[PATCH 6/6] fdtdec: apply DT overlays from bloblist
Raymond Mao
raymond.mao at linaro.org
Wed Jun 18 16:59:28 CEST 2025
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.
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;
+
+ 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;
+ ret = bloblist_resize(BLOBLISTT_CONTROL_FDT, new_fdt_size, &expand_by);
+ if (ret)
+ return ret;
+
+ /* 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;
+
+ /* The blob is shifted if it was following the FDT */
+ if (*blob > (void *)live_fdt)
+ *blob += expand_by;
+
+ return ret;
+}
+
int fdtdec_setup(void)
{
int ret = -ENOENT;
@@ -1708,6 +1762,8 @@ int fdtdec_setup(void)
gd->fdt_src = FDTSRC_BLOBLIST;
log_debug("Devicetree is in bloblist at %p\n",
gd->fdt_blob);
+ bloblist_apply_blobs(BLOBLISTT_FDT_OVERLAY,
+ fdtdec_apply_dto_from_blob);
goto setup_fdt;
} else {
log_debug("No FDT found in bloblist\n");
--
2.25.1
More information about the U-Boot
mailing list