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:
parent
0abe3323f5
commit
06377c5a1f
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user