[U-Boot] [PATCH] Revert "env: add spi_flash_read_env function"
Stefano Babic
sbabic at denx.de
Wed Mar 13 12:21:20 UTC 2019
On 13/03/19 12:15, Heiko Schocher wrote:
> This reverts commit 9a9d66f5eff0f443de4c2c6ca3e27771ed14b1b4.
>
> because it breaks fw_setenv and U-Boot interworking, if
> U-Boot environment is stored in a SPI-NOR.
>
> Reproduce it with:
> boot linux with empty Environment and store a variable
> with fw_setenv into it, the Environment is now filled
> with 0xff:
>
> root at ckey5e:10:8e:~# hexdump -C /dev/mtd4
> 00000000 e9 e8 07 fa 01 62 6f 6f 74 63 6d 64 3d 72 75 6e |.....bootcmd=run|
> [...]
> 00000f30 7d 00 75 62 69 62 6f 6f 74 76 6f 6c 3d 32 00 00 |}.ubibootvol=2..|
> 00000f40 00 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
>
> Boot now U-Boot prints:
>
> Loading Environment from SPI Flash... SF: Detected s25fl128l with page size 256 Bytes, erase size 4 KiB, total 16 MiB
> *** Warning - bad CRC, using default environment
>
> Reason is the above commit, as it only reads until \0\0
> is found, and assumes the rest of the Environment
> space is filled with 0x00, which is not the case when
> saving an Environment under linux with fw_setenv.
>
> Signed-off-by: Heiko Schocher <hs at denx.de>
> ---
Acked-by: Stefano Babic <sbabic at denx.de>
In fact, the commit breaks the API between U-Boot and Linux and
optimizes a specific use case in U-Boot only. The API foresees that
there is an environment of a specific size without bothering (in linux)
where it is stored. It is strictly required that the environment has the
same format for all underlying storage - it must be possible to simply
copy the environment. Commit breaks tools like mkenvimage, too.
Best regards,
Stefano Babic
> I already posted a fix:
> https://lists.denx.de/pipermail/u-boot/2019-January/355148.html
> which I withdrawed:
> https://lists.denx.de/pipermail/u-boot/2019-January/355529.html
>
> because I did not recognised the correlation between fw_setenv
> in linux context and saveenv in U-Boot context.
>
> I think now, best is to revert this commit.
>
> Comments?
>
> This patch drops checkpatch warnings:
> env/sf.c:120: check: Alignment should match open parenthesis
> env/sf.c:224: check: Alignment should match open parenthesis
> env/sf.c:281: check: Alignment should match open parenthesis
>
> but as it is a revert I did not correct them.
>
> env/sf.c | 56 +++++++++++---------------------------------------------
> 1 file changed, 11 insertions(+), 45 deletions(-)
>
> diff --git a/env/sf.c b/env/sf.c
> index b3dec82c35..23cbad5d88 100644
> --- a/env/sf.c
> +++ b/env/sf.c
> @@ -81,40 +81,6 @@ static int setup_flash_device(void)
> return 0;
> }
>
> -static int is_end(const char *addr, size_t size)
> -{
> - /* The end of env variables is marked by '\0\0' */
> - int i = 0;
> -
> - for (i = 0; i < size - 1; ++i)
> - if (addr[i] == 0x0 && addr[i + 1] == 0x0)
> - return 1;
> - return 0;
> -}
> -
> -static int spi_flash_read_env(struct spi_flash *flash, u32 offset, size_t len,
> - void *buf)
> -{
> - u32 addr = 0;
> - u32 page_size = flash->page_size;
> -
> - memset(buf, 0x0, len);
> - for (int i = 0; i < len / page_size; ++i) {
> - int ret = spi_flash_read(flash, offset, page_size,
> - &((char *)buf)[addr]);
> -
> - if (ret < 0)
> - return ret;
> -
> - if (is_end(&((char *)buf)[addr], page_size))
> - return 0;
> -
> - addr += page_size;
> - offset += page_size;
> - }
> - return 0;
> -}
> -
> #if defined(CONFIG_ENV_OFFSET_REDUND)
> #ifdef CMD_SAVEENV
> static int env_sf_save(void)
> @@ -150,8 +116,8 @@ static int env_sf_save(void)
> ret = -ENOMEM;
> goto done;
> }
> - ret = spi_flash_read_env(env_flash, saved_offset,
> - saved_size, saved_buffer);
> + ret = spi_flash_read(env_flash, saved_offset,
> + saved_size, saved_buffer);
> if (ret)
> goto done;
> }
> @@ -217,10 +183,10 @@ static int env_sf_load(void)
> if (ret)
> goto out;
>
> - read1_fail = spi_flash_read_env(env_flash, CONFIG_ENV_OFFSET,
> - CONFIG_ENV_SIZE, tmp_env1);
> - read2_fail = spi_flash_read_env(env_flash, CONFIG_ENV_OFFSET_REDUND,
> - CONFIG_ENV_SIZE, tmp_env2);
> + read1_fail = spi_flash_read(env_flash, CONFIG_ENV_OFFSET,
> + CONFIG_ENV_SIZE, tmp_env1);
> + read2_fail = spi_flash_read(env_flash, CONFIG_ENV_OFFSET_REDUND,
> + CONFIG_ENV_SIZE, tmp_env2);
>
> ret = env_import_redund((char *)tmp_env1, read1_fail, (char *)tmp_env2,
> read2_fail);
> @@ -254,8 +220,8 @@ static int env_sf_save(void)
> if (!saved_buffer)
> goto done;
>
> - ret = spi_flash_read_env(env_flash, saved_offset,
> - saved_size, saved_buffer);
> + ret = spi_flash_read(env_flash, saved_offset,
> + saved_size, saved_buffer);
> if (ret)
> goto done;
> }
> @@ -311,10 +277,10 @@ static int env_sf_load(void)
> if (ret)
> goto out;
>
> - ret = spi_flash_read_env(env_flash, CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE,
> - buf);
> + ret = spi_flash_read(env_flash,
> + CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, buf);
> if (ret) {
> - set_default_env("spi_flash_read_env() failed", 0);
> + set_default_env("spi_flash_read() failed", 0);
> goto err_read;
> }
>
>
--
=====================================================================
DENX Software Engineering GmbH, Managing Director: Wolfgang Denk
HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: +49-8142-66989-53 Fax: +49-8142-66989-80 Email: sbabic at denx.de
=====================================================================
More information about the U-Boot
mailing list