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}"/../kselftest/ktap_helpers.sh 19 20 PDT=/proc/device-tree/ 21 COMPAT_LIST="${DIR}"/compatible_list 22 IGNORE_LIST="${DIR}"/compatible_ignore_list 23 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=$( 32 for node in $(find ${PDT} -type d); do 33 [ ! -f "${node}"/compatible ] && continue 34 # Check if node is available 35 if [[ -e "${node}"/status ]]; then 36 status=$(tr -d '\000' < "${node}"/status) 37 if [[ "${status}" != "okay" && "${status}" != "ok" ]]; then 38 if [ -n "${disabled_nodes_regex}" ]; then 39 disabled_nodes_regex="${disabled_nodes_regex}|${node}" 40 else 41 disabled_nodes_regex="${node}" 42 fi 43 continue 44 fi 45 fi 46 47 # Ignore this node if one of its ancestors was disabled 48 if [ -n "${disabled_nodes_regex}" ]; then 49 echo "${node}" | grep -q -E "${disabled_nodes_regex}" && continue 50 fi 51 52 echo "${node}" | sed -e 's|\/proc\/device-tree||' 53 done | sort 54 ) 55 56 nodes_dev_bound=$( 57 IFS=$'\n' 58 for dev_dir in $(find /sys/devices -type d); do 59 [ ! -f "${dev_dir}"/uevent ] && continue 60 [ ! -d "${dev_dir}"/driver ] && continue 61 62 grep '^OF_FULLNAME=' "${dev_dir}"/uevent | sed -e 's|OF_FULLNAME=||' 63 done 64 ) 65 66 num_tests=$(echo ${nodes_compatible} | wc -w) 67 ktap_set_plan "${num_tests}" 68 69 retval="${KSFT_PASS}" 70 for node in ${nodes_compatible}; do 71 if ! echo "${nodes_dev_bound}" | grep -E -q "(^| )${node}( |\$)"; then 72 compatibles=$(tr '\000' '\n' < "${PDT}"/"${node}"/compatible) 73 74 for compatible in ${compatibles}; do 75 if grep -x -q "${compatible}" "${IGNORE_LIST}"; then 76 continue 77 fi 78 79 if grep -x -q "${compatible}" "${COMPAT_LIST}"; then 80 ktap_test_fail "${node}" 81 retval="${KSFT_FAIL}" 82 continue 2 83 fi 84 done 85 ktap_test_skip "${node}" 86 else 87 ktap_test_pass "${node}" 88 fi 89 90 done 91 92 ktap_print_totals 93 exit "${retval}"
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.