[PATCH 0/2] allow control DTB to double as "FIT image"

Quentin Schulz quentin.schulz at cherry.de
Tue May 12 18:39:52 CEST 2026


Hi Rasmus,

On 5/12/26 6:16 PM, Rasmus Villemoes wrote:
> The commit message for patch 1 explains what it is I'd like to be able
> to do, but here's some more background:
> 

For reference:

"""
Writing those scripts in the built-in environment leads to
backslatitis and missing or wrong quoting and is generally not very
readable or maintainable.
"""

> For a long time, we've embedded the boot script in the U-Boot binary
> by building a bootscript.itb, and using a .dtsi like
> 
>    / {
>            config {
>                   bootscript = /incbin/("/path/to/bootscript.itb");
>            };
>    };
> 
> which in turn is mentioned in CONFIG_DEVICE_TREE_INCLUDES, that
> bootscript.itb FIT image has been embedded in U-Boot's control
> dtb. Running that was then a matter of doing
> 
>    fdt addr ${fdtcontroladdr} && fdt get addr bsaddr /config bootscript && source ${bsaddr}
> 
> There are a couple of advantage of having the bootscript (and other
> script logic) embedded in the U-Boot binary. First, there's no need to
> figure out some separate partition to store the script in, and making
> sure that gets updated whenever the bootloader itself does. Second,
> one doesn't need to worry about verifying the script; whatever steps
> one needs to take to implement secure boot for U-Boot itself will by
> necessity also cover the control dtb (if nothing else then because
> that's where the public key for the kernel verification lives).
> 
> Now with the stricter requirements of libfdt starting from v2026.04,
> the above command no longer worked, or only half the time, because the
> embedded FIT image may not land on an 8-byte aligned address. So that
> line had to be changed a little (line breaks added)
> 
>    fdt addr ${fdtcontroladdr}
>      && fdt get addr bsaddr /config bootscript
>      && fdt get size bssize /config bootscript
>      && cp.b ${bsaddr} ${loadaddr} ${bssize}
>      && source ${loadaddr}
> 
> which is getting quite unwieldy.
> 
> Then it struck me that one could perhaps simplify all of this quite a
> lot: Cut out the intermediate bootscript.itb, just create a .dtsi
> which directly puts a /images node inside the control dtb
> 
> / {
>    	images {
> 		default = "bootscript";
> 		bootscript {
> 			description = "Boot script";
> 			data = /incbin/("/path/to/bootscript.sh");
> 			type = "script";
> 			compression = "none";
> 		};
> 	};
> };
> 
> and treat the control dtb itself as a FIT image; so the command to put
> in $bootcmd becomes simply
> 
>    source ${fdtcontroladdr}:bootscript
> 
> and embedding other pieces of callable scripts is quite trivial.
> 
> And that almost works out-of-the-box, except for the fit_check_format() sanity check.
> 
> I realize this is a bit of a hack, but I do think it's somewhat
> elegant, and avoids inventing a whole lot of extra infrastructure for
> allowing one to embed larger scripts and invoke them from the shell. I
> am of course happy to put this exemption for gd->fdt_blob under a
> CONFIG_ knob if that is deemed necessary.
> 

Have you tried to use the text-based environment mechanism as described 
in 
https://docs.u-boot.org/en/latest/usage/environment.html#text-based-environment? 
(I've learned about this only very recently with the Apple devices being 
migrated to it)

Cheers,
Quentin


More information about the U-Boot mailing list