From nobody Sun Feb 8 12:37:31 2026 Received: from smtpout-04.galae.net (smtpout-04.galae.net [185.171.202.116]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 4351529BD80; Mon, 12 Jan 2026 14:21:28 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.171.202.116 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768227690; cv=none; b=b+oYMtdyfJtAmTWGzyg/NYk7ULBqQgRxIp/ZUvsRzqkpIiLjI7CwxQbT1qhoMNsPT/GSVCyTaqU3jcqnQohHDsp8MRBn4qQJXfP9x6f0Lyvu7qWMhp7QcxrplpxwnHlSjAViK9luOuOm6TnI02/Q4IHJlyhSc7RwqxO/H2edIc0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768227690; c=relaxed/simple; bh=CEasET10sP+j3Sucb0CuGp5z2ogY06a0y4XR5kPsAtM=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XTQPkBT/GZxZ+WImXNSmnQqa3aAf0OHpZXJraBUiaBOnB9inpzw0GypvFixdCOoW8xTYZk5YykSG3hYaxTi0+GzST4sjrrWJMyDJDxJNa3lDYo+57jN7SqUYgGDbTMmcQ0YipoVRstJdUdhtevHJSxIu0cajPemqq9OEGrsS8hE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com; spf=pass smtp.mailfrom=bootlin.com; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b=qr3IvNPX; arc=none smtp.client-ip=185.171.202.116 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=bootlin.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=bootlin.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=bootlin.com header.i=@bootlin.com header.b="qr3IvNPX" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-04.galae.net (Postfix) with ESMTPS id 921D9C20869; Mon, 12 Jan 2026 14:21:00 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 15FA9606FA; Mon, 12 Jan 2026 14:21:27 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 2748D103C926D; Mon, 12 Jan 2026 15:21:25 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1768227686; h=from:subject:date:message-id:to:cc:mime-version: content-transfer-encoding:in-reply-to:references; bh=qkuvUEzHxqmCDSzTmLcBGluTI+Rj6lKZ4lPg+PlL+38=; b=qr3IvNPXgRatKHsrHvQ+X7lcNyNwvcsGVOBoR5DapGl4DF8Q2tuz1caG5FfvaFcloD+AoR MttzXn5JLy9z373GCdLreYGYMiqjbvj4MqvFby/3zi44vZKh3vC7V6Rmc2K3pxu6eIcA7U 45kW5PGZVdhOaaXutel8sajWCDnr2c6rvQQuVcTPe9CfmUyyKKicWrjoi7KT07RC7kfGwa ijhke4EmAz5B+eWjycRsGCuah7QnzkB7H4mgiPgemZassXbgrjicycqn5XOetsvyD0WVId De3ef7SxwV4d7qmUNsVSFEghdsmq4LV04xRknPGBhEmgzTmlV93DryXxXFVZPA== From: Herve Codina To: David Gibson , Rob Herring , Krzysztof Kozlowski , Conor Dooley Cc: Ayush Singh , Geert Uytterhoeven , devicetree-compiler@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, devicetree-spec@vger.kernel.org, Hui Pu , Ian Ray , Luca Ceresoli , Thomas Petazzoni , Herve Codina Subject: [RFC PATCH 43/77] dtc: Introduce dti_get_node_by_ref() Date: Mon, 12 Jan 2026 15:19:33 +0100 Message-ID: <20260112142009.1006236-44-herve.codina@bootlin.com> X-Mailer: git-send-email 2.52.0 In-Reply-To: <20260112142009.1006236-1-herve.codina@bootlin.com> References: <20260112142009.1006236-1-herve.codina@bootlin.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-Last-TLS-Session-Version: TLSv1.3 Content-Type: text/plain; charset="utf-8" The future introduction of orphan nodes for addons device-tree will lead to more than one tree in the addons data. Those trees will be: - the classical root tree starting at the root node - trees related to orphan nodes Also, an addon device-tree can have only trees based on orphan nodes. In other words an addon device-tree is valid without having the classical 'root' tree. To prepare this change, introduce and use dti_get_node_by_ref(). dti_get_node_by_ref() retrieves a node by a reference (a label or a path) like get_node_by_ref() but it works at the struct dt_info level. It handles the case where a 'root' device-tree is not present and will handle orphan nodes trees as soon as they will be introduced. This introduction doesn't lead to any functional changes. Signed-off-by: Herve Codina --- checks.c | 10 ++++------ dtc-parser.y | 22 +++++++++++++++++----- dtc.h | 2 +- livetree.c | 19 ++++++++++++++++--- 4 files changed, 38 insertions(+), 15 deletions(-) diff --git a/checks.c b/checks.c index fd22524..a47870d 100644 --- a/checks.c +++ b/checks.c @@ -486,7 +486,6 @@ ERROR(duplicate_label, check_duplicate_label_node, NULL= ); static cell_t check_phandle_prop(struct check *c, struct dt_info *dti, struct node *node, const char *propname) { - struct node *root =3D dti->dt; struct property *prop; struct marker *m; cell_t phandle; @@ -504,7 +503,7 @@ static cell_t check_phandle_prop(struct check *c, struc= t dt_info *dti, m =3D prop->val.markers; for_each_marker_of_type(m, REF_PHANDLE) { assert(m->offset =3D=3D 0); - if (node !=3D get_node_by_ref(root, m->ref)) + if (node !=3D dti_get_node_by_ref(dti, m->ref)) /* "Set this node's phandle equal to some * other node's phandle". That's nonsensical * by construction. */ { @@ -614,7 +613,7 @@ static void fixup_phandle_references(struct check *c, s= truct dt_info *dti, for_each_marker_of_type(m, REF_PHANDLE) { assert(m->offset + sizeof(cell_t) <=3D prop->val.len); =20 - refnode =3D get_node_by_ref(dt, m->ref); + refnode =3D dti_get_node_by_ref(dti, m->ref); if (! refnode) { if (!(dti->dtsflags & (DTSF_PLUGIN | DTSF_ADDON))) FAIL(c, dti, node, "Reference to non-existent node or " @@ -633,7 +632,7 @@ static void fixup_phandle_references(struct check *c, s= truct dt_info *dti, } =20 for_each_symbol(node->exportsymlist, exportsym) { - refnode =3D get_node_by_ref(dt, exportsym->ref); + refnode =3D dti_get_node_by_ref(dti, exportsym->ref); if (!refnode) { if (!(dti->dtsflags & (DTSF_PLUGIN | DTSF_ADDON))) { FAIL(c, dti, node, @@ -657,7 +656,6 @@ ERROR(phandle_references, fixup_phandle_references, NUL= L, static void fixup_path_references(struct check *c, struct dt_info *dti, struct node *node) { - struct node *dt =3D dti->dt; struct property *prop; =20 for_each_property(node, prop) { @@ -668,7 +666,7 @@ static void fixup_path_references(struct check *c, stru= ct dt_info *dti, for_each_marker_of_type(m, REF_PATH) { assert(m->offset <=3D prop->val.len); =20 - refnode =3D get_node_by_ref(dt, m->ref); + refnode =3D dti_get_node_by_ref(dti, m->ref); if (!refnode) { FAIL(c, dti, node, "Reference to non-existent node or label \"%s\"\n", m->ref); diff --git a/dtc-parser.y b/dtc-parser.y index 61ebde2..08b3642 100644 --- a/dtc-parser.y +++ b/dtc-parser.y @@ -31,6 +31,18 @@ static bool is_ref_relative(const char *ref) return ref[0] !=3D '/' && strchr(&ref[1], '/'); } =20 +static struct node *parser_get_node_by_ref(struct node *dt, const char *re= f) +{ + /* + * Use a temporary dt_info in order to use dti_get_node_by_ref() + */ + struct dt_info dti =3D {}; + + dti.dt =3D dt; + + return dti_get_node_by_ref(&dti, ref); +} + %} =20 %union { @@ -240,7 +252,7 @@ devicetree: } | devicetree DT_LABEL dt_ref nodedef { - struct node *target =3D get_node_by_ref($1, $3); + struct node *target =3D parser_get_node_by_ref($1, $3); =20 if ((last_header_flags & DTSF_PLUGIN) && is_ref_relative($3)) ERROR(&@2, "Label-relative reference %s not supported in plugin", $3); @@ -259,7 +271,7 @@ devicetree: ERROR(&@2, "Label-relative reference %s not supported in plugin", $2); add_orphan_node($1, $3, $2); } else { - struct node *target =3D get_node_by_ref($1, $2); + struct node *target =3D parser_get_node_by_ref($1, $2); =20 if (target) merge_nodes(target, $3); @@ -270,7 +282,7 @@ devicetree: } | devicetree DT_LABEL_REF nodedef { - struct node *target =3D get_node_by_ref($1, $2); + struct node *target =3D parser_get_node_by_ref($1, $2); =20 if (target) { merge_nodes(target, $3); @@ -284,7 +296,7 @@ devicetree: } | devicetree DT_DEL_NODE dt_ref ';' { - struct node *target =3D get_node_by_ref($1, $3); + struct node *target =3D parser_get_node_by_ref($1, $3); =20 if (target) delete_node(target); @@ -296,7 +308,7 @@ devicetree: } | devicetree DT_OMIT_NO_REF dt_ref ';' { - struct node *target =3D get_node_by_ref($1, $3); + struct node *target =3D parser_get_node_by_ref($1, $3); =20 if (target) omit_node_if_unused(target); diff --git a/dtc.h b/dtc.h index 7d53fcb..832265c 100644 --- a/dtc.h +++ b/dtc.h @@ -323,7 +323,6 @@ struct property *get_property_by_label(struct node *tre= e, const char *label, struct marker *get_marker_label(struct node *tree, const char *label, struct node **node, struct property **prop); struct node *get_subnode(struct node *node, const char *nodename); -struct node *get_node_by_ref(struct node *tree, const char *ref); cell_t get_node_phandle(struct node *root, struct node *node); =20 uint32_t guess_boot_cpuid(struct node *tree); @@ -357,6 +356,7 @@ struct dt_info { struct node *dti_get_node_by_path(struct dt_info *dti, const char *path); struct node *dti_get_node_by_label(struct dt_info *dti, const char *label); struct node *dti_get_node_by_phandle(struct dt_info *dti, cell_t phandle); +struct node *dti_get_node_by_ref(struct dt_info *dti, const char *ref); =20 /* DTS version flags definitions */ #define DTSF_V1 0x0001 /* /dts-v1/ */ diff --git a/livetree.c b/livetree.c index a551307..f1c7e27 100644 --- a/livetree.c +++ b/livetree.c @@ -748,7 +748,7 @@ static struct node *get_node_by_phandle(struct node *tr= ee, cell_t phandle) return NULL; } =20 -struct node *get_node_by_ref(struct node *tree, const char *ref) +static struct node *get_node_by_ref(struct node *tree, const char *ref) { struct node *target =3D tree; const char *label =3D NULL, *path =3D NULL; @@ -824,6 +824,19 @@ struct node *dti_get_node_by_phandle(struct dt_info *d= ti, cell_t phandle) return NULL; } =20 +struct node *dti_get_node_by_ref(struct dt_info *dti, const char *ref) +{ + struct node *node; + + if (dti->dt) { + node =3D get_node_by_ref(dti->dt, ref); + if (node) + return node; + } + + return NULL; +} + static void add_phandle_property(struct node *node, const char *name, int format) { @@ -1407,7 +1420,7 @@ static void mark_local_phandles_internal(struct dt_in= fo *dti, for_each_property(node, prop) { m =3D prop->val.markers; for_each_marker_of_type(m, REF_PHANDLE) { - refnode =3D get_node_by_ref(dti->dt, m->ref); + refnode =3D dti_get_node_by_ref(dti, m->ref); if (refnode) m->is_local =3D true; } @@ -1460,7 +1473,7 @@ static void mark_local_exports_internal(struct dt_inf= o *dti, struct node *refnode; =20 for_each_symbol(node->exportsymlist, exportsym) { - refnode =3D get_node_by_ref(dti->dt, exportsym->ref); + refnode =3D dti_get_node_by_ref(dti, exportsym->ref); if (refnode) exportsym->is_local =3D true; } --=20 2.52.0