[U-Boot] [PATCH 1/3] SPL: Let spl_parse_image_header() return value
Nishanth Menon
nm at ti.com
Fri May 20 23:56:03 CEST 2016
Marek,
Just forwarding report from Suman (in CC) reporting that as of u-boot
master 4b6e1fd "Merge git://git.denx.de/u-boot-dm"
It looks like BeagleBoard-X15, DRA7 platforms fail due to this commit.
Fail signature looks like the following:
...
DRA752 ES2.0
Trying to boot from MMC1
reading args
spl_load_image_fat_os: error reading image args, err - -1
reading u-boot.img
spl_load_image_fat: error reading image u-boot.img, err - 0
Failed to mount ext2 filesystem...
spl_load_image_ext_os: ext4fs mount err - 0
Failed to mount ext2 filesystem...
spl_load_image_ext: ext4fs mount err - 0
...
On Thu, Apr 28, 2016 at 5:44 PM, Marek Vasut <marex at denx.de> wrote:
> Allow the spl_parse_image_header() to return value. This is convenient
> for controlling the SPL boot flow if the loaded image is corrupted.
>
> Signed-off-by: Marek Vasut <marex at denx.de>
> Cc: Fabio Estevam <fabio.estevam at nxp.com>
> Cc: Peng Fan <van.freenix at gmail.com>
> Cc: Stefano Babic <sbabic at denx.de>
> Cc: Tom Rini <trini at konsulko.com>
> ---
> common/spl/spl.c | 3 ++-
> common/spl/spl_ext.c | 6 +++++-
> common/spl/spl_fat.c | 4 +++-
> common/spl/spl_mmc.c | 6 +++++-
> common/spl/spl_nand.c | 9 +++++++--
> common/spl/spl_net.c | 4 +---
> common/spl/spl_nor.c | 9 +++++++--
> common/spl/spl_onenand.c | 5 ++++-
> common/spl/spl_ymodem.c | 7 +++++--
> drivers/mtd/spi/spi_spl_load.c | 10 ++++++++--
> include/spl.h | 2 +-
> 11 files changed, 48 insertions(+), 17 deletions(-)
>
> diff --git a/common/spl/spl.c b/common/spl/spl.c
> index 82e7f58..7259619 100644
> --- a/common/spl/spl.c
> +++ b/common/spl/spl.c
> @@ -73,7 +73,7 @@ void spl_set_header_raw_uboot(void)
> spl_image.name = "U-Boot";
> }
>
> -void spl_parse_image_header(const struct image_header *header)
> +int spl_parse_image_header(const struct image_header *header)
> {
> u32 header_size = sizeof(struct image_header);
>
> @@ -118,6 +118,7 @@ void spl_parse_image_header(const struct image_header *header)
> spl_set_header_raw_uboot();
> #endif
> }
> + return 0;
> }
>
> __weak void __noreturn jump_to_image_no_args(struct spl_image_info *spl_image)
> diff --git a/common/spl/spl_ext.c b/common/spl/spl_ext.c
> index b77dbf4..ade5496 100644
> --- a/common/spl/spl_ext.c
> +++ b/common/spl/spl_ext.c
> @@ -48,7 +48,11 @@ int spl_load_image_ext(struct blk_desc *block_dev,
> goto end;
> }
>
> - spl_parse_image_header(header);
> + err = spl_parse_image_header(header);
> + if (err < 0) {
> + puts("spl: ext4fs_read failed\n");
> + goto end;
> + }
>
> err = ext4fs_read((char *)spl_image.load_addr, filelen, &actlen);
>
> diff --git a/common/spl/spl_fat.c b/common/spl/spl_fat.c
> index d761b26..338ea2f 100644
> --- a/common/spl/spl_fat.c
> +++ b/common/spl/spl_fat.c
> @@ -57,7 +57,9 @@ int spl_load_image_fat(struct blk_desc *block_dev,
> if (err <= 0)
> goto end;
>
> - spl_parse_image_header(header);
> + err = spl_parse_image_header(header);
> + if (err <= 0)
> + goto end;
>
> err = file_fat_read(filename, (u8 *)spl_image.load_addr, 0);
>
> diff --git a/common/spl/spl_mmc.c b/common/spl/spl_mmc.c
> index 8d588d1..360c754 100644
> --- a/common/spl/spl_mmc.c
> +++ b/common/spl/spl_mmc.c
> @@ -23,8 +23,12 @@ static int mmc_load_legacy(struct mmc *mmc, ulong sector,
> {
> u32 image_size_sectors;
> unsigned long count;
> + int ret;
> +
> + ret = spl_parse_image_header(header);
> + if (ret)
> + return ret;
>
> - spl_parse_image_header(header);
> /* convert size to sectors - round up */
> image_size_sectors = (spl_image.size + mmc->read_bl_len - 1) /
> mmc->read_bl_len;
> diff --git a/common/spl/spl_nand.c b/common/spl/spl_nand.c
> index 79388ff..bbd9546 100644
> --- a/common/spl/spl_nand.c
> +++ b/common/spl/spl_nand.c
> @@ -32,7 +32,10 @@ static int spl_nand_load_element(int offset, struct image_header *header)
> if (err)
> return err;
>
> - spl_parse_image_header(header);
> + err = spl_parse_image_header(header);
> + if (err)
> + return err;
> +
> return nand_spl_load_image(offset, spl_image.size,
> (void *)(unsigned long)spl_image.load_addr);
> }
> @@ -77,7 +80,9 @@ int spl_nand_load_image(void)
> /* load linux */
> nand_spl_load_image(CONFIG_SYS_NAND_SPL_KERNEL_OFFS,
> sizeof(*header), (void *)header);
> - spl_parse_image_header(header);
> + err = spl_parse_image_header(header);
> + if (err)
> + return err;
> if (header->ih_os == IH_OS_LINUX) {
> /* happy - was a linux */
> err = nand_spl_load_image(
> diff --git a/common/spl/spl_net.c b/common/spl/spl_net.c
> index 63b20d8..ae71d26 100644
> --- a/common/spl/spl_net.c
> +++ b/common/spl/spl_net.c
> @@ -34,7 +34,5 @@ int spl_net_load_image(const char *device)
> printf("Problem booting with BOOTP\n");
> return rv;
> }
> - spl_parse_image_header((struct image_header *)load_addr);
> -
> - return 0;
> + return spl_parse_image_header((struct image_header *)load_addr);
> }
> diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c
> index d0bd0b0..da2422f 100644
> --- a/common/spl/spl_nor.c
> +++ b/common/spl/spl_nor.c
> @@ -9,6 +9,7 @@
>
> int spl_nor_load_image(void)
> {
> + int ret;
> /*
> * Loading of the payload to SDRAM is done with skipping of
> * the mkimage header in this SPL NOR driver
> @@ -28,7 +29,9 @@ int spl_nor_load_image(void)
> if (image_get_os(header) == IH_OS_LINUX) {
> /* happy - was a Linux */
>
> - spl_parse_image_header(header);
> + ret = spl_parse_image_header(header);
> + if (ret)
> + return ret;
>
> memcpy((void *)spl_image.load_addr,
> (void *)(CONFIG_SYS_OS_BASE +
> @@ -56,8 +59,10 @@ int spl_nor_load_image(void)
> * Load real U-Boot from its location in NOR flash to its
> * defined location in SDRAM
> */
> - spl_parse_image_header(
> + ret = spl_parse_image_header(
> (const struct image_header *)CONFIG_SYS_UBOOT_BASE);
> + if (ret)
> + return ret;
>
> memcpy((void *)(unsigned long)spl_image.load_addr,
> (void *)(CONFIG_SYS_UBOOT_BASE + sizeof(struct image_header)),
> diff --git a/common/spl/spl_onenand.c b/common/spl/spl_onenand.c
> index af7d82e..1a28a84 100644
> --- a/common/spl/spl_onenand.c
> +++ b/common/spl/spl_onenand.c
> @@ -17,6 +17,7 @@
> int spl_onenand_load_image(void)
> {
> struct image_header *header;
> + int ret;
>
> debug("spl: onenand\n");
>
> @@ -25,7 +26,9 @@ int spl_onenand_load_image(void)
> /* Load u-boot */
> onenand_spl_load_image(CONFIG_SYS_ONENAND_U_BOOT_OFFS,
> CONFIG_SYS_ONENAND_PAGE_SIZE, (void *)header);
> - spl_parse_image_header(header);
> + ret = spl_parse_image_header(header);
> + if (ret)
> + return ret;
> onenand_spl_load_image(CONFIG_SYS_ONENAND_U_BOOT_OFFS,
> spl_image.size, (void *)spl_image.load_addr);
>
> diff --git a/common/spl/spl_ymodem.c b/common/spl/spl_ymodem.c
> index 380d8dd..4f26ea5 100644
> --- a/common/spl/spl_ymodem.c
> +++ b/common/spl/spl_ymodem.c
> @@ -40,8 +40,11 @@ int spl_ymodem_load_image(void)
> if (!ret) {
> while ((res =
> xyzModem_stream_read(buf, BUF_SIZE, &err)) > 0) {
> - if (addr == 0)
> - spl_parse_image_header((struct image_header *)buf);
> + if (addr == 0) {
> + ret = spl_parse_image_header((struct image_header *)buf);
> + if (ret)
> + return ret;
> + }
> store_addr = addr + spl_image.load_addr;
> size += res;
> addr += res;
> diff --git a/drivers/mtd/spi/spi_spl_load.c b/drivers/mtd/spi/spi_spl_load.c
> index ca56fe9..46c98a9 100644
> --- a/drivers/mtd/spi/spi_spl_load.c
> +++ b/drivers/mtd/spi/spi_spl_load.c
> @@ -23,6 +23,8 @@
> static int spi_load_image_os(struct spi_flash *flash,
> struct image_header *header)
> {
> + int err;
> +
> /* Read for a header, parse or error out. */
> spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS, 0x40,
> (void *)header);
> @@ -30,7 +32,9 @@ static int spi_load_image_os(struct spi_flash *flash,
> if (image_get_magic(header) != IH_MAGIC)
> return -1;
>
> - spl_parse_image_header(header);
> + err = spl_parse_image_header(header);
> + if (err)
> + return err;
>
> spi_flash_read(flash, CONFIG_SYS_SPI_KERNEL_OFFS,
> spl_image.size, (void *)spl_image.load_addr);
> @@ -81,7 +85,9 @@ int spl_spi_load_image(void)
> if (err)
> return err;
>
> - spl_parse_image_header(header);
> + err = spl_parse_image_header(header);
> + if (err)
> + return err;
> err = spi_flash_read(flash, CONFIG_SYS_SPI_U_BOOT_OFFS,
> spl_image.size, (void *)spl_image.load_addr);
> }
> diff --git a/include/spl.h b/include/spl.h
> index de4f70a..7edfab4 100644
> --- a/include/spl.h
> +++ b/include/spl.h
> @@ -56,7 +56,7 @@ void preloader_console_init(void);
> u32 spl_boot_device(void);
> u32 spl_boot_mode(void);
> void spl_set_header_raw_uboot(void);
> -void spl_parse_image_header(const struct image_header *header);
> +int spl_parse_image_header(const struct image_header *header);
> void spl_board_prepare_for_linux(void);
> void __noreturn jump_to_image_linux(void *arg);
> int spl_start_uboot(void);
> --
> 2.7.0
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
--
---
Regards,
Nishanth Menon
More information about the U-Boot
mailing list