Re: [RFC PATCH 05/15] libfdt: Introduce fdt_first_node()
"Luca Ceresoli" <[email protected]> Wed, 01 Apr 2026 17:11:15 +0200
| Newsgroups | org.kernel.vger.devicetree-spec,org.kernel.vger.devicetree-compiler,org.kernel.vger.linux-devicetree,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <[email protected]> |
Hi Herv=C3=A9, David, I'm trying to review the patches that have no feedback so far. Being new to the dtc codebase I'm mostly pointing out things that are not clear from a newcomer point of view. I hope this helps anyway. On Tue Feb 10, 2026 at 6:33 PM CET, Herve Codina wrote: > In several places, libfdt assumes that a FDT_BEGIN_NODE tag is present > at the offset 0 of the structure block. > > This assumption is not correct. Indeed, a FDT_NOP can be present at the > offset 0 and this is a legit case. I wonder whether this can be proven by showing an example, or the specs, or whatever use case that makes sense. > Introduce fdt_first_node() in order to get the offset of the first node > (first FDT_BEGIN_NODE tag) available in a fdt blob. > > Signed-off-by: Herve Codina <[email protected]> > --- > libfdt/fdt.c | 25 +++++++++++++++++++++++++ > libfdt/libfdt_internal.h | 1 + > 2 files changed, 26 insertions(+) > > diff --git a/libfdt/fdt.c b/libfdt/fdt.c > index 56d4dcb..676c7d7 100644 > --- a/libfdt/fdt.c > +++ b/libfdt/fdt.c > @@ -252,6 +252,31 @@ int fdt_check_prop_offset_(const void *fdt, int offs= et) > return offset; > } > Even though this seems to be quite uncommon in this repository, I think documenting new functions would be helpful, especially preconditions, postconditions and parameter values when not obvious. What about: Find the initial node with content (FDT_BEGIN_NODE) in a fdt, skipping FDT_NOP [and <other tags> is applicable]. *return: pointer to the first node into the fdt or e negative error value > +int fdt_first_node(const void *fdt) > +{ > + int nextoffset =3D 0; > + int offset; > + uint32_t tag; > + > + do { > + offset =3D nextoffset; > + tag =3D fdt_next_tag(fdt, offset, &nextoffset); > + switch (tag) { > + case FDT_END_NODE: > + case FDT_PROP: > + return -FDT_ERR_BADSTRUCTURE; > + > + case FDT_BEGIN_NODE: > + return offset; > + > + default: > + break; > + } > + } while (tag !=3D FDT_END); > + > + return (nextoffset < 0) ? nextoffset : -FDT_ERR_NOTFOUND; > +} > + Luca -- Luca Ceresoli, Bootlin Embedded Linux and Kernel engineering https://bootlin.com