Make it possible to do device tree validation on
dts/dtsi during development and preparation for
upstream.

Signed-off-by: Bruno Thomsen <[email protected]>
---
 platforms/kernel.in | 25 +++++++++++++++++++++++++
 rules/kernel.make   | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+)

diff --git a/platforms/kernel.in b/platforms/kernel.in
index 2c6d906e8..79a414fd8 100644
--- a/platforms/kernel.in
+++ b/platforms/kernel.in
@@ -11,6 +11,8 @@ menuconfig KERNEL
        select HOST_LZ4                 if KERNEL_LZ4
        select HOST_LIBKMOD             if KERNEL_MODULES
        select HOST_SYSTEM_BC
+       select HOST_SYSTEM_PYTHON3      if KERNEL_DTB_CHECK
+       select HOST_SYSTEM_PYTHON3_DTSCHEMA     if KERNEL_DTB_CHECK
        select HOST_OPENSSL             if KERNEL_OPENSSL
        select HOST_LIBELF              if KERNEL_LIBELF
        select HOST_BINDGEN_CLI         if KERNEL_RUST
@@ -232,6 +234,29 @@ config KERNEL_DTSO
 
 endif
 
+config KERNEL_DTB_CHECK
+       bool
+       depends on KERNEL_DTB
+       prompt "validate device trees against the DT schema"
+       help
+         Additionally build the device trees with the kernel build system
+         ('make CHECK_DTBS=y <board>.dtb') to validate them against the
+         device tree bindings in Documentation/devicetree/bindings.
+         Problems are reported as warnings, they do not break the build.
+
+         This requires the 'dtschema' python package on the build host and
+         it noticeably increases the build time of the kernel, because the
+         schema of all bindings must be processed first.
+
+         Only device trees that are part of the kernel tree can be checked.
+         Each file in KERNEL_DTS is looked up in KERNEL_DTS_PATH and the
+         first match below a 'boot/dts' directory is checked, even if the
+         device tree itself is built from an earlier entry in the search
+         path. Device trees without such a match are skipped with a
+         warning. So for device trees in a vendor directory, that directory
+         must be part of KERNEL_DTS_PATH, e.g.
+         "${KERNEL_DIR}/arch/${GENERIC_KERNEL_ARCH}/boot/dts/ti/omap".
+
 config KERNEL_CODE_SIGNING
        prompt "use code signing infrastructure"
        select KERNEL_OPENSSL
diff --git a/rules/kernel.make b/rules/kernel.make
index af0dd3913..eaed71023 100644
--- a/rules/kernel.make
+++ b/rules/kernel.make
@@ -215,6 +215,36 @@ KERNEL_MAKE_OPT            = \
        $(KERNEL_IMAGE) \
        $(call ptx/ifdef, PTXCONF_KERNEL_MODULES,modules)
 
+#
+# device tree validation
+#
+# The kernel build system can only validate device trees from the kernel tree.
+# Look up the device trees in KERNEL_DTS_PATH and use the first match below a
+# 'boot/dts' directory.
+#
+kernel/dtb-check-file  = \
+       $(firstword $(foreach dts, \
+               $(call ptx/in-path-all,KERNEL_DTS_PATH,$(1)), \
+               $(if $(findstring /boot/dts/,$(dts)),$(dts))))
+
+# the dtb make targets are relative to arch/<arch>/boot/dts
+kernel/dtb-check-target        = \
+       $(patsubst %.dts,%.dtb,$(patsubst /%,%,$(word 2, \
+               $(subst /boot/dts,$(ptx/def/space), \
+                       $(call kernel/dtb-check-file,$(1))))))
+
+KERNEL_DTB_CHECK_FILES = $(strip \
+       $(foreach dts,$(KERNEL_DTS),$(call kernel/dtb-check-target,$(dts))))
+
+KERNEL_DTB_CHECK_SKIPPED = $(strip \
+       $(foreach dts,$(KERNEL_DTS), \
+               $(if $(call kernel/dtb-check-file,$(dts)),,$(dts))))
+
+KERNEL_DTB_CHECK_OPT   = \
+       $(KERNEL_SHARED_OPT) \
+       CHECK_DTBS=y \
+       $(KERNEL_DTB_CHECK_FILES)
+
 KERNEL_TOOL_PERF_OPTS  := \
        -C $(KERNEL_DIR)/tools/perf \
        O=$(KERNEL_BUILD_DIR)/tools/perf \
@@ -263,6 +293,12 @@ $(STATEDIR)/kernel.compile:
                $(KERNEL_BUILD_DIR)/usr/initramfs_data.cpio.* \
                $(KERNEL_BUILD_DIR)/usr/.initramfs_data.cpio.*
        @$(call world/compile, KERNEL)
+ifdef PTXCONF_KERNEL_DTB_CHECK
+       @$(foreach dts, $(KERNEL_DTB_CHECK_SKIPPED), \
+               echo "dtb-check: skipping '$(dts)': no match below 'boot/dts' 
in KERNEL_DTS_PATH";)
+       @$(if $(KERNEL_DTB_CHECK_FILES), \
+               $(call world/execute, KERNEL, $(MAKE) $(KERNEL_DTB_CHECK_OPT)))
+endif
 ifdef PTXCONF_KERNEL_TOOL_PERF
        @mkdir -p $(KERNEL_BUILD_DIR)/tools/perf
        @$(call compile, KERNEL, $(KERNEL_TOOL_PERF_OPTS))
-- 
2.55.0


Reply via email to