Yo,

On Wed, Jan 03, 2024 at 06:49:19PM -0700, Simon Glass 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 <s...@chromium.org>

Since this was merged into master, U-Boot is no longer booting on my
icicle kit (At least that's what my bisection tells me). This is a
RISC-V board and U-Boot for it is built from
microchip_mpfs_icicle_defconfig.

There's zero output on the console from U-Boot at all, the last thing
that I see is OpenSBI before things grind to a halt.

Thanks,
Conor.


> ---
> 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
> 

Attachment: signature.asc
Description: PGP signature

Reply via email to