[PATCH v2] emulation: fdt: Allow using U-Boot's device tree with QEMU

Heinrich Schuchardt xypron.glpk at gmx.de
Wed Apr 16 07:33:51 CEST 2025


On 4/5/25 21:07, Simon Glass wrote:
> At present it is impossible to change the qemu_arm64 defconfig to
> obtain a devicetree from the U-Boot build.
> 
> This is necessary for FIT validation, for example, where the signature
> node must be compiled into U-Boot.

This description looks wrong:

Signatures are in FIT images.

Only public keys to validate the signatures should be compiled into U-Boot.

> 
> A proposed change to QEMU to allow device tree additions has been
> blocked for several years. The only known workaround is to use QEMU's
> dumpdtb option, merge in the signature node manually, disable
> OF_HAS_PRIOR_STAGE and then start QEMU with special arguments. This is
> complicated enough that it is documented in U-Boot[1].

This seems to relate to
[PATCH] hw/arm/virt: Allow additions to the generated device tree
https://lore.kernel.org/qemu-devel/20210926183410.256484-1-sjg@chromium.org/

As your describe in [1] QEMU already provides a -dtb parameter if you 
want a crafted device-tree. Your proposed change is confounding boot 
stages and and would not provide value to the QEMU project. It was 
therefore rejected for good.

It remains unclear why you would disable OF_HAS_PRIOR_STAGE if you were 
using QEMU's -dtb parameter.

What would be the benefit of compiling the DT into U-Boot instead of 
providing it via the -dtb parameter?

> 
> Unfortunately the only way to disable OF_HAS_PRIOR_STAGE at present is
> to hack the Kconfig.
> 
> Add a new QEMU_MANUAL_DTB Kconfig option which makes OF_HAS_PRIOR_STAGE
> optional, thus avoiding needing to patch U-Boot to get this working.
> 
> This seems a clearer solution than just making OF_HAS_PRIOR_STAGE
> visible, since that symbol is intended to be set automatically by each
> platform.

To me the new parameter is harder to use than simply making 
CONFIG_OF_HAS_PRIOR_STAGE always editable.

> 
> [1] https://docs.u-boot.org/en/latest/develop/devicetree/dt_qemu.html

The instructions that you provide in [1] are incorrect.

"qemu-system-arm -machine virt -machine dumpdtb=qemu.dtb"

The second machine statement overrides the first one. And the second one 
will use the default machine which for instance on riscv64 is not virt.

The correct invocation to download the device-tree would be:

qemu-system-arm -M virt,dumpdtb=qemudtb


> Link: https://patchwork.kernel.org/project/qemu-devel/patch/20210926183410.256484-1-sjg@chromium.org/#24481799
> 
> Signed-off-by: Simon Glass <sjg at chromium.org>
> Suggested-by: Tom Rini <trini at konsulko.com>
> ---
> 
> Changes in v2:
> - Add a new QEMU-specific Kconfig instead
> 
>   arch/arm/Kconfig                   |  2 +-
>   board/emulation/common/Kconfig     | 12 ++++++++++++
>   doc/develop/devicetree/dt_qemu.rst |  5 +++++
>   dts/Kconfig                        |  9 +++++++--

This patch lacks proper documentation in doc/

>   4 files changed, 25 insertions(+), 3 deletions(-)
> 
> diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig
> index db8758e6dfe..b55ed61894a 100644
> --- a/arch/arm/Kconfig
> +++ b/arch/arm/Kconfig
> @@ -1055,7 +1055,7 @@ config ARCH_QEMU
>   	imply DM_RNG
>   	imply DM_RTC
>   	imply RTC_PL031
> -	imply OF_HAS_PRIOR_STAGE if !TARGET_QEMU_ARM_SBSA
> +	imply OF_HAS_PRIOR_STAGE if !TARGET_QEMU_ARM_SBSA && !QEMU_MANUAL_DTB
>   	imply VIDEO
>   	imply VIDEO_BOCHS
>   	imply SYS_WHITE_ON_BLACK
> diff --git a/board/emulation/common/Kconfig b/board/emulation/common/Kconfig
> index 4c15c8bcb89..3f9a6ea578f 100644
> --- a/board/emulation/common/Kconfig
> +++ b/board/emulation/common/Kconfig
> @@ -13,3 +13,15 @@ config MTDPARTS_NOR1
>   	help
>   	  This define the partition of nor1 used to build mtparts dynamically
>   	  for the u-boot env stored on nor1.
> +
> +config QEMU_MANUAL_DTB
> +	bool "Manually provide a device tree to QEMU"
> +	help
> +	  For some use cases, such as FIT validation where a public key must be
> +	  placed in U-Boot's device tree, we need to override the device tree
> +	  that QEMU would normally provide to us.
> +
> +	  Note: this work-around is necessary since Linaro has blocked
> +	  addition of a feature to support additions to the QEMU devicetree:
> +
> +	    Link: https://patchwork.kernel.org/project/qemu-devel/patch/20210926183410.256484-1-sjg@chromium.org/#24481799
> diff --git a/doc/develop/devicetree/dt_qemu.rst b/doc/develop/devicetree/dt_qemu.rst
> index 8ba2b225590..c693b49d3d4 100644
> --- a/doc/develop/devicetree/dt_qemu.rst
> +++ b/doc/develop/devicetree/dt_qemu.rst
> @@ -46,3 +46,8 @@ You can then run qemu with the merged devicetree, e.g.::
>   
>   Note that there seems to be a bug in some versions of qemu where the output of
>   dumpdtb does not quite match what is provided to U-Boot.
> +
> +See also the
> +`rejected QEMU patch <https://patchwork.kernel.org/project/qemu-devel/patch/20231117021840.117874-1-sjg@chromium.org>`_
> +and
> +`discussion <https://patchwork.kernel.org/project/qemu-devel/patch/20210926183410.256484-1-sjg@chromium.org>`_.
> diff --git a/dts/Kconfig b/dts/Kconfig
> index 2e88d210bb8..53f7e246a80 100644
> --- a/dts/Kconfig
> +++ b/dts/Kconfig
> @@ -205,8 +205,13 @@ config OF_HAS_PRIOR_STAGE
>   	  development purposes, but it is not recommended, and likely will not
>   	  even work, for production systems.
>   
> -	  Note: This option must be set in Kconfig and cannot be enabled or
> -	  disabled in the board's defconfig file.
> +	  Note: This option can be disabled for QEMU usiing QEMU_MANUAL_DTB thus

%s/usiing/using/

Best regards

Heinrich

> +	  allowing QEMU to support FIT validation, where the devicetree must
> +	  include a public key.
> +
> +	  See also this for context:
> +
> +	  https://patchwork.kernel.org/project/qemu-devel/patch/20210926183410.256484-1-sjg@chromium.org/#24481799
>   
>   config OF_OMIT_DTB
>   	bool "Omit the device tree output when building"



More information about the U-Boot mailing list