Makefile: Add support for DT bindings schema checks

This adds the build infrastructure for checking DT binding schema
documents and validating dtb files using the binding schema. Here we use
devicetree-rebasing subtree to provide the DT bindings. Along with that
adapt dts/upstream/Bindings/Makefile to align with old U-Boot Kbuild
infrastructure.

Dependency:
-----------

The DT schema project must be installed in order to validate the DT schema
binding documents and validate DTS files using the DT schema. The DT schema
project can be installed with pip::

    pip3 install dtschema

Note that 'dtschema' installation requires 'swig' and Python development
files installed first. On Debian/Ubuntu systems::

    apt install swig python3-dev

Testing:
--------

Build dts files and check using DT binding schema:
$ make dtbs_check

Optionally, DT_SCHEMA_FILES can be passed in with a schema file(s) to
use for validation. This makes it easier to find and fix errors
generated by a specific schema.

Note, at this point dtbs_check is an optional build target as there are
many warnings generated due to custom DT properties used by many
platforms in u-boot. It is expected with these checks that compliance
with DT bindings to take place. Once that's done it can be added to CI
builds to remain compliant with DT bindings.

Reviewed-by: Simon Glass <sjg@chromium.org>
Tested-by: Simon Glass <sjg@chromium.org>
Signed-off-by: Sumit Garg <sumit.garg@linaro.org>
This commit is contained in:
Sumit Garg 2024-02-22 15:05:58 +05:30 committed by Tom Rini
parent 8f31c85cf9
commit 4be3fe9d80
3 changed files with 36 additions and 7 deletions

View file

@ -1158,12 +1158,28 @@ endif
@# disabling OF_BOARD. @# disabling OF_BOARD.
$(call cmd,ofcheck,$(KCONFIG_CONFIG)) $(call cmd,ofcheck,$(KCONFIG_CONFIG))
PHONY += dtbs PHONY += dtbs dtbs_check
dtbs: dts/dt.dtb dtbs: dts/dt.dtb
@: @:
dts/dt.dtb: u-boot dts/dt.dtb: dtbs_prepare u-boot
$(Q)$(MAKE) $(build)=dts dtbs $(Q)$(MAKE) $(build)=dts dtbs
dtbs_prepare: prepare3
ifneq ($(filter dtbs_check, $(MAKECMDGOALS)),)
export CHECK_DTBS=y
endif
ifneq ($(CHECK_DTBS),)
dtbs_prepare: dt_binding_check
endif
dtbs_check: dt_binding_check dtbs
DT_BINDING_DIR := dts/upstream/Bindings
dt_binding_check: scripts_dtc
$(Q)$(MAKE) $(build)=$(DT_BINDING_DIR) $(DT_BINDING_DIR)/processed-schema.json
quiet_cmd_copy = COPY $@ quiet_cmd_copy = COPY $@
cmd_copy = cp $< $@ cmd_copy = cp $< $@

View file

@ -47,9 +47,9 @@ quiet_cmd_mk_schema = SCHEMA $@
rm -f $$f rm -f $$f
define rule_chkdt define rule_chkdt
$(if $(DT_SCHEMA_LINT),$(call cmd,yamllint),) $(if $(DT_SCHEMA_LINT),$(call echo-cmd,yamllint) $(cmd_yamllint),); \
$(call cmd,chk_bindings) $(call echo-cmd,chk_bindings) $(cmd_chk_bindings); \
$(call cmd,mk_schema) $(call echo-cmd,mk_schema) $(cmd_mk_schema)
endef endef
DT_DOCS = $(patsubst $(srctree)/%,%,$(shell $(find_all_cmd))) DT_DOCS = $(patsubst $(srctree)/%,%,$(shell $(find_all_cmd)))

View file

@ -356,8 +356,21 @@ endif
dtsi_include_list_deps = $(addprefix $(obj)/,$(subst $(quote),,$(dtsi_include_list))) dtsi_include_list_deps = $(addprefix $(obj)/,$(subst $(quote),,$(dtsi_include_list)))
$(obj)/%.dtb: $(src)/%.dts $(DTC) $(dtsi_include_list_deps) FORCE ifneq ($(CHECK_DTBS),)
$(call if_changed_dep,dtc) DT_CHECKER ?= dt-validate
DT_CHECKER_FLAGS ?= $(if $(DT_SCHEMA_FILES),-l $(DT_SCHEMA_FILES),-m)
DT_BINDING_DIR := dts/upstream/Bindings
DT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.json
quiet_cmd_dtb = DTC_CHK $@
cmd_dtb = $(cmd_dtc) ; $(DT_CHECKER) $(DT_CHECKER_FLAGS) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ || true
else
quiet_cmd_dtb = $(quiet_cmd_dtc)
cmd_dtb = $(cmd_dtc)
endif
$(obj)/%.dtb: $(src)/%.dts $(DTC) $(dtsi_include_list_deps) $(DT_TMP_SCHEMA) FORCE
$(call if_changed_dep,dtb)
pre-tmp = $(subst $(comma),_,$(dot-target).pre.tmp) pre-tmp = $(subst $(comma),_,$(dot-target).pre.tmp)
dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp) dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)