mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-10 15:14:43 +00:00
env: add CONFIG_ENV_SECT_SIZE_AUTO
This is roughly the U-Boot side equivalent to commit
e282c422e0
(tools: fw_env: use erasesize from MEMGETINFO ioctl). The
motivation is the case where one has a board with several revisions,
where the SPI flashes have different erase sizes.
In our case, we have an 8K environment, and the flashes have erase
sizes of 4K (newer boards) and 64K (older boards). Currently, we must
set CONFIG_ENV_SECT_SIZE to 64K to make the code work on the older
boards, but for the newer ones, that ends up wasting quite a bit of
time reading/erasing/restoring the last 56K.
At first, I wanted to allow setting CONFIG_ENV_SECT_SIZE to 0 to mean
"use the erase size the chip reports", but that config
option is used in a number of preprocessor conditionals, and shared
between ENV_IS_IN_FLASH and ENV_IS_IN_SPI_FLASH.
So instead, introduce a new boolean config option, which for now can
only be used with ENV_IS_IN_SPI_FLASH. If left off, there's no change
in behaviour.
The only slightly annoying detail is that, when selected, the compiler
is apparently not smart enough to see that the the saved_size and
saved_offset variables are only used under the same "if (sect_size >
CONFIG_ENV_SIZE)" condition as where they are computed, so we need to
initialize them to 0 to avoid "may be used uninitialized" warnings.
On our newer boards with the 4K erase size, saving the environment now
takes 0.080 seconds instead of 0.53 seconds, which directly translates
to that much faster boot time since our logic always causes the
environment to be written during boot.
Signed-off-by: Rasmus Villemoes <rasmus.villemoes@prevas.dk>
This commit is contained in:
parent
4da7347d85
commit
bcb44f62b2
2 changed files with 22 additions and 2 deletions
14
env/Kconfig
vendored
14
env/Kconfig
vendored
|
@ -324,6 +324,20 @@ config ENV_IS_IN_SPI_FLASH
|
|||
during a "saveenv" operation. CONFIG_ENV_OFFSET_REDUND must be
|
||||
aligned to an erase sector boundary.
|
||||
|
||||
config ENV_SECT_SIZE_AUTO
|
||||
bool "Use automatically detected sector size"
|
||||
depends on ENV_IS_IN_SPI_FLASH
|
||||
help
|
||||
Some boards exist in multiple variants, with different
|
||||
flashes having different sector sizes. In such cases, you
|
||||
can select this option to make U-Boot use the actual sector
|
||||
size when figuring out how much to erase, which can thus be
|
||||
more efficient on the flashes with smaller erase size. Since
|
||||
the environment must always be aligned on a sector boundary,
|
||||
CONFIG_ENV_OFFSET must be aligned to the largest of the
|
||||
different sector sizes, and CONFIG_ENV_SECT_SIZE should be
|
||||
set to that value.
|
||||
|
||||
config USE_ENV_SPI_BUS
|
||||
bool "SPI flash bus for environment"
|
||||
depends on ENV_IS_IN_SPI_FLASH
|
||||
|
|
10
env/sf.c
vendored
10
env/sf.c
vendored
|
@ -72,7 +72,7 @@ static int env_sf_save(void)
|
|||
{
|
||||
env_t env_new;
|
||||
char *saved_buffer = NULL, flag = ENV_REDUND_OBSOLETE;
|
||||
u32 saved_size, saved_offset, sector;
|
||||
u32 saved_size = 0, saved_offset = 0, sector;
|
||||
u32 sect_size = CONFIG_ENV_SECT_SIZE;
|
||||
int ret;
|
||||
|
||||
|
@ -80,6 +80,9 @@ static int env_sf_save(void)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (IS_ENABLED(CONFIG_ENV_SECT_SIZE_AUTO))
|
||||
sect_size = env_flash->mtd.erasesize;
|
||||
|
||||
ret = env_export(&env_new);
|
||||
if (ret)
|
||||
return -EIO;
|
||||
|
@ -187,7 +190,7 @@ out:
|
|||
#else
|
||||
static int env_sf_save(void)
|
||||
{
|
||||
u32 saved_size, saved_offset, sector;
|
||||
u32 saved_size = 0, saved_offset = 0, sector;
|
||||
u32 sect_size = CONFIG_ENV_SECT_SIZE;
|
||||
char *saved_buffer = NULL;
|
||||
int ret = 1;
|
||||
|
@ -197,6 +200,9 @@ static int env_sf_save(void)
|
|||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (IS_ENABLED(CONFIG_ENV_SECT_SIZE_AUTO))
|
||||
sect_size = env_flash->mtd.erasesize;
|
||||
|
||||
/* Is the sector larger than the env (i.e. embedded) */
|
||||
if (sect_size > CONFIG_ENV_SIZE) {
|
||||
saved_size = sect_size - CONFIG_ENV_SIZE;
|
||||
|
|
Loading…
Reference in a new issue