Re: [RFC PATCH 05/15] libfdt: Introduce fdt_first_node()

Luca Ceresoli
2026-04-01T15:11:22Z

Hi Hervé, 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 <herve.codina@bootlin.com>
> ---
> 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 offset)
> 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 = 0;
> + int offset;
> + uint32_t tag;
> +
> + do {
> + offset = nextoffset;
> + tag = 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 != FDT_END);
> +
> + return (nextoffset < 0) ? nextoffset : -FDT_ERR_NOTFOUND;
> +}
> +

Luca

--
Luca Ceresoli, Bootlin
Embedded Linux and Kernel engineering