[PATCH 3/8] sunxi: SPL SPI: allow multiple boot attempt

Samuel Holland samuel at sholland.org
Sat Jan 14 20:56:08 CET 2023


On 10/13/22 22:05, Icenowy Zheng wrote:
> As we're going to add support for SPI NAND to this code, add code that
> allows multiple boot attempts with different load offsets and functions.
> 
> To keep compatibility with loading raw binary on SPI NOR, a bool
> parameter is used to allow booting without valid magic number when
> booting with SPI NOR.

So the issue is that when CONFIG_SPL_RAW_IMAGE_SUPPORT=y, then
spl_parse_image_header() will return 0 even when using the wrong NAND
parameters? I don't see a better solution, so:

Reviewed-by: Samuel Holland <samuel at sholland.org>
Tested-by: Samuel Holland <samuel at sholland.org> # Orange Pi Zero Plus

> Signed-off-by: Icenowy Zheng <uwu at icenowy.me>
> ---
>  arch/arm/mach-sunxi/spl_spi_sunxi.c | 58 +++++++++++++++++++----------
>  1 file changed, 38 insertions(+), 20 deletions(-)
> 
> diff --git a/arch/arm/mach-sunxi/spl_spi_sunxi.c b/arch/arm/mach-sunxi/spl_spi_sunxi.c
> index 88c15a3ee9..21be33a23f 100644
> --- a/arch/arm/mach-sunxi/spl_spi_sunxi.c
> +++ b/arch/arm/mach-sunxi/spl_spi_sunxi.c
> @@ -340,8 +340,8 @@ static void spi0_read_data(void *buf, u32 addr, u32 len, u32 addr_len)
>  	}
>  }
>  
> -static ulong spi_load_read(struct spl_load_info *load, ulong sector,
> -			   ulong count, void *buf)
> +static ulong spi_load_read_nor(struct spl_load_info *load, ulong sector,
> +			       ulong count, void *buf)
>  {
>  	spi0_read_data(buf, sector, count, 3);
>  
> @@ -350,41 +350,59 @@ static ulong spi_load_read(struct spl_load_info *load, ulong sector,
>  
>  /*****************************************************************************/
>  
> -static int spl_spi_load_image(struct spl_image_info *spl_image,
> -			      struct spl_boot_device *bootdev)
> +static int spl_spi_try_load(struct spl_image_info *spl_image,
> +			    struct spl_boot_device *bootdev,
> +			    struct spl_load_info *load, u32 offset,
> +			    bool allow_raw)
>  {
>  	int ret = 0;
>  	struct legacy_img_hdr *header;
> -	uint32_t load_offset = sunxi_get_spl_size();
> -

nit: keep this blank line

>  	header = (struct legacy_img_hdr *)CONFIG_SYS_TEXT_BASE;
> -	load_offset = max_t(uint32_t, load_offset, CONFIG_SYS_SPI_U_BOOT_OFFS);
> -
> -	spi0_init();
>  
> -	spi0_read_data((void *)header, load_offset, 0x40, 3);
> +	if (load->read(load, offset, 0x40, (void *)header) == 0)
> +		return -EINVAL;
>  
>          if (IS_ENABLED(CONFIG_SPL_LOAD_FIT) &&
>  		image_get_magic(header) == FDT_MAGIC) {
> -		struct spl_load_info load;
>  
>  		debug("Found FIT image\n");
> -		load.dev = NULL;
> -		load.priv = NULL;
> -		load.filename = NULL;
> -		load.bl_len = 1;
> -		load.read = spi_load_read;
> -		ret = spl_load_simple_fit(spl_image, &load,
> -					  load_offset, header);
> +		ret = spl_load_simple_fit(spl_image, load,
> +					  offset, header);
>  	} else {
> +		if (!allow_raw && image_get_magic(header) != IH_MAGIC)
> +			return -EINVAL;
> +
>  		ret = spl_parse_image_header(spl_image, bootdev, header);
>  		if (ret)
>  			return ret;
>  
> -		spi0_read_data((void *)spl_image->load_addr,
> -			       load_offset, spl_image->size, 3);
> +		if (load->read(load, offset, spl_image->size,
> +			       (void *)spl_image->load_addr) == 0)
> +			ret = -EINVAL;
>  	}
>  
> +	return ret;
> +}
> +
> +static int spl_spi_load_image(struct spl_image_info *spl_image,
> +			      struct spl_boot_device *bootdev)
> +{
> +	int ret = 0;
> +	uint32_t load_offset = sunxi_get_spl_size();
> +	struct spl_load_info load;
> +
> +	load_offset = max_t(uint32_t, load_offset, CONFIG_SYS_SPI_U_BOOT_OFFS);
> +
> +	load.dev = NULL;
> +	load.priv = NULL;
> +	load.filename = NULL;
> +	load.bl_len = 1;
> +
> +	spi0_init();
> +
> +	load.read = spi_load_read_nor;
> +	ret = spl_spi_try_load(spl_image, bootdev, &load, load_offset, true);
> +
>  	spi0_deinit();
>  
>  	return ret;



More information about the U-Boot mailing list