From mboxrd@z Thu Jan 1 00:00:00 1970 From: AKASHI Takahiro Date: Mon, 19 Apr 2021 09:59:55 +0900 Subject: [PATCH] env/fat.c: support redund environment In-Reply-To: <20210116211443.138744-1-brandon.maier@rockwellcollins.com> References: <20210116211443.138744-1-brandon.maier@rockwellcollins.com> Message-ID: <20210419005955.GB8702@laputa> List-Id: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit To: u-boot@lists.denx.de On Sat, Jan 16, 2021 at 03:14:43PM -0600, Brandon Maier wrote: > Signed-off-by: Brandon Maier > CC: Joe Hershberger > CC: Wolfgang Denk > --- > env/Kconfig | 13 +++++++++++-- > env/fat.c | 41 +++++++++++++++++++++++++++++++++-------- > 2 files changed, 44 insertions(+), 10 deletions(-) > > diff --git a/env/Kconfig b/env/Kconfig > index 67ce93061b..a940ddce95 100644 > --- a/env/Kconfig > +++ b/env/Kconfig > @@ -411,8 +411,9 @@ config ENV_IS_IN_UBI > > config SYS_REDUNDAND_ENVIRONMENT > bool "Enable redundant environment support" > - depends on ENV_IS_IN_EEPROM || ENV_IS_IN_FLASH || ENV_IS_IN_MMC || \ > - ENV_IS_IN_NAND || ENV_IS_IN_SPI_FLASH || ENV_IS_IN_UBI > + depends on ENV_IS_IN_EEPROM || ENV_IS_IN_FAT || ENV_IS_IN_FLASH || \ > + ENV_IS_IN_MMC || ENV_IS_IN_NAND || ENV_IS_IN_SPI_FLASH || \ > + ENV_IS_IN_UBI > help > Normally, the environemt is stored in a single location. By > selecting this option, you can then define where to hold a redundant > @@ -461,6 +462,14 @@ config ENV_FAT_FILE > It's a string of the FAT file name. This file use to store the > environment. > > +config ENV_FAT_FILE_REDUND > + string "Name of the FAT file to use for the environment" It would be better to emphasize *redundant* use here in "string," in addition to "help," to differentiate ENV_FAT_FILE. -Takahiro Akashi > + depends on ENV_IS_IN_FAT && SYS_REDUNDAND_ENVIRONMENT > + default "uboot-redund.env" > + help > + It's a string of the FAT file name. This file use to store the > + redundant environment. > + > config ENV_EXT4_INTERFACE > string "Name of the block device for the environment" > depends on ENV_IS_IN_EXT4 > diff --git a/env/fat.c b/env/fat.c > index 653a38fd93..e4cd5970b4 100644 > --- a/env/fat.c > +++ b/env/fat.c > @@ -29,6 +29,10 @@ > # define LOADENV > #endif > > +#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT > +DECLARE_GLOBAL_DATA_PTR; > +#endif > + > static char *env_fat_device_and_part(void) > { > #ifdef CONFIG_MMC > @@ -53,6 +57,7 @@ static int env_fat_save(void) > env_t __aligned(ARCH_DMA_MINALIGN) env_new; > struct blk_desc *dev_desc = NULL; > struct disk_partition info; > + const char *file = CONFIG_ENV_FAT_FILE; > int dev, part; > int err; > loff_t size; > @@ -78,29 +83,41 @@ static int env_fat_save(void) > return 1; > } > > - err = file_fat_write(CONFIG_ENV_FAT_FILE, (void *)&env_new, 0, sizeof(env_t), > - &size); > +#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT > + if (gd->env_valid == ENV_VALID) > + file = CONFIG_ENV_FAT_FILE_REDUND; > +#endif > + > + err = file_fat_write(file, (void *)&env_new, 0, sizeof(env_t), &size); > if (err == -1) { > /* > * This printf is embedded in the messages from env_save that > * will calling it. The missing \n is intentional. > */ > printf("Unable to write \"%s\" from %s%d:%d... ", > - CONFIG_ENV_FAT_FILE, CONFIG_ENV_FAT_INTERFACE, dev, part); > + file, CONFIG_ENV_FAT_INTERFACE, dev, part); > return 1; > } > > +#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT > + gd->env_valid = (gd->env_valid == ENV_REDUND) ? ENV_VALID : ENV_REDUND; > +#endif > + > return 0; > } > > #ifdef LOADENV > static int env_fat_load(void) > { > - ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE); > + ALLOC_CACHE_ALIGN_BUFFER(char, buf1, CONFIG_ENV_SIZE); > +#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT > + ALLOC_CACHE_ALIGN_BUFFER(char, buf2, CONFIG_ENV_SIZE); > + int err2; > +#endif > struct blk_desc *dev_desc = NULL; > struct disk_partition info; > int dev, part; > - int err; > + int err1; > > #ifdef CONFIG_MMC > if (!strcmp(CONFIG_ENV_FAT_INTERFACE, "mmc")) > @@ -124,8 +141,15 @@ static int env_fat_load(void) > goto err_env_relocate; > } > > - err = file_fat_read(CONFIG_ENV_FAT_FILE, buf, CONFIG_ENV_SIZE); > - if (err == -1) { > + err1 = file_fat_read(CONFIG_ENV_FAT_FILE, buf1, CONFIG_ENV_SIZE); > +#ifdef CONFIG_SYS_REDUNDAND_ENVIRONMENT > + err2 = file_fat_read(CONFIG_ENV_FAT_FILE_REDUND, buf2, CONFIG_ENV_SIZE); > + > + err1 = (err1 >= 0) ? 0 : -1; > + err2 = (err2 >= 0) ? 0 : -1; > + return env_import_redund(buf1, err1, buf2, err2, H_EXTERNAL); > +#else > + if (err1 < 0) { > /* > * This printf is embedded in the messages from env_save that > * will calling it. The missing \n is intentional. > @@ -135,7 +159,8 @@ static int env_fat_load(void) > goto err_env_relocate; > } > > - return env_import(buf, 1, H_EXTERNAL); > + return env_import(buf1, 1, H_EXTERNAL); > +#endif > > err_env_relocate: > env_set_default(NULL, 0); > -- > 2.29.1 >