mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 23:51:33 +00:00
env: sf: add support of command env erase
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>
This commit is contained in:
parent
e41f55b32e
commit
25d90ad45a
1 changed files with 34 additions and 0 deletions
34
env/sf.c
vendored
34
env/sf.c
vendored
|
@ -28,9 +28,18 @@
|
||||||
#define INITENV
|
#define INITENV
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define OFFSET_INVALID (~(u32)0)
|
||||||
|
|
||||||
#ifdef CONFIG_ENV_OFFSET_REDUND
|
#ifdef CONFIG_ENV_OFFSET_REDUND
|
||||||
|
#define ENV_OFFSET_REDUND CONFIG_ENV_OFFSET_REDUND
|
||||||
|
|
||||||
static ulong env_offset = CONFIG_ENV_OFFSET;
|
static ulong env_offset = CONFIG_ENV_OFFSET;
|
||||||
static ulong env_new_offset = CONFIG_ENV_OFFSET_REDUND;
|
static ulong env_new_offset = CONFIG_ENV_OFFSET_REDUND;
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
#define ENV_OFFSET_REDUND OFFSET_INVALID
|
||||||
|
|
||||||
#endif /* CONFIG_ENV_OFFSET_REDUND */
|
#endif /* CONFIG_ENV_OFFSET_REDUND */
|
||||||
|
|
||||||
DECLARE_GLOBAL_DATA_PTR;
|
DECLARE_GLOBAL_DATA_PTR;
|
||||||
|
@ -288,6 +297,30 @@ out:
|
||||||
}
|
}
|
||||||
#endif
|
#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
|
#if CONFIG_ENV_ADDR != 0x0
|
||||||
__weak void *env_sf_get_env_addr(void)
|
__weak void *env_sf_get_env_addr(void)
|
||||||
{
|
{
|
||||||
|
@ -415,5 +448,6 @@ U_BOOT_ENV_LOCATION(sf) = {
|
||||||
ENV_NAME("SPIFlash")
|
ENV_NAME("SPIFlash")
|
||||||
.load = env_sf_load,
|
.load = env_sf_load,
|
||||||
.save = ENV_SAVE_PTR(env_sf_save),
|
.save = ENV_SAVE_PTR(env_sf_save),
|
||||||
|
.erase = ENV_ERASE_PTR(env_sf_erase),
|
||||||
.init = env_sf_init,
|
.init = env_sf_init,
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in a new issue