[PATCH v4 6/8] arm: dts: meson-gx-u-boot: add binman configuration for U-Boot SPL
    Quentin Schulz 
    quentin.schulz at cherry.de
       
    Thu Oct 16 11:21:03 CEST 2025
    
    
  
Hi Ferass,
On 10/15/25 7:58 PM, Ferass El Hafidi wrote:
> Hi Quentin,
> 
> On Wed Oct 15, 2025 at 5:11 PM UTC, Quentin Schulz wrote:
[...]
>>> +
>>> +			blob {
>>> +				size = <0xb000>; /* The BootROM loads 48K max (header is 4K) */
>>> +				filename = "spl/u-boot-spl.bin";
>>> +			};
>>
>> I'm not sure this actually works? It would rely on a binary located at
>> spl/u-boot-spl.bin, which binman doesn't seem to be generating? Either
>> we;re missing something to generate it with binman, or something
>> external to binman generates it?
>>
> 
> spl/u-boot-spl.bin is generated on build-time, it's the U-Boot SPL
> binary. And that does work according to my testing...
> 
Yesterday me was convinced binman is generating the SPL binaries but it 
isn't the case :) Sorry for the noise.
>> Typically it is generated with:
>>
>> u-boot-spl {
>> };
>>
> 
> ...but I think this is much cleaner, so I'll go with that.
> 
And this is essentially
blob {
     filename = "spl/u-boot-spl.bin";
};
Because tools/binman/etype/u_boot_spl.py is inheriting Entry_blob whose 
default "filename" property is "spl/u-boot-spl.bin".
TIL :)
>> ?
>>
>> If you're trying to enforce a max size, then we have Kconfig symbols for
>> those, probably SPL_MAX_SIZE and then I believe binman enforces those
>> one way or another. If it doesn't, then many boards and architecture
>> have a problem and we should fix that so you can rely on it.
>>
> 
> I did know of SPL_MAX_SIZE... Might have just overlooked it though.
> I think this should be the proper way to do this, yeah.
> 
If I were you I'd triple check though, because I'm not entirely sure it 
does what you want. I quickly checked on Rockchip and I think this is 
rather enforced at the mkimage level in tools/rkcommon.c where we store 
the max size of the xPL (size of available SRAM to U-Boot (third member 
of spl_info struct)) and compare the size of the xPL (TPL if there's 
one, SPL otherwise). See rkcommon_check_params().
Though that tool predates our use of binman for generating the images on 
Rockchip, so maybe Binman checks properly. I vaguely remember having 
binman shout at me that my xPL was too big (likely because it detected 
an overlap with the offset at which U-Boot proper is expected). One way 
to be sure is to artificially increase the size of the binary and check 
if it fails when expected to.
FYI, on Rockchip we went for a unique binary (u-boot-rockchip.bin) which 
contains both the xPL and U-Boot proper at the expected offset. Then you 
just need to tell users to flash the binary at the offset the BootROM is 
expecting to find the xPL header. It's rather convenient (but is a bit 
"bloated" by zeroes if U-Boot proper is much later in the storage medium 
compared to the end of the xPL, e.g. by default on Rockchip proper is 
almost ~8MiB after the start of xPL) because regardless of the device or 
configuration, the flashing instructions are the same. We still expose 
the xPL and proper files individually if you want to flash them by hand 
(which comes in handy when you want to use those 8MiB for storing e.g. 
the U-Boot environment(s) and not erase it whenever you flash U-Boot). 
Food for thoughts :)
[...]
>>> +				};
>>> +
>>> +				atf {
>>> +					description = "ARM Trusted Firmware";
>>> +					type = "firmware";
>>> +					os = "arm-trusted-firmware";
>>> +					arch = "arm64";
>>> +					compression = "none";
>>> +					load = <BL31_ADDR>;
>>> +					entry = <BL31_ADDR>;
>>> +
>>> +					atf-bl31 {
>>> +						filename = "bl31.bin";
>>
>> I believe this is already the case if you set BL31 environment variable
>> to bl31.bin. I would simply remove it and let the user decide what's
>> best for them. For binman this comes from the -a atf-bl31-path=${BL31}
>> argument.
>>
>> The benefit is that you can now point to a BL31 outside of U-Boot's
>> tree, which is super convenient for debugging TF-A, or with build
>> systems like Yocto or Buildroot.
>>
> 
> You can already point to a BL31 outside U-Boot's tree, and this is what
> I've been always doing when testing.
> 
Reading tools/binman/etype/atf_bl31.py and 
tools/binman/etype/blob_named_by_arg.py, it seems if BL31 env variable 
is set (and thus passed via -a atf-bl31-path to binman) then the 
filename property of atf-bl31 node is replaced with BL31. So you're right :)
> But I think having it check for a bl31.bin inside the tree when $BL31 is
> not set is a sane default IMO .. but correct me if I'm wrong and it's
> considered poor practise.
> 
No opinion on this.
[...]
>>> +				};
>>> +
>>> +				scp {
>>> +					description = "SCP firmware";
>>> +					type = "scp";
>>> +					arch = "arm"; /* The Cortex-M core is used as SCP */
>>> +					compression = "none";
>>> +					load = <SCP_ADDR>;
>>> +
>>> +					scp {
>>> +						filename = "scp.bin";
>>> +					};
>>
>> I would recommend to attempt mimicking what's been done for atf-bl31
>> (then you need to add a new argument to the lists of arguments for
>> binman in the root Makefile). See above for benefits.
>>
> 
> One can already `export SCP=../path/to/scp/firmware` and have binman use
> that.
> 
Indeed, it is passed via -a scp-path to Binman. And this mimics what's 
been done earlier in this patch for atf-bl31, so I guess this checks out 
:) Sorry for the noise.
Cheers,
Quentin
    
    
More information about the U-Boot
mailing list