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

Moteen Shah m-shah at ti.com
Thu May 15 11:01:08 CEST 2025


Hey Quentin,

On 14/05/25 21:42, Quentin Schulz wrote:
> Hi Moteen,
>
> On 5/14/25 8:05 AM, Moteen Shah wrote:
>> 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.
>>
>
> Yup, the issue is that the non-proper stages do not actually read the 
> bootph nodes as they are stripped by fdtgrep. The DTB for the stage is 
> of everything relevant to the stage, without the bootph nodes. This is 
> done to save precious space (instead of having a full DTB with 
> appropriate bootph nodes, we only keep the bootph nodes and we strip 
> the bootph properties from them as they are now implied). However, the 
> proper stage (and specifically the pre-relocation part of the proper 
> stage) uses the full DTB, with bootph properties. So we need to 
> propagate them so that pre-relocation works as expected since it'll 
> check whether bootph-all/bootph-some-ram property is part of the node 
> before probing the device.
>
> [...]
>
>>>> +    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"
>>
>
> Mmmm, true, I had in mind that recursive also works for defining 
> "parent of parent" and "parent of parent of parent", etc, but it 
> really seems the term is specific to recursion, which we don't use here.
>
> Can suggest something like:
>
> Node to propagate the property to. Its parents (and their parents, and 
> so on until the root node) are also propagated the property.
>
> [...]
>
>>>> +    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?
>>
>
> Something like: (not tested)
>
> def propagate_bootph(node, props):
>     changed = False
>     while node:
>         to_write = props - set(node.props)
>         for prop in to_write:
>             node.AddEmptyProp(prop, 0)
>             changed = True
>         node = node.parent
>     return changed
>
> def scan_and_prop_bootph(node):
>     bootph_prop = {'bootph-all', 'bootph-some-ram'}
>
>     changed = False
>     to_propagate = bootph_prop & set(node.props)
>     if to_propagate:
>         changed |= propagate_bootph(node.parent, to_propagate)
> [...]

Thanks for the pseudo code, question on this again, can a node have 
bootph-all and bootph-some-ram together which we would require to 
propagate together. In my understanding having both of these property in 
the same node present will be a redundancy, and searching in current 
tree as well, I found no such examples of both the properties being used 
in the same node. If in future we are planning to add more bootph* 
properties in the proper stage(pre-relocation) this change does makes 
sense. Let me know if I should add this in my next revision.

Regards,
Moteen


>
>>
>>  > 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 
>
> require? No :)
>
> We can optimize later on if it really becomes annoying for build time 
> but I'm sure there are other places in code where optimizing would be 
> more beneficial :)
>
> So no worries about the optimization ;) (also not sure it is 
> necessarily more optimized what I'm suggesting, just a gut feeling).
>
> Cheers,
> Quentin


More information about the U-Boot mailing list