spl: spl_legacy: Fix NAND boot on OMAP3 BeagleBoard

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>
This commit is contained in:
Roger Quadros 2022-09-29 13:11:28 +03:00 committed by Tom Rini
parent 0abe3323f5
commit 06377c5a1f
4 changed files with 19 additions and 15 deletions

View 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, int spl_load_legacy_img(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev, 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 SizeT lzma_len;
__maybe_unused void *src; __maybe_unused void *src;
struct legacy_img_hdr hdr;
ulong dataptr; ulong dataptr;
int ret; int ret;
/* Read header into local struct */
load->read(load, header, sizeof(hdr), &hdr);
/* /*
* If the payload is compressed, the decompressed data should be * If the payload is compressed, the decompressed data should be
* directly write to its load address. * 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; 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) if (ret)
return ret; return ret;
/* Read image */ /* Read image */
switch (spl_image_get_comp(&hdr)) { switch (spl_image_get_comp(hdr)) {
case IH_COMP_NONE: case IH_COMP_NONE:
dataptr = header; dataptr = offset;
/* /*
* Image header will be skipped only if SPL_COPY_PAYLOAD_ONLY * 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; lzma_len = LZMA_LEN;
/* dataptr points to compressed payload */ /* dataptr points to compressed payload */
dataptr = header + sizeof(hdr); dataptr = offset + sizeof(hdr);
debug("LZMA: Decompressing %08lx to %08lx\n", debug("LZMA: Decompressing %08lx to %08lx\n",
dataptr, spl_image->load_addr); dataptr, spl_image->load_addr);
@ -143,7 +140,7 @@ int spl_load_legacy_img(struct spl_image_info *spl_image,
default: default:
debug("Compression method %s is not supported\n", 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; return -EINVAL;
} }

View File

@ -119,7 +119,7 @@ static int spl_nand_load_element(struct spl_image_info *spl_image,
load.bl_len = 1; load.bl_len = 1;
load.read = spl_nand_legacy_read; 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 { } else {
err = spl_parse_image_header(spl_image, bootdev, header); err = spl_parse_image_header(spl_image, bootdev, header);
if (err) if (err)

View File

@ -111,10 +111,14 @@ static int spl_nor_load_image(struct spl_image_info *spl_image,
/* Legacy image handling */ /* Legacy image handling */
if (IS_ENABLED(CONFIG_SPL_LEGACY_IMAGE_FORMAT)) { if (IS_ENABLED(CONFIG_SPL_LEGACY_IMAGE_FORMAT)) {
struct legacy_img_hdr hdr;
load.bl_len = 1; load.bl_len = 1;
load.read = spl_nor_load_read; 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, return spl_load_legacy_img(spl_image, bootdev, &load,
spl_nor_get_uboot_base()); spl_nor_get_uboot_base(),
&hdr);
} }
return 0; return 0;

View 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_load_legacy_img() - Loads a legacy image from a device.
* @spl_image: Image description to set up * @spl_image: Image description to set up
* @load: Structure containing the information required to load data. * @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 * Reads an legacy image from the device. Loads u-boot image to
* specified load address. * 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, int spl_load_legacy_img(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev, 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. * spl_load_imx_container() - Loads a imx container image from a device.