* [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps
@ 2026-09-10 14:16 Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO " Ernest Van Hoecke
` (6 more replies)
0 siblings, 7 replies; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric), Frank Li, Kieran Bingham,
Pengutronix Kernel Team, Stephen Boyd, Brian Masney,
Linus Walleij, Bartosz Golaszewski, Uwe Kleine-König,
Herve Codina, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke, stable
This series fixes an fw_devlink supplier-resolution problem reported by
Leonardo Costa while using a Devicetree nexus to describe GPIO and PWM
resources routed through an LVDS connector. Consumers referencing the
nexus could remain deferred because fw_devlink linked them to the nexus
rather than to the providers selected by gpio-map and pwm-map. [1]
GPIO, PWM and clock consumer APIs use of_parse_phandle_with_args_map()
to resolve specifiers through gpio-map, pwm-map and clock-map
properties. The corresponding fw_devlink parsers use direct phandle
parsing instead. Given a consumer which references a nexus, the consumer
API and fw_devlink therefore resolve the reference to different nodes:
consumer API: consumer -> nexus -> mapped provider
fw_devlink: consumer -> nexus
A nexus is a translation node rather than the resource provider and need
not have a driver. The link to it can consequently remain unresolved and
defer the consumer even though the mapped provider is available.
Make the fw_devlink GPIO, PWM and clock parsers use the same map-aware
resolver as their consumer APIs. The resolver also handles valid direct
references by returning the original provider when no map is present.
Use dedicated exact-name and suffix declaration macros to opt these
bindings into map-aware parsing without changing unrelated property
parsers. Retain GPIO's existing exclusions and compatibility handling.
The regression tests call the OF add_links operation and verify that a
mapped reference creates exactly one link to the final provider, not to
the nexus. They also cover valid direct references. The GPIO tests
exercise all property spellings recognized by fw_devlink, including the
deprecated singular and unprefixed forms.
Tested with:
- The new CONFIG_OF_UNITTEST fw_devlink cases under QEMU/x86_64 all
passed
- W=1 builds on x86_64 and arm64, including the OF unittest data
- Toradex Verdin iMX8M Plus hardware using a connector nexus for the
display GPIO and PWM resources: the display probes successfully
[1] https://lore.kernel.org/all/juuc4af7ndbajcl7gzf4tg5qz2q2j5tt3rvql4jbauradujrre@gc5nbdhhixaf/
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
Changes in v2:
- Split the unit tests into per-resource follow-up commits
- Added clock nexus as well because the clock nexus series was merged:
https://lore.kernel.org/all/20260807-schneider-v7-2-rc1-eip201-upstream-v5-0-8785f9531cf0@bootlin.com/
- Link to v1: https://lore.kernel.org/r/20260902-fw-devlink-nexus-ready-v1-0-68fe1996e78a@toradex.com
---
Ernest Van Hoecke (7):
of: property: fw_devlink: Follow GPIO nexus maps
of: property: fw_devlink: Report unsupported supplier linking
of: unittest: Test fw_devlink with GPIO nexus maps
of: property: fw_devlink: Follow PWM nexus maps
of: unittest: Test fw_devlink with PWM nexus maps
of: property: fw_devlink: Follow clock nexus maps
of: unittest: Test fw_devlink with clock nexus maps
drivers/of/property.c | 53 ++++++++++++++-----
drivers/of/unittest-data/tests-phandle.dtsi | 63 +++++++++++++++++++++++
drivers/of/unittest.c | 79 +++++++++++++++++++++++++++++
3 files changed, 182 insertions(+), 13 deletions(-)
---
base-commit: 91b1b8d437abe0cd83210d8f257b785a63047aa9
change-id: 20260901-fw-devlink-nexus-ready-c859706b019d
Best regards,
--
Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
^ permalink raw reply [flat|nested] 14+ messages in thread
* [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO nexus maps
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
2026-09-10 14:28 ` sashiko-bot
2026-09-11 7:51 ` Bartosz Golaszewski
2026-09-10 14:16 ` [PATCH v2 2/7] of: property: fw_devlink: Report unsupported supplier linking Ernest Van Hoecke
` (5 subsequent siblings)
6 siblings, 2 replies; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric), Frank Li, Kieran Bingham,
Pengutronix Kernel Team, Stephen Boyd, Brian Masney,
Linus Walleij, Bartosz Golaszewski, Uwe Kleine-König,
Herve Codina, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke, stable
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
GPIO consumers use of_parse_phandle_with_args_map() to resolve
specifiers through gpio-map properties. fw_devlink instead parses GPIO
properties as direct phandle references, so it records the nexus node as
the supplier rather than the mapped GPIO provider.
A nexus is a translation node, not the GPIO provider, and need not be
populated as a device. The resulting fwnode link can therefore remain
unresolved and indefinitely defer the consumer while
device_links_check_suppliers() waits for the nexus.
Use the map-aware parser for all supported GPIO property spellings. This
makes fw_devlink resolve the same provider as the GPIO consumer API.
Direct GPIO references continue to work because the map-aware parser
returns the original provider when no gpio-map property is present.
Fixes: 7f00be96f125 ("of: property: Add device link support for interrupt-parent, dmas and -gpio(s)")
Reported-by: Leonardo Costa <leonardo.costa@toradex.com>
Link: https://lore.kernel.org/all/juuc4af7ndbajcl7gzf4tg5qz2q2j5tt3rvql4jbauradujrre@gc5nbdhhixaf/
Tested-by: Leonardo Costa <leonardo.costa@toradex.com>
Cc: stable@vger.kernel.org
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
drivers/of/property.c | 38 ++++++++++++++++++++++++++++----------
1 file changed, 28 insertions(+), 10 deletions(-)
diff --git a/drivers/of/property.c b/drivers/of/property.c
index 72cf12907de0..380df0861ab9 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -1311,6 +1311,19 @@ static struct device_node *parse_prop_cells(struct device_node *np,
return sup_args.np;
}
+static struct device_node *parse_nexus_prop(struct device_node *np,
+ const char *prop_name, int index,
+ const char *stem_name)
+{
+ struct of_phandle_args sup_args;
+
+ if (of_parse_phandle_with_args_map(np, prop_name, stem_name, index,
+ &sup_args))
+ return NULL;
+
+ return sup_args.np;
+}
+
#define DEFINE_SIMPLE_PROP(fname, name, cells) \
static struct device_node *parse_##fname(struct device_node *np, \
const char *prop_name, int index) \
@@ -1361,6 +1374,15 @@ static struct device_node *parse_##fname(struct device_node *np, \
return parse_suffix_prop_cells(np, prop_name, index, suffix, cells); \
}
+#define DEFINE_SUFFIX_NEXUS_PROP(fname, suffix, stem) \
+static struct device_node *parse_##fname(struct device_node *np, \
+ const char *prop_name, int index) \
+{ \
+ if (!strends(prop_name, suffix)) \
+ return NULL; \
+ return parse_nexus_prop(np, prop_name, index, stem); \
+}
+
/**
* struct supplier_bindings - Property parsing functions for suppliers
*
@@ -1416,7 +1438,7 @@ DEFINE_SIMPLE_PROP(pses, "pses", "#pse-cells")
DEFINE_SIMPLE_PROP(power_supplies, "power-supplies", NULL)
DEFINE_SIMPLE_PROP(mmc_pwrseq, "mmc-pwrseq", NULL)
DEFINE_SUFFIX_PROP(regulators, "-supply", NULL)
-DEFINE_SUFFIX_PROP(gpio, "-gpio", "#gpio-cells")
+DEFINE_SUFFIX_NEXUS_PROP(gpio, "-gpio", "gpio")
static struct device_node *parse_pinctrl_n(struct device_node *np,
const char *prop_name, int index)
@@ -1436,8 +1458,10 @@ static struct device_node *parse_gpios(struct device_node *np,
if (strends(prop_name, ",nr-gpios"))
return NULL;
- return parse_suffix_prop_cells(np, prop_name, index, "-gpios",
- "#gpio-cells");
+ if (!strends(prop_name, "-gpios"))
+ return NULL;
+
+ return parse_nexus_prop(np, prop_name, index, "gpio");
}
static struct device_node *parse_iommu_maps(struct device_node *np,
@@ -1452,8 +1476,6 @@ static struct device_node *parse_iommu_maps(struct device_node *np,
static struct device_node *parse_gpio_compat(struct device_node *np,
const char *prop_name, int index)
{
- struct of_phandle_args sup_args;
-
if (strcmp(prop_name, "gpio") && strcmp(prop_name, "gpios"))
return NULL;
@@ -1464,11 +1486,7 @@ static struct device_node *parse_gpio_compat(struct device_node *np,
if (of_property_read_bool(np, "gpio-hog"))
return NULL;
- if (of_parse_phandle_with_args(np, prop_name, "#gpio-cells", index,
- &sup_args))
- return NULL;
-
- return sup_args.np;
+ return parse_nexus_prop(np, prop_name, index, "gpio");
}
static struct device_node *parse_interrupts(struct device_node *np,
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 2/7] of: property: fw_devlink: Report unsupported supplier linking
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO " Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
2026-09-10 14:28 ` sashiko-bot
2026-09-10 14:16 ` [PATCH v2 3/7] of: unittest: Test fw_devlink with GPIO nexus maps Ernest Van Hoecke
` (4 subsequent siblings)
6 siblings, 1 reply; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric), Frank Li, Kieran Bingham,
Pengutronix Kernel Team, Stephen Boyd, Brian Masney,
Linus Walleij, Bartosz Golaszewski, Uwe Kleine-König,
Herve Codina, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
OF supplier linking is deliberately disabled on OLPC and Intel CE4100
systems. The add_links operation currently returns zero on these systems,
so callers cannot distinguish unsupported linking from success.
Return -EOPNOTSUPP when supplier linking is unsupported. This allows OF
unit tests to skip link assertions on these systems without exposing the
private platform-support predicate.
The driver core ignores the add_links return value and marks the fwnode
as processed regardless, so its link creation and retry behavior remain
unchanged.
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
drivers/of/property.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/of/property.c b/drivers/of/property.c
index 380df0861ab9..eba7e9fe6c38 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -1691,7 +1691,7 @@ static int of_fwnode_add_links(struct fwnode_handle *fwnode)
struct device_node *con_np = to_of_node(fwnode);
if (!of_is_fwnode_add_links_supported())
- return 0;
+ return -EOPNOTSUPP;
if (!con_np)
return -EINVAL;
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 3/7] of: unittest: Test fw_devlink with GPIO nexus maps
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO " Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 2/7] of: property: fw_devlink: Report unsupported supplier linking Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
2026-09-11 7:51 ` Bartosz Golaszewski
2026-09-10 14:16 ` [PATCH v2 4/7] of: property: fw_devlink: Follow PWM " Ernest Van Hoecke
` (3 subsequent siblings)
6 siblings, 1 reply; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric), Frank Li, Kieran Bingham,
Pengutronix Kernel Team, Stephen Boyd, Brian Masney,
Linus Walleij, Bartosz Golaszewski, Uwe Kleine-König,
Herve Codina, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
Add OF unit tests that call the fw_devlink add_links operation for GPIOs
routed through nexus maps. Verify that each mapped consumer has exactly
one link to the final GPIO provider rather than to the nexus.
Also cover direct references and all GPIO property spellings recognized
by fw_devlink, including the deprecated singular and unprefixed forms.
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
drivers/of/unittest-data/tests-phandle.dtsi | 33 +++++++++++++
drivers/of/unittest.c | 75 +++++++++++++++++++++++++++++
2 files changed, 108 insertions(+)
diff --git a/drivers/of/unittest-data/tests-phandle.dtsi b/drivers/of/unittest-data/tests-phandle.dtsi
index 554a996b2ef1..c3727ed15bde 100644
--- a/drivers/of/unittest-data/tests-phandle.dtsi
+++ b/drivers/of/unittest-data/tests-phandle.dtsi
@@ -79,6 +79,39 @@ consumer-b {
phandle-list-bad-args = <&provider2 1 0>,
<&provider4 0>;
};
+
+ fw-devlink-tests {
+ gpio_provider: gpio-controller {
+ #gpio-cells = <2>;
+ };
+
+ fwdevlink_nexus: nexus {
+ #gpio-cells = <2>;
+ gpio-map = <0 0 &gpio_provider 1 0>;
+ gpio-map-mask = <0xffffffff 0>;
+ gpio-map-pass-thru = <0 0xffffffff>;
+ };
+
+ gpio-compat-consumer {
+ gpios = <&fwdevlink_nexus 0 0>;
+ };
+
+ gpio-compat-singular-consumer {
+ gpio = <&fwdevlink_nexus 0 0>;
+ };
+
+ gpio-consumer {
+ test-gpios = <&fwdevlink_nexus 0 0>;
+ };
+
+ gpio-direct-consumer {
+ test-gpios = <&gpio_provider 1 0>;
+ };
+
+ gpio-singular-consumer {
+ test-gpio = <&fwdevlink_nexus 0 0>;
+ };
+ };
};
};
};
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index e255f54f4d76..dfa3c885d142 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -10,6 +10,7 @@
#include <linux/dma-direct.h> /* to test phys_to_dma/dma_to_phys */
#include <linux/err.h>
#include <linux/errno.h>
+#include <linux/fwnode.h>
#include <linux/hashtable.h>
#include <linux/libfdt.h>
#include <linux/of.h>
@@ -710,6 +711,79 @@ static void __init of_unittest_parse_phandle_with_args_map(void)
}
}
+static void __init of_unittest_fw_devlink_supplier(struct device_node *tests,
+ const char *consumer_name,
+ const char *supplier_name)
+{
+ struct device_node *consumer, *supplier;
+ struct fwnode_handle *consumer_fwnode;
+ struct fwnode_link *link;
+ unsigned int link_count = 0;
+ bool found = false;
+ int rc;
+
+ consumer = of_get_child_by_name(tests, consumer_name);
+ supplier = of_get_child_by_name(tests, supplier_name);
+ if (unittest(consumer && supplier, "missing consumer %s or supplier %s\n",
+ consumer_name, supplier_name))
+ goto put_nodes;
+
+ consumer_fwnode = of_fwnode_handle(consumer);
+ fwnode_links_purge(consumer_fwnode);
+ rc = fwnode_call_int_op(consumer_fwnode, add_links);
+ if (rc == -EOPNOTSUPP) {
+ pr_info_once("fw_devlink tests skipped: OF supplier links are not supported\n");
+ goto purge_links;
+ }
+ if (unittest(!rc, "failed to add links for %pOF: %d\n", consumer, rc))
+ goto purge_links;
+
+ /*
+ * The suppliers list should normally be accessed with fwnode_link_lock
+ * held, but that lock is private to the driver core. These test nodes
+ * are isolated and have no concurrent link updates.
+ */
+ list_for_each_entry(link, &consumer_fwnode->suppliers, c_hook) {
+ link_count++;
+ if (link->supplier == of_fwnode_handle(supplier))
+ found = true;
+ }
+
+ unittest(link_count == 1, "%pOF has %u suppliers, expected 1\n", consumer, link_count);
+ unittest(found, "%pOF is not linked to supplier %pOF\n", consumer, supplier);
+
+purge_links:
+ fwnode_links_purge(consumer_fwnode);
+put_nodes:
+ of_node_put(consumer);
+ of_node_put(supplier);
+}
+
+static void __init of_unittest_fw_devlink(void)
+{
+ static const struct {
+ const char *consumer;
+ const char *supplier;
+ } cases[] = {
+ { "gpio-compat-consumer", "gpio-controller" },
+ { "gpio-compat-singular-consumer", "gpio-controller" },
+ { "gpio-consumer", "gpio-controller" },
+ { "gpio-direct-consumer", "gpio-controller" },
+ { "gpio-singular-consumer", "gpio-controller" },
+ };
+ struct device_node *tests;
+ int i;
+
+ tests = of_find_node_by_path("/testcase-data/phandle-tests/fw-devlink-tests");
+ if (unittest(tests, "missing fw_devlink test data\n"))
+ return;
+
+ for (i = 0; i < ARRAY_SIZE(cases); i++)
+ of_unittest_fw_devlink_supplier(tests, cases[i].consumer, cases[i].supplier);
+
+ of_node_put(tests);
+}
+
static void __init of_unittest_property_string(void)
{
const char *strings[4];
@@ -4533,6 +4607,7 @@ static int __init of_unittest(void)
of_unittest_dynamic();
of_unittest_parse_phandle_with_args();
of_unittest_parse_phandle_with_args_map();
+ of_unittest_fw_devlink();
of_unittest_printf();
of_unittest_property_string();
of_unittest_property_copy();
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 4/7] of: property: fw_devlink: Follow PWM nexus maps
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (2 preceding siblings ...)
2026-09-10 14:16 ` [PATCH v2 3/7] of: unittest: Test fw_devlink with GPIO nexus maps Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
2026-09-10 14:31 ` sashiko-bot
2026-09-10 14:16 ` [PATCH v2 5/7] of: unittest: Test fw_devlink with " Ernest Van Hoecke
` (2 subsequent siblings)
6 siblings, 1 reply; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric), Frank Li, Kieran Bingham,
Pengutronix Kernel Team, Stephen Boyd, Brian Masney,
Linus Walleij, Bartosz Golaszewski, Uwe Kleine-König,
Herve Codina, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke, stable
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
PWM consumers use of_parse_phandle_with_args_map() to resolve specifiers
through pwm-map properties. fw_devlink instead parses the pwms property
as a direct phandle reference, so it records the nexus node as the
supplier rather than the mapped PWM provider.
A nexus is a translation node, not the PWM provider, and need not be
populated as a device. The resulting fwnode link can therefore remain
unresolved and indefinitely defer the consumer while
device_links_check_suppliers() waits for the nexus.
Use the map-aware parser for pwms so fw_devlink resolves the same
provider as the PWM consumer API. Direct PWM references continue to work
because the map-aware parser returns the original provider when no
pwm-map property is present.
Fixes: e71e46a6f19c ("pwm: Add support for pwm nexus dt bindings")
Reported-by: Leonardo Costa <leonardo.costa@toradex.com>
Link: https://lore.kernel.org/all/juuc4af7ndbajcl7gzf4tg5qz2q2j5tt3rvql4jbauradujrre@gc5nbdhhixaf/
Tested-by: Leonardo Costa <leonardo.costa@toradex.com>
Cc: stable@vger.kernel.org
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
drivers/of/property.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
diff --git a/drivers/of/property.c b/drivers/of/property.c
index eba7e9fe6c38..a9c51d639a2b 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -1331,6 +1331,15 @@ static struct device_node *parse_##fname(struct device_node *np, \
return parse_prop_cells(np, prop_name, index, name, cells); \
}
+#define DEFINE_SIMPLE_NEXUS_PROP(fname, name, stem) \
+static struct device_node *parse_##fname(struct device_node *np, \
+ const char *prop_name, int index) \
+{ \
+ if (strcmp(prop_name, name)) \
+ return NULL; \
+ return parse_nexus_prop(np, prop_name, index, stem); \
+}
+
/**
* parse_suffix_prop_cells - Suffix property parsing function for suppliers
*
@@ -1426,7 +1435,7 @@ DEFINE_SIMPLE_PROP(extcon, "extcon", NULL)
DEFINE_SIMPLE_PROP(nvmem_cells, "nvmem-cells", "#nvmem-cell-cells")
DEFINE_SIMPLE_PROP(phys, "phys", "#phy-cells")
DEFINE_SIMPLE_PROP(wakeup_parent, "wakeup-parent", NULL)
-DEFINE_SIMPLE_PROP(pwms, "pwms", "#pwm-cells")
+DEFINE_SIMPLE_NEXUS_PROP(pwms, "pwms", "pwm")
DEFINE_SIMPLE_PROP(resets, "resets", "#reset-cells")
DEFINE_SIMPLE_PROP(leds, "leds", NULL)
DEFINE_SIMPLE_PROP(backlight, "backlight", NULL)
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 5/7] of: unittest: Test fw_devlink with PWM nexus maps
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (3 preceding siblings ...)
2026-09-10 14:16 ` [PATCH v2 4/7] of: property: fw_devlink: Follow PWM " Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 6/7] of: property: fw_devlink: Follow clock " Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 7/7] of: unittest: Test fw_devlink with " Ernest Van Hoecke
6 siblings, 0 replies; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric), Frank Li, Kieran Bingham,
Pengutronix Kernel Team, Stephen Boyd, Brian Masney,
Linus Walleij, Bartosz Golaszewski, Uwe Kleine-König,
Herve Codina, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
Extend the fw_devlink OF unit tests with PWM references routed through a
nexus map. Verify that the mapped consumer has exactly one link to the
final PWM provider rather than to the nexus.
Also cover a direct PWM reference to ensure that it continues to resolve
to the original provider when no map is present.
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
drivers/of/unittest-data/tests-phandle.dtsi | 16 ++++++++++++++++
drivers/of/unittest.c | 2 ++
2 files changed, 18 insertions(+)
diff --git a/drivers/of/unittest-data/tests-phandle.dtsi b/drivers/of/unittest-data/tests-phandle.dtsi
index c3727ed15bde..eef966615b22 100644
--- a/drivers/of/unittest-data/tests-phandle.dtsi
+++ b/drivers/of/unittest-data/tests-phandle.dtsi
@@ -85,11 +85,19 @@ gpio_provider: gpio-controller {
#gpio-cells = <2>;
};
+ pwm_provider: pwm-controller {
+ #pwm-cells = <2>;
+ };
+
fwdevlink_nexus: nexus {
#gpio-cells = <2>;
+ #pwm-cells = <2>;
gpio-map = <0 0 &gpio_provider 1 0>;
gpio-map-mask = <0xffffffff 0>;
gpio-map-pass-thru = <0 0xffffffff>;
+ pwm-map = <0 0 &pwm_provider 1 0>;
+ pwm-map-mask = <0xffffffff 0>;
+ pwm-map-pass-thru = <0 0xffffffff>;
};
gpio-compat-consumer {
@@ -111,6 +119,14 @@ gpio-direct-consumer {
gpio-singular-consumer {
test-gpio = <&fwdevlink_nexus 0 0>;
};
+
+ pwm-consumer {
+ pwms = <&fwdevlink_nexus 0 0>;
+ };
+
+ pwm-direct-consumer {
+ pwms = <&pwm_provider 1 0>;
+ };
};
};
};
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index dfa3c885d142..b739a69997a9 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -770,6 +770,8 @@ static void __init of_unittest_fw_devlink(void)
{ "gpio-consumer", "gpio-controller" },
{ "gpio-direct-consumer", "gpio-controller" },
{ "gpio-singular-consumer", "gpio-controller" },
+ { "pwm-consumer", "pwm-controller" },
+ { "pwm-direct-consumer", "pwm-controller" },
};
struct device_node *tests;
int i;
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 6/7] of: property: fw_devlink: Follow clock nexus maps
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (4 preceding siblings ...)
2026-09-10 14:16 ` [PATCH v2 5/7] of: unittest: Test fw_devlink with " Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
2026-09-10 14:29 ` sashiko-bot
2026-09-10 14:16 ` [PATCH v2 7/7] of: unittest: Test fw_devlink with " Ernest Van Hoecke
6 siblings, 1 reply; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric), Frank Li, Kieran Bingham,
Pengutronix Kernel Team, Stephen Boyd, Brian Masney,
Linus Walleij, Bartosz Golaszewski, Uwe Kleine-König,
Herve Codina, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
Clock consumers use of_parse_phandle_with_args_map() to resolve
specifiers through clock-map properties. fw_devlink instead parses the
clocks property as a direct phandle reference, so it records the nexus
node as the supplier rather than the mapped clock provider.
A nexus is a translation node, not the clock provider, and need not be
populated as a device. The resulting fwnode link can therefore remain
unresolved and indefinitely defer the consumer while
device_links_check_suppliers() waits for the nexus.
Use the map-aware parser for clocks so fw_devlink resolves the same
provider as the clock consumer API. Direct clock references continue to
work because the map-aware parser returns the original provider when no
clock-map property is present.
Fixes: aacc54c67869 ("clk: Add support for clock nexus dt bindings")
Link: https://lore.kernel.org/all/20260807-schneider-v7-2-rc1-eip201-upstream-v5-0-8785f9531cf0@bootlin.com/
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
drivers/of/property.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/of/property.c b/drivers/of/property.c
index a9c51d639a2b..48e05f7bae2f 100644
--- a/drivers/of/property.c
+++ b/drivers/of/property.c
@@ -1422,7 +1422,7 @@ struct supplier_bindings {
u8 fwlink_flags;
};
-DEFINE_SIMPLE_PROP(clocks, "clocks", "#clock-cells")
+DEFINE_SIMPLE_NEXUS_PROP(clocks, "clocks", "clock")
DEFINE_SIMPLE_PROP(interconnects, "interconnects", "#interconnect-cells")
DEFINE_SIMPLE_PROP(iommus, "iommus", "#iommu-cells")
DEFINE_SIMPLE_PROP(mboxes, "mboxes", "#mbox-cells")
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [PATCH v2 7/7] of: unittest: Test fw_devlink with clock nexus maps
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
` (5 preceding siblings ...)
2026-09-10 14:16 ` [PATCH v2 6/7] of: property: fw_devlink: Follow clock " Ernest Van Hoecke
@ 2026-09-10 14:16 ` Ernest Van Hoecke
6 siblings, 0 replies; 14+ messages in thread
From: Ernest Van Hoecke @ 2026-09-10 14:16 UTC (permalink / raw)
To: Rob Herring, Saravana Kannan
Cc: Miquel Raynal (Schneider Electric), Frank Li, Kieran Bingham,
Pengutronix Kernel Team, Stephen Boyd, Brian Masney,
Linus Walleij, Bartosz Golaszewski, Uwe Kleine-König,
Herve Codina, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke
From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
Extend the fw_devlink OF unit tests with clock references routed through
a nexus map. Verify that the mapped consumer has exactly one link to the
final clock provider rather than to the nexus.
Also cover a direct clock reference to ensure that it continues to
resolve to the original provider when no map is present.
Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
---
drivers/of/unittest-data/tests-phandle.dtsi | 14 ++++++++++++++
drivers/of/unittest.c | 2 ++
2 files changed, 16 insertions(+)
diff --git a/drivers/of/unittest-data/tests-phandle.dtsi b/drivers/of/unittest-data/tests-phandle.dtsi
index eef966615b22..aaf0b871c01d 100644
--- a/drivers/of/unittest-data/tests-phandle.dtsi
+++ b/drivers/of/unittest-data/tests-phandle.dtsi
@@ -81,6 +81,10 @@ consumer-b {
};
fw-devlink-tests {
+ clock_provider: clock-controller {
+ #clock-cells = <1>;
+ };
+
gpio_provider: gpio-controller {
#gpio-cells = <2>;
};
@@ -90,8 +94,10 @@ pwm_provider: pwm-controller {
};
fwdevlink_nexus: nexus {
+ #clock-cells = <1>;
#gpio-cells = <2>;
#pwm-cells = <2>;
+ clock-map = <0 &clock_provider 1>;
gpio-map = <0 0 &gpio_provider 1 0>;
gpio-map-mask = <0xffffffff 0>;
gpio-map-pass-thru = <0 0xffffffff>;
@@ -100,6 +106,14 @@ fwdevlink_nexus: nexus {
pwm-map-pass-thru = <0 0xffffffff>;
};
+ clock-consumer {
+ clocks = <&fwdevlink_nexus 0>;
+ };
+
+ clock-direct-consumer {
+ clocks = <&clock_provider 1>;
+ };
+
gpio-compat-consumer {
gpios = <&fwdevlink_nexus 0 0>;
};
diff --git a/drivers/of/unittest.c b/drivers/of/unittest.c
index b739a69997a9..2859a44c3fe5 100644
--- a/drivers/of/unittest.c
+++ b/drivers/of/unittest.c
@@ -765,6 +765,8 @@ static void __init of_unittest_fw_devlink(void)
const char *consumer;
const char *supplier;
} cases[] = {
+ { "clock-consumer", "clock-controller" },
+ { "clock-direct-consumer", "clock-controller" },
{ "gpio-compat-consumer", "gpio-controller" },
{ "gpio-compat-singular-consumer", "gpio-controller" },
{ "gpio-consumer", "gpio-controller" },
--
2.43.0
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO nexus maps
2026-09-10 14:16 ` [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO " Ernest Van Hoecke
@ 2026-09-10 14:28 ` sashiko-bot
2026-09-11 7:51 ` Bartosz Golaszewski
1 sibling, 0 replies; 14+ messages in thread
From: sashiko-bot @ 2026-09-10 14:28 UTC (permalink / raw)
To: Ernest Van Hoecke; +Cc: robh, conor+dt, linux-clk, devicetree
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [High] Stack buffer overflow when parsing `#<stem>-cells` property.
- [High] Infinite loop during device tree map traversal.
--
commit 07389d4c4496496ba5a738fbae28d5c3df4427f8
Author: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
of: property: fw_devlink: Follow GPIO nexus maps
This commit modifies fw_devlink to parse GPIO properties using a map-aware
parser instead of direct phandle references. This ensures fw_devlink resolves
the same provider as the GPIO consumer API, properly deferring consumers until
the nexus translation node is available.
Link: https://lore.kernel.org/all/juuc4af7ndbajcl7gzf4tg5qz2q2j5tt3rvql4jbauradujrre@gc5nbdhhixaf/
> diff --git a/drivers/of/property.c b/drivers/of/property.c
> index 72cf12907de03..380df0861ab97 100644
> --- a/drivers/of/property.c
> +++ b/drivers/of/property.c
[ ... ]
> @@ -1311,6 +1311,19 @@ static struct device_node *parse_prop_cells(struct device_node *np,
> return sup_args.np;
> }
>
> +static struct device_node *parse_nexus_prop(struct device_node *np,
> + const char *prop_name, int index,
> + const char *stem_name)
> +{
> + struct of_phandle_args sup_args;
> +
> + if (of_parse_phandle_with_args_map(np, prop_name, stem_name, index,
> + &sup_args))
> + return NULL;
> +
> + return sup_args.np;
> +}
[Severity: High]
This is a pre-existing issue, but by using of_parse_phandle_with_args_map()
during early boot for all -gpio(s) properties, does this expose a stack
buffer overflow to malformed Device Trees?
Looking at of_parse_phandle_with_args_map() in drivers/of/base.c, it reads
list_size from a Device Tree property (e.g., #gpio-cells) without checking
if it exceeds MAX_PHANDLE_ARGS:
drivers/of/base.c:of_parse_phandle_with_args_map() {
...
ret = of_property_read_u32(cur, cells_name, &list_size);
if (ret < 0)
goto put;
/* Precalculate the match array - this simplifies match loop */
for (i = 0; i < list_size; i++)
initial_match_array[i] = cpu_to_be32(out_args->args[i]);
...
}
If a malformed DT provides a cells property greater than 16, this loop will
read past the end of out_args->args and write past the end of the
initial_match_array stack buffer. Can this lead to memory corruption or a
kernel panic during early boot?
[Severity: High]
This isn't a bug introduced by this patch, but does calling
of_parse_phandle_with_args_map() here also expose an infinite loop when
traversing cyclic maps?
Looking at the map traversal loop in of_parse_phandle_with_args_map():
drivers/of/base.c:of_parse_phandle_with_args_map() {
...
while (cur) {
/* Get the <list>-map property */
map = of_get_property(cur, map_name, &map_len);
...
/* Iterate again with new provider */
out_args->np = new;
of_node_put(cur);
cur = new;
new = NULL;
}
...
}
Since there is no depth limit or cycle detection, if a Device Tree has a
cyclic map structure (where Node A maps to Node B, which maps back to Node A),
will this loop hang infinitely and cause a hard lockup?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260910-fw-devlink-nexus-ready-v2-0-17ac82dbe226@toradex.com?part=1
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 2/7] of: property: fw_devlink: Report unsupported supplier linking
2026-09-10 14:16 ` [PATCH v2 2/7] of: property: fw_devlink: Report unsupported supplier linking Ernest Van Hoecke
@ 2026-09-10 14:28 ` sashiko-bot
0 siblings, 0 replies; 14+ messages in thread
From: sashiko-bot @ 2026-09-10 14:28 UTC (permalink / raw)
To: Ernest Van Hoecke; +Cc: linux-clk, conor+dt, devicetree, robh
Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
Pre-existing issues:
- [High] Missing MSI controller binding support for `msi-map` in `of_supplier_bindings`.
--
commit 47987c8dc7b7519422af5f39cc351a7527565d09
Author: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
of: property: fw_devlink: Report unsupported supplier linking
OF supplier linking is deliberately disabled on OLPC and Intel CE4100 systems.
This commit changes the add_links operation to return -EOPNOTSUPP when
supplier linking is unsupported, which allows OF unit tests to skip link
assertions on these systems.
> diff --git a/drivers/of/property.c b/drivers/of/property.c
> index 380df0861ab97..eba7e9fe6c386 100644
> --- a/drivers/of/property.c
> +++ b/drivers/of/property.c
> @@ -1691,7 +1691,7 @@ static int of_fwnode_add_links(struct fwnode_handle *fwnode)
> struct device_node *con_np = to_of_node(fwnode);
>
> if (!of_is_fwnode_add_links_supported())
> - return 0;
> + return -EOPNOTSUPP;
>
> if (!con_np)
> return -EINVAL;
[Severity: High]
This isn't a bug introduced by this patch, but does of_supplier_bindings
miss support for the msi-map property?
Looking at of_supplier_bindings in drivers/of/property.c:
static const struct supplier_bindings of_supplier_bindings[] = {
...
{ .parse_prop = parse_panel, },
{ .parse_prop = parse_msi_parent, },
{ .parse_prop = parse_pses, },
...
};
Failing to handle the msi-map MSI controller DT binding variant causes
fw_devlink to not establish required dependency links.
As a consequence, consumer devices (such as PCIe host controllers) may probe
before the MSI controller is ready, leading to MSI allocation failures and
potential device unavailability (which can render the system unusable if
critical devices like storage or network are affected).
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260910-fw-devlink-nexus-ready-v2-0-17ac82dbe226@toradex.com?part=2
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 6/7] of: property: fw_devlink: Follow clock nexus maps
2026-09-10 14:16 ` [PATCH v2 6/7] of: property: fw_devlink: Follow clock " Ernest Van Hoecke
@ 2026-09-10 14:29 ` sashiko-bot
0 siblings, 0 replies; 14+ messages in thread
From: sashiko-bot @ 2026-09-10 14:29 UTC (permalink / raw)
To: Ernest Van Hoecke; +Cc: robh, devicetree, linux-clk, conor+dt
Thank you for your contribution! Sashiko AI review found 3 potential issue(s) to consider:
Pre-existing issues:
- [Critical] Stack buffer overflow in `of_parse_phandle_with_args_map` due to unchecked `list_size` against stack array bounds.
- [High] The function `of_parse_phandle_with_args_map` can infinite loop if a device tree contains cyclic `<list>-map` properties (e.g., a cyclic `clock-map`).
- [High] Out-of-bounds read of `*-map-mask` and `*-map-pass-thru` properties based on unchecked lengths.
--
commit 44ed61de7bd2d691043db2b6326c916f60e9f97b
Author: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
of: property: fw_devlink: Follow clock nexus maps
This patch modifies fw_devlink to resolve clock properties using the
map-aware parser instead of a direct phandle reference. This allows
fw_devlink to correctly identify the clock provider when clock nexus nodes
are used, preventing indefinite deferral.
Link: https://lore.kernel.org/all/20260807-schneider-v7-2-rc1-eip201-upstream-v5-0-8785f9531cf0@bootlin.com/
> diff --git a/drivers/of/property.c b/drivers/of/property.c
> index a9c51d639a2b5..48e05f7bae2fd 100644
> --- a/drivers/of/property.c
> +++ b/drivers/of/property.c
> @@ -1422,7 +1422,7 @@ struct supplier_bindings {
> u8 fwlink_flags;
> };
>
> -DEFINE_SIMPLE_PROP(clocks, "clocks", "#clock-cells")
> +DEFINE_SIMPLE_NEXUS_PROP(clocks, "clocks", "clock")
[Severity: High]
This isn't a bug introduced by this patch, but by switching fw_devlink to use
the nexus parser for clocks, it will now aggressively call
of_parse_phandle_with_args_map() during early boot for every clock property.
This exposes a few pre-existing flaws in that function to malformed device
trees, which can now crash or hang the boot process.
For instance, can a cyclic clock-map property cause an infinite loop here?
drivers/of/base.c:of_parse_phandle_with_args_map() {
[ ... ]
ret = -EINVAL;
while (cur) {
/* Get the <list>-map property */
map = of_get_property(cur, map_name, &map_len);
[ ... ]
out_args->np = new;
of_node_put(cur);
cur = new;
new = NULL;
}
[ ... ]
}
Because there is no depth limit or cycle detection, a self-referential map
will cause the kernel to loop forever.
[Severity: Critical]
This is a pre-existing issue, but does this loop write past the end of the
initial_match_array buffer?
drivers/of/base.c:of_parse_phandle_with_args_map() {
[ ... ]
__be32 initial_match_array[MAX_PHANDLE_ARGS];
[ ... ]
/* Get the #<list>-cells property */
cur = out_args->np;
ret = of_property_read_u32(cur, cells_name, &list_size);
if (ret < 0)
goto put;
/* Precalculate the match array - this simplifies match loop */
for (i = 0; i < list_size; i++)
initial_match_array[i] = cpu_to_be32(out_args->args[i]);
[ ... ]
}
Since list_size is read directly from the device tree without being clamped
to MAX_PHANDLE_ARGS, a large #clock-cells value will overflow the stack
buffer.
[Severity: High]
This is a pre-existing issue, but are the mask and pass array lengths verified
against the property bounds before access?
drivers/of/base.c:of_parse_phandle_with_args_map() {
[ ... ]
/* Get the <list>-map-mask property (optional) */
mask = of_get_property(cur, mask_name, NULL);
if (!mask)
mask = dummy_mask;
/* Iterate through <list>-map property */
match = 0;
while (map_len > (list_size + 1) && !match) {
/* Compare specifiers */
match = 1;
for (i = 0; i < list_size; i++, map_len--)
match &= !((match_array[i] ^ *map++) & mask[i]);
[ ... ]
/* Get the <list>-map-pass-thru property (optional) */
pass = of_get_property(cur, pass_name, NULL);
[ ... ]
if (i < list_size) {
val &= ~pass[i];
val |= cpu_to_be32(out_args->args[i]) & pass[i];
}
[ ... ]
}
Because of_get_property() is called with a NULL length pointer, if the
clock-map-mask or clock-map-pass-thru properties exist but are smaller
than list_size elements, mask[i] and pass[i] will read out of bounds.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260910-fw-devlink-nexus-ready-v2-0-17ac82dbe226@toradex.com?part=6
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 4/7] of: property: fw_devlink: Follow PWM nexus maps
2026-09-10 14:16 ` [PATCH v2 4/7] of: property: fw_devlink: Follow PWM " Ernest Van Hoecke
@ 2026-09-10 14:31 ` sashiko-bot
0 siblings, 0 replies; 14+ messages in thread
From: sashiko-bot @ 2026-09-10 14:31 UTC (permalink / raw)
To: Ernest Van Hoecke; +Cc: devicetree, linux-clk, robh, conor+dt
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
Pre-existing issues:
- [Critical] Missing bounds check in `of_parse_phandle_with_args_map` allows a malformed Devicetree to trigger a stack buffer overflow.
- [High] Missing cycle detection in `of_parse_phandle_with_args_map` allows a malformed Devicetree to cause an infinite loop.
--
commit 17ae1bc408452875cfad3c0d990add52c676f9b9
Author: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
of: property: fw_devlink: Follow PWM nexus maps
PWM consumers use of_parse_phandle_with_args_map() to resolve specifiers
through pwm-map properties. fw_devlink instead parses the pwms property
as a direct phandle reference, so it records the nexus node as the
supplier rather than the mapped PWM provider.
Use the map-aware parser for pwms so fw_devlink resolves the same
provider as the PWM consumer API. Direct PWM references continue to work
because the map-aware parser returns the original provider when no
pwm-map property is present.
Link: https://lore.kernel.org/all/juuc4af7ndbajcl7gzf4tg5qz2q2j5tt3rvql4jbauradujrre@gc5nbdhhixaf/
> diff --git a/drivers/of/property.c b/drivers/of/property.c
> index eba7e9fe6c386..a9c51d639a2b5 100644
> --- a/drivers/of/property.c
> +++ b/drivers/of/property.c
> @@ -1426,7 +1435,7 @@ DEFINE_SIMPLE_PROP(extcon, "extcon", NULL)
> DEFINE_SIMPLE_PROP(nvmem_cells, "nvmem-cells", "#nvmem-cell-cells")
> DEFINE_SIMPLE_PROP(phys, "phys", "#phy-cells")
> DEFINE_SIMPLE_PROP(wakeup_parent, "wakeup-parent", NULL)
> -DEFINE_SIMPLE_PROP(pwms, "pwms", "#pwm-cells")
> +DEFINE_SIMPLE_NEXUS_PROP(pwms, "pwms", "pwm")
[Severity: Critical]
This isn't a bug introduced by this patch, but this change exposes a
pre-existing stack buffer overflow in of_parse_phandle_with_args_map() by
parsing pwms properties automatically during early boot.
Does this code overflow initial_match_array[]? If a provider node in a
malformed Devicetree has a #pwm-cells property larger than MAX_PHANDLE_ARGS
(16), list_size is read without bounds checking:
drivers/of/base.c:of_parse_phandle_with_args_map() {
...
/* Precalculate the match array - this simplifies match loop */
for (i = 0; i < list_size; i++)
initial_match_array[i] = cpu_to_be32(out_args->args[i]);
...
}
Because fw_devlink now automatically calls parse_nexus_prop() and
of_parse_phandle_with_args_map() for all pwms properties, this regression can
now be trivially triggered without requiring consumer drivers to probe.
[Severity: High]
This is also a pre-existing issue, but this patch similarly expands the attack
surface by triggering it automatically during early boot via fw_devlink.
Can this loop run infinitely if the Devicetree contains cyclic phandle maps?
When following <list>-map properties through nexus nodes, there is no cycle
detection or maximum depth limit:
drivers/of/base.c:of_parse_phandle_with_args_map() {
...
while (cur) {
/* Get the <list>-map property */
map = of_get_property(cur, map_name, &map_len);
...
}
If a pwm-map property contains cyclic references (e.g., node A maps to node B,
and node B maps back to node A), could this cause a system hang or deadlock
during boot?
--
Sashiko AI review · https://sashiko.dev/#/patchset/20260910-fw-devlink-nexus-ready-v2-0-17ac82dbe226@toradex.com?part=4
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO nexus maps
2026-09-10 14:16 ` [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO " Ernest Van Hoecke
2026-09-10 14:28 ` sashiko-bot
@ 2026-09-11 7:51 ` Bartosz Golaszewski
1 sibling, 0 replies; 14+ messages in thread
From: Bartosz Golaszewski @ 2026-09-11 7:51 UTC (permalink / raw)
To: Ernest Van Hoecke
Cc: Miquel Raynal (Schneider Electric), Frank Li, Kieran Bingham,
Pengutronix Kernel Team, Stephen Boyd, Brian Masney,
Linus Walleij, Bartosz Golaszewski, Uwe Kleine-König,
Herve Codina, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke, stable, Rob Herring,
Saravana Kannan
On Thu, 10 Sep 2026 16:16:42 +0200, Ernest Van Hoecke
<ernestvanhoecke@gmail.com> said:
> From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
>
> GPIO consumers use of_parse_phandle_with_args_map() to resolve
> specifiers through gpio-map properties. fw_devlink instead parses GPIO
> properties as direct phandle references, so it records the nexus node as
> the supplier rather than the mapped GPIO provider.
>
> A nexus is a translation node, not the GPIO provider, and need not be
> populated as a device. The resulting fwnode link can therefore remain
> unresolved and indefinitely defer the consumer while
> device_links_check_suppliers() waits for the nexus.
>
> Use the map-aware parser for all supported GPIO property spellings. This
> makes fw_devlink resolve the same provider as the GPIO consumer API.
> Direct GPIO references continue to work because the map-aware parser
> returns the original provider when no gpio-map property is present.
>
> Fixes: 7f00be96f125 ("of: property: Add device link support for interrupt-parent, dmas and -gpio(s)")
> Reported-by: Leonardo Costa <leonardo.costa@toradex.com>
> Link: https://lore.kernel.org/all/juuc4af7ndbajcl7gzf4tg5qz2q2j5tt3rvql4jbauradujrre@gc5nbdhhixaf/
> Tested-by: Leonardo Costa <leonardo.costa@toradex.com>
> Cc: stable@vger.kernel.org
> Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
> ---
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 14+ messages in thread
* Re: [PATCH v2 3/7] of: unittest: Test fw_devlink with GPIO nexus maps
2026-09-10 14:16 ` [PATCH v2 3/7] of: unittest: Test fw_devlink with GPIO nexus maps Ernest Van Hoecke
@ 2026-09-11 7:51 ` Bartosz Golaszewski
0 siblings, 0 replies; 14+ messages in thread
From: Bartosz Golaszewski @ 2026-09-11 7:51 UTC (permalink / raw)
To: Ernest Van Hoecke
Cc: Miquel Raynal (Schneider Electric), Frank Li, Kieran Bingham,
Pengutronix Kernel Team, Stephen Boyd, Brian Masney,
Linus Walleij, Bartosz Golaszewski, Uwe Kleine-König,
Herve Codina, Greg Kroah-Hartman, Geert Uytterhoeven,
Leonardo Costa, devicetree, linux-clk, linux-gpio, linux-pwm,
linux-kernel, Ernest Van Hoecke, Rob Herring, Saravana Kannan
On Thu, 10 Sep 2026 16:16:44 +0200, Ernest Van Hoecke
<ernestvanhoecke@gmail.com> said:
> From: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
>
> Add OF unit tests that call the fw_devlink add_links operation for GPIOs
> routed through nexus maps. Verify that each mapped consumer has exactly
> one link to the final GPIO provider rather than to the nexus.
>
> Also cover direct references and all GPIO property spellings recognized
> by fw_devlink, including the deprecated singular and unprefixed forms.
>
> Signed-off-by: Ernest Van Hoecke <ernest.vanhoecke@toradex.com>
> ---
Reviewed-by: Bartosz Golaszewski <bartosz.golaszewski@oss.qualcomm.com>
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2026-09-11 7:52 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-10 14:16 [PATCH v2 0/7] of: property: Make fw_devlink follow GPIO, PWM and clock nexus maps Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 1/7] of: property: fw_devlink: Follow GPIO " Ernest Van Hoecke
2026-09-10 14:28 ` sashiko-bot
2026-09-11 7:51 ` Bartosz Golaszewski
2026-09-10 14:16 ` [PATCH v2 2/7] of: property: fw_devlink: Report unsupported supplier linking Ernest Van Hoecke
2026-09-10 14:28 ` sashiko-bot
2026-09-10 14:16 ` [PATCH v2 3/7] of: unittest: Test fw_devlink with GPIO nexus maps Ernest Van Hoecke
2026-09-11 7:51 ` Bartosz Golaszewski
2026-09-10 14:16 ` [PATCH v2 4/7] of: property: fw_devlink: Follow PWM " Ernest Van Hoecke
2026-09-10 14:31 ` sashiko-bot
2026-09-10 14:16 ` [PATCH v2 5/7] of: unittest: Test fw_devlink with " Ernest Van Hoecke
2026-09-10 14:16 ` [PATCH v2 6/7] of: property: fw_devlink: Follow clock " Ernest Van Hoecke
2026-09-10 14:29 ` sashiko-bot
2026-09-10 14:16 ` [PATCH v2 7/7] of: unittest: Test fw_devlink with " Ernest Van Hoecke
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox