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

Reply via email to