[REGRESSION] imx: spl_imx_romapi: boot loops

Marcel Ziswiler marcel.ziswiler at toradex.com
Wed Oct 25 18:01:31 CEST 2023


Hi Rasmus

On Tue, 2023-10-24 at 16:32 +0200, Rasmus Villemoes wrote:
> On 24/10/2023 15.15, Marcel Ziswiler wrote:
> 
> Hi Marcel
> 
> tl;dr: can you try
> 
> @@ -330,7 +335,7 @@ static int spl_romapi_load_image_stream(struct
> spl_image_info *spl_image,
> 
>                 ss.base = phdr;
>                 ss.end = p;
> -               ss.pagesize = pagesize;
> +               ss.pagesize = 1024;
> 
>                 memset(&load, 0, sizeof(load));
>                 load.bl_len = 1;
> 
> and also put 1024 in the binman node so u-boot.itb is also 1024-byte
> aligned?

That did not help.


> This will likely break usb boot (where pagesize==1), so if you want the
> binary to work with usb you can make the RHS instead "(pagesize > 1 ?
> 1024 : 1)" or something like that.
> 
> I don't think it will work, but OTOH my analysis below doesn't find any
> other (fundamental) difference between the old and new code.
> 
> > 
> > On Tue, 2023-10-24 at 13:17 +0200, Rasmus Villemoes wrote:
> > 
> > > 
> > > and this works just fine. But in my case ss->pagesize is 1, whereas you
> > > have 512.
> > > 
> > > Just exactly how are you booting? It says "Boot Stage: Primary boot"
> > > whereas I'm doing serial download with uuu (i.e. "Boot Stage: USB boot").
> > 
> > Yes, regular eMMC boot.
> 
> [snip]
> 
> > 
> > At least I am not aware that we would be doing anything special for eMMC boot.
> 
> Well, I/we usually do boot from eMMC (except during bootstrap where we
> use uuu), more precisely from the eMMC boot partitions, but that doesn't
> end up using the spl_romapi_load_image_stream() but instead the expected
> spl_romapi_load_image_seekable().
> 
> Perhaps some NXP folks can explain the logic behind
> 
> static int is_boot_from_stream_device(u32 boot)
> {
> 	u32 interface;
> 
> 	interface = boot >> 16;
> 	if (interface >= BT_DEV_TYPE_USB)
> 		return 1;
> 
> 	if (interface == BT_DEV_TYPE_MMC && (boot & 1))
> 		return 1;
> 
> 	return 0;
> }
> 
> Apparently that "boot & 1" is an indication that "eMMC fast boot mode"
> is enabled (not to be confused with fastboot which is a USB protocol
> that only becomes relevant once U-Boot proper is up and running).

Yes, we use eMMC fast boot mode.

> As I've complained about previously, the ROM API is almost entirely
> undocumented. There's something in imx93rm.pdf (which is where I have
> that eMMC fast boot info from), but I have no idea if that applies to
> imx8/imx8mp as well.
> 
> Are there any alignment requirements on the destination and/or the size
> parameter? Is there some timing requirements so that if we read too late
> the data is lost? So could e.g. a bunch of printf debugging break boot?
> 
> Because I really can't see the fundamental difference between now and
> then. Both before and after the commit in question, the code does:
> 
> - read 1024 bytes at a time, search each chunk for FDT magic
> 
> This then gives the "Find img info 0x4802b000"
> 
> - make sure the leftover within that 1024 chunk is a full FDT header
> (usually ok, so no output)
> 
> - read the FDT size from that header, round up to a multiple of 1024,
> fetch that - that's the "Need continue download 1024".
> 
> And then the flow deviates.
> 
> The old code would do the fake spl_fit_load to figure out the maximum
> offset (thus the real total .itb size), then take that remaining size,
> round up to ->pagesize (512), and fetch that with one final
> rom_api_download_image(p, 0, imagesize);.
> 
> My code instead does a number of rom_api_download_image() calls, where
> each size argument is rounded up to the ->pagesize from the boot_info
> query (i.e. 512). So it's possible that for one of those calls, the
> destination is only 512-byte aligned (because a previous call fetched an
> odd number of 512 byte blocks), and that doesn't happen in the previous
> case where all but the last rom_api_download_image() have fetched 1024
> byte aligned chunks.
> 
> What am I missing?

Good question. Some more debugging revealed that we are missing 464 bytes at the beginning of the buffer. Why
would that be?

> Rasmus

Cheers

Marcel


More information about the U-Boot mailing list