summaryrefslogtreecommitdiff
path: root/env
diff options
context:
space:
mode:
Diffstat (limited to 'env')
-rw-r--r--env/Kconfig43
-rw-r--r--env/env.c6
-rw-r--r--env/flags.c10
-rw-r--r--env/ubi.c65
4 files changed, 105 insertions, 19 deletions
diff --git a/env/Kconfig b/env/Kconfig
index 7abd82ab6f3..bbd657682d7 100644
--- a/env/Kconfig
+++ b/env/Kconfig
@@ -34,6 +34,29 @@ config ENV_CALLBACK_LIST_STATIC
If the callback name is not specified, then the callback is deleted.
Spaces are also allowed anywhere in the list.
+config ENV_FLAGS_LIST_STATIC
+ string "Static flags list"
+ default ""
+ help
+ The environment flags are associated with variables in a static
+ list. Define this list in the following format:
+
+ type_attribute = [s|d|x|b|i|m]
+ access_attribute = [a|r|o|c|w]
+ attributes = type_attribute[access_attribute]
+ entry = variable_name[:attributes]
+ list = entry[,list]
+
+ The type attributes are s for string, d for decimal, x for
+ hexadecimal and b for boolean. If networking is enabled, i can
+ be used for IP addresses and m for MAC addresses.
+
+ The access attributes are a for any, r for read-only, o for
+ write-once and c for change-default. When CONFIG_ENV_WRITEABLE_LIST
+ is enabled, w can be used to mark variables as writable.
+
+ Spaces are also allowed anywhere in the list.
+
config SAVEENV
def_bool y if CMD_SAVEENV
@@ -716,6 +739,26 @@ config ENV_UBI_VOLUME_REDUND
help
Name of the redundant volume that you want to store the environment in.
+config ENV_UBI_VOLUME_CREATE
+ bool "Create UBI volume if it does not exist"
+ depends on ENV_IS_IN_UBI
+ help
+ This option is useful if U-Boot will be booted from a fresh device
+ where the environment volume has not been created.
+ This is a common case where factory UBI image contains only volumes
+ with valid data.
+ By enabling this option, any missing environment volumes will be
+ created before loading.
+ If ENV_UBI_VOLUME_REDUND is also enabled, both volumes will be
+ created.
+
+config ENV_UBI_VOLUME_STATIC
+ bool "Create static UBI volume"
+ depends on ENV_UBI_VOLUME_CREATE
+ help
+ By default environment volume will be dynamic.
+ Enable this option to create static volume.
+
config ENV_UBI_VID_OFFSET
int "ubi environment VID offset"
depends on ENV_IS_IN_UBI
diff --git a/env/env.c b/env/env.c
index 7a9c96b4078..404e8b7a26c 100644
--- a/env/env.c
+++ b/env/env.c
@@ -189,7 +189,7 @@ int env_load(void)
if (!env_has_inited(drv->location))
continue;
- printf("Loading Environment from %s... ", drv->name);
+ printf("Loading Environment from %s...\r", drv->name);
/*
* In error case, the error message must be printed during
* drv->load() in some underlying API, and it must be exactly
@@ -197,7 +197,7 @@ int env_load(void)
*/
ret = drv->load();
if (!ret) {
- printf("OK\n");
+ printf("Loading Environment from %s... OK\n", drv->name);
gd->env_load_prio = prio;
return 0;
@@ -206,7 +206,7 @@ int env_load(void)
if (best_prio == -1)
best_prio = prio;
} else {
- debug("Failed (%d)\n", ret);
+ debug("Loading Environment from %s... Failed (%d)\n", drv->name, ret);
}
}
diff --git a/env/flags.c b/env/flags.c
index f734fda50c2..f1966bc91b4 100644
--- a/env/flags.c
+++ b/env/flags.c
@@ -22,7 +22,7 @@
#include <env_internal.h>
#endif
-#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)
+#if CONFIG_IS_ENABLED(NET)
#define ENV_FLAGS_NET_VARTYPE_REPS "im"
#else
#define ENV_FLAGS_NET_VARTYPE_REPS ""
@@ -57,7 +57,7 @@ static const char * const env_flags_vartype_names[] = {
"decimal",
"hexadecimal",
"boolean",
-#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)
+#if CONFIG_IS_ENABLED(NET)
"IP address",
"MAC address",
#endif
@@ -211,7 +211,7 @@ static void skip_num(int hex, const char *value, const char **end,
*end = value;
}
-#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)
+#if CONFIG_IS_ENABLED(NET)
int eth_validate_ethaddr_str(const char *addr)
{
const char *end;
@@ -244,7 +244,7 @@ static int _env_flags_validate_type(const char *value,
enum env_flags_vartype type)
{
const char *end;
-#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)
+#if CONFIG_IS_ENABLED(NET)
const char *cur;
int i;
#endif
@@ -273,7 +273,7 @@ static int _env_flags_validate_type(const char *value,
if (value[1] != '\0')
return -1;
break;
-#if CONFIG_IS_ENABLED(NET) || CONFIG_IS_ENABLED(NET_LWIP)
+#if CONFIG_IS_ENABLED(NET)
case env_flags_vartype_ipaddr:
cur = value;
for (i = 0; i < 4; i++) {
diff --git a/env/ubi.c b/env/ubi.c
index e9865b45ebc..810faaf7744 100644
--- a/env/ubi.c
+++ b/env/ubi.c
@@ -103,12 +103,30 @@ static int env_ubi_save(void)
}
#endif /* CONFIG_ENV_REDUNDANT */
+static int env_ubi_volume_create(const char *volume)
+{
+ bool dynamic = !IS_ENABLED(CONFIG_ENV_UBI_VOLUME_STATIC);
+ struct ubi_volume *vol;
+ int ret;
+
+ vol = ubi_find_volume(volume);
+ if (vol)
+ return 0;
+
+ ret = ubi_create_vol(volume, CONFIG_ENV_SIZE, dynamic, UBI_VOL_NUM_AUTO,
+ false);
+ if (ret)
+ printf("Failed to create environment volume '%s'\n", volume);
+
+ return ret;
+}
+
#ifdef CONFIG_ENV_REDUNDANT
static int env_ubi_load(void)
{
ALLOC_CACHE_ALIGN_BUFFER(char, env1_buf, CONFIG_ENV_SIZE);
ALLOC_CACHE_ALIGN_BUFFER(char, env2_buf, CONFIG_ENV_SIZE);
- int read1_fail, read2_fail;
+ int read1_fail, read2_fail, create1_fail = 0, create2_fail = 0;
env_t *tmp_env1, *tmp_env2;
/*
@@ -132,17 +150,35 @@ static int env_ubi_load(void)
return -EIO;
}
- read1_fail = ubi_volume_read(CONFIG_ENV_UBI_VOLUME, (void *)tmp_env1, 0,
- CONFIG_ENV_SIZE);
- if (read1_fail)
- printf("\n** Unable to read env from %s:%s **\n",
- CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME);
+ if (IS_ENABLED(CONFIG_ENV_UBI_VOLUME_CREATE)) {
+ create1_fail = env_ubi_volume_create(CONFIG_ENV_UBI_VOLUME);
+ create2_fail = env_ubi_volume_create(CONFIG_ENV_UBI_VOLUME_REDUND);
+ if (create1_fail && create2_fail) {
+ env_set_default(NULL, 0);
+ return -ENODEV;
+ }
+ }
- read2_fail = ubi_volume_read(CONFIG_ENV_UBI_VOLUME_REDUND,
- (void *)tmp_env2, 0, CONFIG_ENV_SIZE);
- if (read2_fail)
- printf("\n** Unable to read redundant env from %s:%s **\n",
- CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME_REDUND);
+ if (!create1_fail) {
+ read1_fail = ubi_volume_read(CONFIG_ENV_UBI_VOLUME, tmp_env1, 0,
+ CONFIG_ENV_SIZE);
+ if (read1_fail)
+ printf("\n** Unable to read env from %s:%s **\n",
+ CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME);
+ } else {
+ read1_fail = create1_fail;
+ }
+
+ if (!create2_fail) {
+ read2_fail = ubi_volume_read(CONFIG_ENV_UBI_VOLUME_REDUND,
+ tmp_env2, 0, CONFIG_ENV_SIZE);
+ if (read2_fail)
+ printf("\n** Unable to read redundant env from %s:%s **\n",
+ CONFIG_ENV_UBI_PART,
+ CONFIG_ENV_UBI_VOLUME_REDUND);
+ } else {
+ read2_fail = create2_fail;
+ }
return env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
read2_fail, H_EXTERNAL);
@@ -169,6 +205,13 @@ static int env_ubi_load(void)
return -EIO;
}
+ if (IS_ENABLED(CONFIG_ENV_UBI_VOLUME_CREATE)) {
+ if (env_ubi_volume_create(CONFIG_ENV_UBI_VOLUME)) {
+ env_set_default(NULL, 0);
+ return -ENODEV;
+ }
+ }
+
if (ubi_volume_read(CONFIG_ENV_UBI_VOLUME, buf, 0, CONFIG_ENV_SIZE)) {
printf("\n** Unable to read env from %s:%s **\n",
CONFIG_ENV_UBI_PART, CONFIG_ENV_UBI_VOLUME);