From nobody Sun Feb 8 12:37:32 2026 Received: from smtpout-03.galae.net (smtpout-03.galae.net [185.246.85.4]) (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 39AAB2EBDE9; Mon, 12 Jan 2026 14:20:52 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.246.85.4 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768227660; cv=none; b=s8lRhiKZAzlhvCG1jzCHWJXhMeKD7d1xbg/ofiOG7l71ZFsyRWX6HgNroSg+gKu3tXIIjW9+Y7a/J6tsCiUhyqp5dr6d7GP1gy8w7akfreqrv2PvzyoBMWrgUeVsYn1RgUJ1ln4aVDlcQmo+F9QUrJyktuOmCQv7tyWsTucQK4Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1768227660; c=relaxed/simple; bh=qLF2kIyfVul0cJD4gyl/NdCPlfl+XCaJm1dQgoBndY8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Jr6M5oscfF/Lsg3ux2eBkDM0xJ2Vcbp4e1Tf9Zhic7/VKuTe/PAKb+IrcjX0wLarCuQjU3uuoG3aQT+Zw/m/WHLW3w0gW2V728RriPKz90VlOor90uPOTs9A31tbC/lEsSSgPIl7Xe+MjI6mVrRxwSB36N7IgHOA67gdL/y3uU0= 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=rMXQPsAX; arc=none smtp.client-ip=185.246.85.4 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="rMXQPsAX" Received: from smtpout-01.galae.net (smtpout-01.galae.net [212.83.139.233]) by smtpout-03.galae.net (Postfix) with ESMTPS id 5E9AF4E42091; Mon, 12 Jan 2026 14:20:51 +0000 (UTC) Received: from mail.galae.net (mail.galae.net [212.83.136.155]) by smtpout-01.galae.net (Postfix) with ESMTPS id 2E417606FA; Mon, 12 Jan 2026 14:20:51 +0000 (UTC) Received: from [127.0.0.1] (localhost [127.0.0.1]) by localhost (Mailerdaemon) with ESMTPSA id 08971103C9260; Mon, 12 Jan 2026 15:20:48 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bootlin.com; s=dkim; t=1768227650; h=from:subject:date:message-id:to:cc:mime-version: content-transfer-encoding:in-reply-to:references; bh=4YJltUWUeDp+5OZdI6WlzDErfO/ft9YRY1mAHR9txhk=; b=rMXQPsAXQHxXoBuqz/fCr1rGV80J9TwFxDkNRmFwhxW0SzPWMlQPQu0DQOA79xSuHxdElT 06QXFVqvXhkdkuJiNMunxqeCu9JM8BV3lpKDj+o0Sbm2nhTAkmXmGWhimecxcNyTFbKHMu XX3TZPlVCwVfjVH67QQO6UTkx9DrcFeMS4O8fxEJIwPAGdhBCjFLT+DctUDFbyHaHMoXry VmJr7CJzmDzzk03yRaaL/QZMzEnaTaFgNH5mvuBHfvi5bmDa3vImRwC3wtMoyF4IiFA7pP hOcz7iwOdEWqQq9lqBMTlFafRo78zY5HrvFlVIha9YEHWj2v8gxuqbFeNg68bw== 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 19/77] dtc: Introduce export symbols Date: Mon, 12 Jan 2026 15:19:09 +0100 Message-ID: <20260112142009.1006236-20-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" Export symbols allow to define a list of symbols exported at a given node level. Those exported symbols can be used by an addon when the addon is applied on the node exporting the symbols. In order to perform its symbol resolution. Any unresolved phandle value will be resolved using those exported symbols. The feature is similar to __symbols__ involved with overlay but while all symbols are visible with __symbols__, only specific symbols (exported symbols) are visible with export symbols. Also an exported symbol has a specific name and this name has to used for symbol resolution. Having this specific name allows to: - Have several nodes providing the same exported symbols name but each of them pointing to different nodes. Without looking at the detail of the syntax, node-a and node-b export the same symbol foo but pointing to different node. node-a { /* export foo -> /path/foo1 */ }; node-b { /* export foo -> /path/foo2 */ }; This allow to have the exact same addon referencing 'foo' applied either on node-a or node-b. - Have several board describing a well defined node even if resources needed for exported symbols are not the same. On board A, the 'ctrl' exported symbols points to some ctrl device available on the SoC: node { /* export 'ctrl' -> /soc/ctrl@1000 }; On board B, the ctrl device used is on a i2c bus node { /* export 'ctrl' -> /soc/i2c@5000/ctrl@10 }; The addon can be used on board A and board B without any modification. It uses 'ctrl' exported by the node the it is applied to. Introduce the 'symbol' internal data structure and the export symbol list related to a node. No functional change yet but preparation for the future support for export symbol parsing. Signed-off-by: Herve Codina --- dtc-parser.y | 6 +++--- dtc.h | 13 ++++++++++++- flattree.c | 2 +- fstree.c | 2 +- livetree.c | 7 ++++--- 5 files changed, 21 insertions(+), 9 deletions(-) diff --git a/dtc-parser.y b/dtc-parser.y index 2e152b0..9c93673 100644 --- a/dtc-parser.y +++ b/dtc-parser.y @@ -183,7 +183,7 @@ devicetree: else if (is_ref_relative($1)) ERROR(&@2, "Label-relative reference %s not supported in plugin", $1); $$ =3D add_orphan_node( - name_node(build_node(NULL, NULL, NULL), + name_node(build_node(NULL, NULL, NULL, NULL), ""), $2, $1); } @@ -270,11 +270,11 @@ devicetree: nodedef: '{' proplist subnodes '}' ';' { - $$ =3D build_node($2, $3, &@$); + $$ =3D build_node($2, $3, NULL, &@$); } | '{' subnodes '}' ';' { - $$ =3D build_node(NULL, $2, &@$); + $$ =3D build_node(NULL, $2, NULL, &@$); } ; =20 diff --git a/dtc.h b/dtc.h index c0fffd2..6508694 100644 --- a/dtc.h +++ b/dtc.h @@ -204,6 +204,16 @@ struct label { struct label *next; }; =20 +struct symbol { + bool is_local; + char *name; + char *ref; + cell_t phandle; + char *fullpath; + struct symbol *next; + struct srcpos *srcpos; +}; + struct bus_type { const char *name; }; @@ -224,6 +234,7 @@ struct node { char *name; struct property *proplist; struct node *children; + struct symbol *exportsymlist; =20 struct node *parent; struct node *next_sibling; @@ -272,7 +283,7 @@ struct property *chain_property(struct property *first,= struct property *list); struct property *reverse_properties(struct property *first); =20 struct node *build_node(struct property *proplist, struct node *children, - struct srcpos *srcpos); + struct symbol *exportsymlist, struct srcpos *srcpos); struct node *build_node_delete(struct srcpos *srcpos); struct node *name_node(struct node *node, const char *name); struct node *omit_node_if_unused(struct node *node); diff --git a/flattree.c b/flattree.c index bedb286..36b795d 100644 --- a/flattree.c +++ b/flattree.c @@ -809,7 +809,7 @@ static struct node *unflatten_tree(struct inbuf *dtbuf, uint32_t offset; const char *str; =20 - node =3D build_node(NULL, NULL, NULL); + node =3D build_node(NULL, NULL, NULL, NULL); =20 flatname =3D flat_read_string(dtbuf); =20 diff --git a/fstree.c b/fstree.c index 0f9a534..445ae53 100644 --- a/fstree.c +++ b/fstree.c @@ -19,7 +19,7 @@ static struct node *read_fstree(const char *dirname) if (!d) die("Couldn't opendir() \"%s\": %s\n", dirname, strerror(errno)); =20 - tree =3D build_node(NULL, NULL, NULL); + tree =3D build_node(NULL, NULL, NULL, NULL); =20 while ((de =3D readdir(d)) !=3D NULL) { char *tmpname; diff --git a/livetree.c b/livetree.c index 2a0a7ed..0050492 100644 --- a/livetree.c +++ b/livetree.c @@ -86,7 +86,7 @@ struct property *reverse_properties(struct property *firs= t) } =20 struct node *build_node(struct property *proplist, struct node *children, - struct srcpos *srcpos) + struct symbol *exportsymlist, struct srcpos *srcpos) { struct node *new =3D xmalloc(sizeof(*new)); struct node *child; @@ -95,6 +95,7 @@ struct node *build_node(struct property *proplist, struct= node *children, =20 new->proplist =3D reverse_properties(proplist); new->children =3D children; + new->exportsymlist =3D exportsymlist; new->srcpos =3D srcpos_copy(srcpos); =20 for_each_child(new, child) { @@ -248,7 +249,7 @@ struct node * add_orphan_node(struct node *dt, struct n= ode *new_node, char *ref) xasprintf(&name, "fragment@%u", next_orphan_fragment++); name_node(new_node, "__overlay__"); - node =3D build_node(p, new_node, NULL); + node =3D build_node(p, new_node, NULL, NULL); name_node(node, name); free(name); =20 @@ -892,7 +893,7 @@ static struct node *build_and_name_child_node(struct no= de *parent, const char *n { struct node *node; =20 - node =3D build_node(NULL, NULL, NULL); + node =3D build_node(NULL, NULL, NULL, NULL); name_node(node, name); add_child(parent, node); =20 --=20 2.52.0