Am 6. Januar 2026 13:21:32 MEZ schrieb Aswin Murugan 
<[email protected]>:
>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 <[email protected]>
>---
> 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

Reply via email to