[RFC PATCH 07/77] livetree: Improve get_node_by_phandle()
Herve Codina <[email protected]> Mon, 12 Jan 2026 15:18:57 +0100
| Newsgroups | org.kernel.vger.devicetree-spec,org.kernel.vger.devicetree-compiler,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
get_node_by_phandle() allows to get a node based on its phandle value. It checks the phandle value against value available in internal node structure. This internal phandle value is updated during process_check() and so, get_node_by_phandle() cannot give correct results before the process_check() call. Improve get_node_by_phandle() to look at node phandle properties when the internal phandle value is not valid. This allows to return a correct matching node even if process_check() was not called yet. With the recently introduced FDT_REF_LOCAL dtb tag, this will be needed to update internal phandle references before the call to process_check(). Indeed, this tag allows to identify phandles and internal references need to be updated based on the phandle value before the process_check() call. Signed-off-by: Herve Codina <[email protected]> --- livetree.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/livetree.c b/livetree.c index f328824..9b67934 100644 --- a/livetree.c +++ b/livetree.c @@ -609,16 +609,35 @@ struct node *get_node_by_label(struct node *tree, const char *label) return NULL; } +static cell_t get_node_phandle_existing(struct node *node) +{ + struct property *prop; + + if (phandle_is_valid(node->phandle)) + return node->phandle; + + prop = get_property(node, "phandle"); + if (!prop) { + prop = get_property(node, "linux,phandle"); + if (!prop) + return 0; + } + + return propval_cell(prop); +} + struct node *get_node_by_phandle(struct node *tree, cell_t phandle) { struct node *child, *node; + cell_t tree_phandle; if (!phandle_is_valid(phandle)) { assert(generate_fixups); return NULL; } - if (tree->phandle == phandle) { + tree_phandle = get_node_phandle_existing(tree); + if (phandle_is_valid(tree_phandle) && tree_phandle == phandle) { if (tree->deleted) return NULL; return tree; -- 2.52.0