[PATCH v7] fdt: Allow the devicetree to come from a bloblist

Ilias Apalodimas ilias.apalodimas at linaro.org
Thu Jan 4 15:24:11 CET 2024


On Thu, 4 Jan 2024 at 03:49, Simon Glass <sjg at chromium.org> wrote:
>
> Standard passage provides for a bloblist to be passed from one firmware
> phase to the next. That can be used to pass the devicetree along as well.
> Add an option to support this.
>
> Tests for this will be added as part of the Universal Payload work.
>
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> The discussion on this was not resolved and is now important due to the
> bloblist series from Raymond. So I am sending it again since I believe
> this is a better starting point than building on OF_BOARD
>
> Changes in v7:
> - Drop use of OF_BLOBLIST
>
> Changes in v6:
> - Don't allow bloblist with OF_EMBED
>
> Changes in v5:
> - Make OF_BLOBLIST default y
> - Make OF_BLOBLIST optional at runtime
>
> Changes in v4:
> - Rebase to -next
>
>  doc/develop/devicetree/control.rst |  3 ++
>  include/fdtdec.h                   |  6 ++--
>  lib/fdtdec.c                       | 44 +++++++++++++++++++++++-------
>  3 files changed, 41 insertions(+), 12 deletions(-)
>
> diff --git a/doc/develop/devicetree/control.rst b/doc/develop/devicetree/control.rst
> index cbb65c9b177..11c92d440f4 100644
> --- a/doc/develop/devicetree/control.rst
> +++ b/doc/develop/devicetree/control.rst
> @@ -108,6 +108,9 @@ If CONFIG_OF_BOARD is defined, 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 CONFIG_BLOBLIST is defined, the devicetree may come from a bloblist passed
> +from a previous stage, if present.
> +
>  If CONFIG_SANDBOX is defined, then it will be read from a file on
>  startup. Use the -d flag to U-Boot to specify the file to read, -D for the
>  default and -T for the test devicetree, used to run sandbox unit tests.
> diff --git a/include/fdtdec.h b/include/fdtdec.h
> index bd1149f46d0..e80de24076c 100644
> --- a/include/fdtdec.h
> +++ b/include/fdtdec.h
> @@ -72,7 +72,7 @@ struct bd_info;
>   *     U-Boot is packaged as an ELF file, e.g. for debugging purposes
>   * @FDTSRC_ENV: Provided by the fdtcontroladdr environment variable. This should
>   *     be used for debugging/development only
> - * @FDTSRC_NONE: No devicetree at all
> + * @FDTSRC_BLOBLIST: Provided by a bloblist from an earlier phase
>   */
>  enum fdt_source_t {
>         FDTSRC_SEPARATE,
> @@ -80,6 +80,7 @@ enum fdt_source_t {
>         FDTSRC_BOARD,
>         FDTSRC_EMBED,
>         FDTSRC_ENV,
> +       FDTSRC_BLOBLIST,
>  };
>
>  /*
> @@ -1190,7 +1191,8 @@ int fdtdec_resetup(int *rescan);
>   *
>   * The existing devicetree is available at gd->fdt_blob
>   *
> - * @err internal error code if we fail to setup a DTB
> + * @err: 0 on success, -EEXIST if the devicetree is already correct, or other
> + * internal error code if we fail to setup a DTB
>   * @returns new devicetree blob pointer
>   */
>  void *board_fdt_blob_setup(int *err);
> diff --git a/lib/fdtdec.c b/lib/fdtdec.c
> index 4016bf3c113..b2c59ab3818 100644
> --- a/lib/fdtdec.c
> +++ b/lib/fdtdec.c
> @@ -7,6 +7,10 @@
>   */
>
>  #ifndef USE_HOSTCC
> +
> +#define LOG_CATEGORY   LOGC_DT
> +
> +#include <bloblist.h>
>  #include <boot_fit.h>
>  #include <display_options.h>
>  #include <dm.h>
> @@ -86,6 +90,7 @@ static const char *const fdt_src_name[] = {
>         [FDTSRC_BOARD] = "board",
>         [FDTSRC_EMBED] = "embed",
>         [FDTSRC_ENV] = "env",
> +       [FDTSRC_BLOBLIST] = "bloblist",
>  };
>
>  const char *fdtdec_get_srcname(void)
> @@ -1662,23 +1667,42 @@ static void setup_multi_dtb_fit(void)
>
>  int fdtdec_setup(void)
>  {
> -       int ret;
> +       int ret = -ENOENT;
> +
> +       /* If allowing a bloblist, check that first */
> +       if (CONFIG_IS_ENABLED(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);
> +                       } else {
> +                               log_debug("No FDT found in bloblist\n");
> +                               ret = -ENOENT;
> +                       }
> +               }
> +       }
>
> -       /* The devicetree is typically appended to U-Boot */
> -       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 */
> -               gd->fdt_blob = dtb_dt_embedded();
> -               gd->fdt_src = FDTSRC_EMBED;
> +       /* Otherwise, the devicetree is typically appended to U-Boot */
> +       if (ret) {
> +               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 */
> +                       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)) {
>                 gd->fdt_blob = board_fdt_blob_setup(&ret);
> -               if (ret)
> +               if (!ret)
> +                       gd->fdt_src = FDTSRC_BOARD;
> +               else if (ret != -EEXIST)
>                         return ret;
> -               gd->fdt_src = FDTSRC_BOARD;
>         }
>
>         /* Allow the early environment to override the fdt address */
> --
> 2.34.1
>

Thanks Simon
Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>


More information about the U-Boot mailing list