[PATCH 2/2] env: add CONFIG_ENV_SECT_SIZE_AUTO

Joakim Tjernlund Joakim.Tjernlund at infinera.com
Wed May 6 10:59:38 CEST 2020


On Wed, 2020-05-06 at 10:47 +0200, Rasmus Villemoes wrote:
> CAUTION: This email originated from outside of the organization. Do not click links or open attachments unless you recognize the sender and know the content is safe.
> 
> 
> 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.

I see, It had been good if one could have used 0

> 
> 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.

Please don't stop at just SPI Flash, we could use this for common NOR flashes too.

> 
> 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 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;
> --
> 2.23.0
> 



More information about the U-Boot mailing list