Hi Maxime, On 28 November 2017 at 03:24, Maxime Ripard <maxime.rip...@free-electrons.com> 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.rip...@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; > +
Little nit. Can you please put the access in functions like env_has_inited() and env_set_inited()? This allows us to change the implementation later, and also it more self-documenting. > 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; > > 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 */ > > unsigned long ram_top; /* Top address of RAM used by U-Boot > */ > unsigned long relocaddr; /* Start address of U-Boot in RAM */ > -- > git-series 0.9.1 > _______________________________________________ > U-Boot mailing list > U-Boot@lists.denx.de > https://lists.denx.de/listinfo/u-boot Regards, Simon _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot