[PATCH v4 6/8] arm: dts: meson-gx-u-boot: add binman configuration for U-Boot SPL
Quentin Schulz
quentin.schulz at cherry.de
Wed Oct 15 19:11:54 CEST 2025
Hi Ferass,
On 10/15/25 6:25 PM, Ferass El Hafidi wrote:
> Add binman configuration to meson-gx-u-boot.dtsi to automate building
> bootable images using amlimage.
>
> Signed-off-by: Ferass El Hafidi <funderscore at postmarketos.org>
> Reviewed-by: Neil Armstrong <neil.armstrong at linaro.org>
Quick drive-by comments.
> ---
> arch/arm/dts/meson-gx-u-boot.dtsi | 142 ++++++++++++++++++++++++++++++++++++++
> 1 file changed, 142 insertions(+)
>
> diff --git a/arch/arm/dts/meson-gx-u-boot.dtsi b/arch/arm/dts/meson-gx-u-boot.dtsi
> index 9e0620f395e..d05f869c06e 100644
> --- a/arch/arm/dts/meson-gx-u-boot.dtsi
> +++ b/arch/arm/dts/meson-gx-u-boot.dtsi
> @@ -2,6 +2,7 @@
> /*
> * Copyright (c) 2019 BayLibre, SAS.
> * Author: Maxime Jourdan <mjourdan at baylibre.com>
> + * Copyright (c) 2023 Ferass El Hafidi <funderscore at postmarketos.org>
> */
>
> / {
> @@ -15,6 +16,16 @@
> soc {
> bootph-all;
> };
> +
> + chosen {
> + stdout-path = "serial0:115200n8";
> + };
> +
I don't believe this is required for binman so please split into its own
commit with justification.
> +#if defined(CONFIG_BINMAN)
> + binman: binman {
> + multiple-images;
> + };
> +#endif
> };
>
> &vpu {
> @@ -30,3 +41,134 @@
> <0x0 0xc883c000 0x0 0x1000>;
> reg-names = "hdmitx", "hhi";
> };
> +
> +#if defined(CONFIG_MESON_GX) && defined(CONFIG_BINMAN)
Isn't MESON_GX implied since we are in meson-gx-u-boot.dtsi?
> +/* binman configuration on GXBB and GXL */
> +
> +#if defined(CONFIG_MESON_GXBB)
> +#define BL31_ADDR 0x10100000
> +#else /* GXL */
> +#define BL31_ADDR 0x05100000
> +#endif
> +
First question is... can't this be derived from the binary already?
On Rockchip we do
fit,load;
fit,entry;
fit,data;
for OP-TEE OS and TF-A though we do split the binaries into multiple
nodes (see @atf-SEQ and @tee-SEQ). I'm not sure if those properties are
applicable to only tee and atf nodes without a node for each segment, if
it isn't...
I would highly recommend against doing this.
I would instead have a
arch/arm/dts/meson-gxbb-u-boot.dtsi with
&fit {
atf {
entry = <0x10100000>;
load = <0x10100000>;
};
};
and have the default entry and load be 0x05100000 if that really is a
sensible default (otherwise put none in meson-gx-u-boot.dtsi and declare
it in each meson-gxXXX-u-boot.dtsi). Then your boards would include
meson-gxbb-u-boot.dtsi instead of meson-gx-u-boot.dtsi (and the former
DTSI would include the latter DTSI).
The benefit is that it makes it much clearer what would be required to
support a new family/SoC of the Meson GX family. Or what exactly could
differ between families. But also keeps the main -u-boot.dtsi readable
(which is not that easy to do, see our horrendous rockchip-u-boot.dtsi :( )
> +/*
> + * On GXBB the base address of the SCP firmware doesn't matter as SPL will
> + * send the firmware to the SCP anyway, and can get the base address from the
> + * FIT. On GXL it matters, as BL31 is supposed to send the firmware, so set the
> + * base address to what GXL BL2 would load the binary to.
> + */
> +#define SCP_ADDR 0x13c0000
> +
> +&binman {
> + u-boot-amlogic {
> + filename = "u-boot-meson-with-spl.bin";
> + pad-byte = <0xff>;
> +
> + mkimage {
> + filename = "spl/u-boot-spl-signed.bin";
> +#if defined(CONFIG_MESON_GXBB)
> + args = "-n", "gxbb", "-T", "amlimage";
> +#elif defined(CONFIG_MESON_GXL)
> + args = "-n", "gxl", "-T", "amlimage";
> +#endif
Same here as suggested for the load address of TF-A.
On Rockchip we use CONFIG_SYS_SOC but I don't think you can on Amlogic.
You could set SYS_SOC depending on MESON_GXBB/MESON_GXL/... in
arch/arm/mach-meson/Kconfig and be done with it, but there are some
side-effects (read SYS_SOC doc).
Another way is to add
&binman {
mkimage {
args = "-n", "gxbb", "-T", "amlimage";
};
};
to arch/arm/dts/meson-gxbb-u-boot.dtsi.
> +
> + 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?
Typically it is generated with:
u-boot-spl {
};
?
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.
> + };
> +
> + fit: fit {
> + description = "ATF and U-Boot images";
> + #address-cells = <1>;
> + fit,fdt-list = "of-list";
> + fit,external-offset = <CONFIG_FIT_EXTERNAL_OFFSET>;
> + fit,align = <512>;
> + offset = <CONFIG_SPL_PAD_TO>;
> +
> + images {
> + u-boot {
> + description = "U-Boot";
> + type = "standalone";
> + os = "u-boot";
> + arch = "arm64";
> + compression = "none";
> + load = <CONFIG_TEXT_BASE>;
> + entry = <CONFIG_TEXT_BASE>;
> +
> + u-boot-nodtb {
> + };
Why no hash for U-Boot?
> + };
> +
> + 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.
> + };
> + hash {
> + algo = "sha256";
> + };
This means your boards all need to have CONFIG_SPL_SHA256 if
CONFIG_SPL_FIT_SIGNATURE is provided otherwise the hash cannot be
verified. Please check if that is the case (enforced at the Kconfig
symbol-level would be best).
> + };
> +
> + 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.
> + hash {
> + /*
> + * The hash is used by the SCP and passed to it
> + * by U-Boot SPL.
> + */
> + algo = "sha256";
> + };
> + };
> +
> + @fdt-SEQ {
> + description = "NAME";
> + type = "flat_dt";
> + compression = "none";
why no hash for FDTs?
> + };
> +
> + };
> + configurations {
> + default = "@config-DEFAULT-SEQ";
> + @config-SEQ {
> + description = "NAME.dtb";
> + fdt = "fdt-SEQ";
> + firmware = "atf";
> + loadables = "scp", "u-boot";
> + };
> + };
> + };
> + };
> +};
> +
Is the below really related to adding binman configuration???
> +&vpu {
> + /delete-property/ bootph-all;
> +};
> +
> +&apb {
> + bootph-all;
> +};
> +
> +&sd_emmc_b {
> + bootph-all;
> +};
> +
> +&sd_emmc_c {
> + bootph-all;
> +};
> +#endif
>
Cheers,
Quentin
More information about the U-Boot
mailing list