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 16DIR="$(dirname $(readlink -f "$0"))" 17 18source "${DIR}"/../kselftest/ktap_helpers.sh 19 20PDT=/proc/device-tree/ 21COMPAT_LIST="${DIR}"/compatible_list 22IGNORE_LIST="${DIR}"/compatible_ignore_list 23 24ktap_print_header 25 26if [[ ! -d "${PDT}" ]]; then 27 ktap_skip_all "${PDT} doesn't exist." 28 exit "${KSFT_SKIP}" 29fi 30 31nodes_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 56nodes_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 66num_tests=$(echo ${nodes_compatible} | wc -w) 67ktap_set_plan "${num_tests}" 68 69retval="${KSFT_PASS}" 70for 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 90done 91 92ktap_print_totals 93exit "${retval}" 94