[PATCH] arm: init: add an option to use FDT from previous bootloader

Simon Glass sjg at chromium.org
Tue Oct 24 20:03:41 CEST 2023


Hi Caleb,

On Tue, 24 Oct 2023 at 04:32, Caleb Connolly <caleb.connolly at linaro.org> wrote:
>
> Add a new config option to allow u-boot to reuse the FDT provided by the

U-Boot (please fix throughout)

> previous stage bootloader when available.
>
> On some boards the previous stage bootloader can populate
> platform-specific parts of the devicetree such as the memory node, this
> allows us to avoid hardcoding it in u-boot and instead determine it
> dynamically at runtime.
>
> Signed-off-by: Caleb Connolly <caleb.connolly at linaro.org>
> ---
> This patch will improve generic support for Qualcomm boards by enabling
> us to configure the memory map at runtime rather than having hardcoded
> maps on a per-device basis. I've gone for this approach initially to try
> and avoid introducing board specific code where possible, but I'm happy
> to rework this into mach-snapdragon if that's preferred.

Do you think it could use bloblist instead? I did send a patch to use
the FDT in the bloblist:

https://patchwork.ozlabs.org/project/uboot/patch/20230926141514.2101787-40-sjg@chromium.org/

Regards,
Simon

> ---
> base-commit: e65b5d35c9116485366bb08138043d51220551da
>
> // Caleb (they/them)
> ---
>  arch/arm/lib/save_prev_bl_data.c |  7 +++++++
>  boot/Kconfig                     | 10 ++++++++++
>  include/init.h                   |  9 +++++++++
>  lib/fdtdec.c                     |  7 ++++++-
>  4 files changed, 32 insertions(+), 1 deletion(-)
>
> diff --git a/arch/arm/lib/save_prev_bl_data.c b/arch/arm/lib/save_prev_bl_data.c
> index f7b23faf0d66..b0608502535e 100644
> --- a/arch/arm/lib/save_prev_bl_data.c
> +++ b/arch/arm/lib/save_prev_bl_data.c
> @@ -45,6 +45,13 @@ bool is_addr_accessible(phys_addr_t addr)
>         return false;
>  }
>
> +phys_addr_t get_prev_bl_fdt_addr(void)
> +{
> +       if (!is_addr_accessible((phys_addr_t)reg0))
> +               return 0;
> +       return reg0;
> +}
> +
>  int save_prev_bl_data(void)
>  {
>         struct fdt_header *fdt_blob;
> diff --git a/boot/Kconfig b/boot/Kconfig
> index a01e6cb8aafe..c127ba254589 100644
> --- a/boot/Kconfig
> +++ b/boot/Kconfig
> @@ -1599,6 +1599,16 @@ config SAVE_PREV_BL_INITRAMFS_START_ADDR
>           If no initramfs was provided by previous bootloader, no env variables
>           will be created.
>
> +config USE_PREV_BL_FDT
> +       depends on SAVE_PREV_BL_FDT_ADDR && !OF_BOARD
> +       bool "Use the FDT provided by the previous stage bootloader"
> +       help
> +         When u-boot is chain-loaded from a previous bootloader, enable this option
> +         to use the FDT provided by the previous bootloader instead of any built-in
> +         to u-boot.
> +
> +         If no FDT was available, u-boot will fall back to its internal FDT.
> +
>  menu "Configuration editor"
>
>  config CEDIT
> diff --git a/include/init.h b/include/init.h
> index 4e7fe26c2004..58604cd98758 100644
> --- a/include/init.h
> +++ b/include/init.h
> @@ -168,6 +168,15 @@ defined(CONFIG_SAVE_PREV_BL_FDT_ADDR)
>   * Return: 0 if ok; -ENODATA on error
>   */
>  int save_prev_bl_data(void);
> +
> +/**
> + * get_prev_bl_fdt_addr - When u-boot is chainloaded, get the address
> + * of the FDT passed by the previous bootloader.
> + *
> + * Return: the address of the FDT passed by the previous bootloader
> + * or 0 if not found.
> + */
> +phys_addr_t get_prev_bl_fdt_addr(void);
>  #endif
>
>  /**
> diff --git a/lib/fdtdec.c b/lib/fdtdec.c
> index 7a6916764835..85425f2dc1ee 100644
> --- a/lib/fdtdec.c
> +++ b/lib/fdtdec.c
> @@ -1222,7 +1222,7 @@ static int uncompress_blob(const void *src, ulong sz_src, void **dstp)
>   */
>  static void *fdt_find_separate(void)
>  {
> -       void *fdt_blob = NULL;
> +       void *fdt_blob = NULL, *prevbl_fdt_blob;
>
>         if (IS_ENABLED(CONFIG_SANDBOX))
>                 return NULL;
> @@ -1234,6 +1234,11 @@ static void *fdt_find_separate(void)
>         else
>                 fdt_blob = (ulong *)__bss_end;
>  #else
> +#if defined(CONFIG_USE_PREV_BL_FDT)
> +       prevbl_fdt_blob = (void *)get_prev_bl_fdt_addr();
> +       if (prevbl_fdt_blob)
> +               return prevbl_fdt_blob;
> +#endif
>         /* FDT is at end of image */
>         fdt_blob = (ulong *)_end;
>
>

Regards,
SImon


More information about the U-Boot mailing list