spl: spl_legacy: Fix NAND boot on OMAP3 BeagleBoard
authorRoger Quadros <rogerq@kernel.org>
Thu, 29 Sep 2022 10:11:28 +0000 (13:11 +0300)
committerTom Rini <trini@konsulko.com>
Wed, 26 Oct 2022 19:20:47 +0000 (15:20 -0400)
OMAP3 BeagleBoard NAND boot hangs when spl_load_legacy_img() tries
to read the header into 'struct hdr' which is allocated on the
stack.

As the header has already been read once before by spl_nand.c,
we can avoid the extra header allocation and read here by
simply passing around the pointer to the header.

This fixes NAND boot on OMAP3 BeagleBoard.

Signed-off-by: Roger Quadros <rogerq@kernel.org>
Reviewed-By: Michael Trimarchi <michael@amarulasolutions.com>
common/spl/spl_legacy.c
common/spl/spl_nand.c
common/spl/spl_nor.c
include/spl.h

index b3624df..4c7f446 100644 (file)
@@ -77,32 +77,29 @@ static inline int spl_image_get_comp(const struct legacy_img_hdr *hdr)
 
 int spl_load_legacy_img(struct spl_image_info *spl_image,
                        struct spl_boot_device *bootdev,
-                       struct spl_load_info *load, ulong header)
+                       struct spl_load_info *load, ulong offset,
+                       struct legacy_img_hdr *hdr)
 {
        __maybe_unused SizeT lzma_len;
        __maybe_unused void *src;
-       struct legacy_img_hdr hdr;
        ulong dataptr;
        int ret;
 
-       /* Read header into local struct */
-       load->read(load, header, sizeof(hdr), &hdr);
-
        /*
         * If the payload is compressed, the decompressed data should be
         * directly write to its load address.
         */
-       if (spl_image_get_comp(&hdr) != IH_COMP_NONE)
+       if (spl_image_get_comp(hdr) != IH_COMP_NONE)
                spl_image->flags |= SPL_COPY_PAYLOAD_ONLY;
 
-       ret = spl_parse_image_header(spl_image, bootdev, &hdr);
+       ret = spl_parse_image_header(spl_image, bootdev, hdr);
        if (ret)
                return ret;
 
        /* Read image */
-       switch (spl_image_get_comp(&hdr)) {
+       switch (spl_image_get_comp(hdr)) {
        case IH_COMP_NONE:
-               dataptr = header;
+               dataptr = offset;
 
                /*
                 * Image header will be skipped only if SPL_COPY_PAYLOAD_ONLY
@@ -119,7 +116,7 @@ int spl_load_legacy_img(struct spl_image_info *spl_image,
                lzma_len = LZMA_LEN;
 
                /* dataptr points to compressed payload  */
-               dataptr = header + sizeof(hdr);
+               dataptr = offset + sizeof(hdr);
 
                debug("LZMA: Decompressing %08lx to %08lx\n",
                      dataptr, spl_image->load_addr);
@@ -143,7 +140,7 @@ int spl_load_legacy_img(struct spl_image_info *spl_image,
 
        default:
                debug("Compression method %s is not supported\n",
-                     genimg_get_comp_short_name(image_get_comp(&hdr)));
+                     genimg_get_comp_short_name(image_get_comp(hdr)));
                return -EINVAL;
        }
 
index a167388..4f4c00f 100644 (file)
@@ -119,7 +119,7 @@ static int spl_nand_load_element(struct spl_image_info *spl_image,
                load.bl_len = 1;
                load.read = spl_nand_legacy_read;
 
-               return spl_load_legacy_img(spl_image, bootdev, &load, offset);
+               return spl_load_legacy_img(spl_image, bootdev, &load, offset, header);
        } else {
                err = spl_parse_image_header(spl_image, bootdev, header);
                if (err)
index 281c613..eaa95fb 100644 (file)
@@ -111,10 +111,14 @@ static int spl_nor_load_image(struct spl_image_info *spl_image,
 
        /* Legacy image handling */
        if (IS_ENABLED(CONFIG_SPL_LEGACY_IMAGE_FORMAT)) {
+               struct legacy_img_hdr hdr;
+
                load.bl_len = 1;
                load.read = spl_nor_load_read;
+               spl_nor_load_read(&load, spl_nor_get_uboot_base(), sizeof(hdr), &hdr);
                return spl_load_legacy_img(spl_image, bootdev, &load,
-                                          spl_nor_get_uboot_base());
+                                          spl_nor_get_uboot_base(),
+                                          &hdr);
        }
 
        return 0;
index 0fc3686..303a657 100644 (file)
@@ -353,7 +353,8 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
  * spl_load_legacy_img() - Loads a legacy image from a device.
  * @spl_image: Image description to set up
  * @load:      Structure containing the information required to load data.
- * @header:    Pointer to image header (including appended image)
+ * @offset:    Pointer to image
+ * @hdr:       Pointer to image header
  *
  * Reads an legacy image from the device. Loads u-boot image to
  * specified load address.
@@ -361,7 +362,9 @@ int spl_load_simple_fit(struct spl_image_info *spl_image,
  */
 int spl_load_legacy_img(struct spl_image_info *spl_image,
                        struct spl_boot_device *bootdev,
-                       struct spl_load_info *load, ulong header);
+                       struct spl_load_info *load, ulong offset,
+                       struct legacy_img_hdr *hdr);
+
 
 /**
  * spl_load_imx_container() - Loads a imx container image from a device.