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

Conor Dooley conor.dooley at microchip.com
Tue Jan 16 14:48:06 CET 2024


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 <sjg at 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
> 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: not available
URL: <https://lists.denx.de/pipermail/u-boot/attachments/20240116/dad62880/attachment.sig>


More information about the U-Boot mailing list