Please note that the aim of this patch is to illustrate how we can extend the existing backing storage drivers for env interfaces to support U-Boot environment context.
We will be able to support more devices as well as more contexts in a similar way. Existing drivers still work exactly in the same way as before while they are not extended yet. Signed-off-by: AKASHI Takahiro <takahiro.aka...@linaro.org> --- env/fat.c | 103 ++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 84 insertions(+), 19 deletions(-) diff --git a/env/fat.c b/env/fat.c index 7f74c64dfe7e..e4a672d2730a 100644 --- a/env/fat.c +++ b/env/fat.c @@ -30,23 +30,44 @@ # endif #endif +static struct evn_fat_context { + char *interface; + char *dev_and_part; + char *file; +} fat_context[ENVCTX_COUNT] = { +#if defined(CONFIG_ENV_FAT_INTERFACE) && \ + defined(CONFIG_ENV_FAT_DEVICE_AND_PART) && defined(CONFIG_ENV_FAT_FILE) + [ENVCTX_UBOOT] = { + CONFIG_ENV_FAT_INTERFACE, + CONFIG_ENV_FAT_DEVICE_AND_PART, + CONFIG_ENV_FAT_FILE, + }, +#endif +}; + #ifdef CMD_SAVEENV -static int env_fat_save(void) +static int env_fat_save_ext(enum env_context ctx) { env_t __aligned(ARCH_DMA_MINALIGN) env_new; + env_hdr_t *envp; struct blk_desc *dev_desc = NULL; disk_partition_t info; int dev, part; int err; loff_t size; - err = env_export(&env_new); + if (!fat_context[ctx].interface) + return -EIO; + + env_new.data_size = ENV_SIZE; + envp = (env_hdr_t *)&env_new; + err = env_export_ext(&envp, ctx); if (err) return err; - part = blk_get_device_part_str(CONFIG_ENV_FAT_INTERFACE, - CONFIG_ENV_FAT_DEVICE_AND_PART, - &dev_desc, &info, 1); + part = blk_get_device_part_str(fat_context[ctx].interface, + fat_context[ctx].dev_and_part, + &dev_desc, &info, 1); if (part < 0) return 1; @@ -57,28 +78,34 @@ static int env_fat_save(void) * will calling it. The missing \n is intentional. */ printf("Unable to use %s %d:%d... ", - CONFIG_ENV_FAT_INTERFACE, dev, part); + fat_context[ctx].interface, dev, part); return 1; } - err = file_fat_write(CONFIG_ENV_FAT_FILE, (void *)&env_new, 0, sizeof(env_t), - &size); + err = file_fat_write(fat_context[ctx].file, (void *)envp, 0, + sizeof(env_hdr_t) + envp->data_size, &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); + fat_context[ctx].file, fat_context[ctx].interface, + dev, part); return 1; } return 0; } + +static int env_fat_save(void) +{ + return env_fat_save_ext(ENVCTX_UBOOT); +} #endif /* CMD_SAVEENV */ #ifdef LOADENV -static int env_fat_load(void) +static int env_fat_load_ext(enum env_context ctx) { ALLOC_CACHE_ALIGN_BUFFER(char, buf, CONFIG_ENV_SIZE); struct blk_desc *dev_desc = NULL; @@ -86,14 +113,17 @@ static int env_fat_load(void) int dev, part; int err; + if (!fat_context[ctx].interface) + return -EIO; + #ifdef CONFIG_MMC - if (!strcmp(CONFIG_ENV_FAT_INTERFACE, "mmc")) + if (!strcmp(fat_context[ctx].interface, "mmc")) mmc_initialize(NULL); #endif - part = blk_get_device_part_str(CONFIG_ENV_FAT_INTERFACE, - CONFIG_ENV_FAT_DEVICE_AND_PART, - &dev_desc, &info, 1); + part = blk_get_device_part_str(fat_context[ctx].interface, + fat_context[ctx].dev_and_part, + &dev_desc, &info, 1); if (part < 0) goto err_env_relocate; @@ -104,37 +134,72 @@ static int env_fat_load(void) * will calling it. The missing \n is intentional. */ printf("Unable to use %s %d:%d... ", - CONFIG_ENV_FAT_INTERFACE, dev, part); + fat_context[ctx].interface, dev, part); goto err_env_relocate; } - err = file_fat_read(CONFIG_ENV_FAT_FILE, buf, CONFIG_ENV_SIZE); + err = file_fat_read(fat_context[ctx].file, buf, CONFIG_ENV_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 read \"%s\" from %s%d:%d... ", - CONFIG_ENV_FAT_FILE, CONFIG_ENV_FAT_INTERFACE, dev, part); + fat_context[ctx].file, fat_context[ctx].interface, + dev, part); goto err_env_relocate; } - return env_import(buf, 1); + if (((env_hdr_t *)buf)->data_size <= 1) + return 0; + + return env_import_ext(buf, ctx, 1); err_env_relocate: - set_default_env(NULL, 0); + if (ctx == ENVCTX_UBOOT) + set_default_env(NULL, 0); return -EIO; } + +static int env_fat_load(void) +{ + return env_fat_load_ext(ENVCTX_UBOOT); +} #endif /* LOADENV */ +#if defined(CMD_LOADENV) || defined(CMD_SAVEENV) +static int env_fat_init_ext(enum env_context ctx) +{ + if (ctx != ENVCTX_UBOOT) + return 0; + /* + * Note: + * We can't report 0 here because low-level storage driver, + * like scsi, may not have been detected yet at boot time. + */ + return -ENOENT; +} + +static int env_fat_init(void) +{ + return env_fat_init_ext(ENVCTX_UBOOT); +} +#endif + U_BOOT_ENV_LOCATION(fat) = { .location = ENVL_FAT, ENV_NAME("FAT") #ifdef LOADENV .load = env_fat_load, + .load_ext = env_fat_load_ext, #endif #ifdef CMD_SAVEENV .save = env_save_ptr(env_fat_save), + .save_ext = env_save_ptr(env_fat_save_ext), +#endif +#if defined(CMD_LOADENV) || defined(CMD_SAVEENV) + .init = env_fat_init, + .init_ext = env_fat_init_ext, #endif }; -- 2.21.0 _______________________________________________ U-Boot mailing list U-Boot@lists.denx.de https://lists.denx.de/listinfo/u-boot