[PATCH 1/2] tools: binman: control.py: Propagate bootph-* properties to supernodes

Moteen Shah m-shah at ti.com
Wed May 14 08:05:59 CEST 2025


Hey Quentin,
Thanks for the review.

On 13/05/25 16:10, Quentin Schulz wrote:
> Hi Moteen,
>
> On 5/12/25 1:50 PM, Moteen Shah wrote:
>> Add a function to scan through all the nodes in the device-tree
>> for bootph-* property. If found, propagate it to all of its parent
>
> It's not scanning for bootph-* properties. It's scanning for two 
> specific bootph properties, so try to update the commit log and 
> comments so it's not misleading.
>

I will update the commit message in the revision.

> The commit log is lacking information as to why we need to do this, 
> what this helps with and why this is specific to bootph-all and 
> bootph-some-ram.

 > Why this is specific to bootph-all and bootph-some-ram

The other ones are handled by fdtgrep as those are for the SPL stage.

>
> We need to be able to look at this patch in 5 years and have a clue of 
> why this was required.

Noted.

>
>> nodes up the hierarchy.
>>
>> Signed-off-by: Moteen Shah <m-shah at ti.com>
>> Signed-off-by: Simon Glass <sjg at chromium.org>
>> ---
>>   tools/binman/control.py | 51 +++++++++++++++++++++++++++++++++++++++++
>>   1 file changed, 51 insertions(+)
>>
>> diff --git a/tools/binman/control.py b/tools/binman/control.py
>> index 81f61e3e152..ccf081cb686 100644
>> --- a/tools/binman/control.py
>> +++ b/tools/binman/control.py
>> @@ -530,6 +530,54 @@ def _RemoveTemplates(parent):
>>       for node in del_nodes:
>>           node.Delete()
>>   +def propagate_bootph(node, prop):
>> +    """Propagate bootph-* property to all the parent nodes up the 
>> hierarchy
>> +
>
> Misleading, it's not propagating bootph properties, it's propagating 
> the prop passed as an argument to the function, so rename to something 
> like propagate_prop and update the comment.

Okay, will rename this to propagate_prop.

>
> Be clear also that this is expected to be a boolean property (because 
> of AddEmptyProp).

Noted.

>
>> +    Args:
>> +        node (fdt.Node): Node to propagate the property to
>
> Specify that all its parents (recursively) will have this property 
> propagated to.

It is iterative not recursive. How about: "Node and all its parent nodes 
above it to propagate the property to iteratively"

>
>> +        prop (str): Property to propagate
>> +
>> +    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):
>> +    """Propagate bootph properties from children to parents
>> +
>> +    The bootph schema indicates that bootph nodes in children should 
>> be implied
>
> s/nodes/properties/

Will change in the revision

>
>> +    in their parents, all the way up the hierarchy. This is 
>> expensive to
>> +    implement in U-Boot before relocation, so this function explicitly
>
> I think the point here is "at runtime" which is missing.
>

Noted.

>> +    propagates these bootph properties upwards.
>
> at build time :)
>

Noted.

>> +
>> +    This is used to set the bootph-* property in the parent node if a
>> +    "bootph-*" property is found in any of the parent's subnodes.
>> +
>
> This is all misleading, we aren't propagating all bootph properties
>
>> +    Args:
>> +        node (fdt.Node): Node to propagate the property to
>
> Same remarks as for the propagate_bootph method above.
>
>> +        prop (str): Property name to propagate
>> +
>> +    Return:
>> +        True if any change was made, else False
>> +
>> +    """
>> +    bootph_prop = ['bootph-all', 'bootph-some-ram']
>> +
>
> Please explain why those only.

Answered above.

>
>> +    changed = False
>> +    for prop in bootph_prop:
>> +        if prop in node.props:
>> +            changed |= propagate_bootph(node.parent, prop)
>> +
>> +    for subnode in node.subnodes:
>> +        changed |= scan_and_prop_bootph(subnode)
>> +    return changed
>> +
>
> I have a gut feeling this is suboptimal, though simple and easy to 
> maintain.
> We currently go up to the root node for each and every found 
> bootph-{all,some-ram} property. We could simply divide this by half 
> (or more if there are more properties to propagate in the future) by 
> passing the props to propagate instead of just one. We can keep track 
> of which node has propagated the property already and, for its 
> children, stop the propagation at that level instead of going up to 
> the root node all the time. I'm not sure typical Device Trees are deep 
> enough for us to care about that kind of optimization for now, 
> especially since it'll be running at build time only?
>

 > passing the props to propagate instead of just one

Since we are only concerned with the post SPL stage with this patch 
since the SPL stages are handled by fdtgrep, I am not sure if adding 
this optimization would result in gains assuming that bootph-all is the 
superset of all bootph-* properties(this patch concerns only with 
some-ram and all) and adding anything with bootph-all in the same node 
will be redundant?


 > stop the propagation at that level instead of going up to the root 
node all the time

This optimization will surely result in gains of about few microseconds 
I would assume, since we are running this on host PC.
I am not sure if we require such optimizations in build time. It would 
be great if I can get some more opinions on this. I am not able to 
profile the time delta in build time with this patch since every build 
is having differences of few seconds between them on the same tree. I 
tried using pythons cprofiler on the function[0], didn't find any timing 
overheads as expected since we are running things on host PC which is 
way faster than the SoC's.

[1]https://gist.github.com/Jamm02/6ce3e4eb1fd2442ad5e01ff89ead6e6e

Regards,
Moteen

> Cheers,
> Quentin


More information about the U-Boot mailing list