Hi Marek, On 10/18/21 2:23 AM, Marek Vasut wrote: > Currently the MMC environment driver supports storing redundant environment > only in one eMMC partition at different offsets. This is sub-optimal, since > if this one boot partition is erased, both copies of environment are lost. > Since the eMMC has two boot partitions, add support for storing one copy of > environment in each of the two boot partitions. > > To enable this functionality, select CONFIG_SYS_REDUNDAND_ENVIRONMENT to > indicate redundant environment should be used. Set CONFIG_SYS_MMC_ENV_PART > to 1 to indicate environment should be stored in eMMC boot partition. Set > CONFIG_ENV_OFFSET equal to CONFIG_ENV_OFFSET_REDUND, and both to the offset > from start of eMMC boot partition where the environment should be located.
Is there any patch before apply this? When I had been trying to test this, I can't apply this from patchwork. Best Regards, Jaehoon Chung > > Signed-off-by: Marek Vasut <ma...@denx.de> > Cc: Fabio Estevam <feste...@gmail.com> > Cc: Jaehoon Chung <jh80.ch...@samsung.com> > Cc: Peng Fan <peng....@nxp.com> > Cc: Stefano Babic <sba...@denx.de> > --- > V2: Add documentation of this behavior into Kconfig help text > --- > env/Kconfig | 5 +++++ > env/mmc.c | 47 ++++++++++++++++++++++++++++++++++++++++++----- > 2 files changed, 47 insertions(+), 5 deletions(-) > > diff --git a/env/Kconfig b/env/Kconfig > index f75f2b13536..06d72bad1dc 100644 > --- a/env/Kconfig > +++ b/env/Kconfig > @@ -200,6 +200,11 @@ config ENV_IS_IN_MMC > This value may also be positive or negative; this is handled in the > same way as CONFIG_ENV_OFFSET. > > + In case CONFIG_SYS_MMC_ENV_PART is 1 (i.e. environment in eMMC boot > + partition) then setting CONFIG_ENV_OFFSET_REDUND to the same value > + as CONFIG_ENV_OFFSET makes use of the second eMMC boot partition for > + the redundant environment copy. > + > This value is also in units of bytes, but must also be aligned to > an MMC sector boundary. > > diff --git a/env/mmc.c b/env/mmc.c > index e111d8e5881..465b104559b 100644 > --- a/env/mmc.c > +++ b/env/mmc.c > @@ -26,6 +26,18 @@ > > DECLARE_GLOBAL_DATA_PTR; > > +/* > + * In case the environment is redundant, stored in eMMC hardware boot > + * partition and the environment and redundant environment offsets are > + * identical, store the environment and redundant environment in both > + * eMMC boot partitions, one copy in each. > + * */ > +#if (defined(CONFIG_SYS_REDUNDAND_ENVIRONMENT) && \ > + (CONFIG_SYS_MMC_ENV_PART == 1) && \ > + (CONFIG_ENV_OFFSET == CONFIG_ENV_OFFSET_REDUND)) > +#define ENV_MMC_HWPART_REDUND > +#endif > + > #if CONFIG_IS_ENABLED(OF_CONTROL) > static inline int mmc_offset_try_partition(const char *str, int copy, s64 > *val) > { > @@ -126,13 +138,11 @@ __weak uint mmc_get_env_part(struct mmc *mmc) > > static unsigned char env_mmc_orig_hwpart; > > -static int mmc_set_env_part(struct mmc *mmc) > +static int mmc_set_env_part(struct mmc *mmc, uint part) > { > - uint part = mmc_get_env_part(mmc); > int dev = mmc_get_env_dev(); > int ret = 0; > > - env_mmc_orig_hwpart = mmc_get_blk_desc(mmc)->hwpart; > ret = blk_select_hwpart_devnum(IF_TYPE_MMC, dev, part); > if (ret) > puts("MMC partition switch failed\n"); > @@ -140,7 +150,7 @@ static int mmc_set_env_part(struct mmc *mmc) > return ret; > } > #else > -static inline int mmc_set_env_part(struct mmc *mmc) {return 0; }; > +static inline int mmc_set_env_part(struct mmc *mmc, uint part) {return 0; }; > #endif > > static const char *init_mmc_for_env(struct mmc *mmc) > @@ -157,7 +167,8 @@ static const char *init_mmc_for_env(struct mmc *mmc) > if (mmc_init(mmc)) > return "MMC init failed"; > #endif > - if (mmc_set_env_part(mmc)) > + env_mmc_orig_hwpart = mmc_get_blk_desc(mmc)->hwpart; > + if (mmc_set_env_part(mmc, mmc_get_env_part(mmc))) > return "MMC partition switch failed"; > > return NULL; > @@ -209,6 +220,13 @@ static int env_mmc_save(void) > #ifdef CONFIG_ENV_OFFSET_REDUND > if (gd->env_valid == ENV_VALID) > copy = 1; > + > +#ifdef ENV_MMC_HWPART_REDUND > + ret = mmc_set_env_part(mmc, copy + 1); > + if (ret) > + goto fini; > +#endif > + > #endif > > if (mmc_get_env_addr(mmc, copy, &offset)) { > @@ -273,6 +291,12 @@ static int env_mmc_erase(void) > #ifdef CONFIG_ENV_OFFSET_REDUND > copy = 1; > > +#ifdef ENV_MMC_HWPART_REDUND > + ret = mmc_set_env_part(mmc, copy + 1); > + if (ret) > + goto fini; > +#endif > + > if (mmc_get_env_addr(mmc, copy, &offset)) { > ret = CMD_RET_FAILURE; > goto fini; > @@ -331,7 +355,20 @@ static int env_mmc_load(void) > goto fini; > } > > +#ifdef ENV_MMC_HWPART_REDUND > + ret = mmc_set_env_part(mmc, 1); > + if (ret) > + goto fini; > +#endif > + > read1_fail = read_env(mmc, CONFIG_ENV_SIZE, offset1, tmp_env1); > + > +#ifdef ENV_MMC_HWPART_REDUND > + ret = mmc_set_env_part(mmc, 2); > + if (ret) > + goto fini; > +#endif > + > read2_fail = read_env(mmc, CONFIG_ENV_SIZE, offset2, tmp_env2); > > ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2, >