[PATCH v5 09/11] spl: Convert semihosting to spl_load

Xavier Drudis Ferran xdrudis at tinet.cat
Thu Aug 3 10:36:20 CEST 2023


El Mon, Jul 31, 2023 at 06:43:01PM -0400, Sean Anderson deia:
> This converts the semihosting load method to use spl_load. As a result, it
> also adds support for LOAD_FIT_FULL and IMX images.
> 
> Signed-off-by: Sean Anderson <sean.anderson at seco.com>
> ---
> 
> Changes in v5:
> - Rework to load header in spl_load
> 
> Changes in v2:
> - New
> 
>  common/spl/spl_semihosting.c | 43 ++++++++++++------------------------
>  1 file changed, 14 insertions(+), 29 deletions(-)
> 
> diff --git a/common/spl/spl_semihosting.c b/common/spl/spl_semihosting.c
> index 5b5e842a11..e7cb9f4ce6 100644
> --- a/common/spl/spl_semihosting.c
> +++ b/common/spl/spl_semihosting.c
> @@ -9,16 +9,16 @@
>  #include <semihosting.h>
>  #include <spl.h>
>  
> -static int smh_read_full(long fd, void *memp, size_t len)
> +static ulong spl_smh_fit_read(struct spl_load_info *load, ulong sector,
> +			      ulong count, void *buf)
>  {
> -	long read;
> +	int ret, fd = *(int *)load->priv;
>

should ret be long to hold smh_read() return value ?

> -	read = smh_read(fd, memp, len);
> -	if (read < 0)
> -		return read;
> -	if (read != len)
> -		return -EIO;
> -	return 0;
> +	if (smh_seek(fd, sector))
> +		return 0;
> +

                                                                                                                 
I never used smh, but why would this not be :

+       ret = smh_seek(fd, sector);
+       if (ret)
+               return ret;

(why does smh_seek(), smh_write(), smh_open(), smh_close() return
long, by the way? the implementations return either 0 or smh_errno(),
so int would do ?)
                   
> +	ret = smh_read(fd, buf, count);
> +	return ret < 0 ? 0 : ret;
>  }
>  
>  static int spl_smh_load_image(struct spl_image_info *spl_image,
> @@ -27,14 +27,17 @@ static int spl_smh_load_image(struct spl_image_info *spl_image,
>  	const char *filename = CONFIG_SPL_FS_LOAD_PAYLOAD_NAME;
>  	int ret;
>  	long fd, len;
> -	struct legacy_img_hdr *header =
> -		spl_get_load_buffer(-sizeof(*header), sizeof(*header));
> +	struct spl_load_info load = {
> +		.bl_len = 1,
> +		.read = spl_smh_fit_read,
> +	};
>  
>  	fd = smh_open(filename, MODE_READ | MODE_BINARY);
>  	if (fd < 0) {
>  		log_debug("could not open %s: %ld\n", filename, fd);
>  		return fd;
>  	}
> +	load.priv = &fd;
>  
>  	ret = smh_flen(fd);
>  	if (ret < 0) {
> @@ -43,25 +46,7 @@ static int spl_smh_load_image(struct spl_image_info *spl_image,
>  	}
>  	len = ret;
>  
> -	ret = smh_read_full(fd, header, sizeof(struct legacy_img_hdr));
> -	if (ret) {
> -		log_debug("could not read image header: %d\n", ret);
> -		goto out;
> -	}
> -
> -	ret = spl_parse_image_header(spl_image, bootdev, header);
> -	if (ret) {
> -		log_debug("failed to parse image header: %d\n", ret);
> -		goto out;
> -	}
> -
> -	ret = smh_seek(fd, 0);
> -	if (ret) {
> -		log_debug("could not seek to start of image: %d\n", ret);
> -		goto out;
> -	}
> -
> -	ret = smh_read_full(fd, (void *)spl_image->load_addr, len);
> +	ret = spl_load(spl_image, bootdev, &load, len, 0);
>  	if (ret)
>  		log_debug("could not read %s: %d\n", filename, ret);
>  out:
> -- 
> 2.40.1
> 


More information about the U-Boot mailing list