]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
env: sf: add support of command env erase
authorPatrick Delaunay <patrick.delaunay@foss.st.com>
Tue, 9 Feb 2021 10:48:52 +0000 (11:48 +0100)
committerTom Rini <trini@konsulko.com>
Fri, 16 Apr 2021 21:32:52 +0000 (17:32 -0400)
Add support of opts erase for env in SPI flash;
this opts is used by command 'env erase'.

This command only fills the env offset by 0x0 (bit flip to 0) and
the saved environment becomes invalid (with bad CRC).

It doesn't erase the sector here to avoid issue when the sector
is larger than the env (i.e. embedded when
CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE).

The needed sector erase will be managed in the next "env save" command,
using the opt ".save", before to update the environment in SPI flash.

Signed-off-by: Patrick Delaunay <patrick.delaunay@foss.st.com>
env/sf.c

index 20358f5c3f43f66885e839112828ffbc53f777d1..1c2ab9da9b96c78c9c878ff585c3c989b733a855 100644 (file)
--- a/env/sf.c
+++ b/env/sf.c
 #define INITENV
 #endif
 
+#define        OFFSET_INVALID          (~(u32)0)
+
 #ifdef CONFIG_ENV_OFFSET_REDUND
+#define ENV_OFFSET_REDUND      CONFIG_ENV_OFFSET_REDUND
+
 static ulong env_offset                = CONFIG_ENV_OFFSET;
 static ulong env_new_offset    = CONFIG_ENV_OFFSET_REDUND;
+
+#else
+
+#define ENV_OFFSET_REDUND      OFFSET_INVALID
+
 #endif /* CONFIG_ENV_OFFSET_REDUND */
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -288,6 +297,30 @@ out:
 }
 #endif
 
+static int env_sf_erase(void)
+{
+       int ret;
+       env_t env;
+
+       ret = setup_flash_device();
+       if (ret)
+               return ret;
+
+       memset(&env, 0, sizeof(env_t));
+       ret = spi_flash_write(env_flash, CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, &env);
+       if (ret)
+               goto done;
+
+       if (ENV_OFFSET_REDUND != OFFSET_INVALID)
+               ret = spi_flash_write(env_flash, ENV_OFFSET_REDUND, CONFIG_ENV_SIZE, &env);
+
+done:
+       spi_flash_free(env_flash);
+       env_flash = NULL;
+
+       return ret;
+}
+
 #if CONFIG_ENV_ADDR != 0x0
 __weak void *env_sf_get_env_addr(void)
 {
@@ -415,5 +448,6 @@ U_BOOT_ENV_LOCATION(sf) = {
        ENV_NAME("SPIFlash")
        .load           = env_sf_load,
        .save           = ENV_SAVE_PTR(env_sf_save),
+       .erase          = ENV_ERASE_PTR(env_sf_erase),
        .init           = env_sf_init,
 };