public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: Herve Codina <herve.codina@bootlin.com>
To: 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, linux-kernel@vger.kernel.org,
	Luca Ceresoli <luca.ceresoli@bootlin.com>,
	Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Subject: [PATCH 4/7] of: resolver: Add support for the export symbols node
Date: Mon,  9 Dec 2024 16:18:22 +0100	[thread overview]
Message-ID: <20241209151830.95723-5-herve.codina@bootlin.com> (raw)
In-Reply-To: <20241209151830.95723-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>
---
 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 f5f6c46231d1..b685c46b20b8 100644
--- a/drivers/of/resolver.c
+++ b/drivers/of/resolver.c
@@ -222,6 +222,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;
@@ -236,6 +239,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
  *
@@ -320,7 +342,7 @@ int of_resolve_phandles(struct device_node *overlay, const struct device_node *e
 	}
 
 	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");
 		err = -EINVAL;
 		goto out;
@@ -332,10 +354,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);
 			goto out;
 		}
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index 7b97d4fc0236..e76ac087ea98 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -4025,7 +4025,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");
 
@@ -4035,7 +4035,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.47.0


  parent reply	other threads:[~2024-12-09 15:18 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-12-09 15:18 [PATCH 0/7] of: overlay: Add support for export-symbols node feature Herve Codina
2024-12-09 15:18 ` [PATCH 1/7] dt-bindings: Add support for export-symbols node Herve Codina
2024-12-09 16:26   ` Rob Herring (Arm)
2024-12-18 13:05     ` Herve Codina
2024-12-09 17:27   ` Luca Ceresoli
2024-12-10  8:20     ` Herve Codina
2024-12-09 15:18 ` [PATCH 2/7] of: resolver: Introduce get_phandle_from_symbols_node() Herve Codina
2024-12-09 15:18 ` [PATCH 3/7] of: resolver: Add export_symbols in of_resolve_phandles() parameters Herve Codina
2024-12-09 15:18 ` Herve Codina [this message]
2024-12-09 15:18 ` [PATCH 5/7] of: overlay: Add export_symbols_name in of_overlay_fdt_apply() parameters Herve Codina
2024-12-09 17:27   ` Luca Ceresoli
2024-12-10  8:21     ` Herve Codina
2024-12-09 15:18 ` [PATCH 6/7] of: overlay: Add support for the export symbols node Herve Codina
2024-12-09 15:18 ` [PATCH 7/7] of: unittest: Add tests for export symbols Herve Codina
2024-12-10 16:51   ` kernel test robot
2024-12-12  1:05   ` kernel test robot
2024-12-09 16:47 ` [PATCH 0/7] of: overlay: Add support for export-symbols node feature Andrew Davis
2024-12-09 17:03   ` Herve Codina
2024-12-09 17:47     ` Andrew Davis
2024-12-09 19:39       ` Rob Herring
2024-12-10  9:30       ` Ayush Singh
2024-12-09 20:11 ` Rob Herring
2024-12-10  8:16   ` Herve Codina
2024-12-10 13:46     ` Rob Herring
2024-12-10 14:58       ` Herve Codina
2024-12-18 12:22         ` Herve Codina
2024-12-10  9:22 ` Ayush Singh
2024-12-10  9:41   ` Herve Codina
2024-12-10  9:56     ` Ayush Singh
2024-12-10 10:55       ` Herve Codina
2025-01-08  7:36         ` Ayush Singh
2025-01-08  8:07           ` Herve Codina
2025-01-08  8:28             ` Ayush Singh
2025-01-08  9:47               ` Herve Codina
2025-01-10  4:26                 ` David Gibson
2025-01-10  7:36                   ` Herve Codina
2025-01-10  7:55                   ` Ayush Singh
2025-01-11  3:17                     ` David Gibson
2025-04-29 19:12 ` Ayush Singh
  -- strict thread matches above, loose matches on Subject: below --
2025-04-30 12:48 Herve Codina
2025-04-30 12:49 ` [PATCH 4/7] of: resolver: Add support for the export symbols node 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=20241209151830.95723-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=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