[PATCH 3/3] wip: binman: Move processing after templates

Moteen Shah m-shah at ti.com
Mon May 12 13:21:28 CEST 2025


Hello Simon,

On 10/05/25 16:54, Simon Glass wrote:
> Hi Moteen,
>
> On Fri, 9 May 2025 at 08:10, Moteen Shah <m-shah at ti.com> wrote:
>> Hey Simon,
>> A gentle ping on this.
>>
>> Regards,
>> Moteen
>>
>> On 28/04/25 16:53, Moteen Shah wrote:
>>> Hey Simon,
>>> Thanks for the suggestions and review.
>>>
>>> On 23/04/25 17:59, Simon Glass wrote:
>>>> Do the bootph processing after templates are handled, since templates
>>>> can change the tree structure quite a bit.
>>>>
>>>> Also avoid changing the u-boot.dtb file since that is an input to Binman
>>>>
>>>> Add some other suggested code tweaks:
>>>> - Only sync the dtb if something changed
>>>> - add more comments
>>>>
>>>> Note: This patch is just for illustration; please just combine it into
>>>> your existing work.
>>>>
>>>> Signed-off-by: Simon Glass <sjg at chromium.org>
>>>> ---
>>>>
>>>>    tools/binman/control.py | 70 +++++++++++++++++++++++++++--------------
>>>>    1 file changed, 46 insertions(+), 24 deletions(-)
>>>>
>>>> diff --git a/tools/binman/control.py b/tools/binman/control.py
>>>> index b703bdf482e..6b7c5507513 100644
>>>> --- a/tools/binman/control.py
>>>> +++ b/tools/binman/control.py
>>>> @@ -530,34 +530,55 @@ def _RemoveTemplates(parent):
>>>>        for node in del_nodes:
>>>>            node.Delete()
>>>>    -def prop_bootph_to_parent(node, prop):
>>>> -    """Propagates bootph-* property to all the parent
>>>> -    nodes up the hierarchy
>>>> -    """
>>>> -    parent = node.parent
>>>> -    if parent == None or parent.props.get(prop):
>>>> -       return
>>>> +def propagate_bootph(node, prop):
>>>> +    """Propagate bootph-* property to all the parent nodes up the
>>>> hierarchy
>>>> +
>>>> +    Args:
>>>> +        node (fdt.Node): Node to propagate the property to
>>>> +        prop (str): Property to propagate
>>>>    -    while parent:
>>>> -        parent.AddEmptyProp(prop, 0)
>>>> -        parent = parent.parent
>>>> +    Return:
>>>> +        True if any change was made, else False
>>>> +    """
>>>> +    changed = False
>>>> +    while node:
>>>> +        if prop not in node.props:
>>>> +            node.AddEmptyProp(prop, 0)
>>>> +            changed = True
>>>> +        node = node.parent
>>>> +    return changed
>>>>      def scan_and_prop_bootph(node):
>>>> -    """Scan the device tree and set the bootph-* property if its
>>>> present
>>>> -    in subnode
>>>> +    """Propagate bootph properties from children to parents
>>>> +
>>>> +    The bootph schema indicates that bootph nodes in children should
>>>> be implied
>>>> +    in their parents, all the way up the hierarchy. This is
>>>> expensive to
>>>> +    implement in U-Boot before relocation, so this function explicitly
>>>> +    propagates these bootph properties upwards.
>>>>          This is used to set the bootph-* property in the parent node
>>>> if a
>>>> -    "bootph-*" property is found in any of the subnodes of the parent
>>>> -    node.
>>>> +    "bootph-*" property is found in any of the parent's subnodes.
>>>> +
>>>> +    Args:
>>>> +        node (fdt.Node): Node to propagate the property to
>>>> +        prop (str): Property name to propagate
>>>> +
>>>> +    Return:
>>>> +        True if any change was made, else False
>>>> +
>>>>        """
>>>> -    bootph_prop = ['bootph-all', 'bootph-some-ram',
>>>> 'bootph-pre-ram', 'bootph-pre-sram']
>>>> +    bootph_prop = ['bootph-all', 'bootph-some-ram', 'bootph-pre-ram',
>>>> +                   'bootph-pre-sram']
>>>>    -    for props in bootph_prop:
>>>> -        if node.props.get(props):
>>>> -            prop_bootph_to_parent(node, props)
>>>> +    changed = False
>>>> +    for prop in bootph_prop:
>>>> +        if prop in node.props:
>>>> +            changed |= propagate_bootph(node.parent, prop)
>>>>          for subnode in node.subnodes:
>>>> -       scan_and_prop_bootph(subnode)
>>>> +        changed |= scan_and_prop_bootph(subnode)
>>>> +    return changed
>>>> +
>>>>      def PrepareImagesAndDtbs(dtb_fname, select_images, update_fdt,
>>>> use_expanded, indir):
>>>>        """Prepare the images to be processed and select the device tree
>>>> @@ -573,7 +594,7 @@ def PrepareImagesAndDtbs(dtb_fname,
>>>> select_images, update_fdt, use_expanded, ind
>>>>            dtb_fname: Filename of the device tree file to use (.dts or
>>>> .dtb)
>>>>            selected_images: List of images to output, or None for all
>>>>            update_fdt: True to update the FDT wth entry offsets, etc.
>>>> -        use_expanded: True to use expanded versions of entries, if
>>>> available.
>>>> +        use_expanded: True to use expanded versions osf entries, if
>>>> available.
>>>>                So if 'u-boot' is called for, we use 'u-boot-expanded'
>>>> instead. This
>>>>                is needed if update_fdt is True (although tests may
>>>> disable it)
>>>>            indir: List of directories where input files can be found
>>>> @@ -596,10 +617,8 @@ def PrepareImagesAndDtbs(dtb_fname,
>>>> select_images, update_fdt, use_expanded, ind
>>>>            indir = []
>>>>        dtb_fname = fdt_util.EnsureCompiled(dtb_fname, indir=indir)
>>>>        fname = tools.get_output_filename('u-boot.dtb.out')
>>>> -    dtb = fdt.FdtScan(dtb_fname)
>>>> -    scan_and_prop_bootph(dtb.GetRoot())
>>>> -    dtb.Sync(True)
>>>> -    tools.write_file(dtb_fname, dtb.GetContents())
>>>> +    tools.write_file(fname, tools.read_file(dtb_fname))
>>>> +    dtb = fdt.FdtScan(fname)
>>>>          node = _FindBinmanNode(dtb)
>>>>        if not node:
>>>> @@ -620,6 +639,9 @@ def PrepareImagesAndDtbs(dtb_fname,
>>>> select_images, update_fdt, use_expanded, ind
>>>>            fname = tools.get_output_filename('u-boot.dtb.tmpl2')
>>>>            tools.write_file(fname, dtb.GetContents())
>>>>    +    if scan_and_prop_bootph(dtb.GetRoot()):
>>>> +        dtb.Sync(True)
>>>> +
>>> I applied the suggested changes, u-boot.dtb.out does shows the
>>> bootph-* being propagated on reverse compiling, but
>>> on reverse compiling u-boot.dtb I cannot see the same behavior. I
>>> think we might have to make an explicit call to sync
>>> the two of them somehow because the dtb.Sync() here as per my
>>> understanding is syncing the changes done back to
>>> u-boot.dtb.out.
>>>
>>> Any pointers on how I can make the changes reflect in u-boot.dtb
>>> without doing this:
>>>
>>> tools.write_file(dtb_fname, dtb.GetContents())
> But why do you need to do that? It is the 'output' dtb which should be
> packaged in the image. The 'u-boot.dtb' file is an input to binman,
> not an output from it..

We are packaging the u-boot.dtb for K3 devices because of which,
I was not seeing the bootph-* being propagated.
I'll send this patch then, and send a follow up patch for K3 devices to
package u-boot.dtb.out instead.

Thanks and regards,
Moteen

>
>>>
>>> Regards,
>>> Moteen
>>>>        images = _ReadImageDesc(node, use_expanded)
>>>>          if select_images:
> Regards,
> Simon


More information about the U-Boot mailing list