[PATCH v5 0/8] Handoff bloblist from previous boot stage

This patch set adds/adapts a few bloblist APIs and implements Arm arch custom function to retrieve the bloblist (aka. Transfer List) from previous loader via boot arguments when BLOBLIST option is enabled and all boot arguments are compliant to the register conventions defined in the Firmware Handoff spec v0.9.
FDT library function will load the FDT from the bloblist if it exists. Otherwise it fallbacks to get the FDT from traditional way.
If an arch wishes to have different behaviors for loading bloblist from the previous boot stage, it is required to implement the custom function xferlist_from_boot_arg().
V5: Drop [PATCH v4 8/9] fdt: update the document and Kconfig description.
Raymond Mao (8): bloblist: add API to check the register conventions bloblist: check bloblist with specified buffer size bloblist: refactor of bloblist_reloc() arm: armv7: save boot arguments arm: armv8: save boot arguments arm: Get bloblist from boot arguments bloblist: Load the bloblist from the previous loader fdt: get FDT from bloblist
arch/arm/cpu/armv7/start.S | 19 ++++++++ arch/arm/cpu/armv8/start.S | 14 ++++++ arch/arm/lib/Makefile | 2 + arch/arm/lib/xferlist.c | 27 ++++++++++++ arch/arm/lib/xferlist.h | 19 ++++++++ common/bloblist.c | 85 +++++++++++++++++++++++++++--------- common/board_f.c | 9 ++-- configs/qemu_arm64_defconfig | 3 ++ include/bloblist.h | 47 ++++++++++++++++---- lib/fdtdec.c | 18 ++++---- test/bloblist.c | 8 ++-- 11 files changed, 202 insertions(+), 49 deletions(-) create mode 100644 arch/arm/lib/xferlist.c create mode 100644 arch/arm/lib/xferlist.h

Add bloblist_check_reg_conv() to check whether the bloblist is compliant to the register conventions defined in Firmware Handoff specification. This API can be used for all Arm platforms.
Signed-off-by: Raymond Mao raymond.mao@linaro.org --- Changes in v2 - Refactor of bloblist_check_reg_conv(). Changes in v3 - bloblist_check_reg_conv() returns -ENOENT if OF_BOARD is disabled. Changes in v4 - Add checking of signature register. Changes in V5 - Drop the dependence on OF_BOARD.
common/bloblist.c | 11 +++++++++++ include/bloblist.h | 20 ++++++++++++++++++++ 2 files changed, 31 insertions(+)
diff --git a/common/bloblist.c b/common/bloblist.c index 2d373910b6..980b1ddbcb 100644 --- a/common/bloblist.c +++ b/common/bloblist.c @@ -542,3 +542,14 @@ int bloblist_maybe_init(void)
return 0; } + +int bloblist_check_reg_conv(ulong rfdt, ulong rzero, ulong rsig) +{ + if (rzero || rsig != (BLOBLIST_MAGIC | BLOBLIST_REGCONV_VER) || + rfdt != (ulong)bloblist_find(BLOBLISTT_CONTROL_FDT, 0)) { + gd->bloblist = NULL; /* Reset the gd bloblist pointer */ + return -EIO; + } + + return 0; +} diff --git a/include/bloblist.h b/include/bloblist.h index 84fc943819..f7e800f681 100644 --- a/include/bloblist.h +++ b/include/bloblist.h @@ -78,6 +78,13 @@ enum { BLOBLIST_VERSION = 1, BLOBLIST_MAGIC = 0x4a0fb10b,
+ /* + * FIXME: + * Register convention version should be placed into a higher byte + * https://github.com/FirmwareHandoff/firmware_handoff/issues/32 + */ + BLOBLIST_REGCONV_VER = 1 << 24, + BLOBLIST_BLOB_ALIGN_LOG2 = 3, BLOBLIST_BLOB_ALIGN = 1 << BLOBLIST_BLOB_ALIGN_LOG2,
@@ -461,4 +468,17 @@ static inline int bloblist_maybe_init(void) } #endif /* BLOBLIST */
+/** + * bloblist_check_reg_conv() - Check whether the bloblist is compliant to + * the register conventions according to the + * Firmware Handoff spec. + * + * @rfdt: Register that holds the FDT base address. + * @rzero: Register that must be zero. + * @rsig: Register that holds signature and register conventions version. + * Return: 0 if OK, -EIO if the bloblist is not compliant to the register + * conventions. + */ +int bloblist_check_reg_conv(ulong rfdt, ulong rzero, ulong rsig); + #endif /* __BLOBLIST_H */

Instead of expecting the bloblist total size to be the same as the pre-allocated buffer size, practically we are more interested in whether the pre-allocated buffer size is bigger than the bloblist total size.
Signed-off-by: Raymond Mao raymond.mao@linaro.org Reviewed-by: Ilias Apalodimas ilias.apalodimas@linaro.org --- Changes in v2 - New patch file created for v2. Changes in v4 - Update function header of bloblist_check().
common/bloblist.c | 2 +- include/bloblist.h | 9 +++++---- test/bloblist.c | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/common/bloblist.c b/common/bloblist.c index 980b1ddbcb..26b0ba33b1 100644 --- a/common/bloblist.c +++ b/common/bloblist.c @@ -384,7 +384,7 @@ int bloblist_check(ulong addr, uint size) return log_msg_ret("Bad magic", -ENOENT); if (hdr->version != BLOBLIST_VERSION) return log_msg_ret("Bad version", -EPROTONOSUPPORT); - if (!hdr->total_size || (size && hdr->total_size != size)) + if (!hdr->total_size || (size && hdr->total_size > size)) return log_msg_ret("Bad total size", -EFBIG); if (hdr->used_size > hdr->total_size) return log_msg_ret("Bad used size", -ENOENT); diff --git a/include/bloblist.h b/include/bloblist.h index f7e800f681..cc78259e5a 100644 --- a/include/bloblist.h +++ b/include/bloblist.h @@ -348,12 +348,13 @@ int bloblist_new(ulong addr, uint size, uint flags, uint align_log2); * bloblist_check() - Check if a bloblist exists * * @addr: Address of bloblist - * @size: Expected size of blobsize, or 0 to detect the size + * @size: Reserved space size for blobsize, or 0 to use the total size * Return: 0 if OK, -ENOENT if the magic number doesn't match (indicating that - * there problem is no bloblist at the given address), -EPROTONOSUPPORT + * there problem is no bloblist at the given address) or any fields for header + * size, used size and total size do not match, -EPROTONOSUPPORT * if the version does not match, -EIO if the checksum does not match, - * -EFBIG if the expected size does not match the detected size, -ENOSPC - * if the size is not large enough to hold the headers + * -EFBIG if the reserved space size is small than the total size or total size + * is 0 */ int bloblist_check(ulong addr, uint size);
diff --git a/test/bloblist.c b/test/bloblist.c index 17d9dd03d0..7dab9addf8 100644 --- a/test/bloblist.c +++ b/test/bloblist.c @@ -207,7 +207,7 @@ static int bloblist_test_checksum(struct unit_test_state *uts) hdr->flags++;
hdr->total_size--; - ut_asserteq(-EFBIG, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE)); + ut_asserteq(-EIO, bloblist_check(TEST_ADDR, TEST_BLOBLIST_SIZE)); hdr->total_size++;
hdr->spare++;

The current bloblist pointer and size can be retrieved from global data, so we don't need to pass them from the function arguments. This change also help to remove all external access of gd->bloblist outside of bloblist module.
Signed-off-by: Raymond Mao raymond.mao@linaro.org --- Changes in v2 - New patch file created for v2. Changes in v3 - Check the space size before copying the bloblist. - Add return code of bloblist_reloc(). Changes in v4 - return error code from bloblist_reloc().
common/bloblist.c | 10 ++++++++-- common/board_f.c | 9 +++------ include/bloblist.h | 8 ++++---- test/bloblist.c | 6 ++---- 4 files changed, 17 insertions(+), 16 deletions(-)
diff --git a/common/bloblist.c b/common/bloblist.c index 26b0ba33b1..c2fd07575f 100644 --- a/common/bloblist.c +++ b/common/bloblist.c @@ -472,13 +472,19 @@ void bloblist_show_list(void) } }
-void bloblist_reloc(void *to, uint to_size, void *from, uint from_size) +int bloblist_reloc(void *to, uint to_size) { struct bloblist_hdr *hdr;
- memcpy(to, from, from_size); + if (to_size < gd->bloblist->total_size) + return -ENOSPC; + + memcpy(to, gd->bloblist, gd->bloblist->total_size); hdr = to; hdr->total_size = to_size; + gd->bloblist = to; + + return 0; }
int bloblist_init(void) diff --git a/common/board_f.c b/common/board_f.c index d4d7d01f8f..f4145a2698 100644 --- a/common/board_f.c +++ b/common/board_f.c @@ -676,13 +676,10 @@ static int reloc_bloblist(void) return 0; } if (gd->new_bloblist) { - int size = CONFIG_BLOBLIST_SIZE; - debug("Copying bloblist from %p to %p, size %x\n", - gd->bloblist, gd->new_bloblist, size); - bloblist_reloc(gd->new_bloblist, CONFIG_BLOBLIST_SIZE_RELOC, - gd->bloblist, size); - gd->bloblist = gd->new_bloblist; + gd->bloblist, gd->new_bloblist, gd->bloblist->total_size); + return bloblist_reloc(gd->new_bloblist, + CONFIG_BLOBLIST_SIZE_RELOC); } #endif
diff --git a/include/bloblist.h b/include/bloblist.h index cc78259e5a..0ae079d62a 100644 --- a/include/bloblist.h +++ b/include/bloblist.h @@ -426,11 +426,11 @@ const char *bloblist_tag_name(enum bloblist_tag_t tag); * bloblist_reloc() - Relocate the bloblist and optionally resize it * * @to: Pointer to new bloblist location (must not overlap old location) - * @to_size: New size for bloblist (must be larger than from_size) - * @from: Pointer to bloblist to relocate - * @from_size: Size of bloblist to relocate + * @to_size: New size for bloblist + * Return: 0 if OK, -ENOSPC if the new size is small than the bloblist total + * size. */ -void bloblist_reloc(void *to, uint to_size, void *from, uint from_size); +int bloblist_reloc(void *to, uint to_size);
/** * bloblist_init() - Init the bloblist system with a single bloblist diff --git a/test/bloblist.c b/test/bloblist.c index 7dab9addf8..1c60bbac36 100644 --- a/test/bloblist.c +++ b/test/bloblist.c @@ -376,13 +376,12 @@ static int bloblist_test_reloc(struct unit_test_state *uts) { const uint large_size = TEST_BLOBLIST_SIZE; const uint small_size = 0x20; - void *old_ptr, *new_ptr; + void *new_ptr; void *blob1, *blob2; ulong new_addr; ulong new_size;
ut_assertok(bloblist_new(TEST_ADDR, TEST_BLOBLIST_SIZE, 0, 0)); - old_ptr = map_sysmem(TEST_ADDR, TEST_BLOBLIST_SIZE);
/* Add one blob and then one that won't fit */ blob1 = bloblist_add(TEST_TAG, small_size, 0); @@ -394,8 +393,7 @@ static int bloblist_test_reloc(struct unit_test_state *uts) new_addr = TEST_ADDR + TEST_BLOBLIST_SIZE; new_size = TEST_BLOBLIST_SIZE + 0x100; new_ptr = map_sysmem(new_addr, TEST_BLOBLIST_SIZE); - bloblist_reloc(new_ptr, new_size, old_ptr, TEST_BLOBLIST_SIZE); - gd->bloblist = new_ptr; + ut_assertok(bloblist_reloc(new_ptr, new_size));
/* Check the old blob is there and that we can now add the bigger one */ ut_assertnonnull(bloblist_find(TEST_TAG, small_size));

Save boot arguments r[0-3] into an array for handover of bloblist from previous boot stage.
Signed-off-by: Raymond Mao raymond.mao@linaro.org --- Changes in v2 - New patch file created for v2. Changes in v3 - Swap value of r0 with r2. Changes in v4 - Fix a bug when saving the boot args. Changes in V5 - Drop the dependence on OF_BOARD.
arch/arm/cpu/armv7/start.S | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+)
diff --git a/arch/arm/cpu/armv7/start.S b/arch/arm/cpu/armv7/start.S index 69e281b086..f4f50ab9a4 100644 --- a/arch/arm/cpu/armv7/start.S +++ b/arch/arm/cpu/armv7/start.S @@ -152,9 +152,28 @@ ENDPROC(c_runtime_cpu_setup) * *************************************************************************/ WEAK(save_boot_params) +#if (IS_ENABLED(CONFIG_BLOBLIST)) + ldr r12, =saved_args + /* + * Intentionally swapping r0 with r2 in order to simplify the C + * function we use later. + */ + str r2, [r12] + str r1, [r12, #4] + str r0, [r12, #8] + str r3, [r12, #12] +#endif b save_boot_params_ret @ back to my caller ENDPROC(save_boot_params)
+.section .data +.global saved_args +saved_args: + .rept 4 + .word 0 + .endr +END(saved_args) + #ifdef CONFIG_ARMV7_LPAE WEAK(switch_to_hypervisor) b switch_to_hypervisor_ret

Save boot arguments x[0-3] into an array for handover of bloblist from previous boot stage.
Signed-off-by: Raymond Mao raymond.mao@linaro.org --- Changes in v2 - New patch file created for v2. Changes in V5 - Drop the dependence on OF_BOARD.
arch/arm/cpu/armv8/start.S | 14 ++++++++++++++ 1 file changed, 14 insertions(+)
diff --git a/arch/arm/cpu/armv8/start.S b/arch/arm/cpu/armv8/start.S index 6cc1d26e5e..91cdd03947 100644 --- a/arch/arm/cpu/armv8/start.S +++ b/arch/arm/cpu/armv8/start.S @@ -370,5 +370,19 @@ ENTRY(c_runtime_cpu_setup) ENDPROC(c_runtime_cpu_setup)
WEAK(save_boot_params) +#if (IS_ENABLED(CONFIG_BLOBLIST)) + adr x9, saved_args + stp x0, x1, [x9] + /* Increment the address by 16 bytes for the next pair of values */ + stp x2, x3, [x9, #16] +#endif b save_boot_params_ret /* back to my caller */ ENDPROC(save_boot_params) + +.section .data +.global saved_args +saved_args: + .rept 4 + .xword 0 + .endr +END(saved_args)

Add arch custom function to get bloblist from boot arguments. Check whether boot arguments aligns with the register conventions defined in FW Handoff spec v0.9. Add bloblist related options into qemu-arm default config.
Signed-off-by: Raymond Mao raymond.mao@linaro.org --- Changes in v2 - Remove low level code for copying boot arguments. - Refactor board_fdt_blob_setup() and remove direct access of gd->bloblist. Changes in v3 - Optimize board_bloblist_from_boot_arg(). Changes in v4 - Move the function as an Arm-arch library instead of a board-specific one. Changes in V5 - Drop the dependence on OF_BOARD. - Move external declaration to header file. - Adjust the position of BLOBLIST in defconfig file.
arch/arm/lib/Makefile | 2 ++ arch/arm/lib/xferlist.c | 27 +++++++++++++++++++++++++++ arch/arm/lib/xferlist.h | 19 +++++++++++++++++++ configs/qemu_arm64_defconfig | 3 +++ 4 files changed, 51 insertions(+) create mode 100644 arch/arm/lib/xferlist.c create mode 100644 arch/arm/lib/xferlist.h
diff --git a/arch/arm/lib/Makefile b/arch/arm/lib/Makefile index b1bcd37466..67275fba61 100644 --- a/arch/arm/lib/Makefile +++ b/arch/arm/lib/Makefile @@ -85,6 +85,8 @@ obj-y += psci-dt.o
obj-$(CONFIG_DEBUG_LL) += debug.o
+obj-$(CONFIG_BLOBLIST) += xferlist.o + # For EABI conformant tool chains, provide eabi_compat() ifneq (,$(findstring -mabi=aapcs-linux,$(PLATFORM_CPPFLAGS))) extra-y += eabi_compat.o diff --git a/arch/arm/lib/xferlist.c b/arch/arm/lib/xferlist.c new file mode 100644 index 0000000000..e9734959dc --- /dev/null +++ b/arch/arm/lib/xferlist.c @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: GPL-2.0+ +/* + * Copyright (C) 2023 Linaro Limited + * Author: Raymond Mao raymond.mao@linaro.org + */ +#include <linux/types.h> +#include <errno.h> +#include <bloblist.h> +#include "xferlist.h" + +int xferlist_from_boot_arg(ulong addr, ulong size) +{ + int ret; + + ret = bloblist_check(saved_args[3], size); + if (ret) + return ret; + + /* Check the register conventions */ + ret = bloblist_check_reg_conv(saved_args[0], saved_args[2], + saved_args[1]); + if (!ret) + /* Relocate the bloblist to the fixed address */ + ret = bloblist_reloc((void *)addr, size); + + return ret; +} diff --git a/arch/arm/lib/xferlist.h b/arch/arm/lib/xferlist.h new file mode 100644 index 0000000000..60d79c1a8e --- /dev/null +++ b/arch/arm/lib/xferlist.h @@ -0,0 +1,19 @@ +/* SPDX-License-Identifier: GPL-2.0+ BSD-3-Clause */ +/* + * Copyright (C) 2023 Linaro Limited + * Author: Raymond Mao raymond.mao@linaro.org + */ + +#ifndef _XFERLIST_H_ +#define _XFERLIST_H_ + +/* + * Boot parameters saved from start.S + * saved_args[0]: FDT base address + * saved_args[1]: Bloblist signature + * saved_args[2]: must be 0 + * saved_args[3]: Bloblist base address + */ +extern unsigned long saved_args[]; + +#endif /* _XFERLIST_H_ */ diff --git a/configs/qemu_arm64_defconfig b/configs/qemu_arm64_defconfig index 5100e193be..80a5409c51 100644 --- a/configs/qemu_arm64_defconfig +++ b/configs/qemu_arm64_defconfig @@ -27,6 +27,9 @@ CONFIG_USE_PREBOOT=y # CONFIG_DISPLAY_CPUINFO is not set # CONFIG_DISPLAY_BOARDINFO is not set CONFIG_PCI_INIT_R=y +CONFIG_BLOBLIST=y +CONFIG_BLOBLIST_ADDR=0x40004000 +CONFIG_BLOBLIST_SIZE=0x4000 CONFIG_CMD_BOOTZ=y CONFIG_CMD_BOOTEFI_SELFTEST=y CONFIG_CMD_NVEDIT_EFI=y

During bloblist initialization, load the bloblist via boot arguments from the previous loader. If a valid bloblist exists in boot arguments, relocate it into the fixed bloblist memory region. If not, fallback to support BLOBLIST_ADDR or BLOBLIST_ALLOC.
Signed-off-by: Raymond Mao raymond.mao@linaro.org --- Changes in v4 - Add weak default function. - Add comments for BLOBLIST_ALLOC. - Add local debug macro. - Refine the commit message. Changes in V5 - Drop the dependence on OF_BOARD. - Remove local debug macro.
common/bloblist.c | 62 ++++++++++++++++++++++++++++++++-------------- include/bloblist.h | 10 ++++++++ 2 files changed, 54 insertions(+), 18 deletions(-)
diff --git a/common/bloblist.c b/common/bloblist.c index c2fd07575f..ad06d7a179 100644 --- a/common/bloblist.c +++ b/common/bloblist.c @@ -487,37 +487,57 @@ int bloblist_reloc(void *to, uint to_size) return 0; }
+/* + * Weak default function for getting bloblist from boot args. + */ +int __weak xferlist_from_boot_arg(ulong __always_unused addr, + ulong __always_unused size) +{ + return -ENOENT; +} + int bloblist_init(void) { bool fixed = IS_ENABLED(CONFIG_BLOBLIST_FIXED); int ret = -ENOENT; ulong addr, size; - bool expected; - - /** - * We don't expect to find an existing bloblist in the first phase of - * U-Boot that runs. Also we have no way to receive the address of an - * allocated bloblist from a previous stage, so it must be at a fixed + /* + * If U-Boot is not in the first phase, an existing bloblist must be + * at a fixed address. + */ + bool from_addr = fixed && !u_boot_first_phase(); + /* + * If U-Boot is in the first phase that an arch custom routine should + * install the bloblist passed from previous loader to this fixed * address. */ - expected = fixed && !u_boot_first_phase(); + bool from_boot_arg = fixed && u_boot_first_phase(); + if (spl_prev_phase() == PHASE_TPL && !IS_ENABLED(CONFIG_TPL_BLOBLIST)) - expected = false; + from_addr = false; if (fixed) addr = IF_ENABLED_INT(CONFIG_BLOBLIST_FIXED, CONFIG_BLOBLIST_ADDR); size = CONFIG_BLOBLIST_SIZE; - if (expected) { + + if (from_boot_arg) + ret = xferlist_from_boot_arg(addr, size); + else if (from_addr) ret = bloblist_check(addr, size); - if (ret) { - log_warning("Expected bloblist at %lx not found (err=%d)\n", - addr, ret); - } else { - /* Get the real size, if it is not what we expected */ - size = gd->bloblist->total_size; - } - } + + if (ret) + log_warning("Bloblist at %lx not found (err=%d)\n", + addr, ret); + else + /* Get the real size */ + size = gd->bloblist->total_size; + if (ret) { + /* + * If we don't have a bloblist from a fixed address, or the one + * in the fixed address is not valid. we must allocate the + * memory for it now. + */ if (CONFIG_IS_ENABLED(BLOBLIST_ALLOC)) { void *ptr = memalign(BLOBLIST_ALIGN, size);
@@ -525,7 +545,8 @@ int bloblist_init(void) return log_msg_ret("alloc", -ENOMEM); addr = map_to_sysmem(ptr); } else if (!fixed) { - return log_msg_ret("!fixed", ret); + return log_msg_ret("BLOBLIST_FIXED is not enabled", + ret); } log_debug("Creating new bloblist size %lx at %lx\n", size, addr); @@ -538,6 +559,11 @@ int bloblist_init(void) return log_msg_ret("ini", ret); gd->flags |= GD_FLG_BLOBLIST_READY;
+#ifdef DEBUG + bloblist_show_stats(); + bloblist_show_list(); +#endif + return 0; }
diff --git a/include/bloblist.h b/include/bloblist.h index 0ae079d62a..7fbdd622bc 100644 --- a/include/bloblist.h +++ b/include/bloblist.h @@ -482,4 +482,14 @@ static inline int bloblist_maybe_init(void) */ int bloblist_check_reg_conv(ulong rfdt, ulong rzero, ulong rsig);
+/** + * xferlist_from_boot_arg() - Get bloblist from the boot args and relocate it + * to the specified address. + * + * @addr: Address for the bloblist + * @size: Size of space reserved for the bloblist + * Return: 0 if OK, else on error + */ +int xferlist_from_boot_arg(ulong addr, ulong size); + #endif /* __BLOBLIST_H */

Get device tree from a bloblist if it exists. If not, fallback to traditional way.
Signed-off-by: Raymond Mao raymond.mao@linaro.org --- Changes in v2 - Refactor of board_fdt_blob_setup(). Changes in v4 - Move the logics from board custom function to fdt library. Changes in V5 - Rebase the changes on top of master.
lib/fdtdec.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
diff --git a/lib/fdtdec.c b/lib/fdtdec.c index b2c59ab381..647459c1b0 100644 --- a/lib/fdtdec.c +++ b/lib/fdtdec.c @@ -1685,8 +1685,8 @@ int fdtdec_setup(void) } }
- /* Otherwise, the devicetree is typically appended to U-Boot */ if (ret) { + /* Otherwise, 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; @@ -1694,15 +1694,15 @@ int fdtdec_setup(void) 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) - gd->fdt_src = FDTSRC_BOARD; - else if (ret != -EEXIST) - return ret; + /* Allow the board to override the fdt address. */ + if (IS_ENABLED(CONFIG_OF_BOARD)) { + gd->fdt_blob = board_fdt_blob_setup(&ret); + if (!ret) + gd->fdt_src = FDTSRC_BOARD; + else if (ret != -EEXIST) + return ret; + } }
/* Allow the early environment to override the fdt address */

On Fri, Jan 12, 2024 at 01:33:34PM -0800, Raymond Mao wrote:
Get device tree from a bloblist if it exists. If not, fallback to traditional way.
Signed-off-by: Raymond Mao raymond.mao@linaro.org
Changes in v2
- Refactor of board_fdt_blob_setup().
Changes in v4
- Move the logics from board custom function to fdt library.
Changes in V5
- Rebase the changes on top of master.
lib/fdtdec.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
Why was this just not dropped after: commit 70fe23859437ffe4efe0793423937d8b78ebf9d6 Author: Simon Glass sjg@chromium.org Date: Wed Jan 3 18:49:19 2024 -0700
fdt: Allow the devicetree to come from a bloblist
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@chromium.org Reviewed-by: Tom Rini trini@konsulko.com Reviewed-by: Ilias Apalodimas ilias.apalodimas@linaro.org
The commit message is wrong, as it looks like it tweaks how CONFIG_OF_BOARD works to be differently wrong than today (which is in turn a different thread and we can just not change it more right now, and not have another thread about it).

Hi Tom,
On Sat, 13 Jan 2024 at 10:27, Tom Rini trini@konsulko.com wrote:
On Fri, Jan 12, 2024 at 01:33:34PM -0800, Raymond Mao wrote:
Get device tree from a bloblist if it exists. If not, fallback to traditional way.
Signed-off-by: Raymond Mao raymond.mao@linaro.org
Changes in v2
- Refactor of board_fdt_blob_setup().
Changes in v4
- Move the logics from board custom function to fdt library.
Changes in V5
- Rebase the changes on top of master.
lib/fdtdec.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
Why was this just not dropped after: commit 70fe23859437ffe4efe0793423937d8b78ebf9d6
In commit 70fe23859437ffe4efe0793423937d8b78ebf9d6, the FDT from bloblist is always overridden when OF_BOARD is enabled (OF_BOARD is enabled when OF_HAS_PRIOR_STAGE is on). I think this is not what we want. The FDT from the bloblist passed from the previous stage should be the default setting.
[...]
Thanks and regards, Raymond

Hi Tom,
On Mon, 15 Jan 2024 at 09:57, Raymond Mao raymond.mao@linaro.org wrote:
Hi Tom,
On Sat, 13 Jan 2024 at 10:27, Tom Rini trini@konsulko.com wrote:
On Fri, Jan 12, 2024 at 01:33:34PM -0800, Raymond Mao wrote:
Get device tree from a bloblist if it exists. If not, fallback to traditional way.
Signed-off-by: Raymond Mao raymond.mao@linaro.org
Changes in v2
- Refactor of board_fdt_blob_setup().
Changes in v4
- Move the logics from board custom function to fdt library.
Changes in V5
- Rebase the changes on top of master.
lib/fdtdec.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
Why was this just not dropped after: commit 70fe23859437ffe4efe0793423937d8b78ebf9d6
In commit 70fe23859437ffe4efe0793423937d8b78ebf9d6, the FDT from bloblist is always overridden when OF_BOARD is enabled (OF_BOARD is enabled when OF_HAS_PRIOR_STAGE is on). I think this is not what we want. The FDT from the bloblist passed from the previous stage should be the default setting.
If we want to build with OF_HAS_PRIOR_STAGE=y and without OF_BOARD to
avoid the FDT from bloblist not being overridden, `imply OF_HAS_PRIOR_STAGE` needs to be dropped from Kconfig for ARCH_QEMU, otherwise check-of.sh will always complain. Do you mind me adding a patch to arch/arm/Kconfig? And then we can drop [PATCH v5 8/8].
[...]
Thanks and regards, Raymond

On Mon, Jan 15, 2024 at 12:08:26PM -0500, Raymond Mao wrote:
Hi Tom,
On Mon, 15 Jan 2024 at 09:57, Raymond Mao raymond.mao@linaro.org wrote:
Hi Tom,
On Sat, 13 Jan 2024 at 10:27, Tom Rini trini@konsulko.com wrote:
On Fri, Jan 12, 2024 at 01:33:34PM -0800, Raymond Mao wrote:
Get device tree from a bloblist if it exists. If not, fallback to traditional way.
Signed-off-by: Raymond Mao raymond.mao@linaro.org
Changes in v2
- Refactor of board_fdt_blob_setup().
Changes in v4
- Move the logics from board custom function to fdt library.
Changes in V5
- Rebase the changes on top of master.
lib/fdtdec.c | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-)
Why was this just not dropped after: commit 70fe23859437ffe4efe0793423937d8b78ebf9d6
In commit 70fe23859437ffe4efe0793423937d8b78ebf9d6, the FDT from bloblist is always overridden when OF_BOARD is enabled (OF_BOARD is enabled when OF_HAS_PRIOR_STAGE is on). I think this is not what we want. The FDT from the bloblist passed from the previous stage should be the default setting.
If we want to build with OF_HAS_PRIOR_STAGE=y and without OF_BOARD to
avoid the FDT from bloblist not being overridden, `imply OF_HAS_PRIOR_STAGE` needs to be dropped from Kconfig for ARCH_QEMU, otherwise check-of.sh will always complain. Do you mind me adding a patch to arch/arm/Kconfig? And then we can drop [PATCH v5 8/8].
Platforms that are able to migrate towards using bloblist should disable OF_BOARD/OF_HAS_PRIOR_STAGE/etc and just use the bloblist, yes.
participants (2)
-
Raymond Mao
-
Tom Rini