From: David Gibson <david@gibson.dropbear.id.au>
To: Douglas Anderson <dianders@chromium.org>
Cc: Devicetree-compiler@vger.kernel.org,
"Rob Herring" <robh@kernel.org>,
"Krzysztof Kozlowski" <krzk+dt@kernel.org>,
"Conor Dooley" <conor+dt@kernel.org>,
"Konrad Dybcio" <konradybcio@kernel.org>,
"Brian Norris" <briannorris@chromium.org>,
"Chen-Yu Tsai" <wenst@chromium.org>,
"André Draszik" <andre.draszik@linaro.org>,
Devicetree@vger.kernel.org, "Simon Glass" <sjg@chromium.org>,
"Tudor Ambarus" <tudor.ambarus@linaro.org>,
linux-kernel@vger.kernel.org,
"Julius Werner" <jwerner@chromium.org>,
"Saravana Kannan" <saravanak@kernel.org>,
"Peter Griffin" <peter.griffin@linaro.org>
Subject: Re: [PATCH v2 04/10] libfdt: overlay: Factor out fixup and fragment path parsing helpers
Date: Fri, 30 Oct 2026 15:04:18 +1100 [thread overview]
Message-ID: <auQXQU974oMkWe01@gractus.seuss> (raw)
In-Reply-To: <20261028215600.1713475-5-dianders@chromium.org>
[-- Attachment #1: Type: text/plain, Size: 7124 bytes --]
On Wed, Oct 28, 2026 at 02:46:53PM -0700, Douglas Anderson wrote:
> In preparation for updating the base device tree's `/__local_fixups__`
> node during `fdt_overlay_apply()`, factor out two helper functions in
> `libfdt/fdt_overlay.c`:
>
> - Factor out `overlay_parse_fixup_entry()` from
> `overlay_fixup_phandle()` to parse `"path:name:offset"` entries in
> `/__fixups__` properties.
> - Factor out `overlay_split_fragment_path()` from
> `overlay_symbol_update()` to validate and split
> `"/<fragment>/__overlay__[/<rel>]"` paths into the fragment name and
> relative subnode path.
>
> This commit is pure code movement with no functional change.
Conceptually good, but has a couple of warts.
>
> Assisted-by: Gemini:gemini-pro-prerelease
> Signed-off-by: Douglas Anderson <dianders@chromium.org>
> ---
>
> Changes in v2:
> - New patch factoring out overlay_parse_fixup_entry() and
> overlay_split_fragment_path() helpers in libfdt/fdt_overlay.c
>
> libfdt/fdt_overlay.c | 226 +++++++++++++++++++++++++++++--------------
> 1 file changed, 154 insertions(+), 72 deletions(-)
>
> diff --git a/libfdt/fdt_overlay.c b/libfdt/fdt_overlay.c
> index 51a3859620a4..f9d1a555ed5d 100644
> --- a/libfdt/fdt_overlay.c
> +++ b/libfdt/fdt_overlay.c
> @@ -351,6 +351,72 @@ static int overlay_fixup_one_phandle(void *fdto, int symbols_off,
> sizeof(phandle_prop));
> }
>
> +/**
> + * overlay_parse_fixup_entry - Parse one "path:name:offset" entry from /__fixups__
> + * @valuep: In/out pointer to the current NUL-terminated fixup string
> + * @lenp: In/out remaining length of the /__fixups__ property value
It would be good to describe how the in/out values are updated.
> + * @pathp: Output pointer to the target node path
> + * @path_lenp: Output length of @pathp in bytes
> + * @namep: Output pointer to the target property name
> + * @name_lenp: Output length of @namep in bytes
> + * @poffsetp: Output byte offset within the target property
[snip]
> +/**
> + * overlay_split_fragment_path - Split "/<frag>/__overlay__[/<rel>]" into parts
> + * @path: Input NUL-terminated path property string
> + * @path_len: Length of @path in bytes (including trailing NUL)
> + * @frag_namep: Output pointer to the fragment name
> + * @frag_name_lenp: Output length of @frag_namep in bytes
> + * @rel_pathp: Output pointer to the relative subnode path after __overlay__
> + * @rel_path_lenp: Output length of @rel_pathp in bytes
> + * @is_overlayp: Set to true if @path is under an __overlay__ subnode
Returning the bool this way is clunky. Better to use the return
value.
> + * returns:
> + * 0 on success
> + * -FDT_ERR_BADVALUE if @path is not a valid NUL-terminated '/' path
> + */
> +static int overlay_split_fragment_path(const char *path, int path_len,
> + const char **frag_namep,
> + int *frag_name_lenp,
> + const char **rel_pathp,
> + int *rel_path_lenp,
> + bool *is_overlayp)
> +{
> + int len, frag_name_len, rel_path_len;
> + const char *s, *e;
> + const char *frag_name;
> + const char *rel_path;
> +
> + *is_overlayp = false;
> +
> + /* verify it's a string property (terminated by a single \0) */
> + if (path_len < 1 || memchr(path, '\0', path_len) != &path[path_len - 1])
> + return -FDT_ERR_BADVALUE;
> +
> + /* keep end marker to avoid strlen() */
> + e = path + path_len;
> +
> + if (*path != '/')
> + return -FDT_ERR_BADVALUE;
> +
> + /* get fragment name first */
> + s = strchr(path + 1, '/');
> + if (!s) {
> + /* Symbol refers to something that won't end
> + * up in the target tree */
> + return 0;
> + }
> +
> + frag_name = path + 1;
> + frag_name_len = s - path - 1;
> +
> + /* verify format; safe since "s" lies in \0 terminated prop */
> + len = sizeof("/__overlay__/") - 1;
> + if ((e - s) > len && (memcmp(s, "/__overlay__/", len) == 0)) {
> + /* /<fragment-name>/__overlay__/<relative-subnode-path> */
> + rel_path = s + len;
> + rel_path_len = e - rel_path - 1;
> + } else if ((e - s) == len
> + && (memcmp(s, "/__overlay__", len - 1) == 0)) {
> + /* /<fragment-name>/__overlay__ */
> + rel_path = "";
> + rel_path_len = 0;
> + } else {
> + /* Symbol refers to something that won't end
> + * up in the target tree */
> + return 0;
> + }
> +
> + *frag_namep = frag_name;
> + *frag_name_lenp = frag_name_len;
> + *rel_pathp = rel_path;
> + *rel_path_lenp = rel_path_len;
> + *is_overlayp = true;
> + return 0;
> +}
> +
> /**
> * overlay_symbol_update - Update the symbols of base tree after a merge
> * @fdt: Base Device Tree blob
> @@ -907,7 +1017,6 @@ static int overlay_symbol_update(void *fdt, void *fdto)
> {
> int root_sym, ov_sym, prop, path_len, fragment, target;
> int len, frag_name_len, ret, rel_path_len;
> - const char *s, *e;
> const char *path;
> const char *name;
> const char *frag_name;
> @@ -934,47 +1043,20 @@ static int overlay_symbol_update(void *fdt, void *fdto)
>
> /* iterate over each overlay symbol */
> fdt_for_each_property_offset(prop, fdto, ov_sym) {
> + bool is_overlay;
> +
> path = fdt_getprop_by_offset(fdto, prop, &name, &path_len);
> if (!path)
> return path_len;
>
> - /* verify it's a string property (terminated by a single \0) */
> - if (path_len < 1 || memchr(path, '\0', path_len) != &path[path_len - 1])
> - return -FDT_ERR_BADVALUE;
> -
> - /* keep end marker to avoid strlen() */
> - e = path + path_len;
> -
> - if (*path != '/')
> - return -FDT_ERR_BADVALUE;
> -
> - /* get fragment name first */
> - s = strchr(path + 1, '/');
> - if (!s) {
> - /* Symbol refers to something that won't end
> - * up in the target tree */
> - continue;
> - }
> -
> - frag_name = path + 1;
> - frag_name_len = s - path - 1;
> -
> - /* verify format; safe since "s" lies in \0 terminated prop */
> - len = sizeof("/__overlay__/") - 1;
> - if ((e - s) > len && (memcmp(s, "/__overlay__/", len) == 0)) {
> - /* /<fragment-name>/__overlay__/<relative-subnode-path> */
> - rel_path = s + len;
> - rel_path_len = e - rel_path - 1;
> - } else if ((e - s) == len
> - && (memcmp(s, "/__overlay__", len - 1) == 0)) {
> - /* /<fragment-name>/__overlay__ */
> - rel_path = "";
> - rel_path_len = 0;
> - } else {
> - /* Symbol refers to something that won't end
> - * up in the target tree */
> + ret = overlay_split_fragment_path(path, path_len,
> + &frag_name, &frag_name_len,
> + &rel_path, &rel_path_len,
> + &is_overlay);
> + if (ret)
> + return ret;
> + if (!is_overlay)
> continue;
> - }
>
> /* find the fragment index in which the symbol lies */
> ret = fdt_subnode_offset_namelen(fdto, 0, frag_name,
> --
> 2.56.0.313.g2479322e68-goog
>
>
--
David Gibson (he or they) | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au | minimalist, thank you, not the other way
| around.
http://www.ozlabs.org/~dgibson
[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]
next prev parent reply other threads:[~2026-10-30 4:57 UTC|newest]
Thread overview: 26+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-28 21:46 [PATCH v2 00/10] fdtfactor: Introduce fdtfactor to auto-factor overlays Douglas Anderson
2026-10-28 21:46 ` [PATCH v2 01/10] pylibfdt: Fix FdtSw.as_fdt() when buffer is nearly full Douglas Anderson
2026-10-30 12:50 ` Simon Glass
2026-10-28 21:46 ` [PATCH v2 02/10] pylibfdt: Add subnode/property iterators and get_mem_rsv_list() Douglas Anderson
2026-10-29 8:38 ` David Gibson
2026-10-30 12:50 ` Simon Glass
2026-10-28 21:46 ` [PATCH v2 03/10] pylibfdt: Add NodeTree live tree representation Douglas Anderson
2026-10-30 4:57 ` David Gibson
2026-10-30 12:50 ` Simon Glass
2026-10-28 21:46 ` [PATCH v2 04/10] libfdt: overlay: Factor out fixup and fragment path parsing helpers Douglas Anderson
2026-10-30 4:04 ` David Gibson [this message]
2026-10-30 12:50 ` Simon Glass
2026-10-28 21:46 ` [PATCH v2 05/10] libfdt: overlay: Prepare fixup and fragment path helpers for reuse Douglas Anderson
2026-10-30 4:24 ` David Gibson
2026-10-30 12:50 ` Simon Glass
2026-10-28 21:46 ` [PATCH v2 06/10] libfdt: overlay: Update base /__local_fixups__ on apply Douglas Anderson
2026-10-30 11:26 ` David Gibson
2026-10-30 12:50 ` Simon Glass
2026-10-28 21:46 ` [PATCH v2 07/10] fdtfactor: Add tool to split DTBs into a base DTB and overlays Douglas Anderson
2026-10-30 12:50 ` Simon Glass
2026-10-28 21:46 ` [PATCH v2 08/10] fdtfactor: Add -S/--strip-local-fixups option Douglas Anderson
2026-10-30 12:50 ` Simon Glass
2026-10-28 21:46 ` [PATCH v2 09/10] fdtfactor: Support compressed DTB inputs and outputs Douglas Anderson
2026-10-30 12:50 ` Simon Glass
2026-10-28 21:46 ` [PATCH v2 10/10] fdtfactor: Add compiled FIT image factoring support Douglas Anderson
2026-10-30 12:50 ` Simon Glass
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=auQXQU974oMkWe01@gractus.seuss \
--to=david@gibson.dropbear.id.au \
--cc=Devicetree-compiler@vger.kernel.org \
--cc=Devicetree@vger.kernel.org \
--cc=andre.draszik@linaro.org \
--cc=briannorris@chromium.org \
--cc=conor+dt@kernel.org \
--cc=dianders@chromium.org \
--cc=jwerner@chromium.org \
--cc=konradybcio@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=peter.griffin@linaro.org \
--cc=robh@kernel.org \
--cc=saravanak@kernel.org \
--cc=sjg@chromium.org \
--cc=tudor.ambarus@linaro.org \
--cc=wenst@chromium.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.