[PATCH] env/fat.c: support redund environment

Signed-off-by: Brandon Maier brandon.maier@rockwellcollins.com CC: Joe Hershberger joe.hershberger@ni.com CC: Wolfgang Denk wd@denx.de --- 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" + 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);

On Sat, Jan 16, 2021 at 03:14:43PM -0600, Brandon Maier wrote:
Signed-off-by: Brandon Maier brandon.maier@rockwellcollins.com CC: Joe Hershberger joe.hershberger@ni.com CC: Wolfgang Denk wd@denx.de
Applied to u-boot/master, thanks!

On Sat, Jan 16, 2021 at 03:14:43PM -0600, Brandon Maier wrote:
Signed-off-by: Brandon Maier brandon.maier@rockwellcollins.com CC: Joe Hershberger joe.hershberger@ni.com CC: Wolfgang Denk wd@denx.de
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 || \
help Normally, the environemt is stored in a single location. By selecting this option, you can then define where to hold a redundantENV_IS_IN_UBI
@@ -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) { /*
*/ printf("Unable to write "%s" from %s%d:%d... ",
- This printf is embedded in the messages from env_save that
- will calling it. The missing \n is intentional.
CONFIG_ENV_FAT_FILE, CONFIG_ENV_FAT_INTERFACE, dev, part);
return 1; }file, CONFIG_ENV_FAT_INTERFACE, dev, part);
+#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
participants (3)
-
AKASHI Takahiro
-
Brandon Maier
-
Tom Rini