[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