[Buildroot] [PATCH v2] boot/uboot: support custom DTS with CONFIG_OF_UPSTREAM
From: Alexander Sverdlin <alexander.sverdlin@gmail.com>
Date: 2026-09-13 13:35:38
Subsystem:
the rest · Maintainer:
Linus Torvalds
Since U-Boot 2024.07, boards with CONFIG_OF_UPSTREAM build their device
trees from dts/upstream/src/<arch>/<vendor>/ instead of arch/<arch>/dts/,
so the files copied by BR2_TARGET_UBOOT_CUSTOM_DTS_PATH were ignored and
the build failed with "No rule to make target".
Derive the destination from the U-Boot configuration, including the vendor
sub-directory taken from CONFIG_DEFAULT_DEVICE_TREE. That tree keeps the
Linux architecture naming, so aarch64 has to be mapped back from
UBOOT_ARCH ("arm") to "arm64".
Signed-off-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
---
Changelog:
v2:
- handle *u-boot.dtsi separately
- document the new behaviour with OF_UPSTREAM-enabled U-Boot builds
v1:
https://lore.kernel.org/all/20260901145225.579733-1-alexander.sverdlin@gmail.com/ (local)
boot/uboot/Config.in | 13 +++++++++++--
boot/uboot/uboot.mk | 30 +++++++++++++++++++++++++++---
2 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/boot/uboot/Config.in b/boot/uboot/Config.in
index 1eabd10407..1795f22b20 100644
--- a/boot/uboot/Config.in
+++ b/boot/uboot/Config.in@@ -803,8 +803,17 @@ config BR2_TARGET_UBOOT_CUSTOM_DTS_PATH string "Device Tree Source file paths" help Space-separated list of paths to device tree source files - that will be copied to arch/ARCH/dts/ before starting the - build. + that will be copied before starting the build. + + They are copied to arch/ARCH/dts/, except that a configuration + with CONFIG_OF_UPSTREAM (U-Boot 2024.07 and later) builds its + device trees from the vendor directory below dts/upstream/src/ + that CONFIG_DEFAULT_DEVICE_TREE names, so they are copied + there instead. + + The *u-boot.dtsi fragments U-Boot includes on its own are + copied to arch/ARCH/dts/ in either case, as that is the only + place it looks for them. To use this device tree source file, the U-Boot configuration file must refer to it.
diff --git a/boot/uboot/uboot.mk b/boot/uboot/uboot.mk
index 5b3f46ac74..1453308c17 100644
--- a/boot/uboot/uboot.mk
+++ b/boot/uboot/uboot.mk@@ -426,10 +426,34 @@ endif # BR2_TARGET_UBOOT_BUILD_SYSTEM_LEGACY UBOOT_CUSTOM_DTS_PATH = $(call qstrip,$(BR2_TARGET_UBOOT_CUSTOM_DTS_PATH)) +# With CONFIG_OF_UPSTREAM the device trees are built from dts/upstream/src/ +# instead of arch/<arch>/dts/, in the vendor sub-directory encoded in the +# device tree name. That tree keeps the Linux architecture naming, so aarch64 +# has to be mapped back from UBOOT_ARCH ("arm") to "arm64". The fragments +# U-Boot includes on its own are searched for in arch/<arch>/dts/ only, so +# they stay there whatever the device trees do. +define UBOOT_INSTALL_CUSTOM_DTS + arch_dir="arch/$(UBOOT_ARCH)/dts"; \ + dts_dir="$$arch_dir"; \ + if grep -q "^CONFIG_OF_UPSTREAM=y" $(@D)/.config; then \ + if grep -q "^CONFIG_ARM64=y" $(@D)/.config; then \ + dts_dir="dts/upstream/src/arm64"; \ + else \ + dts_dir="dts/upstream/src/$(UBOOT_ARCH)"; \ + fi; \ + dt=$$(sed -n 's/^CONFIG_DEFAULT_DEVICE_TREE="\(.*\)"$$/\1/p' $(@D)/.config); \ + case "$$dt" in */*) dts_dir="$$dts_dir/$${dt%/*}";; esac; \ + fi; \ + for dts in $(UBOOT_CUSTOM_DTS_PATH); do \ + case "$$dts" in \ + *u-boot.dtsi) cp -f "$$dts" $(@D)/$$arch_dir/;; \ + *) cp -f "$$dts" $(@D)/$$dts_dir/;; \ + esac; \ + done +endef + define UBOOT_BUILD_CMDS - $(if $(UBOOT_CUSTOM_DTS_PATH), - cp -f $(UBOOT_CUSTOM_DTS_PATH) $(@D)/arch/$(UBOOT_ARCH)/dts/ - ) + $(if $(UBOOT_CUSTOM_DTS_PATH),$(UBOOT_INSTALL_CUSTOM_DTS)) $(TARGET_CONFIGURE_OPTS) \ PKG_CONFIG="$(PKG_CONFIG_HOST_BINARY)" \ PKG_CONFIG_SYSROOT_DIR="/" \
--
2.55.0
_______________________________________________
buildroot mailing list
buildroot@buildroot.org
https://lists.buildroot.org/mailman/listinfo/buildroot