[RFC] CI testing of device-tree .dts files

Paul Spooren mail at aparcar.org
Wed Jul 15 04:44:12 EDT 2020


Hi all,

I played today a bit with dt-schema[0] which allows to validate 
device-tree schema files via something called json-schema[1], a schema 
description written in, *drums*, yaml. Ideally vendors specify their 
hardware in the Kernel[2] and dt-schema validates each .dts file added 
to OpenWrt. The output for the TP-Link 4300 v1 looks currently like the 
following:

user at dawn:~/src/openwrt/openwrt$ dt-validate -n -s 
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/linux-5.4.51/Documentation/devicetree/bindings/processed-schema.yaml 
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml 

/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:266:15: 
ahb: pcie-controller at 180c0000:ranges: [[33554432, 0, 268435456, 
268435456, 0, 67108864, 16777216, 0, 0, 0, 0, 1]] is not valid under any 
of the given schemas (Possible causes of the failure):
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:266:15: 
ahb: pcie-controller at 180c0000:ranges: [[33554432, 0, 268435456, 
268435456, 0, 67108864, 16777216, 0, 0, 0, 0, 1]] is not of type 'boolean'
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:266:16: 
ahb: pcie-controller at 180c0000:ranges:0: [33554432, 0, 268435456, 
268435456, 0, 67108864, 16777216, 0, 0, 0, 0, 1] is too long

/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml: 
uart at 18020000: $nodename:0: 'uart at 18020000' does not match 
'^serial(@[0-9a-f,]+)*$'
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:60:9: 
pinmux at 1804002c: '#address-cells' is a dependency of '#size-cells'
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml: 
uart at 18500000: $nodename:0: 'uart at 18500000' does not match 
'^serial(@[0-9a-f,]+)*$'
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml: 
eth at 19000000: $nodename:0: 'eth at 19000000' does not match '^ethernet(@.*)?$'
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:109:19: 
eth at 19000000: compatible: ['qca,ar9340-eth', 'syscon'] is not valid 
under any of the given schemas (Possible causes of the failure):
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:109:19: 
eth at 19000000: compatible: ['qca,ar9340-eth', 'syscon'] is too long

/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml: 
eth at 1a000000: $nodename:0: 'eth at 1a000000' does not match '^ethernet(@.*)?$'
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:140:19: 
eth at 1a000000: compatible: ['qca,ar9340-eth', 'syscon'] is not valid 
under any of the given schemas (Possible causes of the failure):
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:140:19: 
eth at 1a000000: compatible: ['qca,ar9340-eth', 'syscon'] is too long

/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:193:7: 
usb at 1b000000: '#address-cells', '#size-cells', 'caps-offset', 'port at 1', 
'reset-names' do not match any of the regexes: 'pinctrl-[0-9]+'
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:200:19: 
usb at 1b000000: phy-names:0: 'usb' was expected
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:193:7: 
usb at 1b000000: '#address-cells', '#size-cells', 'caps-offset', 'port at 1', 
'reset-names' do not match any of the regexes: 'pinctrl-[0-9]+'
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:200:19: 
usb at 1b000000: phy-names:0: 'usb' was expected
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:320:5: 
leds: 'qss', 'system', 'usb1', 'usb2', 'wlan2g' do not match any of the 
regexes: '(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:343:5: 
ath9k-leds: 'wlan5g' does not match any of the regexes: 
'(^led-[0-9a-f]$|led)', 'pinctrl-[0-9]+'
/home/user/src/openwrt/openwrt/build_dir/target-mips_24kc_musl/linux-ath79_generic/image-ar9344_tplink_tl-wdr4300-v1.dtb.yaml:362:7: 
gpio_usb1_power: 'gpio-export,name', 'gpio-export,output' do not match 
any of the regexes: '^#.*', 
'^(at25|devbus|dmacap|dsa|exynos|gpio-fan|gpio|gpmc|hdmi|i2c-gpio),.*', 
'^(keypad|m25p|max8952|max8997|max8998|mpmc),.*', 
'^(pinctrl-single|#pinctrl-single|PowerPC),.*', 
'^(pl022|pxa-mmc|rcar_sound|rotary-encoder|s5m8767|sdhci),.*', 
'^(simple-audio-card|simple-graph-card|st-plgpio|st-spics|ts),.*', 
'^GEFanuc,.*', '^ORCL,.*', '^SUNW,.*', 
'^[a-zA-Z0-9#_][a-zA-Z0-9+\\-._@]{0,63}$', 
'^[a-zA-Z0-9+\\-._]*@[0-9a-zA-Z,]*$', '^abilis,.*', '^abracon,.*', 
'^acme,.*', '^actions,.*', '^active-semi,.*', '^ad,.*', '^adafruit,.*', 
'^adapteva,.*', '^adaptrum,.*', '^adh,.*', '^adi,.*', '^advantech,.*', 
'^aeroflexgaisler,.*', '^al,.*', '^allegro,.*', '^allo,.*', 
'^allwinner,.*', '^alphascale,.*', '^altr,.*', '^amarula,.*', 
'^amazon,.*', '^amcc,.*', '^amd,.*', '^amediatech,.*', '^amlogic,.*', 
'^ampire,.*', '^ams,.*', '^amstaos,.*', '^analogix,.*', '^andestech,.*', 
'^anvo,.*', '^apm,.*', '^aptina,.*', '^arasan,.*', '^archermind,.*', 
'^arctic,.*', '^arcx,.*', '^aries,.*', '^arm,.*', '^armadeus,.*', 
'^arrow,.*', '^artesyn,.*', '^asahi-kasei,.*', '^aspeed,.*', '^asus,.*', 
'^atlas,.*', '^atmel,.*', '^auo,.*', '^auvidea,.*', '^avago,.*', 
'^avia,.*', '^avic,.*', '^avnet,.*', '^axentia,.*', '^axis,.*', 
'^azoteq,.*', '^azw,.*', '^bananapi,.*', '^bhf,.*', '^bitmain,.*', 
'^boe,.*', '^bosch,.*', '^boundary,.*', '^brcm,.*', '^bticino,.*', 
'^buffalo,.*', '^bur,.*', '^calxeda,.*', '^capella,.*', '^cascoda,.*', 
'^catalyst,.*', '^cavium,.*', '^cdns,.*', '^cdtech,.*', '^ceva,.*', 
'^chipidea,.*', '^chipone,.*', '^chipspark,.*', '^chrp,.*', 
'^chunghwa,.*', '^chuwi,.*', '^ciaa,.*', '^cirrus,.*', 
'^cloudengines,.*', '^cnm,.*', '^cnxt,.*', '^colorfly,.*', 
'^compulab,.*', '^corpro,.*', '^cortina,.*', '^cosmic,.*', '^crane,.*', 
'^creative,.*', '^crystalfontz,.*', '^csky,.*', '^csq,.*', 
'^cubietech,.*', '^cypress,.*', '^cznic,.*', '^dallas,.*', 
'^dataimage,.*', '^davicom,.*', '^delta,.*', '^denx,.*', 
'^devantech,.*', '^dh,.*', '^difrnce,.*', '^digi,.*', '^digilent,.*', 
'^dioo,.*', '^dlc,.*', '^dlg,.*', '^dlink,.*', '^dmo,.*', 
'^domintech,.*', '^dongwoon,.*', '^dptechnics,.*', '^dragino,.*', 
'^dserve,.*', '^ea,.*', '^ebs-systart,.*', '^ebv,.*', '^eckelmann,.*', 
'^edt,.*', '^eeti,.*', '^einfochips,.*', '^elan,.*', '^elgin,.*', 
'^embest,.*', '^emlid,.*', '^emmicro,.*', '^empire-electronix,.*', 
'^emtrion,.*', '^endless,.*', '^energymicro,.*', '^engicam,.*', 
'^epcos,.*', '^epfl,.*', '^epson,.*', '^esp,.*', '^est,.*', '^ettus,.*', 
'^eukrea,.*', '^everest,.*', '^everspin,.*', '^evervision,.*', 
'^exar,.*', '^excito,.*', '^ezchip,.*', '^facebook,.*', '^fairphone,.*', 
'^faraday,.*', '^fastrax,.*', '^fcs,.*', '^feiyang,.*', '^firefly,.*', 
'^focaltech,.*', '^friendlyarm,.*', '^fsl,.*', '^fujitsu,.*', 
'^gateworks,.*', '^gcw,.*', '^ge,.*', '^geekbuying,.*', '^gef,.*', 
'^gemei,.*', '^geniatech,.*', '^giantec,.*', '^giantplus,.*', 
'^globalscale,.*', '^globaltop,.*', '^gmt,.*', '^goodix,.*', 
'^google,.*', '^grinn,.*', '^grmn,.*', '^gumstix,.*', '^gw,.*', 
'^hannstar,.*', '^haoyu,.*', '^hardkernel,.*', '^hideep,.*', 
'^himax,.*', '^hisilicon,.*', '^hit,.*', '^hitex,.*', '^holt,.*', 
'^holtek,.*', '^honeywell,.*', '^hoperun,.*', '^hp,.*', '^hsg,.*', 
'^hugsun,.*', '^hwacom,.*', '^hyundai,.*', '^i2se,.*', '^ibm,.*', 
'^icplus,.*', '^idt,.*', '^ifi,.*', '^ilitek,.*', '^img,.*', 
'^incircuit,.*', '^inet-tek,.*', '^infineon,.*', '^inforce,.*', 
'^ingenic,.*', '^innolux,.*', '^inside-secure,.*', '^inspur,.*', 
'^intel,.*', '^intercontrol,.*', '^invensense,.*', '^inversepath,.*', 
'^iom,.*', '^isee,.*', '^isil,.*', '^issi,.*', '^itead,.*', '^iwave,.*', 
'^jdi,.*', '^jedec,.*', '^jesurun,.*', '^jianda,.*', '^karo,.*', 
'^keithkoep,.*', '^keymile,.*', '^khadas,.*', '^kiebackpeter,.*', 
'^kinetic,.*', '^kingdisplay,.*', '^kingnovel,.*', '^kionix,.*', 
'^kobo,.*', '^koe,.*', '^kontron,.*', '^kosagi,.*', '^kyo,.*', 
'^lacie,.*', '^laird,.*', '^lamobo,.*', '^lantiq,.*', '^lattice,.*', 
'^leez,.*', '^lego,.*', '^lemaker,.*', '^lenovo,.*', '^lg,.*', 
'^lgphilips,.*', '^libretech,.*', '^licheepi,.*', '^linaro,.*', 
'^linksprite,.*', '^linksys,.*', '^linux,.*', '^linx,.*', '^lltc,.*', 
'^logicpd,.*', '^longcheer,.*', '^lsi,.*', '^lwn,.*', '^macnica,.*', 
'^mapleboard,.*', '^marvell,.*', '^maxbotix,.*', '^maxim,.*', 
'^mbvl,.*', '^mcube,.*', '^meas,.*', '^mecer,.*', '^mediatek,.*', 
'^megachips,.*', '^mele,.*', '^melexis,.*', '^melfas,.*', 
'^mellanox,.*', '^memsic,.*', '^menlo,.*', '^merrii,.*', '^micrel,.*', 
'^microchip,.*', '^microcrystal,.*', '^micron,.*', '^microsoft,.*', 
'^mikroe,.*', '^miniand,.*', '^minix,.*', '^miramems,.*', 
'^mitsubishi,.*', '^mosaixtech,.*', '^motorola,.*', '^moxa,.*', 
'^mpl,.*', '^mqmaker,.*', '^mscc,.*', '^msi,.*', '^mti,.*', 
'^multi-inno,.*', '^mundoreader,.*', '^murata,.*', '^mxicy,.*', 
'^myir,.*', '^national,.*', '^nec,.*', '^neonode,.*', '^netgear,.*', 
'^netlogic,.*', '^netron-dy,.*', '^netxeon,.*', '^newhaven,.*', 
'^nexbox,.*', '^nextthing,.*', '^ni,.*', '^nintendo,.*', '^nlt,.*', 
'^nokia,.*', '^nordic,.*', '^novtech,.*', '^nutsboard,.*', 
'^nuvoton,.*', '^nvd,.*', '^nvidia,.*', '^nxp,.*', '^oceanic,.*', 
'^okaya,.*', '^oki,.*', '^olimex,.*', '^olpc,.*', '^onion,.*', 
'^onnn,.*', '^ontat,.*', '^opalkelly,.*', '^opencores,.*', 
'^openrisc,.*', '^option,.*', '^oranth,.*', '^orisetech,.*', 
'^ortustech,.*', '^osddisplays,.*', '^ovti,.*', '^oxsemi,.*', 
'^panasonic,.*', '^parade,.*', '^pda,.*', '^pericom,.*', 
'^pervasive,.*', '^phicomm,.*', '^phytec,.*', '^picochip,.*', 
'^pine64,.*', '^pineriver,.*', '^pixcir,.*', '^plantower,.*', 
'^plathome,.*', '^plda,.*', '^plx,.*', '^pni,.*', '^polaroid,.*', 
'^portwell,.*', '^poslab,.*', '^pov,.*', '^powervr,.*', '^primux,.*', 
'^probox2,.*', '^pulsedlight,.*', '^purism,.*', '^qca,.*', '^qcom,.*', 
'^qemu,.*', '^qi,.*', '^qiaodian,.*', '^qihua,.*', '^qnap,.*', 
'^radxa,.*', '^raidsonic,.*', '^ralink,.*', '^ramtron,.*', 
'^raspberrypi,.*', '^raydium,.*', '^rda,.*', '^realtek,.*', 
'^renesas,.*', '^rervision,.*', '^richtek,.*', '^ricoh,.*', 
'^rikomagic,.*', '^riscv,.*', '^rockchip,.*', '^rocktech,.*', 
'^rohm,.*', '^ronbo,.*', '^roofull,.*', '^samsung,.*', '^samtec,.*', 
'^sancloud,.*', '^sandisk,.*', '^sbs,.*', '^schindler,.*', 
'^seagate,.*', '^seirobotics,.*', '^semtech,.*', '^sensirion,.*', 
'^sensortek,.*', '^sff,.*', '^sgd,.*', '^sgx,.*', '^sharp,.*', 
'^shimafuji,.*', '^si-en,.*', '^si-linux,.*', '^sifive,.*', '^sigma,.*', 
'^sii,.*', '^sil,.*', '^silabs,.*', '^silead,.*', '^silergy,.*', 
'^siliconmitus,.*', '^simtek,.*', '^sinlinx,.*', '^sinovoip,.*', 
'^sipeed,.*', '^sirf,.*', '^sis,.*', '^sitronix,.*', '^skyworks,.*', 
'^smsc,.*', '^snps,.*', '^sochip,.*', '^socionext,.*', '^solidrun,.*', 
'^solomon,.*', '^sony,.*', '^spansion,.*', '^sprd,.*', '^sst,.*', 
'^st,.*', '^starry,.*', '^startek,.*', '^ste,.*', '^stericsson,.*', 
'^summit,.*', '^sunchip,.*', '^swir,.*', '^syna,.*', '^synology,.*', 
'^tbs,.*', '^tbs-biometrics,.*', '^tcg,.*', '^tcl,.*', '^technexion,.*', 
'^technologic,.*', '^techstar,.*', '^tempo,.*', '^terasic,.*', 
'^tfc,.*', '^thine,.*', '^ti,.*', '^tianma,.*', '^tlm,.*', '^tmt,.*', 
'^topeet,.*', '^toppoly,.*', '^toradex,.*', '^toshiba,.*', '^toumaz,.*', 
'^tpk,.*', '^tplink,.*', '^tpo,.*', '^tq,.*', '^tronfy,.*', 
'^tronsmart,.*', '^truly,.*', '^tsd,.*', '^tyan,.*', '^u-blox,.*', 
'^ubnt,.*', '^ucrobotics,.*', '^udoo,.*', '^uniwest,.*', '^upisemi,.*', 
'^urt,.*', '^usi,.*', '^utoo,.*', '^v3,.*', '^vamrs,.*', 
'^variscite,.*', '^via,.*', '^virtio,.*', '^vishay,.*', '^vitesse,.*', 
'^vivante,.*', '^vocore,.*', '^voipac,.*', '^vot,.*', '^vxt,.*', 
'^wd,.*', '^wetek,.*', '^wexler,.*', '^whwave,.*', '^wi2wi,.*', 
'^winbond,.*', '^winstar,.*', '^wits,.*', '^wlf,.*', '^wm,.*', 
'^wobo,.*', '^x-powers,.*', '^xes,.*', '^xillybus,.*', '^xlnx,.*', 
'^xunlong,.*', '^yones-toptech,.*', '^ysoft,.*', '^zarlink,.*', 
'^zeitec,.*', '^zidoo,.*', '^zii,.*', '^zte,.*', '^zyxel,.*'
[...]

The workflow is not super trivial but easily to cover by a CI:

* OpenWrt buildroot creates the .dtb files.
* `dtc` (device-tree-compiler) with YAML support (compiled with libyaml) 
converts the .dtb file to YAML.
* `dt-mk-schema` (part of dt-schema) compiles all bindings of the Kernel 
to a single file.
* `dt-validate` (part of dt-schema) then validates the file and prints a 
message similar to the one abve.

Ideally we have a CI which detects modified .dts files and validates 
them and complains at the submitter if anything is wrong. The question 
is if people (you) can actually make sense out of those information and 
may are willing to add additional validation schemas for new devices?

I'm happy to setup the CI part, but as this is my first day touching 
device-tree I'm not (yet) much of help at understanding or solving such 
warning.

Best,
Paul

[0]: https://github.com/robherring/dt-schema
[1]: https://json-schema.org/specification.html
[2]: 
https://github.com/torvalds/linux/tree/master/Documentation/devicetree/bindings




More information about the openwrt-devel mailing list