env: Discern environment coming from external storage

Add another custom environment flag which discerns environment coming
from external storage from environment set by U-Boot itself.

Signed-off-by: Marek Vasut <marex@denx.de>
Reviewed-by: Tom Rini <trini@konsulko.com>
This commit is contained in:
Marek Vasut 2020-07-07 20:51:35 +02:00 committed by Tom Rini
parent ef9bef2bfe
commit 890feecaab
15 changed files with 29 additions and 24 deletions

13
env/common.c vendored
View File

@ -110,7 +110,7 @@ int env_set_default_vars(int nvars, char * const vars[], int flags)
* Check if CRC is valid and (if yes) import the environment. * Check if CRC is valid and (if yes) import the environment.
* Note that "buf" may or may not be aligned. * Note that "buf" may or may not be aligned.
*/ */
int env_import(const char *buf, int check) int env_import(const char *buf, int check, int flags)
{ {
env_t *ep = (env_t *)buf; env_t *ep = (env_t *)buf;
@ -125,7 +125,7 @@ int env_import(const char *buf, int check)
} }
} }
if (himport_r(&env_htab, (char *)ep->data, ENV_SIZE, '\0', 0, 0, if (himport_r(&env_htab, (char *)ep->data, ENV_SIZE, '\0', flags, 0,
0, NULL)) { 0, NULL)) {
gd->flags |= GD_FLG_ENV_READY; gd->flags |= GD_FLG_ENV_READY;
return 0; return 0;
@ -142,7 +142,8 @@ int env_import(const char *buf, int check)
static unsigned char env_flags; static unsigned char env_flags;
int env_import_redund(const char *buf1, int buf1_read_fail, int env_import_redund(const char *buf1, int buf1_read_fail,
const char *buf2, int buf2_read_fail) const char *buf2, int buf2_read_fail,
int flags)
{ {
int crc1_ok, crc2_ok; int crc1_ok, crc2_ok;
env_t *ep, *tmp_env1, *tmp_env2; env_t *ep, *tmp_env1, *tmp_env2;
@ -162,10 +163,10 @@ int env_import_redund(const char *buf1, int buf1_read_fail,
return -EIO; return -EIO;
} else if (!buf1_read_fail && buf2_read_fail) { } else if (!buf1_read_fail && buf2_read_fail) {
gd->env_valid = ENV_VALID; gd->env_valid = ENV_VALID;
return env_import((char *)tmp_env1, 1); return env_import((char *)tmp_env1, 1, flags);
} else if (buf1_read_fail && !buf2_read_fail) { } else if (buf1_read_fail && !buf2_read_fail) {
gd->env_valid = ENV_REDUND; gd->env_valid = ENV_REDUND;
return env_import((char *)tmp_env2, 1); return env_import((char *)tmp_env2, 1, flags);
} }
crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) == crc1_ok = crc32(0, tmp_env1->data, ENV_SIZE) ==
@ -200,7 +201,7 @@ int env_import_redund(const char *buf1, int buf1_read_fail,
ep = tmp_env2; ep = tmp_env2;
env_flags = ep->flags; env_flags = ep->flags;
return env_import((char *)ep, 0); return env_import((char *)ep, 0, flags);
} }
#endif /* CONFIG_SYS_REDUNDAND_ENVIRONMENT */ #endif /* CONFIG_SYS_REDUNDAND_ENVIRONMENT */

2
env/eeprom.c vendored
View File

@ -188,7 +188,7 @@ static int env_eeprom_load(void)
eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR, eeprom_bus_read(CONFIG_SYS_DEF_EEPROM_ADDR,
off, (uchar *)buf_env, CONFIG_ENV_SIZE); off, (uchar *)buf_env, CONFIG_ENV_SIZE);
return env_import(buf_env, 1); return env_import(buf_env, 1, H_EXTERNAL);
} }
static int env_eeprom_save(void) static int env_eeprom_save(void)

2
env/ext4.c vendored
View File

@ -156,7 +156,7 @@ static int env_ext4_load(void)
goto err_env_relocate; goto err_env_relocate;
} }
err = env_import(buf, 1); err = env_import(buf, 1, H_EXTERNAL);
if (!err) if (!err)
gd->env_valid = ENV_VALID; gd->env_valid = ENV_VALID;

2
env/fat.c vendored
View File

@ -144,7 +144,7 @@ static int env_fat_load(void)
goto err_env_relocate; goto err_env_relocate;
} }
return env_import(buf, 1); return env_import(buf, 1, H_EXTERNAL);
err_env_relocate: err_env_relocate:
env_set_default(NULL, 0); env_set_default(NULL, 0);

2
env/flash.c vendored
View File

@ -351,7 +351,7 @@ static int env_flash_load(void)
"reading environment; recovered successfully\n\n"); "reading environment; recovered successfully\n\n");
#endif /* CONFIG_ENV_ADDR_REDUND */ #endif /* CONFIG_ENV_ADDR_REDUND */
return env_import((char *)flash_addr, 1); return env_import((char *)flash_addr, 1, H_EXTERNAL);
} }
#endif /* LOADENV */ #endif /* LOADENV */

4
env/mmc.c vendored
View File

@ -338,7 +338,7 @@ static int env_mmc_load(void)
read2_fail = read_env(mmc, CONFIG_ENV_SIZE, offset2, tmp_env2); read2_fail = read_env(mmc, CONFIG_ENV_SIZE, offset2, tmp_env2);
ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2, ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
read2_fail); read2_fail, H_EXTERNAL);
fini: fini:
fini_mmc_for_env(mmc); fini_mmc_for_env(mmc);
@ -380,7 +380,7 @@ static int env_mmc_load(void)
goto fini; goto fini;
} }
ret = env_import(buf, 1); ret = env_import(buf, 1, H_EXTERNAL);
if (!ret) { if (!ret) {
ep = (env_t *)buf; ep = (env_t *)buf;
gd->env_addr = (ulong)&ep->data; gd->env_addr = (ulong)&ep->data;

4
env/nand.c vendored
View File

@ -331,7 +331,7 @@ static int env_nand_load(void)
read2_fail = readenv(CONFIG_ENV_OFFSET_REDUND, (u_char *) tmp_env2); read2_fail = readenv(CONFIG_ENV_OFFSET_REDUND, (u_char *) tmp_env2);
ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2, ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
read2_fail); read2_fail, H_EXTERNAL);
done: done:
free(tmp_env1); free(tmp_env1);
@ -372,7 +372,7 @@ static int env_nand_load(void)
return -EIO; return -EIO;
} }
return env_import(buf, 1); return env_import(buf, 1, H_EXTERNAL);
#endif /* ! ENV_IS_EMBEDDED */ #endif /* ! ENV_IS_EMBEDDED */
return 0; return 0;

2
env/nvram.c vendored
View File

@ -64,7 +64,7 @@ static int env_nvram_load(void)
#else #else
memcpy(buf, (void *)CONFIG_ENV_ADDR, CONFIG_ENV_SIZE); memcpy(buf, (void *)CONFIG_ENV_ADDR, CONFIG_ENV_SIZE);
#endif #endif
return env_import(buf, 1); return env_import(buf, 1, H_EXTERNAL);
} }
static int env_nvram_save(void) static int env_nvram_save(void)

2
env/onenand.c vendored
View File

@ -55,7 +55,7 @@ static int env_onenand_load(void)
mtd->writesize = MAX_ONENAND_PAGESIZE; mtd->writesize = MAX_ONENAND_PAGESIZE;
#endif /* !ENV_IS_EMBEDDED */ #endif /* !ENV_IS_EMBEDDED */
rc = env_import(buf, 1); rc = env_import(buf, 1, H_EXTERNAL);
if (!rc) if (!rc)
gd->env_valid = ENV_VALID; gd->env_valid = ENV_VALID;

2
env/remote.c vendored
View File

@ -45,7 +45,7 @@ static int env_remote_save(void)
static int env_remote_load(void) static int env_remote_load(void)
{ {
#ifndef ENV_IS_EMBEDDED #ifndef ENV_IS_EMBEDDED
return env_import((char *)env_ptr, 1); return env_import((char *)env_ptr, 1, H_EXTERNAL);
#endif #endif
return 0; return 0;

2
env/sata.c vendored
View File

@ -111,7 +111,7 @@ static void env_sata_load(void)
return -EIO; return -EIO;
} }
return env_import(buf, 1); return env_import(buf, 1, H_EXTERNAL);
} }
U_BOOT_ENV_LOCATION(sata) = { U_BOOT_ENV_LOCATION(sata) = {

4
env/sf.c vendored
View File

@ -172,7 +172,7 @@ static int env_sf_load(void)
CONFIG_ENV_SIZE, tmp_env2); CONFIG_ENV_SIZE, tmp_env2);
ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2, ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
read2_fail); read2_fail, H_EXTERNAL);
spi_flash_free(env_flash); spi_flash_free(env_flash);
env_flash = NULL; env_flash = NULL;
@ -265,7 +265,7 @@ static int env_sf_load(void)
goto err_read; goto err_read;
} }
ret = env_import(buf, 1); ret = env_import(buf, 1, H_EXTERNAL);
if (!ret) if (!ret)
gd->env_valid = ENV_VALID; gd->env_valid = ENV_VALID;

4
env/ubi.c vendored
View File

@ -141,7 +141,7 @@ static int env_ubi_load(void)
CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME_REDUND); CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME_REDUND);
return env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2, return env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
read2_fail); read2_fail, H_EXTERNAL);
} }
#else /* ! CONFIG_SYS_REDUNDAND_ENVIRONMENT */ #else /* ! CONFIG_SYS_REDUNDAND_ENVIRONMENT */
static int env_ubi_load(void) static int env_ubi_load(void)
@ -172,7 +172,7 @@ static int env_ubi_load(void)
return -EIO; return -EIO;
} }
return env_import(buf, 1); return env_import(buf, 1, H_EXTERNAL);
} }
#endif /* CONFIG_SYS_REDUNDAND_ENVIRONMENT */ #endif /* CONFIG_SYS_REDUNDAND_ENVIRONMENT */

View File

@ -302,10 +302,11 @@ int env_select(const char *name);
* @buf: Buffer containing the environment (struct environemnt_s *) * @buf: Buffer containing the environment (struct environemnt_s *)
* @check: non-zero to check the CRC at the start of the environment, 0 to * @check: non-zero to check the CRC at the start of the environment, 0 to
* ignore it * ignore it
* @flags: Flags controlling matching (H_... - see search.h)
* @return 0 if imported successfully, -ENOMSG if the CRC was bad, -EIO if * @return 0 if imported successfully, -ENOMSG if the CRC was bad, -EIO if
* something else went wrong * something else went wrong
*/ */
int env_import(const char *buf, int check); int env_import(const char *buf, int check, int flags);
/** /**
* env_export() - Export the environment to a buffer * env_export() - Export the environment to a buffer
@ -324,10 +325,12 @@ int env_export(struct environment_s *env_out);
* @buf1_read_fail: 0 if buf1 is valid, non-zero if invalid * @buf1_read_fail: 0 if buf1 is valid, non-zero if invalid
* @buf2: Second environment (struct environemnt_s *) * @buf2: Second environment (struct environemnt_s *)
* @buf2_read_fail: 0 if buf2 is valid, non-zero if invalid * @buf2_read_fail: 0 if buf2 is valid, non-zero if invalid
* @flags: Flags controlling matching (H_... - see search.h)
* @return 0 if OK, -EIO if no environment is valid, -ENOMSG if the CRC was bad * @return 0 if OK, -EIO if no environment is valid, -ENOMSG if the CRC was bad
*/ */
int env_import_redund(const char *buf1, int buf1_read_fail, int env_import_redund(const char *buf1, int buf1_read_fail,
const char *buf2, int buf2_read_fail); const char *buf2, int buf2_read_fail,
int flags);
/** /**
* env_get_default() - Look up a variable from the default environment * env_get_default() - Look up a variable from the default environment

View File

@ -113,5 +113,6 @@ int hwalk_r(struct hsearch_data *htab,
#define H_PROGRAMMATIC (1 << 9) /* indicate that an import is from env_set() */ #define H_PROGRAMMATIC (1 << 9) /* indicate that an import is from env_set() */
#define H_ORIGIN_FLAGS (H_INTERACTIVE | H_PROGRAMMATIC) #define H_ORIGIN_FLAGS (H_INTERACTIVE | H_PROGRAMMATIC)
#define H_DEFAULT (1 << 10) /* indicate that an import is default env */ #define H_DEFAULT (1 << 10) /* indicate that an import is default env */
#define H_EXTERNAL (1 << 11) /* indicate that an import is external env */
#endif /* _SEARCH_H_ */ #endif /* _SEARCH_H_ */