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

Moteen Shah m-shah at ti.com
Fri May 9 08:10:17 CEST 2025


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())
>
>
> Regards,
> Moteen
>>       images = _ReadImageDesc(node, use_expanded)
>>         if select_images:


More information about the U-Boot mailing list