From: Herve Codina <herve.codina@bootlin.com>
To: David Gibson <david@gibson.dropbear.id.au>,
Andrew Davis <afd@ti.com>, Ayush Singh <ayush@beagleboard.org>,
Geert Uytterhoeven <geert@linux-m68k.org>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>,
Herve Codina <herve.codina@bootlin.com>,
Arnd Bergmann <arnd@arndb.de>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Saravana Kannan <saravanak@google.com>
Cc: devicetree@vger.kernel.org, devicetree-compiler@vger.kernel.org,
linux-kernel@vger.kernel.org,
Luca Ceresoli <luca.ceresoli@bootlin.com>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Subject: [PATCH v2 4/7] of: resolver: Add support for the export symbols node
Date: Wed, 30 Apr 2025 14:51:48 +0200 [thread overview]
Message-ID: <20250430125154.195498-5-herve.codina@bootlin.com> (raw)
In-Reply-To: <20250430125154.195498-1-herve.codina@bootlin.com>
Symbols resolution done when an overlay is applied looks only at the
global __symbol__ node to resolve unknown symbols from the overlay (i.e
symbols listed in the overlay __fixups__ node).
In order to provide flexibilities and allow to define some additional
symbols visible only when an overlay is applied to a specific node,
introduce the export symbols node.
The export symbols node adds some additional symbols that can be used
in the symbols resolution. The resolver tries to match unresolved
symbols first using the export symbols node and, if a match is not
found, it tries to match using the global __symbol__ node.
Contrary to symbols available in the global __symbols__ node, symbols
listed in the export symbols node can be considered as local symbols.
Indeed, they can be changed depending on the node the overlay is going
to be applied to and are only visibible from the current recolver call.
Handle those additional symbols given by the export symbols node in the
symbols resolution.
Signed-off-by: Herve Codina <herve.codina@bootlin.com>
Tested-by: Ayush Singh <ayush@beagleboard.org>
---
drivers/of/resolver.c | 33 +++++++++++++++++++++++++++++----
drivers/of/unittest.c | 4 ++--
2 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/drivers/of/resolver.c b/drivers/of/resolver.c
index 5c492711b21f..c2b63cec1865 100644
--- a/drivers/of/resolver.c
+++ b/drivers/of/resolver.c
@@ -220,6 +220,9 @@ static int get_phandle_from_symbols_node(const struct device_node *tree_symbols,
const char *refpath;
int err;
+ if (!tree_symbols)
+ return -ENOENT;
+
err = of_property_read_string(tree_symbols, symbol_name, &refpath);
if (err)
return err;
@@ -234,6 +237,25 @@ static int get_phandle_from_symbols_node(const struct device_node *tree_symbols,
return 0;
}
+static int get_phandle_from_export_node(const struct device_node *export_symbols,
+ const char *symbol_name,
+ phandle *phandle)
+{
+ struct device_node *refnode;
+
+ if (!export_symbols)
+ return -ENOENT;
+
+ refnode = of_parse_phandle(export_symbols, symbol_name, 0);
+ if (!refnode)
+ return -ENOENT;
+
+ *phandle = refnode->phandle;
+ of_node_put(refnode);
+
+ return 0;
+}
+
/**
* of_resolve_phandles - Relocate and resolve overlay against live tree
*
@@ -312,7 +334,7 @@ int of_resolve_phandles(struct device_node *overlay, const struct device_node *e
return 0;
struct device_node __free(device_node) *tree_symbols = of_find_node_by_path("/__symbols__");
- if (!tree_symbols) {
+ if (!tree_symbols && !export_symbols) {
pr_err("no symbols in root of device tree.\n");
return -EINVAL;
}
@@ -323,10 +345,13 @@ int of_resolve_phandles(struct device_node *overlay, const struct device_node *e
if (!of_prop_cmp(prop->name, "name"))
continue;
- err = get_phandle_from_symbols_node(tree_symbols, prop->name,
- &phandle);
+ err = get_phandle_from_export_node(export_symbols, prop->name,
+ &phandle);
+ if (err)
+ err = get_phandle_from_symbols_node(tree_symbols, prop->name,
+ &phandle);
if (err) {
- pr_err("node label '%s' not found or invalid in live devicetree symbols table\n",
+ pr_err("node label '%s' not found or invalid in live devicetree symbols or export tables\n",
prop->name);
return err;
}
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index 620237365566..658690fd6980 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -4146,7 +4146,7 @@ static __init void of_unittest_overlay_high_level(void)
/* --- overlay_bad_unresolved --- */
EXPECT_BEGIN(KERN_ERR,
- "OF: resolver: node label 'this_label_does_not_exist' not found in live devicetree symbols table");
+ "OF: resolver: node label 'this_label_does_not_exist' not found or invalid in live devicetree symbols or export tables");
EXPECT_BEGIN(KERN_ERR,
"OF: resolver: overlay phandle fixup failed: -22");
@@ -4156,7 +4156,7 @@ static __init void of_unittest_overlay_high_level(void)
EXPECT_END(KERN_ERR,
"OF: resolver: overlay phandle fixup failed: -22");
EXPECT_END(KERN_ERR,
- "OF: resolver: node label 'this_label_does_not_exist' not found in live devicetree symbols table");
+ "OF: resolver: node label 'this_label_does_not_exist' not found or invalid in live devicetree symbols or export tables");
return;
--
2.49.0
next prev parent reply other threads:[~2025-04-30 12:52 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-30 12:51 [PATCH v2 0/7] of: overlay: Add support for export-symbols node feature Herve Codina
2025-04-30 12:51 ` [PATCH v2 1/7] dt-bindings: Add support for export-symbols node Herve Codina
2025-05-02 14:33 ` Luca Ceresoli
2025-05-27 18:31 ` Krzysztof Kozlowski
2025-05-28 7:59 ` Ayush Singh
2025-05-28 8:06 ` Krzysztof Kozlowski
2025-05-28 16:57 ` Herve Codina
2025-06-04 18:35 ` Krzysztof Kozlowski
2025-06-18 9:32 ` Herve Codina
2025-06-18 9:54 ` Ayush Singh
2025-07-04 9:10 ` Herve Codina
2025-08-17 7:41 ` Krzysztof Kozlowski
2025-08-17 8:18 ` Ayush Singh
2025-08-17 8:22 ` Krzysztof Kozlowski
2025-08-17 8:42 ` Ayush Singh
2025-08-18 17:05 ` Rob Herring
2025-08-18 17:37 ` Ayush Singh
2025-09-08 4:48 ` David Gibson
2025-09-08 4:46 ` David Gibson
2025-09-08 4:44 ` David Gibson
2025-08-17 7:38 ` Krzysztof Kozlowski
2025-04-30 12:51 ` [PATCH v2 2/7] of: resolver: Introduce get_phandle_from_symbols_node() Herve Codina
2025-04-30 12:51 ` [PATCH v2 3/7] of: resolver: Add export_symbols in of_resolve_phandles() parameters Herve Codina
2025-05-02 14:35 ` Luca Ceresoli
2025-05-05 8:10 ` Herve Codina
2025-04-30 12:51 ` Herve Codina [this message]
2025-04-30 12:51 ` [PATCH v2 5/7] of: overlay: Add export_symbols_name in of_overlay_fdt_apply() parameters Herve Codina
2025-05-02 14:40 ` Ayush Singh
2025-05-05 8:17 ` Herve Codina
2025-04-30 12:51 ` [PATCH v2 6/7] of: overlay: Add support for the export symbols node Herve Codina
2025-04-30 12:51 ` [PATCH v2 7/7] of: unittest: Add tests for export symbols Herve Codina
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20250430125154.195498-5-herve.codina@bootlin.com \
--to=herve.codina@bootlin.com \
--cc=afd@ti.com \
--cc=arnd@arndb.de \
--cc=ayush@beagleboard.org \
--cc=conor+dt@kernel.org \
--cc=david@gibson.dropbear.id.au \
--cc=devicetree-compiler@vger.kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=geert@linux-m68k.org \
--cc=gregkh@linuxfoundation.org \
--cc=krzk+dt@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=luca.ceresoli@bootlin.com \
--cc=robh@kernel.org \
--cc=saravanak@google.com \
--cc=thomas.petazzoni@bootlin.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).