[PATCH] checks: Avoid warnings for reg override in __overlay__
Brian Norris <[email protected]> Wed, 17 Jun 2026 13:44:01 -0700
| Newsgroups | org.kernel.vger.devicetree-compiler |
|---|---|
| Message-ID | <[email protected]> |
A simple overlay case can hit a number of false warnings just because it
provides a 'reg' property [1]:
* avoid_default_addr_size: the generated fragment@0 node is an
artificial node, where #address-cells/#size-cells can't exist.
* reg_format: we're assuming the wrong/default #address-cells here, so
the analysis is wrong. (We don't know how many cells should be in
this 'reg', in isolation.)
* unit_address_vs_reg: we don't know the real node name here. (It's not
actually going to be "__overlay__".)
All these cannot be checked by the overlay compiler in isolation.
Suppress them when we identify we're running in plugin mode, and we're
likely looking at a generated __overlay__ hierarchy that can't be
analyzed in this way.
[1]
$ dtc -I dts -O dts tests/overlay-reg-override.dtso
tests/overlay-reg-override.dtso:5.2-14: Warning (reg_format): /fragment@0/__overlay__:reg: property has invalid length (4 bytes) (#address-cells == 2, #size-cells == 1)
tests/overlay-reg-override.dtso:4.6-6.3: Warning (unit_address_vs_reg): /fragment@0/__overlay__: node has a reg or ranges property, but no unit name
<stdout>: Warning (pci_device_reg): Failed prerequisite 'reg_format'
<stdout>: Warning (pci_device_bus_num): Failed prerequisite 'reg_format'
<stdout>: Warning (simple_bus_reg): Failed prerequisite 'reg_format'
<stdout>: Warning (i2c_bus_reg): Failed prerequisite 'reg_format'
<stdout>: Warning (spi_bus_reg): Failed prerequisite 'reg_format'
tests/overlay-reg-override.dtso:4.6-6.3: Warning (avoid_default_addr_size): /fragment@0/__overlay__: Relying on default #address-cells value
tests/overlay-reg-override.dtso:4.6-6.3: Warning (avoid_default_addr_size): /fragment@0/__overlay__: Relying on default #size-cells value
<stdout>: Warning (avoid_unnecessary_addr_size): Failed prerequisite 'avoid_default_addr_size'
<stdout>: Warning (unique_unit_address): Failed prerequisite 'avoid_default_addr_size'
/dts-v1/;
/ {
fragment@0 {
target = <&foo>;
__overlay__ {
reg = <0x00>;
};
};
__fixups__ {
foo = "/fragment@0:target:0";
};
};
Signed-off-by: Brian Norris <[email protected]>
---
checks.c | 17 ++++++++++++++---
tests/overlay-reg-override.dtso | 6 ++++++
tests/run_tests.sh | 1 +
3 files changed, 21 insertions(+), 3 deletions(-)
create mode 100644 tests/overlay-reg-override.dtso
diff --git a/checks.c b/checks.c
index a6037ed08000..dd6824dce6ea 100644
--- a/checks.c
+++ b/checks.c
@@ -368,9 +368,12 @@ static void check_unit_address_vs_reg(struct check *c, struct dt_info *dti,
const char *unitname = get_unitname(node);
struct property *prop = get_property(node, "reg");
- if (get_subnode(node, "__overlay__")) {
- /* HACK: Overlay fragments are a special case */
- return;
+ /* HACK: Overlay fragments are a special case */
+ if (dti->dtsflags & DTSF_PLUGIN) {
+ if (get_subnode(node, "__overlay__"))
+ return;
+ if (streq(node->name, "__overlay__"))
+ return;
}
if (!prop) {
@@ -774,6 +777,10 @@ static void check_reg_format(struct check *c, struct dt_info *dti,
if (!prop)
return; /* No "reg", that's fine */
+ /* Overlay nodes are special */
+ if ((dti->dtsflags & DTSF_PLUGIN) && streq(node->name, "__overlay__"))
+ return;
+
if (!node->parent) {
FAIL(c, dti, node, "Root node has a \"reg\" property");
return;
@@ -1210,6 +1217,10 @@ static void check_avoid_default_addr_size(struct check *c, struct dt_info *dti,
if (!node->parent)
return; /* Ignore root node */
+ /* Overlay nodes are special */
+ if ((dti->dtsflags & DTSF_PLUGIN) && streq(node->name, "__overlay__"))
+ return;
+
reg = get_property(node, "reg");
ranges = get_property(node, "ranges");
diff --git a/tests/overlay-reg-override.dtso b/tests/overlay-reg-override.dtso
new file mode 100644
index 000000000000..7e5e13883b51
--- /dev/null
+++ b/tests/overlay-reg-override.dtso
@@ -0,0 +1,6 @@
+/dts-v1/;
+/plugin/;
+
+&foo {
+ reg = <0x0>;
+};
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index 842b543059bb..8f3265afa5cc 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -752,6 +752,7 @@ dtc_tests () {
check_tests "$SRCDIR/unit-addr-leading-0x.dts" unit_address_format
check_tests "$SRCDIR/unit-addr-leading-0s.dts" unit_address_format
check_tests "$SRCDIR/unit-addr-unique.dts" unique_unit_address
+ check_tests "$SRCDIR/overlay-reg-override.dtso" -n reg_format unit_address_vs_reg avoid_default_addr_size
check_tests "$SRCDIR/bad-phandle-cells.dts" interrupts_extended_property
check_tests "$SRCDIR/bad-gpio.dts" gpios_property
check_tests "$SRCDIR/good-gpio.dts" -n gpios_property
--
2.54.0.1189.g8c84645362-goog