On 06/05/2020 10.47, Rasmus Villemoes wrote: > 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.
ping > Signed-off-by: Rasmus Villemoes <rasmus.villem...@prevas.dk> > --- > env/Kconfig | 14 ++++++++++++++ > env/sf.c | 10 ++++++++-- > 2 files changed, 22 insertions(+), 2 deletions(-) > > diff --git a/env/Kconfig b/env/Kconfig > index 969308fe6c..c90cd04604 100644 > --- a/env/Kconfig > +++ b/env/Kconfig > @@ -317,6 +317,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 > diff --git a/env/sf.c b/env/sf.c > index cd5339578b..644e78fe3d 100644 > --- a/env/sf.c > +++ b/env/sf.c > @@ -69,7 +69,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; > > @@ -77,6 +77,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; > @@ -184,7 +187,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; > @@ -194,6 +197,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; > -- Rasmus Villemoes Software Developer Prevas A/S Hedeager 3 DK-8200 Aarhus N +45 51210274 rasmus.villem...@prevas.dk www.prevas.dk