Re: [PATCH v2 06/10] binman: Add support for pre-patching FDTs in a FIT with a /chosen node

Alexey Charkov <[email protected]> Tue, 4 Aug 2026 18:15:01 +0400
Newsgroups gmane.comp.boot-loaders.u-boot
Message-ID <CAKTNdwGLEBm6W1s-xAnhwK+Wpisek87kLMPF9grm+J7tmZKW3A@mail.gmail.com>
Hi Simon,

On Tue, Aug 4, 2026 at 5:03=E2=80=AFPM Simon Glass <[email protected]> wrote=
:
>
> Hi Alexey,
>
> On 2026-07-31T17:10:44, Alexey Charkov <[email protected]> wrote:
> > binman: Add support for pre-patching FDTs in a FIT with a /chosen node
> >
> > When a generated FIT is used to boot Linux directly, bypassing U-Boot
> > proper (Falcon mode), there is no runtime code to discover the kernel
> > command line and (optional) initrd location and include them in a FDT.
> >
> > To facilitate easier preparation of a ready-to-boot FIT, add support fo=
r
> > pre-patching the FDTs in a FIT with a preconfigured /chosen node includ=
ing
> > the bootargs and initrd location.
> >
> > Signed-off-by: Alexey Charkov <[email protected]>
> >
> > tools/binman/entry.py     |   8 ++++
> >  tools/binman/etype/fit.py | 103 ++++++++++++++++++++++++++++++++++++++=
++++++++
> >  2 files changed, 111 insertions(+)
>
> > diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py
> > @@ -745,6 +779,66 @@ class Entry_fit(Entry_section):
> > +        if initrd_name:
> > +            entry =3D self._priv_entries.get(initrd_name)
> > +            initrd =3D entry.GetData(required=3DFalse) if entry else N=
one
> > +            size =3D len(initrd) if initrd else 0
> > +            if size:
>
> If fit,initrd names an image that does not exist in the FIT (e.g. a
> typo - 'randisk' instead of 'ramdisk'), entry is None and the initrd
> fixup is silently skipped. The user ends up with a Falcon-mode image
> that has no initrd, with no hint from binman as to why. Please raise
> here when the referenced image is not present at all, and only fall
> back to the silent skip when the entry exists but has no data (the
> "optional initramfs was not supplied" case the docs mention).

Indeed, let me add an explicit check for that, thanks.

> > diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py
> > @@ -745,6 +779,66 @@ class Entry_fit(Entry_section):
> > +                # Use the device tree's root #address-cells for the wi=
dth, as
> > +                # fdt_initrd() does (4 bytes per cell)
> > +                cells =3D 4 * libfdt.check_err(
> > +                    libfdt.fdt_address_cells(fdt._fdt, 0))
> > +                fdt.setprop(chosen, 'linux,initrd-start',
> > +                            start.to_bytes(cells, 'big'))
> > +                fdt.setprop(chosen, 'linux,initrd-end',
> > +                            end.to_bytes(cells, 'big'))
> > +                # Reserve the initramfs region so the kernel does not =
reuse it
> > +                libfdt.check_err(
> > +                    libfdt.fdt_add_mem_rsv(fdt._fdt, start, size))
>
> Hmm should we add address_cells() and add_mem_rsv() to the fdt
> library? We should not really be going into the private attribute.

Yep. Let me expose it publicly, thanks.

> > diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py
> > @@ -302,6 +302,40 @@ class Entry_fit(Entry_section):
> > +    Patching /chosen into the generated device trees
> > +    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>
> The underline is longer than the heading title - please trim it to match.
>
> > diff --git a/tools/binman/etype/fit.py b/tools/binman/etype/fit.py
> > @@ -302,6 +302,40 @@ class Entry_fit(Entry_section):
> > +    fit,bootargs
> > +        A string written to /chosen/bootargs of every generated device=
 tree
> > +        (any existing value is overwritten). Typically set to `CONFIG_=
BOOTARGS`
> > +        via the preprocessed devicetree source.
>
> The docs say 'any existing value is overwritten', but the
> implementation guards with 'if bootargs:', so an empty fit,bootargs =3D
> '' leaves any pre-existing /chosen/bootargs in place. Either the docs
> or the code should change - I'd expect the empty case to be treated
> the same as absent (leave untouched), and the docs updated to say so.

Makes sense, will adjust.

> > diff --git a/tools/binman/entry.py b/tools/binman/entry.py
> > @@ -636,6 +636,14 @@ class Entry(object):
> > +    def GetNode(self):
> > +        """Get the devicetree node which describes this entry
> > +
> > +        Returns:
> > +            Node: Node for this entry
> > +        """
> > +        return self._node
>
> Nice - good addition. There are a few existing entry._node accessors
> in control.py that could be converted in a follow-up, but no need in
> this series.

Thanks a lot for looking into this!

Best regards,
Alexey