From mboxrd@z Thu Jan 1 00:00:00 1970 Delivery-date: Mon, 31 Aug 2026 15:12:39 +0200 Received: from metis.whiteo.stw.pengutronix.de ([2a0a:edc0:2:b01:1d::104]) by lore.white.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1x11oU-009Htt-1w for lore@lore.pengutronix.de; Mon, 31 Aug 2026 15:12:39 +0200 Received: from [127.0.0.1] (helo=metis.whiteo.stw.pengutronix.de) by metis.whiteo.stw.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1x11oT-0006Tu-Tx; Mon, 31 Aug 2026 15:12:37 +0200 Received: from mx1.white.stw.pengutronix.de ([2a0a:edc0:0:b01:1d::107]) by metis.whiteo.stw.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1x11oB-0006J1-KG for ptxdist@pengutronix.de; Mon, 31 Aug 2026 15:12:19 +0200 Received: from mail-ej1-x636.google.com (mail-ej1-x636.google.com [IPv6:2a00:1450:4864:20::636]) by mx1.white.stw.pengutronix.de (Postfix) with ESMTPS id 55F38201BCA for ; Mon, 31 Aug 2026 15:12:15 +0200 (CEST) Authentication-Results: mx1.white.stw.pengutronix.de; dkim=pass header.d=gmail.com header.s=20251104 header.b=Bg0zKB9U; spf=pass (mx1.white.stw.pengutronix.de: domain of bruno.thomsen@gmail.com designates 2a00:1450:4864:20::636 as permitted sender) smtp.mailfrom=bruno.thomsen@gmail.com; dmarc=pass (policy=none) header.from=gmail.com Received: by mail-ej1-x636.google.com with SMTP id a640c23a62f3a-c20e70a0962so448450366b.2 for ; Mon, 31 Aug 2026 06:12:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1788181935; x=1788786735; darn=pengutronix.de; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to:content-type; bh=NBGEPltRlJ0H+En85gkED7KJlbfXoLc3f4Y8jBksmx4=; b=Bg0zKB9U50MraxRpUADjXlJIbr0v8eSM+qdHCGB8j5rl5ASX8WDXn+Vcw3pYmR298Z 35pAY0v+vhpS+hSk5bw8+MYvDLS+buFyKi52836NYG7Lcyg2ZbXNNP3S0nLlnffblCrz sWkBCvlZ1FxvDsLdgocpimgPG7EzkBbtWQpObZxDWqJUt/Aa+yH5dis7xZT4IBGz4LDx O4SyVouphWakTZhgBhy8s/vDW4eCuAeelOQp7BjuX1gX1kO4XI8LK7XQ41Cis7bRGgp5 FQCo3Y3cjQRlttnRmLO82Ij6Jw+HFn1bAqRxh9Sl+Kh4Uzc8cUsJJPW4FohlmLmgnSO9 cH4Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1788181935; x=1788786735; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to:content-type; bh=NBGEPltRlJ0H+En85gkED7KJlbfXoLc3f4Y8jBksmx4=; b=jdkpMNFsYBL9Rw4zhB+SuETmN+n9T5o0XbC+q0Jh/RVXf9Qcra5hCprYRtNqQ7xBKx cgFy/s6qbu5AZwQfXvQ7iRG+3waR90TCQt0sdsR1ncGdVzvp6LQG8GzWdp2Hcop0j7+g Sp+XVchdf56J8GTiy5aG9vc7cPt2Tfa+v2fPBmzNU3J+SloeklDixpdPtORmnHU6/3tX F8COkSW3o/0/jvJLYYolttM2joEbJ38ODF6DeYKsRFU2HucNW8zCNX381fcOjP0W/sLj Z00gvZwZZHWf0+cPQYu9wJ8YJ8gcTgJ8XTkBtdXhOKD72jov9AWRIiGu+G6h4MRFt2bc JfNw== X-Gm-Message-State: AFuF++ml6Lk+ocvrlUsUKZRy3sFBwfJBYN5xbQDNPCJOb1/KCikMJjzz se/j1Q856tEOohVhl8YbzUTAoTHNth0LpdMkGn1LimNQZwMs4MCjdo20T9IBRA== X-Gm-Gg: AR+sD118vnKTDrnC2yOWQIYoFJuBhkvgL5WwH2ebXKltLt2mHVVKXnmPXsdkzta678O g//Qv9agfaddTdNO419xv3rJlBXjGJyP139Gr74w5n87WxKx7tXq7jAFXaSjOjd4xot7F5brM8P MkZOon+UJRt80DotOG8JAHMHcTgqLf72gjqjAZ75gzrPmuD9gwN8R1rXtGKUUdM75TOE3MEXEh9 Z2mmB5C1aIllBDmAY4Wsd4si9OkWVNGxFDgbZ/eGzh2wRsreBIEkOpZeXLm/yYW0NXWlGItKgU6 VqGa3eNH4Tu6HcnmHbjoSvgubDSTAtWsXbByGrM9GiMV9PteyWNJIcz7GAprYx8Py8hifZ1/3Wu IK1m8xX1rUCzld4BSClO+VaedyNWNiY9quH/GISCoQl3iFlGuUijxL7j+1IcWI7agoc/sx9azQR wD+L+QBxgR9lFuhUfIblkAHT/jZ7bcKFHL/yWxvSJFDrUCwfGPqQ3D8qi8GWZPpgQAulpIdgVuD CRlqWIcF6vgip5d+4y/UwUhbp/EBwmclFiumP3EpPBj X-Received: by 2002:a17:906:4082:b0:c25:8d62:f992 with SMTP id a640c23a62f3a-c25b3db1604mr16921066b.21.1788181934629; Mon, 31 Aug 2026 06:12:14 -0700 (PDT) Received: from fedora.tux.internal (85.191.71.118.dynamic.dhcp.aura-net.dk. [85.191.71.118]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-c255f1febf3sm426316066b.52.2026.08.31.06.12.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 31 Aug 2026 06:12:13 -0700 (PDT) From: Bruno Thomsen To: ptxdist@pengutronix.de Date: Mon, 31 Aug 2026 15:11:59 +0200 Message-ID: <20260831131159.11771-3-bruno.thomsen@gmail.com> X-Mailer: git-send-email 2.55.0 In-Reply-To: <20260831131159.11771-1-bruno.thomsen@gmail.com> References: <20260831131159.11771-1-bruno.thomsen@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: mx1 X-Stat-Signature: zhx3ryzhpszc69iapkz8ojdus5deog6y X-Rspamd-Queue-Id: 55F38201BCA X-Spamd-Result: default: False [-3.50 / 15.00]; BAYES_HAM(-3.00)[100.00%]; R_MISSING_CHARSET(0.50)[]; DMARC_POLICY_ALLOW(-0.50)[gmail.com,none]; R_SPF_ALLOW(-0.20)[+ip6:2a00:1450:4864::/56:c]; R_DKIM_ALLOW(-0.20)[gmail.com:s=20251104]; MIME_GOOD(-0.10)[text/plain]; ARC_NA(0.00)[]; RCPT_COUNT_TWO(0.00)[2]; MIME_TRACE(0.00)[0:+]; RCVD_TLS_LAST(0.00)[]; TO_MATCH_ENVRCPT_SOME(0.00)[]; FREEMAIL_FROM(0.00)[gmail.com]; TO_DN_SOME(0.00)[]; DWL_DNSWL_NONE(0.00)[gmail.com:dkim]; FREEMAIL_ENVFROM(0.00)[gmail.com]; TAGGED_FROM(0.00)[]; FROM_EQ_ENVFROM(0.00)[]; FREEMAIL_CC(0.00)[gmail.com]; MID_RHS_MATCH_FROM(0.00)[]; NEURAL_HAM(-0.00)[-1.000]; PREVIOUSLY_DELIVERED(0.00)[ptxdist@pengutronix.de]; RCVD_COUNT_TWO(0.00)[2]; TAGGED_RCPT(0.00)[]; ASN(0.00)[asn:15169, ipnet:2a00:1450::/32, country:US]; RCVD_VIA_SMTP_AUTH(0.00)[]; RCVD_IN_DNSWL_NONE(0.00)[2a00:1450:4864:20::636:from]; DKIM_TRACE(0.00)[gmail.com:+]; FROM_HAS_DN(0.00)[] X-Rspamd-Action: no action Subject: [ptxdist] [PATCH v2 2/2] kernel: validate device trees against the DT schema X-BeenThere: ptxdist@pengutronix.de X-Mailman-Version: 2.1.29 Precedence: list List-Id: PTXdist Development Mailing List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: ptxdist@pengutronix.de Cc: Bruno Thomsen Sender: "ptxdist" X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: ptxdist-bounces@pengutronix.de X-SA-Exim-Scanned: No (on metis.whiteo.stw.pengutronix.de); SAEximRunCond expanded to false Make it possible to do device tree validation on dts/dtsi during development and preparation for upstream. Signed-off-by: Bruno Thomsen --- v1 -> v2 changed: - Move complexity from kernel.make to ptxd_make_world_dtb - KERNEL_DTB_CHECK_OPT conditional on KERNEL_DTB_CHECK - Move KERNEL_DTB_CHECK inside 'if KERNEL_DTB' - Clarify in help that schema problems are warnings --- platforms/kernel.in | 25 ++++++++++++++++++++++ rules/kernel.make | 7 +++++++ rules/post/ptxd_make_world_dtb.make | 1 + scripts/lib/ptxd_make_world_dtb.sh | 32 +++++++++++++++++++++++++++++ 4 files changed, 65 insertions(+) diff --git a/platforms/kernel.in b/platforms/kernel.in index 2c6d906e8..36a4f3cf0 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 @@ -200,6 +202,29 @@ config KERNEL_DTS is used as a search path for the device tree files specified here. Multiple dts files can be specified, separated by spaces. +config KERNEL_DTB_CHECK + bool + prompt "validate device trees against the DT schema" + help + Additionally build the device trees with the kernel build system + ('make CHECK_DTBS=y .dtb') to validate them against the + device tree bindings in Documentation/devicetree/bindings. + Schema problems are reported as warnings, so 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, + because the make targets are relative to arch//boot/dts. + Each file in KERNEL_DTS is looked up in KERNEL_DTS_PATH and the + first match inside the kernel tree is validated. 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_DTS_SUPPORT_OVERLAYS bool diff --git a/rules/kernel.make b/rules/kernel.make index af0dd3913..d32a0443c 100644 --- a/rules/kernel.make +++ b/rules/kernel.make @@ -282,6 +282,13 @@ KERNEL_INSTALL_OPT = \ $(KERNEL_BASE_OPT) \ modules_install +ifdef PTXCONF_KERNEL_DTB_CHECK +# validate the device trees while building them in world/dtb +KERNEL_DTB_CHECK_OPT = \ + $(KERNEL_SHARED_OPT) \ + CHECK_DTBS=y +endif + $(STATEDIR)/kernel.install: @$(call targetinfo) ifdef PTXCONF_KERNEL_MODULES_INSTALL diff --git a/rules/post/ptxd_make_world_dtb.make b/rules/post/ptxd_make_world_dtb.make index 37468c0be..81b237a87 100644 --- a/rules/post/ptxd_make_world_dtb.make +++ b/rules/post/ptxd_make_world_dtb.make @@ -10,6 +10,7 @@ world/dtb/env = \ $(call world/env, $(1)) \ pkg_dts_path="$($(1)_DTS_PATH)" \ pkg_dts="$($(1)_DTS)" \ + pkg_dtb_check_opt="$(call ptx/escape,$($(1)_DTB_CHECK_OPT))" \ pkg_arch="$(GENERIC_KERNEL_ARCH)" world/dtb = \ diff --git a/scripts/lib/ptxd_make_world_dtb.sh b/scripts/lib/ptxd_make_world_dtb.sh index dea9268ff..22622b2ad 100644 --- a/scripts/lib/ptxd_make_world_dtb.sh +++ b/scripts/lib/ptxd_make_world_dtb.sh @@ -109,10 +109,13 @@ export -f ptxd_make_world_dtbo ptxd_make_world_dtb() { local dtb_deps_target dtb_source dtb_target + local dts_file dts_in_tree dtb_check_dtstree + local -a dtb_check_targets=() ptxd_make_world_init || return dtb_deps_target="${ptx_state_dir}/${pkg_stamp}" + dtb_check_dtstree="${pkg_kernel_dir:-${pkg_dir}}/arch/${pkg_arch}/boot/dts" echo -e "\nBuilding device trees..." @@ -128,7 +131,36 @@ ptxd_make_world_dtb() { dtb_source="${ptxd_reply}" dtb_target="${pkg_pkg_dir}/boot/$(basename ${dts_dts/%.dts/.dtb})" + # + # The dtb targets of the kernel build system are relative to + # arch//boot/dts, so only device trees from the kernel tree + # can be validated. + # + if [ -n "${pkg_dtb_check_opt}" ]; then + dts_file="" + for dts_in_tree in "${ptxd_reply[@]}"; do + if [ "${dts_in_tree}" != "${dts_in_tree#${dtb_check_dtstree}/}" ]; then + dts_file="${dts_in_tree#${dtb_check_dtstree}/}" + break + fi + done + if [ -n "${dts_file}" ]; then + dtb_check_targets[${#dtb_check_targets[@]}]="${dts_file/%.dts/.dtb}" + else + ptxd_warning "Device tree '${dts_dts}' is not part of the kernel tree. Skipping validation." + fi + fi + ptxd_make_dtb || break done + + if [ ${#dtb_check_targets[@]} -ne 0 ]; then + echo -e "\nValidating device trees..." + ptxd_eval \ + "${MAKE}" \ + "${pkg_dtb_check_opt}" \ + "${dtb_check_targets[@]}" || + ptxd_bailout "Unable to validate device trees." + fi } export -f ptxd_make_world_dtb -- 2.55.0