[PATCH 6/6] fdtdec: apply DT overlays from bloblist
Michal Simek
michal.simek at amd.com
Thu Jun 19 13:38:52 CEST 2025
On 6/18/25 16:59, Raymond Mao wrote:
> During FDT setup, apply all existing DT overlays from the bloblist
> to the base FDT if bloblist is being used for handoff from previous
> boot stage.
More technical details would be good to have here.
Especially that the way what you are using is to expand DT
>
> Signed-off-by: Raymond Mao <raymond.mao at linaro.org>
> ---
> lib/fdtdec.c | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 56 insertions(+)
>
> diff --git a/lib/fdtdec.c b/lib/fdtdec.c
> index c38738b48c7..3a218d8c94a 100644
> --- a/lib/fdtdec.c
> +++ b/lib/fdtdec.c
> @@ -1687,6 +1687,60 @@ void fdtdec_setup_embed(void)
> gd->fdt_src = FDTSRC_EMBED;
> }
>
> +static int fdtdec_apply_dto_from_blob(void **blob)
> +{
> + int ret;
> + struct fdt_header *live_fdt;
> + size_t new_fdt_size, blob_size;
> + int expand_by;
> +
> + if (!CONFIG_IS_ENABLED(OF_LIBFDT_OVERLAY) ||
> + !CONFIG_IS_ENABLED(BLOBLIST))
> + return -EPERM;
> +
> + live_fdt = bloblist_find(BLOBLISTT_CONTROL_FDT, 0);
> + ret = fdt_check_header(live_fdt);
> + if (ret)
> + return ret;
Why is this needed? You already have gd->fdt_blob which has been checked.
> +
> + ret = fdt_check_header(*blob);
> + if (ret)
> + return ret;
> +
> + blob_size = fdt_totalsize(*blob);
> +
> + /* Expand the FDT for spare spaces to apply the overlay */
> + new_fdt_size = fdt_totalsize(live_fdt) + blob_size + 0x400;
Some notes about this 0x400 would be good. Do you see issue if you don't use
this value? Is file DTB after expansion actually bigger then origin+overlay that
you need to add 0x400 magic value here?
> + ret = bloblist_resize(BLOBLISTT_CONTROL_FDT, new_fdt_size, &expand_by);
> + if (ret)
> + return ret;
You do resize inside tl list.. That should be described in commit message
because my exception was that this location can be read only from NS world.
I didn't run this on HW and likely I should do it to understand this better
but isn't this moving CONTROL_FDT entry to different location which will have
bigger space for applying overlay?
Isn't it also worth to check if existing CONTROL_FDT has enough space inside
that new overlay can fit there before resizing it?
> +
> + /* The blob is shifted if it was following the FDT */
> + if (*blob > (void *)live_fdt)
> + *blob += expand_by;
> +
> + ret = fdt_open_into(live_fdt, live_fdt, new_fdt_size);
> + if (ret)
> + return ret;
> +
> + ret = fdt_overlay_apply_verbose(live_fdt, *blob);
> + if (ret)
> + return ret;
> +
> + /* Shrink the excessive spaces */
> + fdt_pack(live_fdt);
> + new_fdt_size = fdt_totalsize(live_fdt);
> + ret = bloblist_resize(BLOBLISTT_CONTROL_FDT, new_fdt_size, &expand_by);
> + if (ret)
> + return ret;
I didn't try to run on HW but don't you need to also adjust gd->fdt_blob to
point to current location where fdt is?
Thanks,
Michal
More information about the U-Boot
mailing list