[PATCH 2/4] fdt: Introduce OF_BLOBLIST

Raymond Mao raymond.mao at linaro.org
Thu Apr 3 17:34:10 CEST 2025


Hi Simon,

On Fri, 28 Mar 2025 at 11:44, Simon Glass <sjg at chromium.org> wrote:
>
> Add an option which indicates that the devicetree comes from the
> bloblist.
>
> After discussions with Tom, it seems we are comfortable with introducing
> this option, ensuring of course that the transfer list is properly
> supported.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
>
>  doc/develop/devicetree/control.rst |  3 ++
>  dts/Kconfig                        |  8 ++++
>  lib/fdtdec.c                       | 66 ++++++++++++------------------
>  3 files changed, 38 insertions(+), 39 deletions(-)
>
> diff --git a/doc/develop/devicetree/control.rst b/doc/develop/devicetree/control.rst
> index 0233945f8b6..d80f4d420a9 100644
> --- a/doc/develop/devicetree/control.rst
> +++ b/doc/develop/devicetree/control.rst
> @@ -137,6 +137,9 @@ If `OF_BOARD` is selected by Kconfig, a board-specific routine will provide the
>  devicetree at runtime, for example if an earlier bootloader stage creates
>  it and passes it to U-Boot.
>
> +If `OF_BLOBLIST` is defined, the devicetree comes from a bloblist passed
> +from a previous stage.
> +
>  If `BLOBLIST` is selected by Kconfig, the devicetree may come from a bloblist
>  passed from a previous stage, if present.
>
> diff --git a/dts/Kconfig b/dts/Kconfig
> index 6a5141b56e9..04359a4d7b2 100644
> --- a/dts/Kconfig
> +++ b/dts/Kconfig
> @@ -167,6 +167,14 @@ config OF_INITIAL_DTB_READONLY
>           If initial DTB for DT control is read-only (e.g. points to
>           memory-mapped flash memory), then set this option.
>
> +config OF_BLOBLIST
> +       bool "DTB is provided by a bloblist"
> +       help
> +         Select this to read the devicetree from the bloblist. This allows
> +         using a bloblist to transfer the devicetree between U-Boot phases.
> +         The devicetree is stored in the bloblist by an earlier phase so that
> +         U-Boot can read it.
> +
>  config OF_BOARD
>         bool "Provided by the board (e.g a previous loader) at runtime"
>         default y if SANDBOX || OF_HAS_PRIOR_STAGE
> diff --git a/lib/fdtdec.c b/lib/fdtdec.c
> index f09c9926a7a..833f8aca3ce 100644
> --- a/lib/fdtdec.c
> +++ b/lib/fdtdec.c
> @@ -1689,55 +1689,43 @@ void fdtdec_setup_embed(void)
>
>  int fdtdec_setup(void)

I think a better idea is to use BLOBLIST_PASSAGE_MANDATORY, see below
pseudo code:

```
if (IS_ENABLED(CONFIG_OF_BOARD)) {
    /* get fdt from board */
}

/* allow fdtcontroladdr to override it */

if (CONFIG_IS_ENABLED(BLOBLIST) && ... ) {
    /* try to find fdt from bloblist */

    if (CONFIG_IS_ENABLED(BLOBLIST_PASSAGE_MANDATORY) {
        if (no_fdt_in_bloblist)
            return ERROR;

        /* override fdt with the one from bloblist */
    }
}
```

Regards,
Raymond

>  {
> -       int ret = -ENOENT;
> +       int ret;
>
> -       /*
> -        * If allowing a bloblist, check that first. There was discussion about
> -        * adding an OF_BLOBLIST Kconfig, but this was rejected.
> -        *
> -        * The necessary test is whether the previous phase passed a bloblist,
> -        * not whether this phase creates one.
> -        */
> -       if (CONFIG_IS_ENABLED(BLOBLIST) &&
> -           (xpl_prev_phase() != PHASE_TPL ||
> -            IS_ENABLED(CONFIG_TPL_BLOBLIST))) {
> +       if (CONFIG_IS_ENABLED(OF_BLOBLIST)) {
>                 ret = bloblist_maybe_init();
> -               if (!ret) {
> -                       gd->fdt_blob = bloblist_find(BLOBLISTT_CONTROL_FDT, 0);
> -                       if (gd->fdt_blob) {
> -                               gd->fdt_src = FDTSRC_BLOBLIST;
> -                               log_debug("Devicetree is in bloblist at %p\n",
> -                                         gd->fdt_blob);
> -                               ret = 0;
> -                       } else {
> -                               log_debug("No FDT found in bloblist\n");
> -                               ret = -ENOENT;
> -                       }
> +               if (ret)
> +                       return ret;
> +               gd->fdt_blob = bloblist_find(BLOBLISTT_CONTROL_FDT, 0);
> +               if (!gd->fdt_blob) {
> +                       printf("Not FDT found in bloblist\n");
> +                       bloblist_show_list();
> +                       return -ENOENT;
>                 }
> -       }
> -
> -       /* Otherwise, the devicetree is typically appended to U-Boot */
> -       if (ret) {
> +               gd->fdt_src = FDTSRC_BLOBLIST;
> +               bloblist_show_list();
> +               log_debug("Devicetree is in bloblist at %p\n", gd->fdt_blob);
> +       } else {
>                 if (IS_ENABLED(CONFIG_OF_SEPARATE)) {
>                         gd->fdt_blob = fdt_find_separate();
>                         gd->fdt_src = FDTSRC_SEPARATE;
>                 } else { /* embed dtb in ELF file for testing / development */
> -                       fdtdec_setup_embed();
> +                       gd->fdt_blob = dtb_dt_embedded();
> +                       gd->fdt_src = FDTSRC_EMBED;
>                 }
> -       }
>
> -       /* Allow the board to override the fdt address. */
> -       if (IS_ENABLED(CONFIG_OF_BOARD)) {
> -               void *blob;
> +               /* Allow the board to override the fdt address. */
> +               if (IS_ENABLED(CONFIG_OF_BOARD)) {
> +                       void *blob;
>
> -               blob = (void *)gd->fdt_blob;
> -               ret = board_fdt_blob_setup(&blob);
> -               if (ret) {
> -                       if (ret != -EEXIST)
> -                               return ret;
> -               } else {
> -                       gd->fdt_src = FDTSRC_BOARD;
> -                       gd->fdt_blob = blob;
> +                       blob = (void *)gd->fdt_blob;
> +                       ret = board_fdt_blob_setup(&blob);
> +                       if (ret) {
> +                               if (ret != -EEXIST)
> +                                       return ret;
> +                       } else {
> +                               gd->fdt_src = FDTSRC_BOARD;
> +                               gd->fdt_blob = blob;
> +                       }
>                 }
>         }
>
> --
> 2.43.0
>


More information about the U-Boot mailing list