[RFC PATCH 2/2] kselftest: Add Devicetree unprobed devices test

Nícolas F. R. A. Prado posted 2 patches 2 years, 6 months ago
There is a newer version of this series
[RFC PATCH 2/2] kselftest: Add Devicetree unprobed devices test
Posted by Nícolas F. R. A. Prado 2 years, 6 months ago
Introduce a new kselftest to detect devices that were declared in the
Devicetree, and are expected to be probed by a driver, but weren't.

The test uses two lists: a list of compatibles that can match a
Devicetree device to a driver, and a list of compatibles that should be
ignored. The first is automatically generated from a script that parses
the kernel source using Coccinelle, and will be run as part of building
this test, therefore Coccinelle is a build-time dependency for this
test. The list of compatibles to ignore is a hand-crafted list to
capture the few exceptions of compatibles that are expected to match a
driver but not be bound to it.

Signed-off-by: Nícolas F. R. A. Prado <nfraprado@collabora.com>
---

 tools/testing/selftests/Makefile              |  1 +
 tools/testing/selftests/dt/.gitignore         |  1 +
 tools/testing/selftests/dt/Makefile           | 17 ++++++
 .../selftests/dt/compatible_ignore_list       |  3 +
 .../selftests/dt/test_unprobed_devices.sh     | 58 +++++++++++++++++++
 5 files changed, 80 insertions(+)
 create mode 100644 tools/testing/selftests/dt/.gitignore
 create mode 100644 tools/testing/selftests/dt/Makefile
 create mode 100644 tools/testing/selftests/dt/compatible_ignore_list
 create mode 100755 tools/testing/selftests/dt/test_unprobed_devices.sh

diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
index 8dca8acdb671..2fe992ca9294 100644
--- a/tools/testing/selftests/Makefile
+++ b/tools/testing/selftests/Makefile
@@ -16,6 +16,7 @@ TARGETS += drivers/dma-buf
 TARGETS += drivers/s390x/uvdevice
 TARGETS += drivers/net/bonding
 TARGETS += drivers/net/team
+TARGETS += dt
 TARGETS += efivarfs
 TARGETS += exec
 TARGETS += fchmodat2
diff --git a/tools/testing/selftests/dt/.gitignore b/tools/testing/selftests/dt/.gitignore
new file mode 100644
index 000000000000..f6476c9f2884
--- /dev/null
+++ b/tools/testing/selftests/dt/.gitignore
@@ -0,0 +1 @@
+compatible_list
diff --git a/tools/testing/selftests/dt/Makefile b/tools/testing/selftests/dt/Makefile
new file mode 100644
index 000000000000..fa5f3c12a659
--- /dev/null
+++ b/tools/testing/selftests/dt/Makefile
@@ -0,0 +1,17 @@
+COCCI = $(shell which spatch 2>/dev/null)
+
+ifneq ($(COCCI),)
+TEST_PROGS := test_unprobed_devices.sh
+TEST_GEN_FILES := compatible_list
+TEST_FILES := compatible_ignore_list
+
+include ../lib.mk
+
+$(OUTPUT)/compatible_list:
+	cd $(top_srcdir) && ./scripts/dtc/extract-matchable-dt-compatibles > $(OUTPUT)/compatible_list
+
+else
+
+all:
+
+endif
diff --git a/tools/testing/selftests/dt/compatible_ignore_list b/tools/testing/selftests/dt/compatible_ignore_list
new file mode 100644
index 000000000000..5d7fc6229428
--- /dev/null
+++ b/tools/testing/selftests/dt/compatible_ignore_list
@@ -0,0 +1,3 @@
+fixed-factor-clock
+fixed-clock
+simple-mfd
diff --git a/tools/testing/selftests/dt/test_unprobed_devices.sh b/tools/testing/selftests/dt/test_unprobed_devices.sh
new file mode 100755
index 000000000000..4741bedefd1f
--- /dev/null
+++ b/tools/testing/selftests/dt/test_unprobed_devices.sh
@@ -0,0 +1,58 @@
+#!/bin/bash
+# SPDX-License-Identifier: GPL-2.0
+#
+# Copyright (c) 2023 Collabora Ltd
+#
+# Based on Frank Rowand's dt_stat script.
+#
+# This script tests for devices that were declared on the Devicetree and are
+# expected to bind to a driver, but didn't.
+#
+# To achieve this, two lists are used:
+# * a list of the compatibles that can be matched by a Devicetree node
+# * a list of compatibles that should be ignored
+#
+PDT=/proc/device-tree/
+COMPAT_LIST=compatible_list
+IGNORE_LIST=compatible_ignore_list
+
+nodes_compatible=$(
+	for node_compat in $(find ${PDT} -name compatible); do
+		node=$(dirname "${node_compat}")
+		# Check if node is available
+		[[ -e "${node}"/status && $(tr -d '\000' < "${node}"/status) != "okay" ]] && continue
+		echo "${node}" | sed -e 's|\/proc\/device-tree||'
+	done | sort
+	)
+
+nodes_dev_bound=$(
+	IFS=$'\n'
+	for uevent in $(find /sys/devices -name uevent); do
+		if [[ -d "$(dirname "${uevent}")"/driver ]]; then
+			grep '^OF_FULLNAME=' "${uevent}" | sed -e 's|OF_FULLNAME=||'
+		fi
+	done
+	)
+
+retval=0
+for node in ${nodes_compatible}; do
+	if ! echo "${nodes_dev_bound}" | grep -E -q "(^| )${node}( |\$)"; then
+		compatibles=$(tr '\000' '\n' < "${PDT}"/"${node}"/compatible)
+
+		for compatible in ${compatibles}; do
+			if grep -x -q "${compatible}" "$IGNORE_LIST"; then
+				echo "DEBUG: Ignoring " "${node}"
+				continue
+			fi
+
+			if grep -x -q "${compatible}" "$COMPAT_LIST"; then
+				echo "BROKEN: " "${node}"
+				retval=1
+				continue 2
+			fi
+		done
+		echo "DEBUG: Skipping " "${node}"
+	fi
+done
+
+exit $retval
-- 
2.41.0

Re: [RFC PATCH 2/2] kselftest: Add Devicetree unprobed devices test
Posted by Mark Brown 2 years, 6 months ago
On Thu, Aug 10, 2023 at 04:23:51PM -0400, Nícolas F. R. A. Prado wrote:
> Introduce a new kselftest to detect devices that were declared in the
> Devicetree, and are expected to be probed by a driver, but weren't.
> 
> The test uses two lists: a list of compatibles that can match a
> Devicetree device to a driver, and a list of compatibles that should be
> ignored. The first is automatically generated from a script that parses
> the kernel source using Coccinelle, and will be run as part of building
> this test, therefore Coccinelle is a build-time dependency for this
> test. The list of compatibles to ignore is a hand-crafted list to
> capture the few exceptions of compatibles that are expected to match a
> driver but not be bound to it.

This doesn't appear to produce KTAP output which is going to make it
less useful for generic kselftest runners.
Re: [RFC PATCH 2/2] kselftest: Add Devicetree unprobed devices test
Posted by Nícolas F. R. A. Prado 2 years, 6 months ago
On Fri, Aug 11, 2023 at 02:54:56PM +0100, Mark Brown wrote:
> On Thu, Aug 10, 2023 at 04:23:51PM -0400, Nícolas F. R. A. Prado wrote:
> > Introduce a new kselftest to detect devices that were declared in the
> > Devicetree, and are expected to be probed by a driver, but weren't.
> > 
> > The test uses two lists: a list of compatibles that can match a
> > Devicetree device to a driver, and a list of compatibles that should be
> > ignored. The first is automatically generated from a script that parses
> > the kernel source using Coccinelle, and will be run as part of building
> > this test, therefore Coccinelle is a build-time dependency for this
> > test. The list of compatibles to ignore is a hand-crafted list to
> > capture the few exceptions of compatibles that are expected to match a
> > driver but not be bound to it.
> 
> This doesn't appear to produce KTAP output which is going to make it
> less useful for generic kselftest runners.

Right, I'm going to need to rewrite it in C for that, but since I already had
the shell script done, I decided to send it as is for the RFC, since I wanted to
get feedback on the general approach more than anything.

Thanks,
Nícolas
Re: [RFC PATCH 2/2] kselftest: Add Devicetree unprobed devices test
Posted by Mark Brown 2 years, 5 months ago
On Fri, Aug 11, 2023 at 10:16:52AM -0400, Nícolas F. R. A. Prado wrote:
> On Fri, Aug 11, 2023 at 02:54:56PM +0100, Mark Brown wrote:

> > This doesn't appear to produce KTAP output which is going to make it
> > less useful for generic kselftest runners.

> Right, I'm going to need to rewrite it in C for that, but since I already had
> the shell script done, I decided to send it as is for the RFC, since I wanted to
> get feedback on the general approach more than anything.

I'm not clear why KTAP would require C?
Re: [RFC PATCH 2/2] kselftest: Add Devicetree unprobed devices test
Posted by Nícolas F. R. A. Prado 2 years, 5 months ago
On Thu, Aug 17, 2023 at 01:26:05PM +0100, Mark Brown wrote:
> On Fri, Aug 11, 2023 at 10:16:52AM -0400, Nícolas F. R. A. Prado wrote:
> > On Fri, Aug 11, 2023 at 02:54:56PM +0100, Mark Brown wrote:
> 
> > > This doesn't appear to produce KTAP output which is going to make it
> > > less useful for generic kselftest runners.
> 
> > Right, I'm going to need to rewrite it in C for that, but since I already had
> > the shell script done, I decided to send it as is for the RFC, since I wanted to
> > get feedback on the general approach more than anything.
> 
> I'm not clear why KTAP would require C?

When going through the documentation there was only mention of the C headers for
the kselftest framework which outputs using the KTAP format, so I thought that
was the only acceptable option.

But in the meantime while looking through the other tests I saw you've recently
added ktap output to ftrace/ftracetest. The newly added test in
net/mptcp/mptcp_lib.sh also has its own helpers for outputting in KTAP. There
are also a couple other cases of this in python.

So I can definitely do the same for this test.

Thanks,
Nícolas
Re: [RFC PATCH 2/2] kselftest: Add Devicetree unprobed devices test
Posted by Mark Brown 2 years, 5 months ago
On Thu, Aug 17, 2023 at 12:17:38PM -0400, Nícolas F. R. A. Prado wrote:
> On Thu, Aug 17, 2023 at 01:26:05PM +0100, Mark Brown wrote:

> > I'm not clear why KTAP would require C?

> When going through the documentation there was only mention of the C headers for
> the kselftest framework which outputs using the KTAP format, so I thought that
> was the only acceptable option.

> But in the meantime while looking through the other tests I saw you've recently
> added ktap output to ftrace/ftracetest. The newly added test in
> net/mptcp/mptcp_lib.sh also has its own helpers for outputting in KTAP. There
> are also a couple other cases of this in python.

> So I can definitely do the same for this test.

Right, KTAP is a format specification for what appears on stdout - how
that output is generated is immaterial.  It's just that most tests are
written in C so that's where the helpers are.