spl: Convert nor to spl_load

This converts the nor load method to use spl_load. As a result it also
adds support for LOAD_FIT_FULL. Since this is the last caller of
spl_load_legacy_img, it has been removed.

We can't load FITs with external data with SPL_LOAD_FIT_FULL, so disable the
test in that case. No boards enable SPL_NOR_SUPPORT and SPL_LOAD_FIT_FULL, so
this is not a regression.

Signed-off-by: Sean Anderson <seanga2@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Sean Anderson 2023-11-08 11:48:53 -05:00 committed by Tom Rini
parent 2e5476b5a7
commit cbe86576cb
4 changed files with 10 additions and 94 deletions

View file

@ -118,64 +118,3 @@ int spl_load_legacy_lzma(struct spl_image_info *spl_image,
spl_image->size = lzma_len;
return 0;
}
/*
* This function is added explicitly to avoid code size increase, when
* no compression method is enabled. The compiler will optimize the
* following switch/case statement in spl_load_legacy_img() away due to
* Dead Code Elimination.
*/
static inline int spl_image_get_comp(const struct legacy_img_hdr *hdr)
{
if (IS_ENABLED(CONFIG_SPL_LZMA))
return image_get_comp(hdr);
return IH_COMP_NONE;
}
int spl_load_legacy_img(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev,
struct spl_load_info *load, ulong offset,
struct legacy_img_hdr *hdr)
{
ulong dataptr;
int ret;
/*
* 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)
spl_image->flags |= SPL_COPY_PAYLOAD_ONLY;
ret = spl_parse_image_header(spl_image, bootdev, hdr);
if (ret)
return ret;
/* Read image */
switch (spl_image_get_comp(hdr)) {
case IH_COMP_NONE:
dataptr = offset;
/*
* Image header will be skipped only if SPL_COPY_PAYLOAD_ONLY
* is set
*/
if (spl_image->flags & SPL_COPY_PAYLOAD_ONLY)
dataptr += sizeof(*hdr);
load->read(load, dataptr, spl_image->size,
map_sysmem(spl_image->load_addr, spl_image->size));
break;
case IH_COMP_LZMA:
return spl_load_legacy_lzma(spl_image, load, offset);
default:
debug("Compression method %s is not supported\n",
genimg_get_comp_short_name(image_get_comp(hdr)));
return -EINVAL;
}
return 0;
}

View file

@ -7,8 +7,8 @@
#include <image.h>
#include <imx_container.h>
#include <log.h>
#include <mapmem.h>
#include <spl.h>
#include <spl_load.h>
static ulong spl_nor_load_read(struct spl_load_info *load, ulong sector,
ulong count, void *buf)
@ -28,8 +28,7 @@ unsigned long __weak spl_nor_get_uboot_base(void)
static int spl_nor_load_image(struct spl_image_info *spl_image,
struct spl_boot_device *bootdev)
{
struct legacy_img_hdr *header;
__maybe_unused struct spl_load_info load;
struct spl_load_info load;
/*
* Loading of the payload to SDRAM is done with skipping of
@ -43,7 +42,8 @@ static int spl_nor_load_image(struct spl_image_info *spl_image,
* Load Linux from its location in NOR flash to its defined
* location in SDRAM
*/
header = (void *)CONFIG_SYS_OS_BASE;
const struct legacy_img_hdr *header =
(const struct legacy_img_hdr *)CONFIG_SYS_OS_BASE;
#ifdef CONFIG_SPL_LOAD_FIT
if (image_get_magic(header) == FDT_MAGIC) {
int ret;
@ -93,34 +93,8 @@ static int spl_nor_load_image(struct spl_image_info *spl_image,
* Load real U-Boot from its location in NOR flash to its
* defined location in SDRAM
*/
header = map_sysmem(spl_nor_get_uboot_base(), sizeof(*header));
#ifdef CONFIG_SPL_LOAD_FIT
if (image_get_magic(header) == FDT_MAGIC) {
debug("Found FIT format U-Boot\n");
spl_set_bl_len(&load, 1);
load.read = spl_nor_load_read;
return spl_load_simple_fit(spl_image, &load,
spl_nor_get_uboot_base(),
(void *)header);
}
#endif
if (IS_ENABLED(CONFIG_SPL_LOAD_IMX_CONTAINER) &&
valid_container_hdr((void *)header)) {
spl_set_bl_len(&load, 1);
load.read = spl_nor_load_read;
return spl_load_imx_container(spl_image, &load,
spl_nor_get_uboot_base());
}
/* Legacy image handling */
if (IS_ENABLED(CONFIG_SPL_LEGACY_IMAGE_FORMAT)) {
spl_set_bl_len(&load, 1);
load.read = spl_nor_load_read;
return spl_load_legacy_img(spl_image, bootdev, &load,
spl_nor_get_uboot_base(),
header);
}
return -EINVAL;
spl_set_bl_len(&load, 1);
load.read = spl_nor_load_read;
return spl_load(spl_image, bootdev, &load, 0, spl_nor_get_uboot_base());
}
SPL_LOAD_IMAGE_METHOD("NOR", 0, BOOT_DEVICE_NOR, spl_nor_load_image);

View file

@ -100,6 +100,7 @@ static inline int _spl_load(struct spl_image_info *spl_image,
IS_ENABLED(CONFIG_SPL_SYS_MMCSD_RAW_MODE) + \
(IS_ENABLED(CONFIG_SPL_NAND_SUPPORT) && !IS_ENABLED(CONFIG_SPL_UBI)) + \
IS_ENABLED(CONFIG_SPL_NET) + \
IS_ENABLED(CONFIG_SPL_NOR_SUPPORT) + \
0
#if SPL_LOAD_USERS > 1

View file

@ -36,4 +36,6 @@ SPL_IMG_TEST(spl_test_nor, LEGACY, 0);
SPL_IMG_TEST(spl_test_nor, LEGACY_LZMA, 0);
SPL_IMG_TEST(spl_test_nor, IMX8, 0);
SPL_IMG_TEST(spl_test_nor, FIT_INTERNAL, 0);
#if !IS_ENABLED(CONFIG_SPL_LOAD_FIT_FULL)
SPL_IMG_TEST(spl_test_nor, FIT_EXTERNAL, 0);
#endif