[PATCH 2/2] env: add CONFIG_ENV_SECT_SIZE_AUTO

Rasmus Villemoes rasmus.villemoes at prevas.dk
Fri Sep 18 10:17:26 CEST 2020


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.villemoes at 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.villemoes at prevas.dk
www.prevas.dk


More information about the U-Boot mailing list