[U-Boot] [PATCH v2 1/2] env: register erase command
Frank Wunderlich
frank-w at public-files.de
Mon Apr 8 10:33:44 UTC 2019
Signed-off-by: Frank Wunderlich <frank-w at public-files.de>
---
cmd/nvedit.c | 13 +++++++++++++
env/env.c | 30 ++++++++++++++++++++++++++++++
env/mmc.c | 7 +++++++
include/environment.h | 17 +++++++++++++++++
4 files changed, 67 insertions(+)
diff --git a/cmd/nvedit.c b/cmd/nvedit.c
index 24a6cf7824..3b5c62d629 100644
--- a/cmd/nvedit.c
+++ b/cmd/nvedit.c
@@ -756,11 +756,22 @@ static int do_env_save(cmd_tbl_t *cmdtp, int flag, int argc,
return env_save() ? 1 : 0;
}
+static int do_env_erase(cmd_tbl_t *cmdtp, int flag, int argc,
+ char * const argv[])
+{
+ return env_erase() ? 1 : 0;
+}
+
U_BOOT_CMD(
saveenv, 1, 0, do_env_save,
"save environment variables to persistent storage",
""
);
+U_BOOT_CMD(
+ eraseenv, 1, 0, do_env_erase,
+ "erase environment variables from persistent storage",
+ ""
+);
#endif
#endif /* CONFIG_SPL_BUILD */
@@ -1207,6 +1218,7 @@ static cmd_tbl_t cmd_env_sub[] = {
#endif
#if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
U_BOOT_CMD_MKENT(save, 1, 0, do_env_save, "", ""),
+ U_BOOT_CMD_MKENT(erase, 1, 0, do_env_erase, "", ""),
#endif
U_BOOT_CMD_MKENT(set, CONFIG_SYS_MAXARGS, 0, do_env_set, "", ""),
#if defined(CONFIG_CMD_ENV_EXISTS)
@@ -1282,6 +1294,7 @@ static char env_help_text[] =
#endif
#if defined(CONFIG_CMD_SAVEENV) && !defined(CONFIG_ENV_IS_NOWHERE)
"env save - save environment\n"
+ "env erase - erase environment\n"
#endif
#if defined(CONFIG_CMD_NVEDIT_EFI)
"env set -e name [arg ...] - set UEFI variable; unset if 'arg' not specified\n"
diff --git a/env/env.c b/env/env.c
index 4b417b90a2..25441370e6 100644
--- 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("Erase 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;
diff --git a/env/mmc.c b/env/mmc.c
index c3cf35d01b..c5b6356363 100644
--- a/env/mmc.c
+++ b/env/mmc.c
@@ -242,6 +242,12 @@ fini:
fini_mmc_for_env(mmc);
return ret;
}
+
+static int env_mmc_erase(void)
+{
+ return 0;//1 on error
+}
+
#endif /* CONFIG_CMD_SAVEENV && !CONFIG_SPL_BUILD */
static inline int read_env(struct mmc *mmc, unsigned long size,
@@ -351,5 +357,6 @@ U_BOOT_ENV_LOCATION(mmc) = {
.load = env_mmc_load,
#ifndef CONFIG_SPL_BUILD
.save = env_save_ptr(env_mmc_save),
+ .erase = env_mmc_erase,
#endif
};
diff --git a/include/environment.h b/include/environment.h
index cd96676141..5024cbea7e 100644
--- a/include/environment.h
+++ b/include/environment.h
@@ -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 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
*/
--
2.17.1
More information about the U-Boot
mailing list