env: register erase command
authorFrank Wunderlich <frank-w@public-files.de>
Sat, 29 Jun 2019 09:36:19 +0000 (11:36 +0200)
committerTom Rini <trini@konsulko.com>
Thu, 18 Jul 2019 15:31:25 +0000 (11:31 -0400)
this patch adds basic changes for adding a erase-subcommand to env

with this command the environment stored on non-volatile storage written
by saveenv can be cleared.

Signed-off-by: Frank Wunderlich <frank-w@public-files.de>
squashed fixes
 - start message with "Erasing"
 - mark erase-function as optional
 - env: separate eraseenv from saveenv

Suggested-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
Reviewed-by: Simon Goldschmidt <simon.k.r.goldschmidt@gmail.com>
cmd/Kconfig
cmd/nvedit.c
env/env.c
include/environment.h

index 67284d8a5f6a2dc24cf86d0577814fdc4ba28272..ec746fe8255d4d9636fff7a6911d9d6e847a1ddd 100644 (file)
@@ -408,6 +408,14 @@ config CMD_SAVEENV
          Save all environment variables into the compiled-in persistent
          storage.
 
+config CMD_ERASEENV
+       bool "eraseenv"
+       default n
+       depends on CMD_SAVEENV
+       help
+         Erase environment variables from the compiled-in persistent
+         storage.
+
 config CMD_ENV_EXISTS
        bool "env exists"
        default y
index 7e468ab39d6a9e737c10990f46f479a8bced0c8e..46b1e60f0ad92372409fe738902fd2c18ceb3f9a 100644 (file)
@@ -767,6 +767,20 @@ U_BOOT_CMD(
        "save environment variables to persistent storage",
        ""
 );
+
+#if defined(CONFIG_CMD_ERASEENV)
+static int do_env_erase(cmd_tbl_t *cmdtp, int flag, int argc,
+                       char * const argv[])
+{
+       return env_erase() ? 1 : 0;
+}
+
+U_BOOT_CMD(
+       eraseenv, 1, 0, do_env_erase,
+       "erase environment variables from persistent storage",
+       ""
+);
+#endif
 #endif
 #endif /* CONFIG_SPL_BUILD */
 
@@ -1316,6 +1330,9 @@ static cmd_tbl_t cmd_env_sub[] = {
 #endif
 #if defined(CONFIG_CMD_SAVEENV) && defined(ENV_IS_IN_DEVICE)
        U_BOOT_CMD_MKENT(save, 1, 0, do_env_save, "", ""),
+#if defined(CONFIG_CMD_ERASEENV)
+       U_BOOT_CMD_MKENT(erase, 1, 0, do_env_erase, "", ""),
+#endif
 #endif
        U_BOOT_CMD_MKENT(set, CONFIG_SYS_MAXARGS, 0, do_env_set, "", ""),
 #if defined(CONFIG_CMD_ENV_EXISTS)
@@ -1396,6 +1413,9 @@ static char env_help_text[] =
 #endif
 #if defined(CONFIG_CMD_SAVEENV) && defined(ENV_IS_IN_DEVICE)
        "env save - save environment\n"
+#if defined(CONFIG_CMD_ERASEENV)
+       "env erase - erase environment\n"
+#endif
 #endif
 #if defined(CONFIG_CMD_NVEDIT_EFI)
        "env set -e name [arg ...] - set UEFI variable; unset if 'arg' not specified\n"
index 4b417b90a2912c201f201514e840d644f03e45e7..d3cbe2f9158429c95c095c9bed6564d9285702ef 100644 (file)
--- a/env/env.c
+++ b/env/env.c
@@ -24,6 +24,8 @@ void env_fix_drivers(void)
                        entry->load += gd->reloc_off;
                if (entry->save)
                        entry->save += gd->reloc_off;
+               if (entry->erase)
+                       entry->erase += gd->reloc_off;
                if (entry->init)
                        entry->init += gd->reloc_off;
        }
@@ -254,6 +256,34 @@ int env_save(void)
        return -ENODEV;
 }
 
+int env_erase(void)
+{
+       struct env_driver *drv;
+
+       drv = env_driver_lookup(ENVOP_ERASE, gd->env_load_prio);
+       if (drv) {
+               int ret;
+
+               if (!drv->erase)
+                       return -ENODEV;
+
+               if (!env_has_inited(drv->location))
+                       return -ENODEV;
+
+               printf("Erasing Environment on %s... ", drv->name);
+               ret = drv->erase();
+               if (ret)
+                       printf("Failed (%d)\n", ret);
+               else
+                       printf("OK\n");
+
+               if (!ret)
+                       return 0;
+       }
+
+       return -ENODEV;
+}
+
 int env_init(void)
 {
        struct env_driver *drv;
index cd966761416e0456f3dc79abed3afa0b28ce32e8..de67cf4f0ea8f0e7a66cebbdbabe55b62903d607 100644 (file)
@@ -200,6 +200,7 @@ enum env_operation {
        ENVOP_INIT,     /* we want to call the init function */
        ENVOP_LOAD,     /* we want to call the load function */
        ENVOP_SAVE,     /* we want to call the save function */
+       ENVOP_ERASE,    /* we want to call the erase function */
 };
 
 struct env_driver {
@@ -225,6 +226,15 @@ struct env_driver {
         */
        int (*save)(void);
 
+       /**
+        * erase() - Erase the environment on storage
+        *
+        * This method is optional and required for 'eraseenv' to work.
+        *
+        * @return 0 if OK, -ve on error
+        */
+       int (*erase)(void);
+
        /**
         * init() - Set up the initial pre-relocation environment
         *
@@ -303,6 +313,13 @@ int env_load(void);
  */
 int env_save(void);
 
+/**
+ * env_erase() - Erase the environment on storage
+ *
+ * @return 0 if OK, -ve on error
+ */
+int env_erase(void);
+
 /**
  * env_fix_drivers() - Updates envdriver as per relocation
  */