Skip to content

Commit ef8795f

Browse files
committed
dt-bindings: kbuild: Use DTB files for validation
Switch the DT validation to use DTB files directly instead of a DTS to YAML conversion. The original motivation for supporting validation on DTB files was to enable running validation on a running system (e.g. 'dt-validate /sys/firmware/fdt') or other cases where the original source DTS is not available. The YAML format was not without issues. Using DTBs with the schema type information solves some of those problems. The YAML format relies on the DTS source level information including bracketing of properties, size directives, and phandle tags all of which are lost in a DTB file. While standardizing the bracketing is a good thing, it does cause a lot of extra warnings and churn to fix them. Another issue has been signed types are not validated correctly as sign information is not propagated to YAML. Using the schema type information allows for proper handling of signed types. YAML also can't represent the full range of 64-bit integers as numbers are stored as floats by most/all parsers. The DTB validation works by decoding property values using the type information in the schemas themselves. The main corner case this does not work for is matrix types where neither dimension is fixed. For now, checking the dimensions in these cases are skipped. Signed-off-by: Rob Herring <robh@kernel.org> Tested-by: Geert Uytterhoeven <geert+renesas@glider.be> Link: https://lore.kernel.org/r/20220310160513.1708182-3-robh@kernel.org
1 parent 2783a7f commit ef8795f

5 files changed

Lines changed: 16 additions & 43 deletions

File tree

Documentation/devicetree/bindings/Makefile

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,7 @@ $(obj)/%.example.dts: $(src)/%.yaml check_dtschema_version FORCE
2626
$(call if_changed,extract_ex)
2727

2828
find_all_cmd = find $(srctree)/$(src) \( -name '*.yaml' ! \
29-
-name 'processed-schema*' ! \
30-
-name '*.example.dt.yaml' \)
29+
-name 'processed-schema*' \)
3130

3231
find_cmd = $(find_all_cmd) | grep -F "$(DT_SCHEMA_FILES)"
3332
CHK_DT_DOCS := $(shell $(find_cmd))
@@ -72,9 +71,9 @@ $(obj)/processed-schema.json: $(DT_DOCS) $(src)/.yamllint check_dtschema_version
7271

7372
always-y += processed-schema.json
7473
always-$(CHECK_DT_BINDING) += $(patsubst $(srctree)/$(src)/%.yaml,%.example.dts, $(CHK_DT_DOCS))
75-
always-$(CHECK_DT_BINDING) += $(patsubst $(srctree)/$(src)/%.yaml,%.example.dt.yaml, $(CHK_DT_DOCS))
74+
always-$(CHECK_DT_BINDING) += $(patsubst $(srctree)/$(src)/%.yaml,%.example.dtb, $(CHK_DT_DOCS))
7675

7776
# Hack: avoid 'Argument list too long' error for 'make clean'. Remove most of
7877
# build artifacts here before they are processed by scripts/Makefile.clean
7978
clean-files = $(shell find $(obj) \( -name '*.example.dts' -o \
80-
-name '*.example.dt.yaml' \) -delete 2>/dev/null)
79+
-name '*.example.dtb' \) -delete 2>/dev/null)

Documentation/devicetree/bindings/writing-schema.rst

Lines changed: 5 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -120,20 +120,13 @@ project can be installed with pip::
120120

121121
pip3 install dtschema
122122

123-
Several executables (dt-doc-validate, dt-mk-schema, dt-validate) will be
124-
installed. Ensure they are in your PATH (~/.local/bin by default).
125-
126-
dtc must also be built with YAML output support enabled. This requires that
127-
libyaml and its headers be installed on the host system. For some distributions
128-
that involves installing the development package, such as:
129-
130-
Debian::
123+
Note that 'dtschema' installation requires 'swig' and Python development files
124+
installed first. On Debian/Ubuntu systems::
131125

132-
apt-get install libyaml-dev
126+
apt install swig python3-dev
133127

134-
Fedora::
135-
136-
dnf -y install libyaml-devel
128+
Several executables (dt-doc-validate, dt-mk-schema, dt-validate) will be
129+
installed. Ensure they are in your PATH (~/.local/bin by default).
137130

138131
Running checks
139132
~~~~~~~~~~~~~~

scripts/Makefile.lib

Lines changed: 7 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -87,11 +87,6 @@ base-dtb-y := $(foreach m, $(multi-dtb-y), $(firstword $(call suffix-search, $m,
8787

8888
always-y += $(dtb-y)
8989

90-
ifneq ($(CHECK_DTBS),)
91-
always-y += $(patsubst %.dtb,%.dt.yaml, $(real-dtb-y))
92-
always-y += $(patsubst %.dtbo,%.dt.yaml, $(real-dtb-y))
93-
endif
94-
9590
# Add subdir path
9691

9792
extra-y := $(addprefix $(obj)/,$(extra-y))
@@ -347,35 +342,34 @@ cmd_dtc = $(HOSTCC) -E $(dtc_cpp_flags) -x assembler-with-cpp -o $(dtc-tmp) $< ;
347342
-d $(depfile).dtc.tmp $(dtc-tmp) ; \
348343
cat $(depfile).pre.tmp $(depfile).dtc.tmp > $(depfile)
349344

350-
$(obj)/%.dtb: $(src)/%.dts $(DTC) FORCE
351-
$(call if_changed_dep,dtc)
352-
353-
$(obj)/%.dtbo: $(src)/%.dts $(DTC) FORCE
354-
$(call if_changed_dep,dtc)
355-
356345
quiet_cmd_fdtoverlay = DTOVL $@
357346
cmd_fdtoverlay = $(objtree)/scripts/dtc/fdtoverlay -o $@ -i $(real-prereqs)
358347

359348
$(multi-dtb-y): FORCE
360349
$(call if_changed,fdtoverlay)
361350
$(call multi_depend, $(multi-dtb-y), .dtb, -dtbs)
362351

352+
ifneq ($(CHECK_DTBS)$(CHECK_DT_BINDING),)
363353
DT_CHECKER ?= dt-validate
364354
DT_CHECKER_FLAGS ?= $(if $(DT_SCHEMA_FILES),-l $(DT_SCHEMA_FILES),-m)
365355
DT_BINDING_DIR := Documentation/devicetree/bindings
366356
DT_TMP_SCHEMA := $(objtree)/$(DT_BINDING_DIR)/processed-schema.json
367357

368358
quiet_cmd_dtb_check = CHECK $@
369-
cmd_dtb_check = $(DT_CHECKER) $(DT_CHECKER_FLAGS) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@
359+
cmd_dtb_check = $(DT_CHECKER) $(DT_CHECKER_FLAGS) -u $(srctree)/$(DT_BINDING_DIR) -p $(DT_TMP_SCHEMA) $@ || true
360+
endif
370361

371362
define rule_dtc
372363
$(call cmd_and_fixdep,dtc)
373364
$(call cmd,dtb_check)
374365
endef
375366

376-
$(obj)/%.dt.yaml: $(src)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE
367+
$(obj)/%.dtb: $(src)/%.dts $(DTC) $(DT_TMP_SCHEMA) FORCE
377368
$(call if_changed_rule,dtc)
378369

370+
$(obj)/%.dtbo: $(src)/%.dts $(DTC) FORCE
371+
$(call if_changed_dep,dtc)
372+
379373
dtc-tmp = $(subst $(comma),_,$(dot-target).dts.tmp)
380374

381375
# Bzip2

scripts/dtc/Makefile

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -17,20 +17,7 @@ fdtoverlay-objs := $(libfdt) fdtoverlay.o util.o
1717

1818
# Source files need to get at the userspace version of libfdt_env.h to compile
1919
HOST_EXTRACFLAGS += -I $(srctree)/$(src)/libfdt
20-
21-
ifeq ($(shell pkg-config --exists yaml-0.1 2>/dev/null && echo yes),)
22-
ifneq ($(CHECK_DT_BINDING)$(CHECK_DTBS),)
23-
$(error dtc needs libyaml for DT schema validation support. \
24-
Install the necessary libyaml development package.)
25-
endif
2620
HOST_EXTRACFLAGS += -DNO_YAML
27-
else
28-
dtc-objs += yamltree.o
29-
# To include <yaml.h> installed in a non-default path
30-
HOSTCFLAGS_yamltree.o := $(shell pkg-config --cflags yaml-0.1)
31-
# To link libyaml installed in a non-default path
32-
HOSTLDLIBS_dtc := $(shell pkg-config --libs yaml-0.1)
33-
endif
3421

3522
# Generated files need one more search path to include headers in source tree
3623
HOSTCFLAGS_dtc-lexer.lex.o := -I $(srctree)/$(src)

scripts/dtc/update-dtc-source.sh

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ DTC_UPSTREAM_PATH=`pwd`/../dtc
3232
DTC_LINUX_PATH=`pwd`/scripts/dtc
3333

3434
DTC_SOURCE="checks.c data.c dtc.c dtc.h flattree.c fstree.c livetree.c srcpos.c \
35-
srcpos.h treesource.c util.c util.h version_gen.h yamltree.c \
35+
srcpos.h treesource.c util.c util.h version_gen.h \
3636
dtc-lexer.l dtc-parser.y"
3737
LIBFDT_SOURCE="fdt.c fdt.h fdt_addresses.c fdt_empty_tree.c \
3838
fdt_overlay.c fdt_ro.c fdt_rw.c fdt_strerror.c fdt_sw.c \

0 commit comments

Comments
 (0)