Commit | Line | Data |
---|---|---|
14571ab1 NP |
1 | #!/bin/bash |
2 | # SPDX-License-Identifier: GPL-2.0 | |
3 | # | |
4 | # Copyright (c) 2023 Collabora Ltd | |
5 | # | |
6 | # Based on Frank Rowand's dt_stat script. | |
7 | # | |
8 | # This script tests for devices that were declared on the Devicetree and are | |
9 | # expected to bind to a driver, but didn't. | |
10 | # | |
11 | # To achieve this, two lists are used: | |
12 | # * a list of the compatibles that can be matched by a Devicetree node | |
13 | # * a list of compatibles that should be ignored | |
14 | # | |
15 | ||
16 | DIR="$(dirname $(readlink -f "$0"))" | |
17 | ||
7c079e90 | 18 | source "${DIR}"/../kselftest/ktap_helpers.sh |
14571ab1 NP |
19 | |
20 | PDT=/proc/device-tree/ | |
21 | COMPAT_LIST="${DIR}"/compatible_list | |
22 | IGNORE_LIST="${DIR}"/compatible_ignore_list | |
23 | ||
14571ab1 NP |
24 | ktap_print_header |
25 | ||
26 | if [[ ! -d "${PDT}" ]]; then | |
27 | ktap_skip_all "${PDT} doesn't exist." | |
28 | exit "${KSFT_SKIP}" | |
29 | fi | |
30 | ||
31 | nodes_compatible=$( | |
6154fb9c NP |
32 | for node in $(find ${PDT} -type d); do |
33 | [ ! -f "${node}"/compatible ] && continue | |
14571ab1 NP |
34 | # Check if node is available |
35 | if [[ -e "${node}"/status ]]; then | |
36 | status=$(tr -d '\000' < "${node}"/status) | |
37 | [[ "${status}" != "okay" && "${status}" != "ok" ]] && continue | |
38 | fi | |
39 | echo "${node}" | sed -e 's|\/proc\/device-tree||' | |
40 | done | sort | |
41 | ) | |
42 | ||
43 | nodes_dev_bound=$( | |
44 | IFS=$'\n' | |
6154fb9c NP |
45 | for dev_dir in $(find /sys/devices -type d); do |
46 | [ ! -f "${dev_dir}"/uevent ] && continue | |
47 | [ ! -d "${dev_dir}"/driver ] && continue | |
48 | ||
49 | grep '^OF_FULLNAME=' "${dev_dir}"/uevent | sed -e 's|OF_FULLNAME=||' | |
14571ab1 NP |
50 | done |
51 | ) | |
52 | ||
53 | num_tests=$(echo ${nodes_compatible} | wc -w) | |
54 | ktap_set_plan "${num_tests}" | |
55 | ||
56 | retval="${KSFT_PASS}" | |
57 | for node in ${nodes_compatible}; do | |
58 | if ! echo "${nodes_dev_bound}" | grep -E -q "(^| )${node}( |\$)"; then | |
59 | compatibles=$(tr '\000' '\n' < "${PDT}"/"${node}"/compatible) | |
60 | ||
61 | for compatible in ${compatibles}; do | |
62 | if grep -x -q "${compatible}" "${IGNORE_LIST}"; then | |
63 | continue | |
64 | fi | |
65 | ||
66 | if grep -x -q "${compatible}" "${COMPAT_LIST}"; then | |
67 | ktap_test_fail "${node}" | |
68 | retval="${KSFT_FAIL}" | |
69 | continue 2 | |
70 | fi | |
71 | done | |
72 | ktap_test_skip "${node}" | |
73 | else | |
74 | ktap_test_pass "${node}" | |
75 | fi | |
76 | ||
77 | done | |
78 | ||
79 | ktap_print_totals | |
80 | exit "${retval}" |