[PATCH v5 08/11] spl: Convert nor to spl_load

Xavier Drudis Ferran xdrudis at tinet.cat
Thu Aug 3 10:33:43 CEST 2023


El Mon, Jul 31, 2023 at 06:43:00PM -0400, Sean Anderson deia:
> This converts the nor load method to use spl_load. As a result it also
> adds support for LOAD_FIT_FULL.
> 
> Signed-off-by: Sean Anderson <sean.anderson at seco.com>
> ---
> 
> Changes in v5:
> - Rework to load header in spl_load
> 
>  common/spl/spl_nor.c | 41 +++++++----------------------------------
>  1 file changed, 7 insertions(+), 34 deletions(-)
> 
> diff --git a/common/spl/spl_nor.c b/common/spl/spl_nor.c
> index 5b65b96a77..7328a87024 100644
> --- a/common/spl/spl_nor.c
> +++ b/common/spl/spl_nor.c
> @@ -26,8 +26,10 @@ 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)
>  {
> -	__maybe_unused const struct legacy_img_hdr *header;
> -	__maybe_unused struct spl_load_info load;
> +	struct spl_load_info load = {
> +		.bl_len = 1,
> +		.read = spl_nor_load_read,
> +	};
>  
>  	/*
>  	 * Loading of the payload to SDRAM is done with skipping of
> @@ -41,7 +43,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 = (const struct legacy_img_hdr *)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;
> @@ -91,36 +94,6 @@ 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
>  	 */
> -#ifdef CONFIG_SPL_LOAD_FIT
> -	header = (const struct legacy_img_hdr *)spl_nor_get_uboot_base();
> -	if (image_get_magic(header) == FDT_MAGIC) {
> -		debug("Found FIT format U-Boot\n");
> -		load.bl_len = 1;
> -		load.read = spl_nor_load_read;
> -		return spl_load_simple_fit(spl_image, &load,
> -					   spl_nor_get_uboot_base(),
> -					   (void *)header);

this loaded the simple fit from sector=CFG_SYS_UBOOT_BASE and now we'll
call spl_load with sector=0 ?

But spl_nor_get_uboot_base() is overriden by calculations of
concatenated images in

arch/arm/mach-imx/image-container.c
arch/mips/mach-mtmips/mt7621/spl/spl.c
arch/mips/mach-mtmips/spl.c

> -	}
> -#endif
> -	if (IS_ENABLED(CONFIG_SPL_LOAD_IMX_CONTAINER)) {
> -		load.bl_len = 1;
> -		load.read = spl_nor_load_read;
> -		return spl_load_imx_container(spl_image, &load,
> -					      spl_nor_get_uboot_base());

this loaded the imx image from sector=CFG_SYS_UBOOT_BASE or whatever
spl_nor_get_uboot_base() gave and now we'll call spl_load with
sector=0 ?

> -	}
> -
> -	/* 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(),
> -					   &hdr);

This loaded legacy image with potential lzma decompression and now
compressed images are no longer supported ?

> -	}
> -
> -	return -EINVAL;
> +	return spl_load(spl_image, bootdev, &load, 0, 0);

maybe better

+	return spl_load(spl_image, bootdev, &load, 0, spl_nor_get_uboot_base());


and consider calling spl_load_legacy_img(spl_image, bootdev, &info, offset, header)
from spl_load()?

>  }
>  SPL_LOAD_IMAGE_METHOD("NOR", 0, BOOT_DEVICE_NOR, spl_nor_load_image);
> -- 
> 2.40.1
> 


More information about the U-Boot mailing list