From: Herve Codina <herve.codina@bootlin.com>
To: David Gibson <david@gibson.dropbear.id.au>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk@kernel.org>,
Conor Dooley <conor+dt@kernel.org>
Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
David Lechner <dlechner@baylibre.com>,
Ayush Singh <ayush@beagleboard.org>,
Geert Uytterhoeven <geert@linux-m68k.org>,
devicetree-compiler@vger.kernel.org, devicetree@vger.kernel.org,
linux-kernel@vger.kernel.org, devicetree-spec@vger.kernel.org,
Hui Pu <hui.pu@gehealthcare.com>,
Ian Ray <ian.ray@gehealthcare.com>,
Luca Ceresoli <luca.ceresoli@bootlin.com>,
Thomas Petazzoni <thomas.petazzoni@bootlin.com>,
Herve Codina <herve.codina@bootlin.com>
Subject: [PATCH v3 01/15] fdtget: Use libfdt iterators instead of open coded loops
Date: Wed, 26 Aug 2026 10:31:32 +0200 [thread overview]
Message-ID: <20260826083146.304291-2-herve.codina@bootlin.com> (raw)
In-Reply-To: <20260826083146.304291-1-herve.codina@bootlin.com>
fdtget uses directly fdt_{first,next}_property_offset() with a while(1)
loop to iterate over node properties.
It also uses the low level primitive fdt_next_tag() with custom tags,
level and depth handling to iterates over subnodes.
It is worth noting that FDT_NOP can be returned by fdt_next_tag() and
this tag is not taken into account in the fdtget open coded loop. This
will lead to an incorrect error if a FDT_NOP tag is encountered.
libfdt provides iterators to iterate over node properties and subnodes.
The subnode iterator provided by libfdt is robust against FDT_NOP tags
and will be robust in the future when new tags are introduced.
Replace fdtget open coded loops by iterators provided by libfdt and
designed to perform those operations.
Signed-off-by: Herve Codina <herve.codina@bootlin.com>
---
fdtget.c | 73 ++++++++++++++++++--------------------------------------
1 file changed, 23 insertions(+), 50 deletions(-)
diff --git a/fdtget.c b/fdtget.c
index dd709854..c6169691 100644
--- a/fdtget.c
+++ b/fdtget.c
@@ -138,21 +138,20 @@ static int show_data(struct display_info *disp, const char *data, int len)
static int list_properties(const void *blob, int node)
{
const char *name;
+ const void *p;
int prop;
- prop = fdt_first_property_offset(blob, node);
- do {
- /* Stop silently when there are no more properties */
- if (prop < 0)
- return prop == -FDT_ERR_NOTFOUND ? 0 : prop;
- fdt_getprop_by_offset(blob, prop, &name, NULL);
- if (name)
+ fdt_for_each_property_offset(prop, blob, node) {
+ p = fdt_getprop_by_offset(blob, prop, &name, NULL);
+ if (p && name)
puts(name);
- prop = fdt_next_property_offset(blob, prop);
- } while (1);
-}
+ }
-#define MAX_LEVEL 32 /* how deeply nested we will go */
+ if ((prop < 0) && (prop != -FDT_ERR_NOTFOUND))
+ return prop;
+
+ return 0;
+}
/**
* List all subnodes in a node, one per line
@@ -163,47 +162,21 @@ static int list_properties(const void *blob, int node)
*/
static int list_subnodes(const void *blob, int node)
{
- int nextoffset; /* next node offset from libfdt */
- uint32_t tag; /* current tag */
- int level = 0; /* keep track of nesting level */
const char *pathp;
- int depth = 1; /* the assumed depth of this node */
-
- while (level >= 0) {
- tag = fdt_next_tag(blob, node, &nextoffset);
- switch (tag) {
- case FDT_BEGIN_NODE:
- pathp = fdt_get_name(blob, node, NULL);
- if (level <= depth) {
- if (pathp == NULL)
- pathp = "/* NULL pointer error */";
- if (*pathp == '\0')
- pathp = "/"; /* root is nameless */
- if (level == 1)
- puts(pathp);
- }
- level++;
- if (level >= MAX_LEVEL) {
- printf("Nested too deep, aborting.\n");
- return 1;
- }
- break;
- case FDT_END_NODE:
- level--;
- if (level == 0)
- level = -1; /* exit the loop */
- break;
- case FDT_END:
- return 1;
- case FDT_PROP:
- break;
- default:
- if (level <= depth)
- printf("Unknown tag 0x%08X\n", tag);
- return 1;
- }
- node = nextoffset;
+ int subnode;
+
+ fdt_for_each_subnode(subnode, blob, node) {
+ pathp = fdt_get_name(blob, subnode, NULL);
+ if (pathp == NULL)
+ pathp = "/* NULL pointer error */";
+ if (*pathp == '\0')
+ pathp = "/"; /* root is nameless */
+ puts(pathp);
}
+
+ if (subnode < 0 && (subnode != -FDT_ERR_NOTFOUND))
+ return subnode;
+
return 0;
}
--
2.55.0
next prev parent reply other threads:[~2026-08-26 8:32 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-08-26 8:31 [PATCH v3 00/15] Add support for structured tags and v18 dtb version Herve Codina
2026-08-26 8:31 ` Herve Codina [this message]
2026-08-26 8:31 ` [PATCH v3 02/15] libfdt: Don't assume the root node is available at offset 0 Herve Codina
2026-08-26 8:31 ` [PATCH v3 03/15] tests: " Herve Codina
2026-08-26 8:31 ` [PATCH v3 04/15] tests/nopulate: Add a FDT_NOP before the root node Herve Codina
2026-08-26 8:31 ` [PATCH v3 05/15] tests: treegen: Introduce emit_fdt_header_vers() Herve Codina
2026-08-26 8:31 ` [PATCH v3 06/15] Introduce structured tag value definition Herve Codina
2026-08-26 8:31 ` [PATCH v3 07/15] fdtdump: Handle unknown tags Herve Codina
2026-08-26 8:31 ` [PATCH v3 08/15] flattree: " Herve Codina
2026-08-26 8:31 ` [PATCH v3 09/15] libfdt: Handle unknown tags in fdt_next_tag() Herve Codina
2026-08-26 8:31 ` [PATCH v3 10/15] libfdt: Introduce fdt_ptr_offset_() Herve Codina
2026-08-26 8:31 ` [PATCH v3 11/15] libfdt: Introduce fdt_getprop_by_offset_w() Herve Codina
2026-08-26 8:31 ` [PATCH v3 12/15] libfdt: Introduce fdt_getprop_offset_namelen() Herve Codina
2026-08-26 8:31 ` [PATCH v3 13/15] tests: Add wip_func utility Herve Codina
2026-08-26 8:31 ` [PATCH v3 14/15] libfdt: Handle unknown tags on dtb modifications Herve Codina
2026-08-26 8:31 ` [PATCH v3 15/15] Introduce v18 dtb version 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=20260826083146.304291-2-herve.codina@bootlin.com \
--to=herve.codina@bootlin.com \
--cc=ayush@beagleboard.org \
--cc=conor+dt@kernel.org \
--cc=david@gibson.dropbear.id.au \
--cc=devicetree-compiler@vger.kernel.org \
--cc=devicetree-spec@vger.kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=dlechner@baylibre.com \
--cc=geert@linux-m68k.org \
--cc=hui.pu@gehealthcare.com \
--cc=ian.ray@gehealthcare.com \
--cc=krzk@kernel.org \
--cc=laurent.pinchart@ideasonboard.com \
--cc=linux-kernel@vger.kernel.org \
--cc=luca.ceresoli@bootlin.com \
--cc=robh@kernel.org \
--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