[U-Boot] [PATCH 10/14] env: Initialise all the environments

Andre Przywara andre.przywara at arm.com
Tue Dec 5 10:11:08 UTC 2017


Hi,

On 28/11/17 10:24, Maxime Ripard wrote:
> Since we want to have multiple environments, we will need to initialise
> all the environments since we don't know at init time what drivers might
> fail when calling load.
> 
> Let's init all of them, and only consider for further operations the ones
> that have not reported any errors at init time.
> 
> Signed-off-by: Maxime Ripard <maxime.ripard at free-electrons.com>
> ---
>  env/env.c                         | 19 ++++++++++++-------
>  include/asm-generic/global_data.h |  1 +
>  2 files changed, 13 insertions(+), 7 deletions(-)
> 
> diff --git a/env/env.c b/env/env.c
> index 5176700133d3..b4d8886e7a69 100644
> --- a/env/env.c
> +++ b/env/env.c
> @@ -112,6 +112,9 @@ int env_get_char(int index)
>  		if (!drv->get_char)
>  			continue;
>  
> +		if (!(gd->env_has_init & BIT(drv->location)))
> +			continue;
> +
>  		ret = drv->get_char(index);
>  		if (!ret)
>  			return 0;
> @@ -134,6 +137,9 @@ int env_load(void)
>  		if (!drv->load)
>  			continue;
>  
> +		if (!(gd->env_has_init & BIT(drv->location)))
> +			continue;
> +
>  		printf("Loading Environment from %s... ", drv->name);
>  		ret = drv->load();
>  		printf("%s\n", ret ? "Failed" : "OK");
> @@ -155,6 +161,9 @@ int env_save(void)
>  		if (!drv->save)
>  			continue;
>  
> +		if (!(gd->env_has_init & BIT(drv->location)))
> +			continue;
> +
>  		printf("Saving Environment to %s... ", drv->name);
>  		ret = drv->save();
>  		printf("%s\n", ret ? "Failed" : "OK");
> @@ -175,14 +184,10 @@ int env_init(void)
>  	int prio;
>  

Becoming a bit desperate now, because I am struggling to find actual
issues in this series ;-), so:

Maybe we should have a build time check should the env_locations array
ever grow beyond 32?
	BUILD_BUG_ON(ARRAY_SIZE(env_locations) > BITS_PER_LONG);

>  	for (prio = 0; (drv = env_driver_lookup(ENVO_INIT, prio)); prio++) {
> -		if (!drv->init)
> -			continue;
> -
> -		ret = drv->init();
> -		if (!ret)
> -			return 0;
> +		if (!drv->init || !drv->init())
> +			gd->env_has_init |= BIT(drv->location);
>  
> -		debug("%s: Environment %s failed to init (err=%d)\n", __func__,
> +		debug("%s: Environment %s init done (ret=%d)\n", __func__,
>  		      drv->name, ret);
>  	}
>  
> diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h
> index 944f58195caf..1d0611fe9498 100644
> --- a/include/asm-generic/global_data.h
> +++ b/include/asm-generic/global_data.h
> @@ -50,6 +50,7 @@ typedef struct global_data {
>  #endif
>  	unsigned long env_addr;		/* Address  of Environment struct */
>  	unsigned long env_valid;	/* Environment valid? enum env_valid */
> +	unsigned long env_has_init;	/* Bitmask of boolean of struct env_location offsets */

struct env_location? Do you mean the env_location array? Or the enum?

Cheers,
Andre.

>  	unsigned long ram_top;		/* Top address of RAM used by U-Boot */
>  	unsigned long relocaddr;	/* Start address of U-Boot in RAM */
> 


More information about the U-Boot mailing list