[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20260112142009.1006236-49-herve.codina@bootlin.com>
Date: Mon, 12 Jan 2026 15:19:38 +0100
From: Herve Codina <herve.codina@...tlin.com>
To: David Gibson <david@...son.dropbear.id.au>,
Rob Herring <robh@...nel.org>,
Krzysztof Kozlowski <krzk@...nel.org>,
Conor Dooley <conor+dt@...nel.org>
Cc: Ayush Singh <ayush@...gleboard.org>,
Geert Uytterhoeven <geert@...ux-m68k.org>,
devicetree-compiler@...r.kernel.org,
devicetree@...r.kernel.org,
linux-kernel@...r.kernel.org,
devicetree-spec@...r.kernel.org,
Hui Pu <hui.pu@...ealthcare.com>,
Ian Ray <ian.ray@...ealthcare.com>,
Luca Ceresoli <luca.ceresoli@...tlin.com>,
Thomas Petazzoni <thomas.petazzoni@...tlin.com>,
Herve Codina <herve.codina@...tlin.com>
Subject: [RFC PATCH 48/77] dtc: Introduce orphan nodes
Orphans nodes can be present in plugin and addon device-trees.
Those nodes are nodes without a parent. The root device-tree node is a
particular orphan node and is not part of those 'orphan' nodes group.
The orphan nodes group is related to nodes identified by a reference in
addons or plugins device-trees. For instance, the following node can be
described in addons and plugins (overlay) device-trees:
--- 8< ---
&foo {
subnode {
prop = <1>;
};
};
--- 8< ---
The foo referenced node described here has no parent. Indeed, it is not
a child of the root node.
This kind of node is legit in plugins and addons device-tree in order to
perform modification on existing node when the plugin or addon dtb is
applied. The foo referenced node is an existing node in the base tree an
the subnode node is added to the foo referenced node chen the dtb is
applied. Even if foo itself doesn't exists in the plugin or addon
device-tree, it needs to be referenced and modifications expected need
to be described (new sub-node for instance).
In plugin dts, when a orphan node is parsed, the dts structure is
changed and the orphan node is merged in the /fragment@..._overlay__
node. The foo referenced node mentioned in the previous snippet is
transformed to:
--- 8< ---
/ {
fragment@0 {
target = <&foo>;
__overlay__ {
subnode {
prop = <0x01>;
};
};
};
__fixups__ {
foo = "/fragment@0:target:0";
};
};
--- 8< ---
With this mechanism, the orphan node itself doesn't exist anymore in
resulting plugin dtb but the resulting device-tree contains meta-data
mixed with pure 'device-tree' data.
Addons have been introduced to avoid this kind of mixing.
For addons, instead of changing the device-tree structure to add
something similar to fragments and __overlay__ present in plugins, the
orphan node will be present as a new dtb block and will be identified as
orphan thanks to meta-data added in dtb.
Modification done in this commit doesn't add functional changes but just
introduce orphan nodes entry points in data structures and functions in
order to prepare future changes related to parsing/generating dts and
dtb files.
Signed-off-by: Herve Codina <herve.codina@...tlin.com>
---
dtc-parser.y | 4 ++--
dtc.h | 7 ++++++-
flattree.c | 3 ++-
fstree.c | 3 ++-
livetree.c | 4 +++-
5 files changed, 15 insertions(+), 6 deletions(-)
diff --git a/dtc-parser.y b/dtc-parser.y
index 08b3642..626a232 100644
--- a/dtc-parser.y
+++ b/dtc-parser.y
@@ -132,7 +132,7 @@ sourcefile:
{
parser_output = build_dt_info($1, $2, $3,
guess_boot_cpuid($3),
- NULL);
+ NULL, NULL);
}
| headers memreserves importlist devicetree
{
@@ -143,7 +143,7 @@ sourcefile:
*/
parser_output = build_dt_info($1, $2, $4,
$4 ? guess_boot_cpuid($4) : 0,
- reverse_symbol($3));
+ reverse_symbol($3), NULL);
}
;
diff --git a/dtc.h b/dtc.h
index d45a84c..399beee 100644
--- a/dtc.h
+++ b/dtc.h
@@ -277,6 +277,9 @@ struct node {
#define for_each_symbol(s0, s) \
for ((s) = (s0); (s); (s) = (s)->next)
+#define for_each_orphan(o0, o) \
+ for ((o) = (o0); (o); (o) = (o)->next_sibling)
+
void add_label(struct label **labels, char *label);
void delete_labels(struct label **labels);
@@ -345,6 +348,7 @@ struct dt_info {
uint32_t boot_cpuid_phys;
struct node *dt; /* the device tree */
struct symbol *importsymlist; /* Import symbol list */
+ struct node *orphanlist; /* orphan nodes list */
const char *outname; /* filename being written to, "-" for stdout */
};
@@ -367,7 +371,8 @@ struct marker *dti_get_marker_label(struct dt_info *dti, const char *label,
struct dt_info *build_dt_info(unsigned int dtsflags,
struct reserve_info *reservelist,
struct node *tree, uint32_t boot_cpuid_phys,
- struct symbol *importsymlist);
+ struct symbol *importsymlist,
+ struct node *orphanlist);
void sort_tree(struct dt_info *dti);
void generate_label_tree(struct dt_info *dti, const char *name, bool allocph);
void generate_fixups_tree(struct dt_info *dti, const char *name);
diff --git a/flattree.c b/flattree.c
index add02f0..412c7f8 100644
--- a/flattree.c
+++ b/flattree.c
@@ -1171,5 +1171,6 @@ struct dt_info *dt_from_blob(const char *fname)
fclose(f);
- return build_dt_info(DTSF_V1 | dtsflags, reservelist, tree, boot_cpuid_phys, importsymlist);
+ return build_dt_info(DTSF_V1 | dtsflags, reservelist, tree, boot_cpuid_phys,
+ importsymlist, NULL);
}
diff --git a/fstree.c b/fstree.c
index a6aaf1e..2be1ffa 100644
--- a/fstree.c
+++ b/fstree.c
@@ -72,5 +72,6 @@ struct dt_info *dt_from_fs(const char *dirname)
tree = read_fstree(dirname);
tree = name_node(tree, "");
- return build_dt_info(DTSF_V1, NULL, tree, guess_boot_cpuid(tree), NULL);
+ return build_dt_info(DTSF_V1, NULL, tree, guess_boot_cpuid(tree), NULL,
+ NULL);
}
diff --git a/livetree.c b/livetree.c
index 79f7b55..057997a 100644
--- a/livetree.c
+++ b/livetree.c
@@ -545,7 +545,8 @@ struct reserve_info *add_reserve_entry(struct reserve_info *list,
struct dt_info *build_dt_info(unsigned int dtsflags,
struct reserve_info *reservelist,
struct node *tree, uint32_t boot_cpuid_phys,
- struct symbol *importsymlist)
+ struct symbol *importsymlist,
+ struct node *orphanlist)
{
struct dt_info *dti;
@@ -555,6 +556,7 @@ struct dt_info *build_dt_info(unsigned int dtsflags,
dti->dt = tree;
dti->boot_cpuid_phys = boot_cpuid_phys;
dti->importsymlist = importsymlist;
+ dti->orphanlist = orphanlist;
return dti;
}
--
2.52.0
Powered by blists - more mailing lists