To store the "validity" (redund or main), the env_addr (different when redund or main env is used) and the init status of the environment for each environment, an array of env_info structure is created in the global data pointer.
Move all calls to env_addr, env_valid and env_has_init to the new model in the different env drivers. Note that env_addr and env_valid defined in board file are intentionally left untouched and thus, will break compilation for a few boards. The question is: why do we need to set env_addr and env_valid in board files? In addition, env_addr is never used (only when using redundant env and it's set before being used). Signed-off-by: Quentin Schulz <quentin.sch...@free-electrons.com> --- common/board_r.c | 8 ++++- env/common.c | 25 ++++++++++------- env/eeprom.c | 34 +++++++++++------------ env/env.c | 13 +++++---- env/flash.c | 48 ++++++++++++++++---------------- env/mmc.c | 8 ++--- env/nand.c | 36 ++++++++++++------------ env/nowhere.c | 4 +-- env/nvram.c | 10 +++---- env/onenand.c | 2 +- env/remote.c | 4 +-- env/sf.c | 26 ++++++++--------- env/ubi.c | 4 +-- include/asm-generic/global_data.h | 5 +-- 14 files changed, 121 insertions(+), 106 deletions(-) diff --git a/common/board_r.c b/common/board_r.c index a3b9bfb..512e109 100644 --- a/common/board_r.c +++ b/common/board_r.c @@ -125,6 +125,10 @@ __weak int fixup_cpu(void) static int initr_reloc_global_data(void) { +#ifdef CONFIG_SYS_EXTRA_ENV_RELOC + int i; +#endif + #ifdef __ARM__ monitor_flash_len = _end - __image_copy_start; #elif defined(CONFIG_NDS32) @@ -154,7 +158,9 @@ static int initr_reloc_global_data(void) * in SRAM mode and initialize that cache from SRAM mode back to being * a cache in cpu_init_r. */ - gd->env_addr += gd->relocaddr - CONFIG_SYS_MONITOR_BASE; + for (i = 0; i < ENVL_COUNT; i++) + gd->env_infos[i].env_addr += gd->relocaddr - + CONFIG_SYS_MONITOR_BASE; #endif #ifdef CONFIG_OF_EMBED /* diff --git a/env/common.c b/env/common.c index 24cf41b..72359fe 100644 --- a/env/common.c +++ b/env/common.c @@ -214,24 +214,24 @@ int env_import_redund(struct env_driver *drv, const char *buf1, const char *buf2 set_default_env("!bad CRC"); return 0; } else if (crc1_ok && !crc2_ok) { - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } else if (!crc1_ok && crc2_ok) { - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; } else { /* both ok - check serial */ if (tmp_env1->flags == 255 && tmp_env2->flags == 0) - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; else if (tmp_env2->flags == 255 && tmp_env1->flags == 0) - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; else if (tmp_env1->flags > tmp_env2->flags) - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; else if (tmp_env2->flags > tmp_env1->flags) - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; else /* flags are equal - almost impossible */ - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } - if (gd->env_valid == ENV_VALID) + if (gd->env_infos[drv->location].env_valid == ENV_VALID) ep = tmp_env1; else ep = tmp_env2; @@ -271,11 +271,18 @@ int env_export(env_t *env_out) void env_relocate(void) { + int i; + #if defined(CONFIG_NEEDS_MANUAL_RELOC) env_reloc(); env_htab.change_ok += gd->reloc_off; + #endif - if (gd->env_valid == ENV_INVALID) { + for(i = 0; i < ENVL_COUNT; i++) + if (gd->env_infos[i].has_init) + break; + + if (i == ENVL_COUNT) { #if defined(CONFIG_SPL_BUILD) /* Environment not changable */ set_default_env(NULL); diff --git a/env/eeprom.c b/env/eeprom.c index b0ffce4..b48aa97 100644 --- a/env/eeprom.c +++ b/env/eeprom.c @@ -67,7 +67,7 @@ static int env_eeprom_get_char(struct env_driver *drv, int index) unsigned int off = CONFIG_ENV_OFFSET; #ifdef CONFIG_ENV_OFFSET_REDUND - if (gd->env_valid == ENV_REDUND) + if (gd->env_infos[drv->location].env_valid == ENV_REDUND) off = CONFIG_ENV_OFFSET_REDUND; #endif eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR, @@ -121,24 +121,24 @@ static int env_eeprom_load(struct env_driver *drv) } if (!crc_ok[0] && !crc_ok[1]) { - gd->env_addr = 0; - gd->env_valid = ENV_INVALID; + gd->env_infos[drv->location].env_addr = 0; + gd->env_infos[drv->location].env_valid = ENV_INVALID; } else if (crc_ok[0] && !crc_ok[1]) { - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } else if (!crc_ok[0] && crc_ok[1]) { - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; } else { /* both ok - check serial */ if (flags[0] == ACTIVE_FLAG && flags[1] == OBSOLETE_FLAG) - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; else if (flags[0] == OBSOLETE_FLAG && flags[1] == ACTIVE_FLAG) - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; else if (flags[0] == 0xFF && flags[1] == 0) - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; else if (flags[1] == 0xFF && flags[0] == 0) - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; else /* flags are equal - almost impossible */ - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } #else /* CONFIG_ENV_OFFSET_REDUND */ @@ -166,15 +166,15 @@ static int env_eeprom_load(struct env_driver *drv) } if (crc == new) { - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } else { - gd->env_valid = ENV_INVALID; + gd->env_infos[drv->location].env_valid = ENV_INVALID; } #endif /* CONFIG_ENV_OFFSET_REDUND */ off = CONFIG_ENV_OFFSET; #ifdef CONFIG_ENV_OFFSET_REDUND - if (gd->env_valid == ENV_REDUND) + if (gd->env_infos[drv->location].env_valid == ENV_REDUND) off = CONFIG_ENV_OFFSET_REDUND; #endif @@ -201,7 +201,7 @@ static int env_eeprom_save(struct env_driver *drv) return rc; #ifdef CONFIG_ENV_OFFSET_REDUND - if (gd->env_valid == ENV_VALID) { + if (gd->env_infos[drv->location].env_valid == ENV_VALID) { off = CONFIG_ENV_OFFSET_REDUND; off_red = CONFIG_ENV_OFFSET; } @@ -218,10 +218,10 @@ static int env_eeprom_save(struct env_driver *drv) off_red + offsetof(env_t, flags), (uchar *)&flag_obsolete, 1); - if (gd->env_valid == ENV_VALID) - gd->env_valid = ENV_REDUND; + if (gd->env_infos[drv->location].env_valid == ENV_VALID) + gd->env_infos[drv->location].env_valid = ENV_REDUND; else - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } #endif return rc; diff --git a/env/env.c b/env/env.c index ccddc2a..01233ce 100644 --- a/env/env.c +++ b/env/env.c @@ -150,7 +150,7 @@ int env_get_char(int index) if (!drv->get_char) continue; - if (!(gd->env_has_init & BIT(drv->location))) + if (!gd->env_infos[drv->location].has_init) continue; ret = drv->get_char(drv, index); @@ -177,7 +177,7 @@ int env_load(void) if (!drv->load) continue; - if (!(gd->env_has_init & BIT(drv->location))) + if (!gd->env_infos[drv->location].has_init) continue; printf("Loading Environment from %s... ", drv->name); @@ -203,7 +203,10 @@ int env_load(void) if (!drv->load) continue; - printf("Overriding env variables with ones from %s env...", + if (!gd->env_infos[drv->location].has_init) + continue; + + printf("%s: Overriding env variables with ones from %s env...", __func__, drv->name); ret = drv->load(drv); printf("%s\n", ret ? "Failed" : "OK"); @@ -237,7 +240,7 @@ int env_save(void) if (!drv->save) continue; - if (!(gd->env_has_init & BIT(drv->location))) + if (!gd->env_infos[drv->location].has_init) continue; printf("Saving Environment to %s... ", drv->name); @@ -277,7 +280,7 @@ int env_init(void) ret = 0; if (!ret) { - gd->env_has_init |= BIT(drv->location); + gd->env_infos[drv->location].has_init = true; init = true; } diff --git a/env/flash.c b/env/flash.c index 45e58b4..1c7666a 100644 --- a/env/flash.c +++ b/env/flash.c @@ -87,29 +87,29 @@ static int env_flash_init(struct env_driver *drv) crc32(0, flash_addr_new->data, ENV_SIZE) == flash_addr_new->crc; if (crc1_ok && !crc2_ok) { - gd->env_addr = addr1; - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_addr = addr1; + gd->env_infos[drv->location].env_valid = ENV_VALID; } else if (!crc1_ok && crc2_ok) { - gd->env_addr = addr2; - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_addr = addr2; + gd->env_infos[drv->location].env_valid = ENV_VALID; } else if (!crc1_ok && !crc2_ok) { - gd->env_addr = addr_default; - gd->env_valid = ENV_INVALID; + gd->env_infos[drv->location].env_addr = addr_default; + gd->env_infos[drv->location].env_valid = ENV_INVALID; } else if (flag1 == ACTIVE_FLAG && flag2 == OBSOLETE_FLAG) { - gd->env_addr = addr1; - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_addr = addr1; + gd->env_infos[drv->location].env_valid = ENV_VALID; } else if (flag1 == OBSOLETE_FLAG && flag2 == ACTIVE_FLAG) { - gd->env_addr = addr2; - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_addr = addr2; + gd->env_infos[drv->location].env_valid = ENV_VALID; } else if (flag1 == flag2) { - gd->env_addr = addr1; - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_addr = addr1; + gd->env_infos[drv->location].env_valid = ENV_REDUND; } else if (flag1 == 0xFF) { - gd->env_addr = addr1; - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_addr = addr1; + gd->env_infos[drv->location].env_valid = ENV_REDUND; } else if (flag2 == 0xFF) { - gd->env_addr = addr2; - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_addr = addr2; + gd->env_infos[drv->location].env_valid = ENV_REDUND; } return 0; @@ -225,13 +225,13 @@ done: static int env_flash_init(struct env_driver *drv) { if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) { - gd->env_addr = (ulong)&(env_ptr->data); - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_addr = (ulong)&(env_ptr->data); + gd->env_infos[drv->location].env_valid = ENV_VALID; return 0; } - gd->env_addr = (ulong)&default_environment[0]; - gd->env_valid = ENV_INVALID; + gd->env_infos[drv->location].env_addr = (ulong)&default_environment[0]; + gd->env_infos[drv->location].env_valid = ENV_INVALID; return 0; } #endif @@ -311,7 +311,7 @@ done: static int env_flash_load(struct env_driver *drv) { #ifdef CONFIG_ENV_ADDR_REDUND - if (gd->env_addr != (ulong)&(flash_addr->data)) { + if (gd->env_infos[drv->location].env_addr != (ulong)&(flash_addr->data)) { env_t *etmp = flash_addr; ulong ltmp = end_addr; @@ -326,7 +326,7 @@ static int env_flash_load(struct env_driver *drv) crc32(0, flash_addr_new->data, ENV_SIZE) == flash_addr_new->crc) { char flag = OBSOLETE_FLAG; - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; flash_sect_protect(0, (ulong)flash_addr_new, end_addr_new); flash_write(&flag, (ulong)&(flash_addr_new->flags), @@ -338,7 +338,7 @@ static int env_flash_load(struct env_driver *drv) (flash_addr->flags & ACTIVE_FLAG) == ACTIVE_FLAG) { char flag = ACTIVE_FLAG; - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; flash_sect_protect(0, (ulong)flash_addr, end_addr); flash_write(&flag, (ulong)&(flash_addr->flags), @@ -346,7 +346,7 @@ static int env_flash_load(struct env_driver *drv) flash_sect_protect(1, (ulong)flash_addr, end_addr); } - if (gd->env_valid == ENV_REDUND) + if (gd->env_infos[drv->location].env_valid == ENV_REDUND) puts("*** Warning - some problems detected " "reading environment; recovered successfully\n\n"); #endif /* CONFIG_ENV_ADDR_REDUND */ diff --git a/env/mmc.c b/env/mmc.c index 64d1404..250108f 100644 --- a/env/mmc.c +++ b/env/mmc.c @@ -163,7 +163,7 @@ static int env_mmc_save(struct env_driver *drv) goto fini; #ifdef CONFIG_ENV_OFFSET_REDUND - if (gd->env_valid == ENV_VALID) + if (gd->env_infos[drv->location].env_valid == ENV_VALID) copy = 1; #endif @@ -182,7 +182,7 @@ static int env_mmc_save(struct env_driver *drv) ret = 0; #ifdef CONFIG_ENV_OFFSET_REDUND - gd->env_valid = gd->env_valid == ENV_REDUND ? ENV_VALID : ENV_REDUND; + gd->env_infos[drv->location].env_valid = gd->env_infos[drv->location].env_valid == ENV_REDUND ? ENV_VALID : ENV_REDUND; #endif fini: @@ -247,10 +247,10 @@ static int env_mmc_load(struct env_driver *drv) ret = -EIO; goto fini; } else if (!read1_fail && read2_fail) { - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; env_import((char *)tmp_env1, 1); } else if (read1_fail && !read2_fail) { - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; env_import((char *)tmp_env2, 1); } else { env_import_redund((char *)tmp_env1, (char *)tmp_env2); diff --git a/env/nand.c b/env/nand.c index 49e506e..77b9ca1 100644 --- a/env/nand.c +++ b/env/nand.c @@ -78,42 +78,42 @@ static int env_nand_init(struct env_driver *drv) crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) == tmp_env1->crc; if (!crc1_ok && !crc2_ok) { - gd->env_addr = 0; - gd->env_valid = ENV_INVALID; + gd->env_infos[drv->location].env_addr = 0; + gd->env_infos[drv->location].env_valid = ENV_INVALID; return 0; } else if (crc1_ok && !crc2_ok) { - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } #ifdef CONFIG_ENV_OFFSET_REDUND else if (!crc1_ok && crc2_ok) { - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; } else { /* both ok - check serial */ if (tmp_env1->flags == 255 && tmp_env2->flags == 0) - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; else if (tmp_env2->flags == 255 && tmp_env1->flags == 0) - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; else if (tmp_env1->flags > tmp_env2->flags) - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; else if (tmp_env2->flags > tmp_env1->flags) - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; else /* flags are equal - almost impossible */ - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } - if (gd->env_valid == ENV_REDUND) + if (gd->env_infos[drv->location].env_valid == ENV_REDUND) env_ptr = tmp_env2; else #endif - if (gd->env_valid == ENV_VALID) + if (gd->env_infos[drv->location].env_valid == ENV_VALID) env_ptr = tmp_env1; - gd->env_addr = (ulong)env_ptr->data; + gd->env_infos[drv->location].env_addr = (ulong)env_ptr->data; #else /* ENV_IS_EMBEDDED || CONFIG_NAND_ENV_DST */ - gd->env_addr = (ulong)&default_environment[0]; - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_addr = (ulong)&default_environment[0]; + gd->env_infos[drv->location].env_valid = ENV_VALID; #endif /* ENV_IS_EMBEDDED || CONFIG_NAND_ENV_DST */ return 0; @@ -216,14 +216,14 @@ static int env_nand_save(struct env_driver *drv) return ret; #ifdef CONFIG_ENV_OFFSET_REDUND - env_idx = (gd->env_valid == ENV_VALID); + env_idx = (gd->env_infos[drv->location].env_valid == ENV_VALID); #endif ret = erase_and_write_env(&location[env_idx], (u_char *)env_new); #ifdef CONFIG_ENV_OFFSET_REDUND if (!ret) { /* preset other copy for next write */ - gd->env_valid = gd->env_valid == ENV_REDUND ? ENV_VALID : + gd->env_infos[drv->location].env_valid = gd->env_infos[drv->location].env_valid == ENV_REDUND ? ENV_VALID : ENV_REDUND; return ret; } @@ -346,10 +346,10 @@ static int env_nand_load(struct env_driver *drv) set_default_env("!bad env area"); goto done; } else if (!read1_fail && read2_fail) { - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; env_import((char *)tmp_env1, 1); } else if (read1_fail && !read2_fail) { - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; env_import((char *)tmp_env2, 1); } else { env_import_redund(drv, (char *)tmp_env1, (char *)tmp_env2); diff --git a/env/nowhere.c b/env/nowhere.c index fb6ea9e..7d81a57 100644 --- a/env/nowhere.c +++ b/env/nowhere.c @@ -26,8 +26,8 @@ static int env_nowhere_load(struct env_driver *drv) */ static int env_nowhere_init(struct env_driver *drv) { - gd->env_addr = (ulong)&default_environment[0]; - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_addr = (ulong)&default_environment[0]; + gd->env_infos[drv->location].env_valid = ENV_VALID; return 0; } diff --git a/env/nvram.c b/env/nvram.c index aad341d..c36c1af 100644 --- a/env/nvram.c +++ b/env/nvram.c @@ -98,15 +98,15 @@ static int env_nvram_init(struct env_driver *drv) nvram_read(data, CONFIG_ENV_ADDR + sizeof(ulong), ENV_SIZE); if (crc32(0, data, ENV_SIZE) == crc) { - gd->env_addr = (ulong)CONFIG_ENV_ADDR + sizeof(long); + gd->env_infos[drv->location].env_addr = (ulong)CONFIG_ENV_ADDR + sizeof(long); #else if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) { - gd->env_addr = (ulong)&env_ptr->data; + gd->env_infos[drv->location].env_addr = (ulong)&env_ptr->data; #endif - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } else { - gd->env_addr = (ulong)&default_environment[0]; - gd->env_valid = ENV_INVALID; + gd->env_infos[drv->location].env_addr = (ulong)&default_environment[0]; + gd->env_infos[drv->location].env_valid = ENV_INVALID; } return 0; diff --git a/env/onenand.c b/env/onenand.c index e633ebe..68790f1 100644 --- a/env/onenand.c +++ b/env/onenand.c @@ -58,7 +58,7 @@ static int env_onenand_load(struct env_driver *drv) rc = env_import(buf, 1); if (rc) - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; return rc ? 0 : -EIO; } diff --git a/env/remote.c b/env/remote.c index b004964..895759e 100644 --- a/env/remote.c +++ b/env/remote.c @@ -26,8 +26,8 @@ DECLARE_GLOBAL_DATA_PTR; static int env_remote_init(struct env_driver *drv) { if (crc32(0, env_ptr->data, ENV_SIZE) == env_ptr->crc) { - gd->env_addr = (ulong)&(env_ptr->data); - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_addr = (ulong)&(env_ptr->data); + gd->env_infos[drv->location].env_valid = ENV_VALID; return 0; } diff --git a/env/sf.c b/env/sf.c index e811cde..40e2671 100644 --- a/env/sf.c +++ b/env/sf.c @@ -98,7 +98,7 @@ static int env_sf_save(struct env_driver *drv) return -EIO; env_new.flags = ACTIVE_FLAG; - if (gd->env_valid == ENV_VALID) { + if (gd->env_infos[drv->location].env_valid == ENV_VALID) { env_new_offset = CONFIG_ENV_OFFSET_REDUND; env_offset = CONFIG_ENV_OFFSET; } else { @@ -150,9 +150,9 @@ static int env_sf_save(struct env_driver *drv) puts("done\n"); - gd->env_valid = gd->env_valid == ENV_REDUND ? ENV_VALID : ENV_REDUND; + gd->env_infos[drv->location].env_valid = gd->env_infos[drv->location].env_valid == ENV_REDUND ? ENV_VALID : ENV_REDUND; - printf("Valid environment: %d\n", (int)gd->env_valid); + printf("Valid environment: %d\n", (int)gd->env_infos[drv->location].env_valid); done: if (saved_buffer) @@ -206,30 +206,30 @@ static int env_sf_load(struct env_driver *drv) ret = -EIO; goto err_read; } else if (crc1_ok && !crc2_ok) { - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } else if (!crc1_ok && crc2_ok) { - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; } else if (tmp_env1->flags == ACTIVE_FLAG && tmp_env2->flags == OBSOLETE_FLAG) { - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } else if (tmp_env1->flags == OBSOLETE_FLAG && tmp_env2->flags == ACTIVE_FLAG) { - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; } else if (tmp_env1->flags == tmp_env2->flags) { - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } else if (tmp_env1->flags == 0xFF) { - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } else if (tmp_env2->flags == 0xFF) { - gd->env_valid = ENV_REDUND; + gd->env_infos[drv->location].env_valid = ENV_REDUND; } else { /* * this differs from code in env_flash.c, but I think a sane * default path is desirable. */ - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; } - if (gd->env_valid == ENV_VALID) + if (gd->env_infos[drv->location].env_valid == ENV_VALID) ep = tmp_env1; else ep = tmp_env2; @@ -336,7 +336,7 @@ static int env_sf_load(struct env_driver *drv) ret = env_import(buf, 1); if (ret) - gd->env_valid = ENV_VALID; + gd->env_infos[drv->location].env_valid = ENV_VALID; err_read: spi_flash_free(env_flash); diff --git a/env/ubi.c b/env/ubi.c index 51b61eb..bd137e9 100644 --- a/env/ubi.c +++ b/env/ubi.c @@ -35,7 +35,7 @@ static int env_ubi_save(struct env_driver *drv) return 1; } - if (gd->env_valid == ENV_VALID) { + if (gd->env_infos[drv->location].env_valid == ENV_VALID) { puts("Writing to redundant UBI... "); if (ubi_volume_write(CONFIG_ENV_UBI_VOLUME_REDUND, (void *)env_new, CONFIG_ENV_SIZE)) { @@ -57,7 +57,7 @@ static int env_ubi_save(struct env_driver *drv) puts("done\n"); - gd->env_valid = gd->env_valid == ENV_REDUND ? ENV_VALID : ENV_REDUND; + gd->env_infos[drv->location].env_valid = gd->env_infos[drv->location].env_valid == ENV_REDUND ? ENV_VALID : ENV_REDUND; return 0; } diff --git a/include/asm-generic/global_data.h b/include/asm-generic/global_data.h index 1d0611f..17cf1b7 100644 --- a/include/asm-generic/global_data.h +++ b/include/asm-generic/global_data.h @@ -23,6 +23,7 @@ #ifndef __ASSEMBLY__ #include <membuff.h> #include <linux/list.h> +#include <environment.h> typedef struct global_data { bd_t *bd; @@ -48,9 +49,7 @@ typedef struct global_data { #if CONFIG_IS_ENABLED(PRE_CONSOLE_BUFFER) unsigned long precon_buf_idx; /* Pre-Console buffer index */ #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 */ + struct env_info env_infos[ENVL_COUNT]; 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