[PATCH v5 04/11] spl: Convert fat to spl_load

Xavier Drudis Ferran xdrudis at tinet.cat
Thu Aug 3 10:30:13 CEST 2023


El Mon, Jul 31, 2023 at 06:42:56PM -0400, Sean Anderson deia:
> This converts the fat loader to use spl_load. Some platforms are very
> tight on space, so we take care to only include the code we really need.
> 
> Signed-off-by: Sean Anderson <sean.anderson at seco.com>
> ---
> 
> Changes in v5:
> - Rework to load header in spl_load
> 
> Changes in v3:
> - Fix failing on success
> 
>  common/spl/spl_fat.c | 55 +++++++++++++++-----------------------------
>  1 file changed, 19 insertions(+), 36 deletions(-)
> 
> diff --git a/common/spl/spl_fat.c b/common/spl/spl_fat.c
> index f8a5b80a3b..6530bcd5a7 100644
> --- a/common/spl/spl_fat.c
> +++ b/common/spl/spl_fat.c
> @@ -60,57 +60,40 @@ int spl_load_image_fat(struct spl_image_info *spl_image,
>  		       const char *filename)
>  {
>  	int err;
> -	struct legacy_img_hdr *header;
> +	loff_t size;
> +	struct spl_load_info load;
> +
> +	/* This generates smaller code than using a compound literal */
> +	load.read = spl_fit_read;
> +	load.bl_len = 1;
> +	load.filename = filename;
>  
>  	err = spl_register_fat_device(block_dev, partition);
>  	if (err)
>  		goto end;
>  
> -	header = spl_get_load_buffer(-sizeof(*header), sizeof(*header));
> -
> -	err = file_fat_read(filename, header, sizeof(struct legacy_img_hdr));
> -	if (err <= 0)
> -		goto end;
> -
> -	if (IS_ENABLED(CONFIG_SPL_LOAD_FIT_FULL) &&
> -	    image_get_magic(header) == FDT_MAGIC) {
> -		err = file_fat_read(filename, (void *)CONFIG_SYS_LOAD_ADDR, 0);
> -		if (err <= 0)
> -			goto end;
> -		err = spl_parse_image_header(spl_image, bootdev,
> -				(struct legacy_img_hdr *)CONFIG_SYS_LOAD_ADDR);

So this used to load to CONFIG_SYS_LOAD_ADDR and will now load to
CONFIG_TEXT_BASE, or whatever the applicable spl_get_load_buffer()
uses. Is this OK ? or do we need a new parameter for the buffer or
something ?

> -		if (err == -EAGAIN)
> -			return err;
> -		if (err == 0)
> -			err = 1;
> -	} else if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
> -	    image_get_magic(header) == FDT_MAGIC) {
> -		struct spl_load_info load;
> -
> -		debug("Found FIT\n");
> -		load.read = spl_fit_read;
> -		load.bl_len = 1;
> -		load.filename = (void *)filename;
> -		load.priv = NULL;
> -
> -		return spl_load_simple_fit(spl_image, &load, 0, header);
> -	} else {
> -		err = spl_parse_image_header(spl_image, bootdev, header);
> +	/*
> +	 * Avoid pulling in this function for other image types since we are
> +	 * very short on space on some boards.
> +	 */
> +	if (IS_ENABLED(CONFIG_SPL_LOAD_FIT_FULL)) {
> +		err = fat_size(filename, &size);
>  		if (err)
>  			goto end;
> -
> -		err = file_fat_read(filename,
> -				    (u8 *)(uintptr_t)spl_image->load_addr, 0);
> +	} else {
> +		size = 0;
>  	}
>  
> +	err = spl_load(spl_image, bootdev, &load, 0, size);
> +
>  end:
>  #ifdef CONFIG_SPL_LIBCOMMON_SUPPORT
> -	if (err <= 0)
> +	if (err < 0)
>  		printf("%s: error reading image %s, err - %d\n",
>  		       __func__, filename, err);
>  #endif
>  
> -	return (err <= 0);
> +	return err;
>  }
>  
>  #if CONFIG_IS_ENABLED(OS_BOOT)
> -- 
> 2.40.1
> 


More information about the U-Boot mailing list