[PATCH v1 1/3] efi_loader: Add platform hook for FDT loading

Heinrich Schuchardt xypron.glpk at gmx.de
Wed Jan 7 19:44:56 CET 2026


Am 6. Januar 2026 13:21:32 MEZ schrieb Aswin Murugan <aswin.murugan at oss.qualcomm.com>:
>Introduce a weak function efi_load_platform_fdt() to allow platforms
>to provide custom device tree selection logic. This enables platforms
>with special requirements (such as multi-DTB selection based on
>hardware detection) to load fdt.
>
>The default weak implementation does nothing, Platforms can provide
>a strong implementation to load platform-specific device trees.
>
>Signed-off-by: Aswin Murugan <aswin.murugan at oss.qualcomm.com>
>---
> include/efi_loader.h         |  2 ++
> lib/efi_loader/efi_bootmgr.c |  4 ++++
> lib/efi_loader/efi_fdt.c     | 23 +++++++++++++++++++++++
> 3 files changed, 29 insertions(+)
>
>diff --git a/include/efi_loader.h b/include/efi_loader.h
>index 3e70ac07055..62c3df48f71 100644
>--- a/include/efi_loader.h
>+++ b/include/efi_loader.h
>@@ -1303,4 +1303,6 @@ int efi_get_distro_fdt_name(char *fname, int size, int seq);
> 
> void efi_load_distro_fdt(efi_handle_t handle, void **fdt, efi_uintn_t *fdt_size);
> 
>+void efi_load_platform_fdt(efi_handle_t handle, void **fdt, efi_uintn_t *fdt_size);
>+
> #endif /* _EFI_LOADER_H */
>diff --git a/lib/efi_loader/efi_bootmgr.c b/lib/efi_loader/efi_bootmgr.c
>index a687f4d8e85..ed06a65feb7 100644
>--- a/lib/efi_loader/efi_bootmgr.c
>+++ b/lib/efi_loader/efi_bootmgr.c
>@@ -1332,6 +1332,10 @@ efi_status_t efi_bootmgr_run(void *fdt)
> 			efi_load_distro_fdt(handle, &fdt_distro, &fdt_size);
> 			fdt = fdt_distro;
> 		}
>+		if (!fdt) {
>+			efi_load_platform_fdt(handle, &fdt_distro, &fdt_size);
>+			fdt = fdt_distro;
>+		}
> 	}
> 
> 	/*
>diff --git a/lib/efi_loader/efi_fdt.c b/lib/efi_loader/efi_fdt.c
>index bfaa9cfc207..bfcfd933adf 100644
>--- a/lib/efi_loader/efi_fdt.c
>+++ b/lib/efi_loader/efi_fdt.c
>@@ -78,6 +78,29 @@ int efi_get_distro_fdt_name(char *fname, int size, int seq)
> 	return 0;
> }
> 
>+/**
>+ * efi_load_platform_fdt() - Platform-specific FDT loading hook (weak)
>+ *
>+ * @handle:	handle of loaded image
>+ * @fdt:	on return device-tree, must be freed via efi_free_pages()
>+ * @fdt_size:	buffer size
>+ *
>+ * This weak function allows platforms to provide custom DTB selection logic.
>+ * The default implementation does nothing, allowing the standard distro boot
>+ * path to handle FDT loading. Platforms can override this function to
>+ * implement custom multi-DTB selection or other platform-specific logic.
>+ *
>+ * If this function successfully loads a DTB, it should set *fdt to point to
>+ * the loaded DTB and return. If it cannot load a DTB, it should set *fdt to
>+ * NULL, and the standard distro boot logic will be used as fallback.
>+ */
>+__weak void efi_load_platform_fdt(efi_handle_t handle, void **fdt,
>+				  efi_uintn_t *fdt_size)
>+{
>+	/* Default: do nothing, let standard distro boot handle it */
>+	*fdt = NULL;
>+}
>+
> /**
>  * efi_load_distro_fdt() - load distro device-tree
>  *

Have a look at starfive_visionfive2_defconfig  which supports several boards and chooses the right devicetree based on a value in an EEPROM in SPL. In main U-Boot it sets a board specific value in $fdtfile which allows loading a device-tree from directory dtb/ on the ESP to override the U-Boot device-tree. 

Best regards

Heinrich



More information about the U-Boot mailing list