All of lore.kernel.org
 help / color / mirror / Atom feed
From: Rob Herring <robh@kernel.org>
To: Daniel Golle <daniel@makrotopia.org>
Cc: "Krzysztof Kozlowski" <krzk+dt@kernel.org>,
	"Conor Dooley" <conor+dt@kernel.org>,
	"Nathan Chancellor" <nathan@kernel.org>,
	"Nicolas Schier" <nsc@kernel.org>,
	"Saravana Kannan" <saravanak@kernel.org>,
	"Ping-Ke Shih" <pkshih@realtek.com>,
	"Andy Shevchenko" <andriy.shevchenko@linux.intel.com>,
	"David Sterba" <dsterba@suse.com>,
	"Bryan O'Donoghue" <bryan.odonoghue@linaro.org>,
	"Hariharan Basuthkar" <quic_hbasuthk@quicinc.com>,
	"Jeff Hugo" <jeff.hugo@oss.qualcomm.com>,
	"Filipe Manana" <fdmanana@suse.com>,
	"Bitterblue Smith" <rtl8821cerfe2@gmail.com>,
	"Wei Yang" <richard.weiyang@gmail.com>,
	"Takashi Iwai" <tiwai@suse.de>,
	"Aurabindo Pillai" <aurabindo.pillai@amd.com>,
	"Chih-Kang Chang" <gary.chang@realtek.com>,
	"David Lechner" <dlechner@baylibre.com>,
	"Miguel Ojeda" <ojeda@kernel.org>, "Gary Guo" <gary@garyguo.net>,
	"Tamir Duberstein" <tamird@kernel.org>,
	"Thomas Weißschuh" <linux@weissschuh.net>,
	"Pagadala Yesu Anjaneyulu" <pagadala.yesu.anjaneyulu@intel.com>,
	"Bartosz Golaszewski" <brgl@kernel.org>,
	"Jorge Ramirez-Ortiz" <jorge.ramirez@oss.qualcomm.com>,
	"Masahiro Yamada" <masahiroy@kernel.org>,
	"Guenter Roeck" <linux@roeck-us.net>,
	"Aleksander Jan Bajkowski" <olek2@wp.pl>,
	"Boris Burkov" <boris@bur.io>,
	"Blake Jones" <blakejones@google.com>,
	"Jonathan Corbet" <corbet@lwn.net>,
	"Mauro Carvalho Chehab" <mchehab+huawei@kernel.org>,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-kbuild@vger.kernel.org
Subject: Re: [PATCH v5 0/4] dt-bindings: automated coding style check for DTS examples
Date: Wed, 10 Jun 2026 13:38:08 -0500	[thread overview]
Message-ID: <20260610183808.GA610395-robh@kernel.org> (raw)
In-Reply-To: <cover.1779908995.git.daniel@makrotopia.org>

On Wed, May 27, 2026 at 08:31:59PM +0100, Daniel Golle wrote:
> Documentation/devicetree/bindings/dts-coding-style.rst documents
> the style expected of DT examples and source files, but nothing
> existing actually enforces it. dtc tolerates arbitrary whitespace,
> yamllint only sees the YAML envelope and not the DTS content
> inside literal block scalars, and so reviewers spend cycles
> flagging issues that tooling could catch.
> 
> Add scripts/dtc/dt-check-style, a Python tool that checks DTS
> coding style on YAML binding examples and on .dts/.dtsi/.dtso
> source files. Rules live in a small declarative registry; each
> rule is tagged 'relaxed' (default) or 'strict' (opt-in for new
> submissions). Promoting a rule from strict to relaxed is a
> one-line edit once the tree catches up.
> 
> Relaxed mode covers trailing whitespace, tab characters in YAML
> examples, mixed tab+space indents, unclosed /* block comments,
> and the per-input-type indent character (1 tab for
> .dts/.dtsi/.dtso). It is zero-violation on the current tree and
> runs as part of dt_binding_check_one, so no new warnings appear
> in `make dt_binding_check`.
> 
> Strict mode adds indent unit and depth consistency; blank-line
> policy (no consecutive blanks or blanks at body edges; required
> blank line before each child node and before "status"); property
> ordering by canonical bucket (compatible, reg/reg-names, ranges,
> standard, vendor, status) with declarative within-bucket pairing
> rules (<x>-names follows <x>, pinctrl-names follows the last
> pinctrl-N) and natural-sort fallback; sibling node ordering by
> unit address or natural-sort name; line length (80 columns);
> continuation alignment of multi-line property values under the
> first '<' or '"' after the '='; lowercase hex literals and unit
> addresses; no whitespace padding inside <...>; closing-brace
> placement; and unused-label detection (skipped for .dtsi/.dtso
> since labels there are exported to includers/applies-to).
> Together these constrain a DT structure to a single canonical
> rendering modulo the author's choice of when to wrap properties
> for readability. Comments are intentionally out of scope. Strict
> mode is opt-in, intended for use by checkpatch.pl in a follow-up
> series.
> 
> The tool reads file paths from @argfile and parallelises across
> CPUs via -j N. With no -j given it picks up $PARALLELISM (set by
> scripts/jobserver-exec from the GNU make jobserver) and falls
> back to os.cpu_count() otherwise. Running as one Python
> invocation amortises the ruamel.yaml import across the whole
> tree -- ~2s on a 32-CPU host vs ~28s sequential. ruamel.yaml is
> the only non-stdlib dependency, already required by dtschema.
> 
> A selftest under scripts/dtc/dt-style-selftest/ pairs good/ and
> bad/ fixtures with expected output so rule behaviour can be
> exercised independently of the full tree via the
> dt_style_selftest top-level make target.
> ---
> v1: https://lore.kernel.org/all/cover.1776700167.git.daniel@makrotopia.org/
> v2: https://lore.kernel.org/all/cover.1777471439.git.daniel@makrotopia.org/
> v3: https://lore.kernel.org/all/cover.1778454442.git.daniel@makrotopia.org/
> v4: https://lore.kernel.org/all/cover.1779472837.git.daniel@makrotopia.org/
> 
> Changes since v4:
>  - dt-check-style: parser robustness fixes from a sashiko.dev
>    AI review (multi-line CPP macros, "/* ... */ code" on one
>    line, "}; };" depth tracking, malformed unit addresses,
>    labels inside strings and on digit-leading node names,
>    unclosed /* on PROPERTY lines)
>  - dt-check-style: new relaxed-mode rule unclosed-block-comment
>  - new patch: scripts/jobserver-exec propagates child exit
>    status (prereq so chk_style errors stay reported)
>  - selftest: add fixtures covering the parser fixes
>  - selftest: move SPDX header to "// SPDX-..." on line 1 in
>    the three .dts fixtures (checkpatch)
> 
> Changes since v3:
>  - dt-check-style: accept node and property names that begin
>    with a digit (the DT spec permits names like 1wire@10)
>  - dt-check-style: strip trailing // and /* */ comments before
>    line classification, so a trailing comment on a node-open or
>    property line no longer causes misclassification
>  - dt-check-style: continuation-alignment compares display
>    columns (tabs expanded to 8) instead of raw string length,
>    removing many false positives on tab-indented .dts files
>  - dt-check-style: value-whitespace flags only whitespace directly
>    inside the brackets (after '<', before '>'), on single- and
>    multi-line cell lists; it no longer flags inter-value spacing,
>    which is often deliberate column alignment
>  - Makefile: build the @argfile with mktemp and remove it, so no
>    stale .tmp_.dt-style.checked is left in the build tree
>  - run.sh: drop bash-only process substitution (POSIX sh now)
>    and check the checker's exit status
>  - selftest: add fixtures for the above (digit-leading nodes,
>    trailing comments, multi-line cell arrays, tab+space aligned
>    continuations) and update yaml-value-ws for the reworked
>    value-whitespace rule
> 
> Changes since v2:
>  - route findings to stderr so a quiet dt_binding_check produces
>    no output (Rob)
>  - switch the Makefile recipe from mktemp to Kbuild's
>    $(tmp-target) so build output stays inside the build folder
>    (Nathan)
>  - collapse the recipe's exit-handling tail into the familiar
>    "&& touch $@ || true" pattern, matching cmd_chk_bindings;
>    keeps future warnings non-fatal (Rob, Nathan)
>  - explain in patch 3/4 why the recipe uses an explicit
>    $(PYTHON3) prefix where the neighbouring recipes call their
>    scripts directly (Rob)
>  - append a trailing newline to every expected/*.txt selftest
>    fixture (Rob)
>  - restore the trailing whitespace inside yaml-trailing-ws.yaml
>    that had been silently stripped during re-application, so the
>    selftest actually exercises the trailing-whitespace rule
> 
> Changes since v1:
>  - rules declared in a registry tagged relaxed/strict; default
>    relaxed mode is zero-violation on the current tree
>  - tool now also accepts .dts/.dtsi/.dtso files directly (with a
>    tab-indent variant); unused-labels skipped for .dtsi/.dtso
>    where labels are exported to includers/applies-to
>  - renamed dt-check-example-style -> dt-check-style
>  - added -j N with $PARALLELISM (jobserver) awareness
>  - dropped node-name [a-z0-9-] check (Rob: better as a meta-schema)
>  - property-order rebuilt around buckets + declarative pairing
>    rules plus natural-sort fallback
>  - added child-name-order, required-blank-lines, hex-case,
>    unit-address-format, value-whitespace, node-close-alone,
>    line-length and continuation-alignment to strict mode
>  - new selftest patch (Krzysztof: "would be happy to see at
>    least a few test cases for it")
> 
> Default relaxed mode is zero-violation on the current tree.
> 
> Strict-mode violation counts on a current tree (5506 YAML
> bindings, 6530 in-tree .dts/.dtsi/.dtso under arch/):
> 
>   rule                     yaml      dts
>   property-order          14554   245000
>   continuation-alignment   1857    93536
>   indent-consistent        1562    48720
>   required-blank-lines     1876    48563
>   line-length               105    26322
>   child-name-order          667    16821
>   mixed-indent-chars          0    13294
>   unused-labels            3611    11628
>   child-address-order        63     4076
>   blank-lines                82     1866
>   node-close-alone           38      774
>   value-whitespace           38      715
>   hex-case                   78      669
>   indent-unit-dts            --      190
>   unit-address-format         5       39
>   trailing-whitespace         0       10
>   indent-unit-strict       1492       --
>   indent-unit               179       --
> 
> (YAML and DTS columns reflect the rules that apply to each input
> type; e.g. indent-unit-strict is YAML-only since .dts files use
> tabs, indent-unit-dts is the equivalent DTS-only check.
> unused-labels is skipped for .dtsi/.dtso since labels there are
> exported to includers/applies-to.)
> 
> The script was written with generous help from Claude Opus 4.7,
> since my Python is even worse than my DTS coding style.
> 
> Daniel Golle (4):
>   dt-bindings: add DTS style checker
>   scripts/jobserver-exec: propagate child exit status
>   dt-bindings: wire style checker into dt_binding_check
>   dt-bindings: add self-test fixtures for style checker
> 
>  Documentation/devicetree/bindings/Makefile    |   19 +-
>  Makefile                                      |    6 +
>  scripts/dtc/dt-check-style                    | 1192 +++++++++++++++++
>  .../dtc/dt-style-selftest/bad/dts-spaces.dts  |   12 +
>  .../bad/yaml-child-addr-order.yaml            |   41 +
>  .../bad/yaml-child-name-order.yaml            |   37 +
>  .../bad/yaml-cont-align.yaml                  |   30 +
>  .../bad/yaml-digit-node-order.yaml            |   37 +
>  .../dt-style-selftest/bad/yaml-hex-case.yaml  |   29 +
>  .../bad/yaml-indent-strict.yaml               |   29 +
>  .../bad/yaml-label-in-string.yaml             |   30 +
>  .../bad/yaml-line-length.yaml                 |   29 +
>  .../bad/yaml-mixed-indent.yaml                |   29 +
>  .../bad/yaml-multi-close.yaml                 |   35 +
>  .../bad/yaml-node-close.yaml                  |   31 +
>  .../bad/yaml-prop-order.yaml                  |   29 +
>  .../bad/yaml-prop-pairing.yaml                |   33 +
>  .../bad/yaml-required-blank.yaml              |   33 +
>  .../dtc/dt-style-selftest/bad/yaml-tab.yaml   |   29 +
>  .../bad/yaml-trailing-comment.yaml            |   26 +
>  .../bad/yaml-trailing-ws.yaml                 |   29 +
>  .../bad/yaml-unclosed-comment.yaml            |   30 +
>  .../bad/yaml-unit-addr-prefix.yaml            |   29 +
>  .../dt-style-selftest/bad/yaml-unit-addr.yaml |   29 +
>  .../bad/yaml-unused-label.yaml                |   29 +
>  .../bad/yaml-value-ws-multiline.yaml          |   27 +
>  .../dt-style-selftest/bad/yaml-value-ws.yaml  |   29 +
>  .../expected/dts-spaces.dts.txt               |    2 +
>  .../expected/yaml-child-addr-order.yaml.txt   |    2 +
>  .../expected/yaml-child-name-order.yaml.txt   |    2 +
>  .../expected/yaml-cont-align.yaml.txt         |    2 +
>  .../expected/yaml-digit-node-order.yaml.txt   |    2 +
>  .../expected/yaml-hex-case.yaml.txt           |    2 +
>  .../expected/yaml-indent-strict.yaml.txt      |    2 +
>  .../expected/yaml-label-in-string.yaml.txt    |    2 +
>  .../expected/yaml-line-length.yaml.txt        |    2 +
>  .../expected/yaml-mixed-indent.yaml.txt       |    3 +
>  .../expected/yaml-multi-close.yaml.txt        |    3 +
>  .../expected/yaml-node-close.yaml.txt         |    2 +
>  .../expected/yaml-prop-order.yaml.txt         |    2 +
>  .../expected/yaml-prop-pairing.yaml.txt       |    3 +
>  .../expected/yaml-required-blank.yaml.txt     |    3 +
>  .../expected/yaml-tab.yaml.txt                |    2 +
>  .../expected/yaml-trailing-comment.yaml.txt   |    2 +
>  .../expected/yaml-trailing-ws.yaml.txt        |    2 +
>  .../expected/yaml-unclosed-comment.yaml.txt   |    2 +
>  .../expected/yaml-unit-addr-prefix.yaml.txt   |    2 +
>  .../expected/yaml-unit-addr.yaml.txt          |    2 +
>  .../expected/yaml-unused-label.yaml.txt       |    2 +
>  .../expected/yaml-value-ws-multiline.yaml.txt |    2 +
>  .../expected/yaml-value-ws.yaml.txt           |    2 +
>  .../dt-style-selftest/good/dts-cont-align.dts |   26 +
>  .../dtc/dt-style-selftest/good/dts-tab.dts    |   29 +
>  .../dt-style-selftest/good/yaml-4space.yaml   |   41 +
>  .../good/yaml-tricky-parsing.yaml             |   57 +
>  scripts/dtc/dt-style-selftest/run.sh          |   71 +
>  scripts/jobserver-exec                        |    4 +-
>  57 files changed, 2214 insertions(+), 4 deletions(-)
>  create mode 100755 scripts/dtc/dt-check-style
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/dts-spaces.dts
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-child-addr-order.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-child-name-order.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-cont-align.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-digit-node-order.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-hex-case.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-indent-strict.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-label-in-string.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-line-length.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-mixed-indent.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-multi-close.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-node-close.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-prop-order.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-prop-pairing.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-required-blank.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-tab.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-trailing-comment.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-trailing-ws.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-unclosed-comment.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-unit-addr-prefix.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-unit-addr.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-unused-label.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-value-ws-multiline.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/bad/yaml-value-ws.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/dts-spaces.dts.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-child-addr-order.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-child-name-order.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-cont-align.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-digit-node-order.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-hex-case.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-indent-strict.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-label-in-string.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-line-length.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-mixed-indent.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-multi-close.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-node-close.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-prop-order.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-prop-pairing.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-required-blank.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-tab.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-trailing-comment.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-trailing-ws.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-unclosed-comment.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-unit-addr-prefix.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-unit-addr.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-unused-label.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-value-ws-multiline.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/expected/yaml-value-ws.yaml.txt
>  create mode 100644 scripts/dtc/dt-style-selftest/good/dts-cont-align.dts
>  create mode 100644 scripts/dtc/dt-style-selftest/good/dts-tab.dts
>  create mode 100644 scripts/dtc/dt-style-selftest/good/yaml-4space.yaml
>  create mode 100644 scripts/dtc/dt-style-selftest/good/yaml-tricky-parsing.yaml
>  create mode 100755 scripts/dtc/dt-style-selftest/run.sh

Applied, thanks!

Rob

      parent reply	other threads:[~2026-06-10 18:38 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-27 19:31 [PATCH v5 0/4] dt-bindings: automated coding style check for DTS examples Daniel Golle
2026-05-27 19:32 ` [PATCH v5 1/4] dt-bindings: add DTS style checker Daniel Golle
2026-05-27 19:46   ` sashiko-bot
2026-06-09 16:19   ` Krzysztof Kozlowski
2026-05-27 19:32 ` [PATCH v5 2/4] scripts/jobserver-exec: propagate child exit status Daniel Golle
2026-06-09 17:08   ` Krzysztof Kozlowski
2026-05-27 19:32 ` [PATCH v5 3/4] dt-bindings: wire style checker into dt_binding_check Daniel Golle
2026-05-27 20:28   ` sashiko-bot
2026-05-27 19:32 ` [PATCH v5 4/4] dt-bindings: add self-test fixtures for style checker Daniel Golle
2026-06-10 18:38 ` Rob Herring [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260610183808.GA610395-robh@kernel.org \
    --to=robh@kernel.org \
    --cc=andriy.shevchenko@linux.intel.com \
    --cc=aurabindo.pillai@amd.com \
    --cc=blakejones@google.com \
    --cc=boris@bur.io \
    --cc=brgl@kernel.org \
    --cc=bryan.odonoghue@linaro.org \
    --cc=conor+dt@kernel.org \
    --cc=corbet@lwn.net \
    --cc=daniel@makrotopia.org \
    --cc=devicetree@vger.kernel.org \
    --cc=dlechner@baylibre.com \
    --cc=dsterba@suse.com \
    --cc=fdmanana@suse.com \
    --cc=gary.chang@realtek.com \
    --cc=gary@garyguo.net \
    --cc=jeff.hugo@oss.qualcomm.com \
    --cc=jorge.ramirez@oss.qualcomm.com \
    --cc=krzk+dt@kernel.org \
    --cc=linux-kbuild@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux@roeck-us.net \
    --cc=linux@weissschuh.net \
    --cc=masahiroy@kernel.org \
    --cc=mchehab+huawei@kernel.org \
    --cc=nathan@kernel.org \
    --cc=nsc@kernel.org \
    --cc=ojeda@kernel.org \
    --cc=olek2@wp.pl \
    --cc=pagadala.yesu.anjaneyulu@intel.com \
    --cc=pkshih@realtek.com \
    --cc=quic_hbasuthk@quicinc.com \
    --cc=richard.weiyang@gmail.com \
    --cc=rtl8821cerfe2@gmail.com \
    --cc=saravanak@kernel.org \
    --cc=tamird@kernel.org \
    --cc=tiwai@suse.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.