From 290f6bb45a247e3b5d1718d29dc5ec4e9ea774f4 Mon Sep 17 00:00:00 2001 From: Romain Naour Date: Fri, 21 Feb 2025 23:55:27 +0100 Subject: [PATCH] linux: introduce BR2_LINUX_KERNEL_CUSTOM_DTS_DIR MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since Linux 6.12, the Buildroot option BR2_LINUX_KERNEL_CUSTOM_DTS_PATH does not work as expected on arm, arm64, mips and riscv[1]. These are the architectures that store the in-tree DTS files in vendor-specific subdirectories of arch/$ARCH/boot/dts/. BR2_LINUX_KERNEL_CUSTOM_DTS_PATH was introduced in Buildroot 2012.08 (commit 69fc497df0ae "Rework support for the device tree"). At the time, the kernel kept all in-tree DTS files directly in arch/$ARCH/boot/dts/, and this is where Buildroot drops the user's custom DTS. Vendor-specific subdirectories appeared in Linux v3.19 for the arm64 architecture, and this scheme was later adopted by mips, riscv and arm. For these architectures, Linux 6.12 (commit e7e2941300d2, "kbuild: split device tree build rules into scripts/Makefile.dtbs") made the DTB build infrastructure incompatible with the way BR2_LINUX_KERNEL_CUSTOM_DTS_PATH is implemented. This infrastructure now expects all DTS files to be in vendor-specific subdirectories on the architectures that use this scheme. We can't update easily the current behavior of BR2_LINUX_KERNEL_CUSTOM_DTS_PATH since it expect a list of files but can also be used "unexpectedly" with directories [2]. BR2_LINUX_KERNEL_INTREE_DTS_NAME="st/stm32mp135f-dk-mx" BR2_LINUX_KERNEL_CUSTOM_DTS_PATH="$(BR2_EXTERNAL_ST_PATH)/[...]/linux-dts/st" In this case, the st directory is copied into the arch/$ARCH/boot/dts/ and BR2_LINUX_KERNEL_INTREE_DTS_NAME is used to build stm32mp135f-dk-mx dtb as if it was intree. Introduce BR2_LINUX_KERNEL_CUSTOM_DTS_DIR configuration parameter to specify a list of directories that are copied as-is over the arch//boot/dts/ directory before building the device tree blob: board/acmesystems/acqua-a5/dts/ └── microchip └── at91-sama5d3_acqua.dts defconfig: BR2_LINUX_KERNEL_CUSTOM_DTS_DIR="board/acmesystems/acqua-a5/dts" Each dts file found is automatically added to the list of devicetree to build. BR2_LINUX_KERNEL_CUSTOM_DTS_DIR can also be used for external devicetree overlays files: board/ti/am574x-idk/dts/ └── ti └── omap └── am57xx-evm.dtso With this new option, BR2_LINUX_KERNEL_CUSTOM_DTS_PATH is now deprecated. Note: We want to create a list of dts files (LINUX_DTS_LIST) present in diectrories listed by BR2_LINUX_KERNEL_CUSTOM_DTS_DIR. But LINUX_DTS_LIST must not contain BR2_LINUX_KERNEL_CUSTOM_DTS_DIR paths. Use GNU 'find' print format %P to print each dts file path without their respective dts overlay directory path. Do the same for LINUX_DTSO_LIST. Thanks to Edgar Bonet for the initial contribution [3]. [1] https://lists.buildroot.org/pipermail/buildroot/2024-October/765463.html [2] https://github.com/bootlin/buildroot-external-st/blob/541ba7d96330cd7da5674b46806b549a7ccf9da8/configs/st_stm32mp135f_dk_demo_defconfig#L21 [3] https://lore.kernel.org/buildroot/93f83afb-6987-441c-8e06-dab4d43b828f@grenoble.cnrs.fr/ Cc: Michael Walle Cc: Gaël PORTAY Reported-by: Chris Packham Signed-off-by: Edgar Bonet [Romain: - Rework the initial contribution by Edgar Bonet by BR2_LINUX_KERNEL_CUSTOM_DTS_DIR following Michael Walle comments and Gaël PORTAY review. - Reword the commit log accordingly. ] Signed-off-by: Romain Naour Reviewed-by: Niklas Cassel Signed-off-by: Julien Olivain --- linux/Config.in | 29 +++++++++++++++++++++++++++++ linux/linux.mk | 17 +++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/linux/Config.in b/linux/Config.in index d6a0ace6c0..ad9bb57439 100644 --- a/linux/Config.in +++ b/linux/Config.in @@ -435,6 +435,7 @@ config BR2_LINUX_KERNEL_INTREE_DTSO_NAMES config BR2_LINUX_KERNEL_CUSTOM_DTS_PATH string "Out-of-tree Device Tree Source file paths" + depends on BR2_LINUX_KERNEL_CUSTOM_DTS_DIR = "" help Paths to out-of-tree Device Tree Source (.dts), Device Tree Source Include (.dtsi) and Device Tree Overlay Source (.dtso) @@ -442,6 +443,34 @@ config BR2_LINUX_KERNEL_CUSTOM_DTS_PATH kernel sources and the .dts files will be compiled from there. + Due to a kernel build system changes in 6.12, + BR2_LINUX_KERNEL_CUSTOM_DTS_PATH is now deprecated and + replaced by BR2_LINUX_KERNEL_CUSTOM_DTS_DIR + +config BR2_LINUX_KERNEL_CUSTOM_DTS_DIR + string "Out-of-tree Device Tree Source overlay directories" + help + Specify a list of directories that are copied as-is over the + arch//boot/dts/ directory before building the device + tree blob. + + This overlay can contain dts, dtso and dtsi files. + + BR2_LINUX_KERNEL_CUSTOM_DTS_DIR should point to one or more + directories containing a vendor subdirectory (e.g. rockchip) + which contains the dts files. This vendor subdirectory should + match the vendor subdirectory used by the board in the kernel + (e.g. arch/arm64/boot/dts/rockchip/). + + While most architechtures make use of vendor subdirectories, + like arm, arm64 and riscv, some architectures like powerpc + and xtensa do not. + In this case, BR2_LINUX_KERNEL_CUSTOM_DTS_DIR should point to + a directory containing the dts files directly. + + Since the 6.12 release, each out-of-tree Device Tree Source + file must be copied into their corresponding sub-directory. + config BR2_LINUX_KERNEL_DTB_KEEP_DIRNAME bool "Keep the directory name of the Device Tree" help diff --git a/linux/linux.mk b/linux/linux.mk index 9c621c18d5..f915823dcf 100644 --- a/linux/linux.mk +++ b/linux/linux.mk @@ -213,6 +213,22 @@ LINUX_CUSTOM_DTS_PATH = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_DTS_PATH)) LINUX_DTS_NAME += $(basename $(filter %.dts,$(notdir $(LINUX_CUSTOM_DTS_PATH)))) LINUX_DTSO_NAMES += $(basename $(filter %.dtso,$(notdir $(LINUX_CUSTOM_DTS_PATH)))) +LINUX_KERNEL_CUSTOM_DTS_DIR = $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_DTS_DIR)) +ifneq ($(LINUX_KERNEL_CUSTOM_DTS_DIR),) +# Use evaluation-during-assignment using := to avoid any re-evaluation +# of LINUX_DTS_LIST when LINUX_DTS_NAME is used. +LINUX_DTS_LIST := $(shell find $(LINUX_KERNEL_CUSTOM_DTS_DIR) -name '*.dts' -printf '%P\n' 2>/dev/null) +LINUX_DTSO_LIST := $(shell find $(LINUX_KERNEL_CUSTOM_DTS_DIR) -name '*.dtso' -printf '%P\n' 2>/dev/null) +LINUX_DTS_NAME += $(basename $(LINUX_DTS_LIST)) +LINUX_DTSO_NAMES += $(basename $(LINUX_DTSO_LIST)) + +define LINUX_COPY_CUSTOM_DTS_FILES + $(foreach d, $(LINUX_KERNEL_CUSTOM_DTS_DIR), \ + @$(call MESSAGE,"Copying devicetree overlay $(d)")$(sep) \ + $(Q)$(call SYSTEM_RSYNC,$(d),$(LINUX_ARCH_PATH)/boot/dts/)$(sep)) +endef +endif + LINUX_DTBS = $(addsuffix .dtb,$(LINUX_DTS_NAME)) $(addsuffix .dtbo,$(LINUX_DTSO_NAMES)) ifeq ($(BR2_LINUX_KERNEL_IMAGE_TARGET_CUSTOM),y) @@ -527,6 +543,7 @@ define LINUX_BUILD_CMDS $(foreach dts,$(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_DTS_PATH)), \ cp -f $(dts) $(LINUX_ARCH_PATH)/boot/dts/ ) + $(LINUX_COPY_CUSTOM_DTS_FILES) $(LINUX_MAKE_ENV) $(BR2_MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) all $(LINUX_MAKE_ENV) $(BR2_MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) $(LINUX_TARGET_NAME) $(LINUX_BUILD_DTB)