[RFC PATCH v2 68/74] tests: fdtaddon: Add a basic test for addons with references by path to orphan nodes

From: Herve Codina

Date: Wed Aug 26 2026 - 06:03:58 EST


Addons can use references by path to reference by path to reference an
orphan node or sub-nodes of an orphan node.

Those references are converted to either local or external references
and have to be handled when the addon is applied.

Add a basic test for this feature.

Signed-off-by: Herve Codina <herve.codina@xxxxxxxxxxx>
---
tests/fdtaddon_basics4-merged1.dtb.dts.expect | 43 +++++++++++++++++++
tests/fdtaddon_basics4-merged1.dtb.expect | 37 ++++++++++++++++
tests/fdtaddon_basics4-merged2.dtb.dts.expect | 43 +++++++++++++++++++
tests/fdtaddon_basics4-merged2.dtb.expect | 37 ++++++++++++++++
tests/fdtaddon_basics4.dtba.expect | 22 ++++++++++
tests/fdtaddon_basics4.dtsa | 25 +++++++++++
tests/run_tests.sh | 3 +-
7 files changed, 209 insertions(+), 1 deletion(-)
create mode 100644 tests/fdtaddon_basics4-merged1.dtb.dts.expect
create mode 100644 tests/fdtaddon_basics4-merged1.dtb.expect
create mode 100644 tests/fdtaddon_basics4-merged2.dtb.dts.expect
create mode 100644 tests/fdtaddon_basics4-merged2.dtb.expect
create mode 100644 tests/fdtaddon_basics4.dtba.expect
create mode 100644 tests/fdtaddon_basics4.dtsa

diff --git a/tests/fdtaddon_basics4-merged1.dtb.dts.expect b/tests/fdtaddon_basics4-merged1.dtb.dts.expect
new file mode 100644
index 00000000..9e6bbf18
--- /dev/null
+++ b/tests/fdtaddon_basics4-merged1.dtb.dts.expect
@@ -0,0 +1,43 @@
+/dts-v1/;
+
+/ {
+
+ base-node {
+
+ sub-node {
+ prop = <0x00>;
+ phandle = <0x02>;
+
+ sub-node {
+ phandle = <0x04>;
+ prop = <0x01>;
+ };
+ };
+ };
+
+ somewhere {
+
+ node-a1 {
+ compatible = "abc,aaa";
+ phandle = <0x01>;
+
+ /export/ node_a: &{/somewhere/node-a1};
+ /export/ other: &{/base-node/sub-node};
+
+ addon-node {
+ ref-other-subnode = <&{/base-node/sub-node/sub-node}>;
+ ref-other2 = <&{/base-node/sub-node}>;
+ ref-other1 = <&{/base-node/sub-node} 0x0a>;
+ prop = <0x00>;
+ };
+ };
+
+ node-a2 {
+ compatible = "abc,aaa";
+ phandle = <0x03>;
+
+ /export/ node_a: &{/somewhere/node-a2};
+ /export/ other: &{/base-node/sub-node};
+ };
+ };
+};
diff --git a/tests/fdtaddon_basics4-merged1.dtb.expect b/tests/fdtaddon_basics4-merged1.dtb.expect
new file mode 100644
index 00000000..f339430a
--- /dev/null
+++ b/tests/fdtaddon_basics4-merged1.dtb.expect
@@ -0,0 +1,37 @@
+/dts-v1/;
+
+/ {
+ base-node {
+ sub-node {
+ prop = <0x00000000>;
+ phandle = <0x00000002>;
+ sub-node {
+ phandle = <0x00000004>;
+ prop = <0x00000001>;
+ };
+ };
+ };
+ somewhere {
+ node-a1 {
+ // [FDT_EXPORT_SYM] 'node_a' -> phandle 0x00000001
+ // [FDT_EXPORT_SYM] 'other' -> phandle 0x00000002
+ compatible = "abc,aaa";
+ phandle = <0x00000001>;
+ addon-node {
+ ref-other-subnode = <0x00000004>;
+ // [FDT_PROPDATA_PHANDLE] ref-other-subnode[0]
+ ref-other2 = <0x00000002>;
+ // [FDT_PROPDATA_PHANDLE] ref-other2[0]
+ ref-other1 = <0x00000002 0x0000000a>;
+ // [FDT_PROPDATA_PHANDLE] ref-other1[0]
+ prop = <0x00000000>;
+ };
+ };
+ node-a2 {
+ // [FDT_EXPORT_SYM] 'node_a' -> phandle 0x00000003
+ // [FDT_EXPORT_SYM] 'other' -> phandle 0x00000002
+ compatible = "abc,aaa";
+ phandle = <0x00000003>;
+ };
+ };
+};
diff --git a/tests/fdtaddon_basics4-merged2.dtb.dts.expect b/tests/fdtaddon_basics4-merged2.dtb.dts.expect
new file mode 100644
index 00000000..0c513c93
--- /dev/null
+++ b/tests/fdtaddon_basics4-merged2.dtb.dts.expect
@@ -0,0 +1,43 @@
+/dts-v1/;
+
+/ {
+
+ base-node {
+
+ sub-node {
+ prop = <0x00>;
+ phandle = <0x02>;
+
+ sub-node {
+ phandle = <0x04>;
+ prop = <0x01>;
+ };
+ };
+ };
+
+ somewhere {
+
+ node-a1 {
+ compatible = "abc,aaa";
+ phandle = <0x01>;
+
+ /export/ node_a: &{/somewhere/node-a1};
+ /export/ other: &{/base-node/sub-node};
+ };
+
+ node-a2 {
+ compatible = "abc,aaa";
+ phandle = <0x03>;
+
+ /export/ node_a: &{/somewhere/node-a2};
+ /export/ other: &{/base-node/sub-node};
+
+ addon-node {
+ ref-other-subnode = <&{/base-node/sub-node/sub-node}>;
+ ref-other2 = <&{/base-node/sub-node}>;
+ ref-other1 = <&{/base-node/sub-node} 0x0a>;
+ prop = <0x00>;
+ };
+ };
+ };
+};
diff --git a/tests/fdtaddon_basics4-merged2.dtb.expect b/tests/fdtaddon_basics4-merged2.dtb.expect
new file mode 100644
index 00000000..f4072f16
--- /dev/null
+++ b/tests/fdtaddon_basics4-merged2.dtb.expect
@@ -0,0 +1,37 @@
+/dts-v1/;
+
+/ {
+ base-node {
+ sub-node {
+ prop = <0x00000000>;
+ phandle = <0x00000002>;
+ sub-node {
+ phandle = <0x00000004>;
+ prop = <0x00000001>;
+ };
+ };
+ };
+ somewhere {
+ node-a1 {
+ // [FDT_EXPORT_SYM] 'node_a' -> phandle 0x00000001
+ // [FDT_EXPORT_SYM] 'other' -> phandle 0x00000002
+ compatible = "abc,aaa";
+ phandle = <0x00000001>;
+ };
+ node-a2 {
+ // [FDT_EXPORT_SYM] 'node_a' -> phandle 0x00000003
+ // [FDT_EXPORT_SYM] 'other' -> phandle 0x00000002
+ compatible = "abc,aaa";
+ phandle = <0x00000003>;
+ addon-node {
+ ref-other-subnode = <0x00000004>;
+ // [FDT_PROPDATA_PHANDLE] ref-other-subnode[0]
+ ref-other2 = <0x00000002>;
+ // [FDT_PROPDATA_PHANDLE] ref-other2[0]
+ ref-other1 = <0x00000002 0x0000000a>;
+ // [FDT_PROPDATA_PHANDLE] ref-other1[0]
+ prop = <0x00000000>;
+ };
+ };
+ };
+};
diff --git a/tests/fdtaddon_basics4.dtba.expect b/tests/fdtaddon_basics4.dtba.expect
new file mode 100644
index 00000000..14450cb9
--- /dev/null
+++ b/tests/fdtaddon_basics4.dtba.expect
@@ -0,0 +1,22 @@
+/dts-v1/;
+/addon/;
+
+// [FDT_IMPORT_SYM] 'node_a' (abc,aaa)
+// [FDT_IMPORT_SYM] 'other' ()
+&node_a {
+ addon-node {
+ prop = <0x00000000>;
+ ref-other1 = <0xffffffff 0x0000000a>;
+ // [FDT_PROPDATA_PHANDLE_REF] ref-other1[0], ref = other
+ ref-other2 = <0xffffffff>;
+ // [FDT_PROPDATA_PHANDLE_REF] ref-other2[0], ref = other
+ ref-other-subnode = <0x00000001>;
+ // [FDT_PROPDATA_PHANDLE] ref-other-subnode[0]
+ };
+};
+&other {
+ sub-node {
+ prop = <0x00000001>;
+ phandle = <0x00000001>;
+ };
+};
diff --git a/tests/fdtaddon_basics4.dtsa b/tests/fdtaddon_basics4.dtsa
new file mode 100644
index 00000000..5ca19ce9
--- /dev/null
+++ b/tests/fdtaddon_basics4.dtsa
@@ -0,0 +1,25 @@
+// SPDX-License-Identifier: (GPL-2.0-or-later OR BSD-2-Clause)
+/*
+ * Copyright (C) 2026 Bootlin
+ */
+
+/dts-v1/;
+/addon/;
+
+/import/ node_a: "abc,aaa";
+/import/ other: "";
+
+&node_a {
+ addon-node {
+ prop = <0>;
+ ref-other1 = <&other 10>;
+ ref-other2 = <&{$other}>;
+ ref-other-subnode = <&{$other/sub-node}>;
+ };
+};
+
+&other {
+ sub-node {
+ prop = <1>;
+ };
+};
diff --git a/tests/run_tests.sh b/tests/run_tests.sh
index de3d31a3..5f09bf47 100755
--- a/tests/run_tests.sh
+++ b/tests/run_tests.sh
@@ -1303,7 +1303,8 @@ fdtaddon_tests() {
run_dtc_test -I dts -O dtb -o fdtaddon_base.dtb "$SRCDIR/fdtaddon_base.dts"
check_dtb fdtaddon_base.dtb

- for dt in fdtaddon_basics1 fdtaddon_basics2 fdtaddon_basics3; do
+ for dt in fdtaddon_basics1 fdtaddon_basics2 fdtaddon_basics3 \
+ fdtaddon_basics4; do
run_dtc_test -I dts -O dtb -o $dt.dtba "$SRCDIR/$dt.dtsa"
check_dtb $dt.dtba

--
2.55.0