diff mbox series

[1/2] linux: add device-tree blob overlays support

Message ID 20240902203533.3961108-2-gael.portay@rtone.fr
State Superseded
Headers show
Series linux: install in-tree device-tree blob overlays | expand

Commit Message

Gaël PORTAY Sept. 2, 2024, 8:35 p.m. UTC
The device-tree blob overlay is an upstream feature; one can build a
.dtbo from .dtso thanks to commit 363547d2191c (kbuild: Allow DTB
overlays to built from .dtso named source files)[1] (linux-6.1-rc2).

This introduces the three new dtbo configs to build in-tree or
out-of-tree dtbos, and to keep the directory name.

The three configs are the equivalent to existing dts configs:
 - BR2_LINUX_KERNEL_INTREE_DTS_OVERLAY_NAMES is equivalent to
   BR2_LINUX_KERNEL_INTREE_DTS_NAME (it takes in-tree files relative to
   dts directory, without file extention: i.e. without .dts)
 - BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY_PATH is equivalent to
   BR2_LINUX_KERNEL_CUSTOM_DTS_PATH (it takes out-of-tree files relative
   to buildroot directory, with file extention .dtso)
 - BR2_LINUX_KERNEL_DTBO_KEEP_DIRNAME is equivalent to
   BR2_LINUX_KERNEL_DTB_KEEP_DIRNAME

[1]: https://github.com/torvalds/linux/commit/363547d2191cbc32ca954ba75d72908712398ff2

Signed-off-by: Gaël PORTAY <gael.portay@rtone.fr>
---
 linux/Config.in | 24 ++++++++++++++++++++++++
 linux/linux.mk  | 34 ++++++++++++++++++++++++++++++++++
 2 files changed, 58 insertions(+)

Comments

Romain Naour Feb. 4, 2025, 3:55 p.m. UTC | #1
Hello Gaël,

Le 02/09/2024 à 22:35, Gaël PORTAY a écrit :
> The device-tree blob overlay is an upstream feature; one can build a
> .dtbo from .dtso thanks to commit 363547d2191c (kbuild: Allow DTB
> overlays to built from .dtso named source files)[1] (linux-6.1-rc2).
> 
> This introduces the three new dtbo configs to build in-tree or
> out-of-tree dtbos, and to keep the directory name.
> 
> The three configs are the equivalent to existing dts configs:
>  - BR2_LINUX_KERNEL_INTREE_DTS_OVERLAY_NAMES is equivalent to
>    BR2_LINUX_KERNEL_INTREE_DTS_NAME (it takes in-tree files relative to
>    dts directory, without file extention: i.e. without .dts)
>  - BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY_PATH is equivalent to
>    BR2_LINUX_KERNEL_CUSTOM_DTS_PATH (it takes out-of-tree files relative
>    to buildroot directory, with file extention .dtso)
>  - BR2_LINUX_KERNEL_DTBO_KEEP_DIRNAME is equivalent to
>    BR2_LINUX_KERNEL_DTB_KEEP_DIRNAME
> 
> [1]: https://github.com/torvalds/linux/commit/363547d2191cbc32ca954ba75d72908712398ff2

As discussed during the Buildroot meeting, the devicetree-tree overlays will be
added with another patch series with a sliglty different implementation that
also take into account the recent issue with latest kernels 6.12.

Please, rebase your patch 2/2 when the devicetree-tree overlays is merged.

Thanks!

Best regards,
Romain

> 
> Signed-off-by: Gaël PORTAY <gael.portay@rtone.fr>
> ---
>  linux/Config.in | 24 ++++++++++++++++++++++++
>  linux/linux.mk  | 34 ++++++++++++++++++++++++++++++++++
>  2 files changed, 58 insertions(+)
> 
> diff --git a/linux/Config.in b/linux/Config.in
> index 526dd9ff00..41f5eb271d 100644
> --- a/linux/Config.in
> +++ b/linux/Config.in
> @@ -440,6 +440,30 @@ config BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT
>  	  Choose this option to support Device Tree overlays
>  	  on the target system.
>  
> +config BR2_LINUX_KERNEL_INTREE_DTS_OVERLAY_NAMES
> +	string "In-tree Device Tree Source Overlay file names"
> +	depends on BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT
> +	help
> +	  Name of in-tree device tree source file, without
> +	  the trailing .dts. You can provide a list of
> +	  dts files to build, separated by spaces.
> +
> +config BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY_PATH
> +	string "Out-of-tree Device Tree Source Overlay file paths"
> +	help
> +	  Paths to out-of-tree Device Tree Source Overlay (.dtso)
> +	  and Device Tree Source Include (.dtsi) files, separated by
> +	  spaces. These files will be copied to the kernel sources and
> +	  the .dtso files will be compiled from there.
> +
> +config BR2_LINUX_KERNEL_DTBO_KEEP_DIRNAME
> +	bool "Keep the directory name of the Device Tree Overlay"
> +	depends on BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT
> +	help
> +	  If enabled, the device tree blob overlays keep their
> +	  directory prefixes when they get copied to the
> +	  output image directory or the target directory.
> +
>  endif
>  
>  config BR2_LINUX_KERNEL_INSTALL_TARGET
> diff --git a/linux/linux.mk b/linux/linux.mk
> index 16d9f19470..d3ea427336 100644
> --- a/linux/linux.mk
> +++ b/linux/linux.mk
> @@ -202,6 +202,18 @@ LINUX_DTS_NAME += $(basename $(filter %.dts,$(notdir $(call qstrip,$(BR2_LINUX_K
>  
>  LINUX_DTBS = $(addsuffix .dtb,$(LINUX_DTS_NAME))
>  
> +ifeq ($(BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT),y)
> +LINUX_DTS_OVERLAY_NAMES += $(call qstrip,$(BR2_LINUX_KERNEL_INTREE_DTS_OVERLAY_NAMES))
> +
> +# We keep only the .dtso files, so that the user can specify both .dtso
> +# and .dtsi files in BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY_PATH. Both will be
> +# copied to arch/<arch>/boot/dts, but only the .dtso files will
> +# actually be generated as .dtbo.
> +LINUX_DTS_OVERLAY_NAMES += $(basename $(filter %.dtso,$(notdir $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY_PATH)))))
> +
> +LINUX_DTBOS = $(addsuffix .dtbo,$(LINUX_DTS_OVERLAY_NAMES))
> +endif
> +
>  ifeq ($(BR2_LINUX_KERNEL_IMAGE_TARGET_CUSTOM),y)
>  LINUX_IMAGE_NAME = $(call qstrip,$(BR2_LINUX_KERNEL_IMAGE_NAME))
>  LINUX_TARGET_NAME = $(call qstrip,$(BR2_LINUX_KERNEL_IMAGE_TARGET_NAME))
> @@ -462,10 +474,26 @@ define LINUX_INSTALL_DTB
>  			$(1)/$(if $(BR2_LINUX_KERNEL_DTB_KEEP_DIRNAME),$(dtb),$(notdir $(dtb)))
>  	)
>  endef
> +define LINUX_BUILD_DTBO
> +	$(LINUX_MAKE_ENV) $(BR2_MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) $(LINUX_DTBOS)
> +endef
> +define LINUX_INSTALL_DTBO
> +	$(foreach dtbo,$(LINUX_DTBOS), \
> +		install -D \
> +			$(wildcard $(LINUX_ARCH_PATH)/boot/dts/$(dtbo)) \
> +			$(1)/$(if $(BR2_LINUX_KERNEL_DTBO_KEEP_DIRNAME),$(dtbo),$(notdir $(dtbo)))
> +	)
> +endef
>  endif # BR2_LINUX_KERNEL_APPENDED_DTB
>  endif # BR2_LINUX_KERNEL_DTB_IS_SELF_BUILT
>  endif # BR2_LINUX_KERNEL_DTS_SUPPORT
>  
> +ifeq ($(BR2_LINUX_KERNEL_DTS_OVERLAY_SUPPORT),y)
> +define LINUX_BUILD_DTBO
> +	$(LINUX_MAKE_ENV) $(BR2_MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) $(LINUX_DTBOS)
> +endef
> +endif # BR2_LINUX_KERNEL_DTS_OVERLAY_SUPPORT
> +
>  ifeq ($(BR2_LINUX_KERNEL_APPENDED_DTB),y)
>  # dtbs moved from arch/$ARCH/boot to arch/$ARCH/boot/dts since 3.8-rc1
>  define LINUX_APPEND_DTB
> @@ -508,10 +536,14 @@ define LINUX_BUILD_CMDS
>  	$(foreach dts,$(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_DTS_PATH)), \
>  		cp -f $(dts) $(LINUX_ARCH_PATH)/boot/dts/
>  	)
> +	$(foreach dtso,$(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY_PATH)), \
> +		cp -f $(dtso) $(LINUX_ARCH_PATH)/boot/dts/
> +	)
>  	$(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)
>  	$(LINUX_APPEND_DTB)
> +	$(LINUX_BUILD_DTBO)
>  endef
>  
>  ifeq ($(BR2_LINUX_KERNEL_APPENDED_DTB),y)
> @@ -533,6 +565,7 @@ ifeq ($(BR2_LINUX_KERNEL_INSTALL_TARGET),y)
>  define LINUX_INSTALL_KERNEL_IMAGE_TO_TARGET
>  	$(call LINUX_INSTALL_IMAGE,$(TARGET_DIR)/boot)
>  	$(call LINUX_INSTALL_DTB,$(TARGET_DIR)/boot)
> +	$(call LINUX_INSTALL_DTBO,$(TARGET_DIR)/boot)
>  endef
>  endif
>  
> @@ -547,6 +580,7 @@ endef
>  define LINUX_INSTALL_IMAGES_CMDS
>  	$(call LINUX_INSTALL_IMAGE,$(BINARIES_DIR))
>  	$(call LINUX_INSTALL_DTB,$(BINARIES_DIR))
> +	$(call LINUX_INSTALL_DTBO,$(BINARIES_DIR))
>  endef
>  
>  ifeq ($(BR2_STRIP_strip),y)
diff mbox series

Patch

diff --git a/linux/Config.in b/linux/Config.in
index 526dd9ff00..41f5eb271d 100644
--- a/linux/Config.in
+++ b/linux/Config.in
@@ -440,6 +440,30 @@  config BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT
 	  Choose this option to support Device Tree overlays
 	  on the target system.
 
+config BR2_LINUX_KERNEL_INTREE_DTS_OVERLAY_NAMES
+	string "In-tree Device Tree Source Overlay file names"
+	depends on BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT
+	help
+	  Name of in-tree device tree source file, without
+	  the trailing .dts. You can provide a list of
+	  dts files to build, separated by spaces.
+
+config BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY_PATH
+	string "Out-of-tree Device Tree Source Overlay file paths"
+	help
+	  Paths to out-of-tree Device Tree Source Overlay (.dtso)
+	  and Device Tree Source Include (.dtsi) files, separated by
+	  spaces. These files will be copied to the kernel sources and
+	  the .dtso files will be compiled from there.
+
+config BR2_LINUX_KERNEL_DTBO_KEEP_DIRNAME
+	bool "Keep the directory name of the Device Tree Overlay"
+	depends on BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT
+	help
+	  If enabled, the device tree blob overlays keep their
+	  directory prefixes when they get copied to the
+	  output image directory or the target directory.
+
 endif
 
 config BR2_LINUX_KERNEL_INSTALL_TARGET
diff --git a/linux/linux.mk b/linux/linux.mk
index 16d9f19470..d3ea427336 100644
--- a/linux/linux.mk
+++ b/linux/linux.mk
@@ -202,6 +202,18 @@  LINUX_DTS_NAME += $(basename $(filter %.dts,$(notdir $(call qstrip,$(BR2_LINUX_K
 
 LINUX_DTBS = $(addsuffix .dtb,$(LINUX_DTS_NAME))
 
+ifeq ($(BR2_LINUX_KERNEL_DTB_OVERLAY_SUPPORT),y)
+LINUX_DTS_OVERLAY_NAMES += $(call qstrip,$(BR2_LINUX_KERNEL_INTREE_DTS_OVERLAY_NAMES))
+
+# We keep only the .dtso files, so that the user can specify both .dtso
+# and .dtsi files in BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY_PATH. Both will be
+# copied to arch/<arch>/boot/dts, but only the .dtso files will
+# actually be generated as .dtbo.
+LINUX_DTS_OVERLAY_NAMES += $(basename $(filter %.dtso,$(notdir $(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY_PATH)))))
+
+LINUX_DTBOS = $(addsuffix .dtbo,$(LINUX_DTS_OVERLAY_NAMES))
+endif
+
 ifeq ($(BR2_LINUX_KERNEL_IMAGE_TARGET_CUSTOM),y)
 LINUX_IMAGE_NAME = $(call qstrip,$(BR2_LINUX_KERNEL_IMAGE_NAME))
 LINUX_TARGET_NAME = $(call qstrip,$(BR2_LINUX_KERNEL_IMAGE_TARGET_NAME))
@@ -462,10 +474,26 @@  define LINUX_INSTALL_DTB
 			$(1)/$(if $(BR2_LINUX_KERNEL_DTB_KEEP_DIRNAME),$(dtb),$(notdir $(dtb)))
 	)
 endef
+define LINUX_BUILD_DTBO
+	$(LINUX_MAKE_ENV) $(BR2_MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) $(LINUX_DTBOS)
+endef
+define LINUX_INSTALL_DTBO
+	$(foreach dtbo,$(LINUX_DTBOS), \
+		install -D \
+			$(wildcard $(LINUX_ARCH_PATH)/boot/dts/$(dtbo)) \
+			$(1)/$(if $(BR2_LINUX_KERNEL_DTBO_KEEP_DIRNAME),$(dtbo),$(notdir $(dtbo)))
+	)
+endef
 endif # BR2_LINUX_KERNEL_APPENDED_DTB
 endif # BR2_LINUX_KERNEL_DTB_IS_SELF_BUILT
 endif # BR2_LINUX_KERNEL_DTS_SUPPORT
 
+ifeq ($(BR2_LINUX_KERNEL_DTS_OVERLAY_SUPPORT),y)
+define LINUX_BUILD_DTBO
+	$(LINUX_MAKE_ENV) $(BR2_MAKE) $(LINUX_MAKE_FLAGS) -C $(@D) $(LINUX_DTBOS)
+endef
+endif # BR2_LINUX_KERNEL_DTS_OVERLAY_SUPPORT
+
 ifeq ($(BR2_LINUX_KERNEL_APPENDED_DTB),y)
 # dtbs moved from arch/$ARCH/boot to arch/$ARCH/boot/dts since 3.8-rc1
 define LINUX_APPEND_DTB
@@ -508,10 +536,14 @@  define LINUX_BUILD_CMDS
 	$(foreach dts,$(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_DTS_PATH)), \
 		cp -f $(dts) $(LINUX_ARCH_PATH)/boot/dts/
 	)
+	$(foreach dtso,$(call qstrip,$(BR2_LINUX_KERNEL_CUSTOM_DTS_OVERLAY_PATH)), \
+		cp -f $(dtso) $(LINUX_ARCH_PATH)/boot/dts/
+	)
 	$(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)
 	$(LINUX_APPEND_DTB)
+	$(LINUX_BUILD_DTBO)
 endef
 
 ifeq ($(BR2_LINUX_KERNEL_APPENDED_DTB),y)
@@ -533,6 +565,7 @@  ifeq ($(BR2_LINUX_KERNEL_INSTALL_TARGET),y)
 define LINUX_INSTALL_KERNEL_IMAGE_TO_TARGET
 	$(call LINUX_INSTALL_IMAGE,$(TARGET_DIR)/boot)
 	$(call LINUX_INSTALL_DTB,$(TARGET_DIR)/boot)
+	$(call LINUX_INSTALL_DTBO,$(TARGET_DIR)/boot)
 endef
 endif
 
@@ -547,6 +580,7 @@  endef
 define LINUX_INSTALL_IMAGES_CMDS
 	$(call LINUX_INSTALL_IMAGE,$(BINARIES_DIR))
 	$(call LINUX_INSTALL_DTB,$(BINARIES_DIR))
+	$(call LINUX_INSTALL_DTBO,$(BINARIES_DIR))
 endef
 
 ifeq ($(BR2_STRIP_strip),y)