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 | ||
18 | source "${DIR}"/ktap_helpers.sh | |
19 | ||
20 | PDT=/proc/device-tree/ | |
21 | COMPAT_LIST="${DIR}"/compatible_list | |
22 | IGNORE_LIST="${DIR}"/compatible_ignore_list | |
23 | ||
24 | KSFT_PASS=0 | |
25 | KSFT_FAIL=1 | |
26 | KSFT_SKIP=4 | |
27 | ||
28 | ktap_print_header | |
29 | ||
30 | if [[ ! -d "${PDT}" ]]; then | |
31 | ktap_skip_all "${PDT} doesn't exist." | |
32 | exit "${KSFT_SKIP}" | |
33 | fi | |
34 | ||
35 | nodes_compatible=$( | |
36 | for node_compat in $(find ${PDT} -name compatible); do | |
37 | node=$(dirname "${node_compat}") | |
38 | # Check if node is available | |
39 | if [[ -e "${node}"/status ]]; then | |
40 | status=$(tr -d '\000' < "${node}"/status) | |
41 | [[ "${status}" != "okay" && "${status}" != "ok" ]] && continue | |
42 | fi | |
43 | echo "${node}" | sed -e 's|\/proc\/device-tree||' | |
44 | done | sort | |
45 | ) | |
46 | ||
47 | nodes_dev_bound=$( | |
48 | IFS=$'\n' | |
49 | for uevent in $(find /sys/devices -name uevent); do | |
50 | if [[ -d "$(dirname "${uevent}")"/driver ]]; then | |
51 | grep '^OF_FULLNAME=' "${uevent}" | sed -e 's|OF_FULLNAME=||' | |
52 | fi | |
53 | done | |
54 | ) | |
55 | ||
56 | num_tests=$(echo ${nodes_compatible} | wc -w) | |
57 | ktap_set_plan "${num_tests}" | |
58 | ||
59 | retval="${KSFT_PASS}" | |
60 | for node in ${nodes_compatible}; do | |
61 | if ! echo "${nodes_dev_bound}" | grep -E -q "(^| )${node}( |\$)"; then | |
62 | compatibles=$(tr '\000' '\n' < "${PDT}"/"${node}"/compatible) | |
63 | ||
64 | for compatible in ${compatibles}; do | |
65 | if grep -x -q "${compatible}" "${IGNORE_LIST}"; then | |
66 | continue | |
67 | fi | |
68 | ||
69 | if grep -x -q "${compatible}" "${COMPAT_LIST}"; then | |
70 | ktap_test_fail "${node}" | |
71 | retval="${KSFT_FAIL}" | |
72 | continue 2 | |
73 | fi | |
74 | done | |
75 | ktap_test_skip "${node}" | |
76 | else | |
77 | ktap_test_pass "${node}" | |
78 | fi | |
79 | ||
80 | done | |
81 | ||
82 | ktap_print_totals | |
83 | exit "${retval}" |