
From: Doug Anderson dianders@chromium.org
This is a useful mechanism any time you have a way to update the saved environment outside of u-boot. This can be a tool like fw_setenv.
Signed-off-by: Doug Anderson dianders@chromium.org Signed-off-by: Simon Glass sjg@chromium.org --- README | 7 +++++++ common/env_common.c | 25 +++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 0 deletions(-)
diff --git a/README b/README index 05c5688..785953f 100644 --- a/README +++ b/README @@ -4098,6 +4098,13 @@ Please note that changes to some configuration parameters may take only effect after the next boot (yes, that's just like Windoze :-).
+If merge_with_default is in the loaded environment, and is not "0", then +the loaded environment will be merged on top of the default environment +instead of just replacing it. This means that your saved environment can +contain only the variables you need to change from the default. This is +useful with fw_setenv. + + Command Line Parsing: =====================
diff --git a/common/env_common.c b/common/env_common.c index 3d3cb70..f7fe7a2 100644 --- a/common/env_common.c +++ b/common/env_common.c @@ -34,6 +34,19 @@
DECLARE_GLOBAL_DATA_PTR;
+/* + * Create a saved enviroment with this env variable set to "1" to merge the + * saved environment on top of the default environment. The idea is that your + * saved environment would just contain variables that you'd like to override + * from the default so that as you update u-boot (w/ potential changes to the + * default) you get all the updates. + * + * This is really most useful when you have a tool like fw_setenv to manage + * your saved environment. Using 'saveenv' to save your environment will saved + * the _merged_ environment (AKA it won't unmerge things). + */ +#define MERGE_WITH_DEFAULT "merge_with_default" + /************************************************************************ * Default settings to be used when no valid environment is found */ @@ -156,7 +169,19 @@ int env_import(const char *buf, int check)
if (himport_r(&env_htab, (char *)ep->data, ENV_SIZE, '\0', 0, 0, NULL, 0 /* do_apply */)) { + char *merge_val; + gd->flags |= GD_FLG_ENV_READY; + merge_val = getenv(MERGE_WITH_DEFAULT); + + if (merge_val != NULL && merge_val[0] != '0') { + set_default_env(""); + himport_r(&env_htab, (char *)ep->data, ENV_SIZE, '\0', + H_NOCLEAR, 0, NULL, 0 /* do_apply */); + hdelete_r(MERGE_WITH_DEFAULT, &env_htab, + 0 /* do_apply */); + puts("Merged saved with default environment\n\n"); + } return 1; }