Merge branch '2022-06-22-platform-updates-and-additions' into next
[platform/kernel/u-boot.git] / cmd / nvedit.c
index 7fce723..53e6b57 100644 (file)
 #include <env.h>
 #include <env_internal.h>
 #include <log.h>
-#include <net.h>
 #include <search.h>
 #include <errno.h>
 #include <malloc.h>
 #include <mapmem.h>
+#include <asm/global_data.h>
 #include <linux/bitops.h>
 #include <u-boot/crc.h>
-#include <watchdog.h>
 #include <linux/stddef.h>
 #include <asm/byteorder.h>
 #include <asm/io.h>
@@ -266,7 +265,9 @@ static int _do_env_set(int flag, int argc, char *const argv[], int env_flag)
        /* Delete only ? */
        if (argc < 3 || argv[2] == NULL) {
                int rc = hdelete_r(name, &env_htab, env_flag);
-               return !rc;
+
+               /* If the variable didn't exist, don't report an error */
+               return rc && rc != -ENOENT ? 1 : 0;
        }
 
        /*
@@ -317,69 +318,6 @@ int env_set(const char *varname, const char *varvalue)
                return _do_env_set(0, 3, (char * const *)argv, H_PROGRAMMATIC);
 }
 
-/**
- * Set an environment variable to an integer value
- *
- * @param varname      Environment variable to set
- * @param value                Value to set it to
- * @return 0 if ok, 1 on error
- */
-int env_set_ulong(const char *varname, ulong value)
-{
-       /* TODO: this should be unsigned */
-       char *str = simple_itoa(value);
-
-       return env_set(varname, str);
-}
-
-/**
- * Set an environment variable to an value in hex
- *
- * @param varname      Environment variable to set
- * @param value                Value to set it to
- * @return 0 if ok, 1 on error
- */
-int env_set_hex(const char *varname, ulong value)
-{
-       char str[17];
-
-       sprintf(str, "%lx", value);
-       return env_set(varname, str);
-}
-
-ulong env_get_hex(const char *varname, ulong default_val)
-{
-       const char *s;
-       ulong value;
-       char *endp;
-
-       s = env_get(varname);
-       if (s)
-               value = simple_strtoul(s, &endp, 16);
-       if (!s || endp == s)
-               return default_val;
-
-       return value;
-}
-
-int eth_env_get_enetaddr(const char *name, uint8_t *enetaddr)
-{
-       string_to_enetaddr(env_get(name), enetaddr);
-       return is_valid_ethaddr(enetaddr);
-}
-
-int eth_env_set_enetaddr(const char *name, const uint8_t *enetaddr)
-{
-       char buf[ARP_HLEN_ASCII + 1];
-
-       if (eth_env_get_enetaddr(name, (uint8_t *)buf))
-               return -EEXIST;
-
-       sprintf(buf, "%pM", enetaddr);
-
-       return env_set(name, buf);
-}
-
 #ifndef CONFIG_SPL_BUILD
 static int do_env_set(struct cmd_tbl *cmdtp, int flag, int argc,
                      char *const argv[])
@@ -420,7 +358,7 @@ int do_env_ask(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
         * the size.  Otherwise we echo it as part of the
         * message.
         */
-       i = simple_strtoul(argv[argc - 1], &endptr, 10);
+       i = dectoul(argv[argc - 1], &endptr);
        if (*endptr != '\0') {                  /* no size */
                size = CONFIG_SYS_CBSIZE - 1;
        } else {                                /* size given */
@@ -658,115 +596,7 @@ static int do_env_edit(struct cmd_tbl *cmdtp, int flag, int argc,
        }
 }
 #endif /* CONFIG_CMD_EDITENV */
-#endif /* CONFIG_SPL_BUILD */
-
-/*
- * Look up variable from environment,
- * return address of storage for that variable,
- * or NULL if not found
- */
-char *env_get(const char *name)
-{
-       if (gd->flags & GD_FLG_ENV_READY) { /* after import into hashtable */
-               struct env_entry e, *ep;
-
-               WATCHDOG_RESET();
-
-               e.key   = name;
-               e.data  = NULL;
-               hsearch_r(e, ENV_FIND, &ep, &env_htab, 0);
-
-               return ep ? ep->data : NULL;
-       }
-
-       /* restricted capabilities before import */
-       if (env_get_f(name, (char *)(gd->env_buf), sizeof(gd->env_buf)) > 0)
-               return (char *)(gd->env_buf);
-
-       return NULL;
-}
-
-/*
- * Like env_get, but prints an error if envvar isn't defined in the
- * environment.  It always returns what env_get does, so it can be used in
- * place of env_get without changing error handling otherwise.
- */
-char *from_env(const char *envvar)
-{
-       char *ret;
-
-       ret = env_get(envvar);
-
-       if (!ret)
-               printf("missing environment variable: %s\n", envvar);
 
-       return ret;
-}
-
-/*
- * Look up variable from environment for restricted C runtime env.
- */
-int env_get_f(const char *name, char *buf, unsigned len)
-{
-       int i, nxt, c;
-
-       for (i = 0; env_get_char(i) != '\0'; i = nxt + 1) {
-               int val, n;
-
-               for (nxt = i; (c = env_get_char(nxt)) != '\0'; ++nxt) {
-                       if (c < 0)
-                               return c;
-                       if (nxt >= CONFIG_ENV_SIZE)
-                               return -1;
-               }
-
-               val = env_match((uchar *)name, i);
-               if (val < 0)
-                       continue;
-
-               /* found; copy out */
-               for (n = 0; n < len; ++n, ++buf) {
-                       c = env_get_char(val++);
-                       if (c < 0)
-                               return c;
-                       *buf = c;
-                       if (*buf == '\0')
-                               return n;
-               }
-
-               if (n)
-                       *--buf = '\0';
-
-               printf("env_buf [%u bytes] too small for value of \"%s\"\n",
-                      len, name);
-
-               return n;
-       }
-
-       return -1;
-}
-
-/**
- * Decode the integer value of an environment variable and return it.
- *
- * @param name         Name of environment variable
- * @param base         Number base to use (normally 10, or 16 for hex)
- * @param default_val  Default value to return if the variable is not
- *                     found
- * @return the decoded value, or default_val if not found
- */
-ulong env_get_ulong(const char *name, int base, ulong default_val)
-{
-       /*
-        * We can use env_get() here, even before relocation, since the
-        * environment variable value is an integer and thus short.
-        */
-       const char *str = env_get(name);
-
-       return str ? simple_strtoul(str, NULL, base) : default_val;
-}
-
-#ifndef CONFIG_SPL_BUILD
 #if defined(CONFIG_CMD_SAVEENV) && defined(ENV_IS_IN_DEVICE)
 static int do_env_save(struct cmd_tbl *cmdtp, int flag, int argc,
                       char *const argv[])
@@ -813,21 +643,6 @@ static int do_env_select(struct cmd_tbl *cmdtp, int flag, int argc,
 
 #endif /* CONFIG_SPL_BUILD */
 
-int env_match(uchar *s1, int i2)
-{
-       if (s1 == NULL)
-               return -1;
-
-       while (*s1 == env_get_char(i2++))
-               if (*s1++ == '=')
-                       return i2;
-
-       if (*s1 == '\0' && env_get_char(i2-1) == '=')
-               return i2;
-
-       return -1;
-}
-
 #ifndef CONFIG_SPL_BUILD
 static int do_env_default(struct cmd_tbl *cmdtp, int flag,
                          int argc, char *const argv[])
@@ -895,7 +710,7 @@ static int do_env_delete(struct cmd_tbl *cmdtp, int flag,
        while (--argc > 0) {
                char *name = *++argv;
 
-               if (!hdelete_r(name, &env_htab, env_flag))
+               if (hdelete_r(name, &env_htab, env_flag))
                        ret = 1;
        }
 
@@ -981,7 +796,7 @@ static int do_env_export(struct cmd_tbl *cmdtp, int flag,
                        case 's':               /* size given */
                                if (--argc <= 0)
                                        return cmd_usage(cmdtp);
-                               size = simple_strtoul(*++argv, NULL, 16);
+                               size = hextoul(*++argv, NULL);
                                goto NXTARG;
                        case 't':               /* text format */
                                if (fmt++)
@@ -998,7 +813,7 @@ NXTARG:             ;
        if (argc < 1)
                return CMD_RET_USAGE;
 
-       addr = simple_strtoul(argv[0], NULL, 16);
+       addr = hextoul(argv[0], NULL);
        ptr = map_sysmem(addr, size);
 
        if (size)
@@ -1137,11 +952,11 @@ static int do_env_import(struct cmd_tbl *cmdtp, int flag,
        if (sep != '\n' && crlf_is_lf )
                crlf_is_lf = 0;
 
-       addr = simple_strtoul(argv[0], NULL, 16);
+       addr = hextoul(argv[0], NULL);
        ptr = map_sysmem(addr, 0);
 
        if (argc >= 2 && strcmp(argv[1], "-")) {
-               size = simple_strtoul(argv[1], NULL, 16);
+               size = hextoul(argv[1], NULL);
        } else if (chk) {
                puts("## Error: external checksum format must pass size\n");
                return CMD_RET_FAILURE;
@@ -1203,6 +1018,45 @@ sep_err:
 }
 #endif
 
+#if defined(CONFIG_CMD_NVEDIT_INDIRECT)
+static int do_env_indirect(struct cmd_tbl *cmdtp, int flag,
+                      int argc, char *const argv[])
+{
+       char *to = argv[1];
+       char *from = argv[2];
+       char *default_value = NULL;
+       int ret = 0;
+
+       if (argc < 3 || argc > 4) {
+               return CMD_RET_USAGE;
+       }
+
+       if (argc == 4) {
+               default_value = argv[3];
+       }
+
+       if (env_get(from) == NULL && default_value == NULL) {
+               printf("## env indirect: Environment variable for <from> (%s) does not exist.\n", from);
+
+               return CMD_RET_FAILURE;
+       }
+
+       if (env_get(from) == NULL) {
+               ret = env_set(to, default_value);
+       }
+       else {
+               ret = env_set(to, env_get(from));
+       }
+
+       if (ret == 0) {
+               return CMD_RET_SUCCESS;
+       }
+       else {
+               return CMD_RET_FAILURE;
+       }
+}
+#endif
+
 #if defined(CONFIG_CMD_NVEDIT_INFO)
 /*
  * print_env_info - print environment information
@@ -1366,6 +1220,9 @@ static struct cmd_tbl cmd_env_sub[] = {
 #if defined(CONFIG_CMD_IMPORTENV)
        U_BOOT_CMD_MKENT(import, 5, 0, do_env_import, "", ""),
 #endif
+#if defined(CONFIG_CMD_NVEDIT_INDIRECT)
+       U_BOOT_CMD_MKENT(indirect, 3, 0, do_env_indirect, "", ""),
+#endif
 #if defined(CONFIG_CMD_NVEDIT_INFO)
        U_BOOT_CMD_MKENT(info, 3, 0, do_env_info, "", ""),
 #endif
@@ -1450,6 +1307,9 @@ static char env_help_text[] =
 #if defined(CONFIG_CMD_IMPORTENV)
        "env import [-d] [-t [-r] | -b | -c] addr [size] [var ...] - import environment\n"
 #endif
+#if defined(CONFIG_CMD_NVEDIT_INDIRECT)
+       "env indirect <to> <from> [default] - sets <to> to the value of <from>, using [default] when unset\n"
+#endif
 #if defined(CONFIG_CMD_NVEDIT_INFO)
        "env info - display environment information\n"
        "env info [-d] [-p] [-q] - evaluate environment information\n"