From: "Marek Behún" <kabel@kernel.org>
To: "Simon Glass" <sjg@chromium.org>, "Pali Rohár" <pali@kernel.org>
Cc: u-boot@lists.denx.de, "Marek Behún" <marek.behun@nic.cz>
Subject: [PATCH v2 10/12] env: Add support for overwriting default environment via sysinfo
Date: Thu, 4 Nov 2021 00:23:30 +0100 [thread overview]
Message-ID: <20211103232332.2737-11-kabel@kernel.org> (raw)
In-Reply-To: <20211103232332.2737-1-kabel@kernel.org>
From: Marek Behún <marek.behun@nic.cz>
The default_environment[] buffer is built at compile time, but sometimes
it makes sense for some default environment variables to be determined
at runtime, for example:
- one board code may support different boards, and needs that
fdtfile, board, board_name
are set appropriately when command
env default -a
is executed
- some boards may want to prohibit the
env default -a
command to remove device MAC addresses stored in
ethaddr, ethNaddr.
This is the case for the ESPRESSObin board code, for example, where
currently the board_late_init() function rewrites the default
environment array to achieve this.
Add new sysinfo IDs
SYSINFO_ID_DEF_ENV_NAMES
SYSINFO_ID_DEF_ENV_VALUES
corresponding to sysinfo string list of names and values of default
environment variables that are to take precedence over the
default_environment[] buffer.
Add code to default environemnt handlers in env/common.c, which iterate
these sysinfo string lists correspondingly.
Signed-off-by: Marek Behún <marek.behun@nic.cz>
---
env/common.c | 107 +++++++++++++++++++++++++++++++++++++++++++++-
include/sysinfo.h | 4 ++
2 files changed, 110 insertions(+), 1 deletion(-)
diff --git a/env/common.c b/env/common.c
index cefe58561b..8ac287beae 100644
--- a/env/common.c
+++ b/env/common.c
@@ -22,6 +22,7 @@
#include <u-boot/crc.h>
#include <dm/ofnode.h>
#include <net.h>
+#include <sysinfo.h>
#include <watchdog.h>
DECLARE_GLOBAL_DATA_PTR;
@@ -148,6 +149,31 @@ char *from_env(const char *envvar)
return ret;
}
+static int sysinfo_default_env_get(const char *var, char *buf, unsigned len)
+{
+ struct udevice *dev;
+ unsigned idx;
+ char *name;
+ void *iter;
+
+ if (sysinfo_get(&dev) < 0 || sysinfo_detect(dev) < 0)
+ return -ENODEV;
+
+ idx = 0;
+ for_each_sysinfo_str_list(dev, SYSINFO_ID_DEF_ENV_NAMES, name, iter) {
+ if (strcmp(var, name)) {
+ ++idx;
+ continue;
+ }
+
+ free(iter);
+ return sysinfo_get_str_list(dev, SYSINFO_ID_DEF_ENV_VALUES, idx,
+ len, buf);
+ }
+
+ return -ENOENT;
+}
+
static int env_get_from_linear(const char *env, const char *name, char *buf,
unsigned len)
{
@@ -157,6 +183,17 @@ static int env_get_from_linear(const char *env, const char *name, char *buf,
if (name == NULL || *name == '\0')
return -1;
+ if (env == default_environment) {
+ int res = sysinfo_default_env_get(name, buf, len);
+
+ /*
+ * Board special default envs take precedence over the
+ * default_environment[] array.
+ */
+ if (res >= 0)
+ return res;
+ }
+
name_len = strlen(name);
for (p = env; *p != '\0'; p = end + 1) {
@@ -248,8 +285,69 @@ char *env_get_default(const char *name)
return NULL;
}
+static int sysinfo_import_default_envs(bool all, int nvars, char * const vars[],
+ int flags)
+{
+ struct udevice *dev;
+ char *name, *value;
+ unsigned idx;
+ void *iter;
+ int len;
+
+ if (sysinfo_get(&dev) < 0 || sysinfo_detect(dev) < 0)
+ return 0;
+
+ len = sysinfo_get_str_list_max_len(dev, SYSINFO_ID_DEF_ENV_VALUES);
+ if (len == -ENOSYS || len == -ENOENT || len == -ERANGE)
+ return 0;
+ else if (len < 0)
+ return len;
+
+ value = malloc(len + 1);
+ if (!value)
+ return -ENOMEM;
+
+ idx = 0;
+ for_each_sysinfo_str_list(dev, SYSINFO_ID_DEF_ENV_NAMES, name, iter) {
+ struct env_entry e, *ep;
+
+ if (!all) {
+ int j;
+
+ /* If name is not in vars, skip */
+ for (j = 0; j < nvars; ++j)
+ if (!strcmp(name, vars[j]))
+ break;
+ if (j == nvars) {
+ idx++;
+ continue;
+ }
+ }
+
+ len = sysinfo_get_str_list(dev, SYSINFO_ID_DEF_ENV_VALUES,
+ idx++, ENV_SIZE, value);
+ if (len < 0)
+ continue;
+
+ e.key = name;
+ e.data = value;
+ if (!hsearch_r(e, ENV_ENTER, &ep, &env_htab, flags)) {
+ int res = -errno;
+ free(iter);
+ free(value);
+ return res;
+ }
+ }
+
+ free(value);
+
+ return 0;
+}
+
void env_set_default(const char *s, int flags)
{
+ int res;
+
if (s) {
if ((flags & H_INTERACTIVE) == 0) {
printf("*** Warning - %s, "
@@ -270,6 +368,13 @@ void env_set_default(const char *s, int flags)
return;
}
+ res = sysinfo_import_default_envs(true, 0, NULL, flags);
+ if (res < 0) {
+ pr_err("## Error: Board special default environment import failed: %d\n",
+ res);
+ return;
+ }
+
gd->flags |= GD_FLG_ENV_READY;
gd->flags |= GD_FLG_ENV_DEFAULT;
}
@@ -288,7 +393,7 @@ int env_set_default_vars(int nvars, char * const vars[], int flags)
vars))
return -errno;
- return 0;
+ return sysinfo_import_default_envs(false, nvars, vars, flags);
}
/*
diff --git a/include/sysinfo.h b/include/sysinfo.h
index d32bf3e808..587ad0dc75 100644
--- a/include/sysinfo.h
+++ b/include/sysinfo.h
@@ -47,6 +47,10 @@ enum sysinfo_id {
/* For show_board_info() */
SYSINFO_ID_BOARD_MODEL,
+ /* For overwriting default environment variables */
+ SYSINFO_ID_DEF_ENV_NAMES,
+ SYSINFO_ID_DEF_ENV_VALUES,
+
/* First value available for downstream/board used */
SYSINFO_ID_USER = 0x1000,
};
--
2.32.0
next prev parent reply other threads:[~2021-11-03 23:25 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-11-03 23:23 [PATCH v2 00/12] Board specific runtime determined default env Marek Behún
2021-11-03 23:23 ` [PATCH v2 01/12] env: Don't set ready flag if import failed in env_set_default() Marek Behún
2021-11-14 0:34 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 02/12] env: Fix env_get() when returning empty string using env_get_f() Marek Behún
2021-11-14 0:34 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 03/12] env: Simplify env_get_default() Marek Behún
2021-11-14 0:34 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 04/12] sysinfo: Make sysinfo_get_str() behave like snprintf() Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-05 11:19 ` Marek Behún
2021-11-05 16:12 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 05/12] test: Use ut_asserteq_str() instead of ut_assertok(strcmp()) Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 06/12] sysinfo: Add get_str_list() method Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-05 11:20 ` Marek Behún
2021-11-05 16:12 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 07/12] sysinfo: Make .detect() non-mandatory Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 08/12] sysinfo: Add support for iterating string list Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-05 11:24 ` Marek Behún
2021-11-05 16:12 ` Simon Glass
2021-11-03 23:23 ` [PATCH v2 09/12] env: Change return behaviour of env_set_default_vars() Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-03 23:23 ` Marek Behún [this message]
2021-11-05 2:02 ` [PATCH v2 10/12] env: Add support for overwriting default environment via sysinfo Simon Glass
2021-11-03 23:23 ` [PATCH v2 11/12] arm: mvebu: Espressobin: Use new API for setting default env at runtime Marek Behún
2021-11-05 2:02 ` Simon Glass
2021-11-05 8:50 ` Pali Rohár
2021-11-09 15:37 ` Pali Rohár
2021-11-03 23:23 ` [PATCH v2 12/12] env: Remove support for read-write default_environment[] Marek Behún
2021-11-05 2:02 ` Simon Glass
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211103232332.2737-11-kabel@kernel.org \
--to=kabel@kernel.org \
--cc=marek.behun@nic.cz \
--cc=pali@kernel.org \
--cc=sjg@chromium.org \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.