forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
kselftest: Add new test for detecting unprobed Devicetree devices
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 by the dt-extract-compatibles script, and is run as part of building 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>
- Loading branch information
Showing
6 changed files
with
160 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
compatible_list |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
PY3 = $(shell which python3 2>/dev/null) | ||
|
||
ifneq ($(PY3),) | ||
|
||
TEST_PROGS := test_unprobed_devices.sh | ||
TEST_GEN_FILES := compatible_list | ||
TEST_FILES := compatible_ignore_list ktap_helpers.sh | ||
|
||
include ../lib.mk | ||
|
||
$(OUTPUT)/compatible_list: | ||
$(top_srcdir)/scripts/dtc/dt-extract-compatibles -d $(top_srcdir) > $@ | ||
|
||
else | ||
|
||
all: no_py3_warning | ||
|
||
no_py3_warning: | ||
@echo "Missing python3. This test will be skipped." | ||
|
||
endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
simple-mfd |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
# SPDX-License-Identifier: GPL-2.0 | ||
# | ||
# Copyright (c) 2023 Collabora Ltd | ||
# | ||
# Helpers for outputting in KTAP format | ||
# | ||
KTAP_TESTNO=1 | ||
|
||
ktap_print_header() { | ||
echo "TAP version 13" | ||
} | ||
|
||
ktap_set_plan() { | ||
num_tests="$1" | ||
|
||
echo "1..$num_tests" | ||
} | ||
|
||
ktap_skip_all() { | ||
echo -n "1..0 # SKIP " | ||
echo $@ | ||
} | ||
|
||
__ktap_test() { | ||
result="$1" | ||
description="$2" | ||
directive="$3" # optional | ||
|
||
local directive_str= | ||
[[ ! -z "$directive" ]] && directive_str="# $directive" | ||
|
||
echo $result $KTAP_TESTNO $description $directive_str | ||
|
||
KTAP_TESTNO=$((KTAP_TESTNO+1)) | ||
} | ||
|
||
ktap_test_pass() { | ||
description="$1" | ||
|
||
result="ok" | ||
__ktap_test "$result" "$description" | ||
} | ||
|
||
ktap_test_skip() { | ||
description="$1" | ||
|
||
result="ok" | ||
directive="SKIP" | ||
__ktap_test "$result" "$description" "$directive" | ||
} | ||
|
||
ktap_test_fail() { | ||
description="$1" | ||
|
||
result="not ok" | ||
__ktap_test "$result" "$description" | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,79 @@ | ||
#!/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 | ||
# | ||
|
||
DIR="$(dirname $(readlink -f "$0"))" | ||
|
||
source "${DIR}"/ktap_helpers.sh | ||
|
||
PDT=/proc/device-tree/ | ||
COMPAT_LIST="${DIR}"/compatible_list | ||
IGNORE_LIST="${DIR}"/compatible_ignore_list | ||
|
||
KSFT_PASS=0 | ||
KSFT_FAIL=1 | ||
KSFT_SKIP=4 | ||
|
||
ktap_print_header | ||
|
||
if [[ ! -d "${PDT}" ]]; then | ||
ktap_skip_all "${PDT} doesn't exist." | ||
exit "${KSFT_SKIP}" | ||
fi | ||
|
||
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 | ||
) | ||
|
||
num_tests=$(echo ${nodes_compatible} | wc -w) | ||
ktap_set_plan "${num_tests}" | ||
|
||
retval="${KSFT_PASS}" | ||
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 | ||
continue | ||
fi | ||
|
||
if grep -x -q "${compatible}" "${COMPAT_LIST}"; then | ||
ktap_test_fail "${node}" | ||
retval="${KSFT_FAIL}" | ||
continue 2 | ||
fi | ||
done | ||
ktap_test_skip "${node}" | ||
else | ||
ktap_test_pass "${node}" | ||
fi | ||
|
||
done | ||
|
||
exit "${retval}" |