[PATCH v2 17/18] qemu-arm: Get bloblist from boot arguments
Simon Glass
sjg at chromium.org
Sat Dec 2 22:16:26 CET 2023
Hi Raymond,
On Mon, 27 Nov 2023 at 12:53, Raymond Mao <raymond.mao at linaro.org> wrote:
>
> Add platform custom function to get bloblist from boot arguments.
This should be the same for all ARM platforms. The ultimate goal is
something like [1]
> Check whether boot arguments aligns with the register conventions
> defined in FW Handoff spec v0.9.
> Add bloblist related options into qemu default config.
>
> Signed-off-by: Raymond Mao <raymond.mao at linaro.org>
> ---
> Changes in v2
> - New patch file created for v2.
>
> board/emulation/qemu-arm/Makefile | 1 +
> board/emulation/qemu-arm/lowlevel_init.S | 19 +++++++++
> board/emulation/qemu-arm/qemu-arm.c | 54 ++++++++++++++++++++++++
> configs/qemu_arm64_defconfig | 3 ++
> configs/qemu_arm_defconfig | 3 ++
> 5 files changed, 80 insertions(+)
> create mode 100644 board/emulation/qemu-arm/lowlevel_init.S
>
> diff --git a/board/emulation/qemu-arm/Makefile b/board/emulation/qemu-arm/Makefile
> index a22d1237ff..12821e7083 100644
> --- a/board/emulation/qemu-arm/Makefile
> +++ b/board/emulation/qemu-arm/Makefile
> @@ -1,3 +1,4 @@
> # SPDX-License-Identifier: GPL-2.0+
>
> obj-y += qemu-arm.o
> +obj-$(CONFIG_OF_BOARD) += lowlevel_init.o
> diff --git a/board/emulation/qemu-arm/lowlevel_init.S b/board/emulation/qemu-arm/lowlevel_init.S
> new file mode 100644
> index 0000000000..d72d7c938a
> --- /dev/null
> +++ b/board/emulation/qemu-arm/lowlevel_init.S
> @@ -0,0 +1,19 @@
> +/* SPDX-License-Identifier: BSD-2-Clause */
> +/*
> + * Copyright (c) 2023, Linaro Limited
> + */
> +
> +#include <config.h>
> +
> +.global save_boot_params
> +save_boot_params:
> +#ifdef CONFIG_ARM64
> + adr x9, qemu_saved_args
> + stp x0, x1, [x9]
> + /* Increment the address by 16 bytes for the next pair of values */
> + stp x2, x3, [x9, #16]
> +#else
> + ldr r12, =qemu_saved_args
> + stm r12, {r0, r1, r2, r3}
> +#endif
> + b save_boot_params_ret
> diff --git a/board/emulation/qemu-arm/qemu-arm.c b/board/emulation/qemu-arm/qemu-arm.c
> index 942f1fff57..a3892630d8 100644
> --- a/board/emulation/qemu-arm/qemu-arm.c
> +++ b/board/emulation/qemu-arm/qemu-arm.c
> @@ -4,6 +4,9 @@
> */
>
> #include <common.h>
> +#if IS_ENABLED(CONFIG_OF_BOARD) && IS_ENABLED(CONFIG_BLOBLIST)
> +#include <bloblist.h>
> +#endif
> #include <cpu_func.h>
> #include <dm.h>
> #include <efi.h>
> @@ -102,6 +105,16 @@ static struct mm_region qemu_arm64_mem_map[] = {
> struct mm_region *mem_map = qemu_arm64_mem_map;
> #endif
>
> +#if IS_ENABLED(CONFIG_OF_BOARD)
OF_BLOBLIST and please avoid #if
> +/* Boot parameters saved from lowlevel_init.S */
> +struct {
> + unsigned long arg0;
> + unsigned long arg1;
> + unsigned long arg2;
> + unsigned long arg3;
> +} qemu_saved_args __section(".data");
> +#endif
> +
> int board_init(void)
> {
> return 0;
> @@ -144,6 +157,47 @@ void *board_fdt_blob_setup(int *err)
> return (void *)CFG_SYS_SDRAM_BASE;
> }
>
> +int board_bloblist_from_boot_arg(unsigned long __maybe_unused addr,
> + unsigned long __maybe_unused size)
> +{
> + int ret = -ENOENT;
> +
> +#if IS_ENABLED(CONFIG_OF_BOARD) && IS_ENABLED(CONFIG_BLOBLIST)
> + unsigned long fdt;
> +
> + ret = bloblist_check(qemu_saved_args.arg3, 0);
> + if (ret)
> + return ret;
> +
> + bloblist_show_stats();
> + bloblist_show_list();
> + if (gd->bloblist->total_size > size) {
> + gd->bloblist = NULL; /* Reset the gd bloblist pointer */
> + log_err("Bloblist total size:%d, board reserved size:%ld\n",
> + gd->bloblist->total_size, size);
> + return -ENOSPC;
> + }
> +
> + /* Check the register conventions */
> + fdt = (unsigned long)bloblist_find(BLOBLISTT_CONTROL_FDT, 0);
This should happen in fdtdec.c automatically. See [2]
> + if (IS_ENABLED(CONFIG_ARM64)) {
> + if (fdt != qemu_saved_args.arg0 || qemu_saved_args.arg2 != 0)
> + ret = -EIO;
> + } else {
> + if (fdt != qemu_saved_args.arg2 || qemu_saved_args.arg0 != 0)
> + ret = -EIO;
> + }
> +
> + if (ret)
> + gd->bloblist = NULL; /* Reset the gd bloblist pointer */
> + else
> + memmove((void *)addr, (void *)qemu_saved_args.arg3,
> + gd->bloblist->total_size);
> +#endif
> +
> + return ret;
> +}
> +
> void enable_caches(void)
> {
> icache_enable();
> diff --git a/configs/qemu_arm64_defconfig b/configs/qemu_arm64_defconfig
> index 5fdf496a45..60fabb5db7 100644
> --- a/configs/qemu_arm64_defconfig
> +++ b/configs/qemu_arm64_defconfig
> @@ -71,3 +71,6 @@ CONFIG_USB_EHCI_HCD=y
> CONFIG_USB_EHCI_PCI=y
> CONFIG_SEMIHOSTING=y
> CONFIG_TPM=y
> +CONFIG_BLOBLIST=y
> +CONFIG_BLOBLIST_ADDR=0x40004000
> +CONFIG_BLOBLIST_SIZE=0x4000
> diff --git a/configs/qemu_arm_defconfig b/configs/qemu_arm_defconfig
> index 1347b86f34..d8a94ad038 100644
> --- a/configs/qemu_arm_defconfig
> +++ b/configs/qemu_arm_defconfig
> @@ -71,3 +71,6 @@ CONFIG_TPM2_MMIO=y
> CONFIG_USB_EHCI_HCD=y
> CONFIG_USB_EHCI_PCI=y
> CONFIG_TPM=y
> +CONFIG_BLOBLIST=y
> +CONFIG_BLOBLIST_ADDR=0x40004000
> +CONFIG_BLOBLIST_SIZE=0x4000
> --
> 2.25.1
>
Regards,
Simon
[1] https://patchwork.ozlabs.org/project/uboot/list/?series=281465&state=*
[2] https://patchwork.ozlabs.org/project/uboot/patch/20230926141514.2101787-40-sjg@chromium.org/
More information about the U-Boot
mailing list