1 #!/bin/bash 2 # SPDX-License-Identifier: GPL-2.0 3 4 source cpu.sh 5 source cpufreq.sh 6 source governor.sh 7 source module.sh 8 source special-tests.sh 9 10 FUNC=basic # do basic tests by default 11 OUTFILE=cpufreq_selftest 12 SYSFS= 13 CPUROOT= 14 CPUFREQROOT= 15 16 # Kselftest framework requirement - SKIP code is 4. 17 ksft_skip=4 18 19 helpme() 20 { 21 printf "Usage: $0 [-h] [-todg args] 22 [-h <help>] 23 [-o <output-file-for-dump>] 24 [-t <basic: Basic cpufreq testing 25 suspend: suspend/resume, 26 hibernate: hibernate/resume, 27 modtest: test driver or governor modules. Only to be used with -d or -g options, 28 sptest1: Simple governor switch to produce lockdep. 29 sptest2: Concurrent governor switch to produce lockdep. 30 sptest3: Governor races, shuffle between governors quickly. 31 sptest4: CPU hotplugs with updates to cpufreq files.>] 32 [-d <driver's module name: only with \"-t modtest>\"] 33 [-g <governor's module name: only with \"-t modtest>\"] 34 \n" 35 exit 2 36 } 37 38 prerequisite() 39 { 40 msg="skip all tests:" 41 42 if [ $UID != 0 ]; then 43 echo $msg must be run as root >&2 44 exit $ksft_skip 45 fi 46 47 taskset -p 01 $$ 48 49 SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'` 50 51 if [ ! -d "$SYSFS" ]; then 52 echo $msg sysfs is not mounted >&2 53 exit 2 54 fi 55 56 CPUROOT=$SYSFS/devices/system/cpu 57 CPUFREQROOT="$CPUROOT/cpufreq" 58 59 if ! ls $CPUROOT/cpu* > /dev/null 2>&1; then 60 echo $msg cpus not available in sysfs >&2 61 exit 2 62 fi 63 64 if ! ls $CPUROOT/cpufreq > /dev/null 2>&1; then 65 echo $msg cpufreq directory not available in sysfs >&2 66 exit 2 67 fi 68 } 69 70 parse_arguments() 71 { 72 while getopts ht:o:d:g: arg 73 do 74 case $arg in 75 h) # --help 76 helpme 77 ;; 78 79 t) # --func_type (Function to perform: basic, suspend, hibernate, modtest, sptest1/2/3/4 (default: basic)) 80 FUNC=$OPTARG 81 ;; 82 83 o) # --output-file (Output file to store dumps) 84 OUTFILE=$OPTARG 85 ;; 86 87 d) # --driver-mod-name (Name of the driver module) 88 DRIVER_MOD=$OPTARG 89 ;; 90 91 g) # --governor-mod-name (Name of the governor module) 92 GOVERNOR_MOD=$OPTARG 93 ;; 94 95 \?) 96 helpme 97 ;; 98 esac 99 done 100 } 101 102 do_test() 103 { 104 # Check if CPUs are managed by cpufreq or not 105 count=$(count_cpufreq_managed_cpus) 106 107 if [ $count = 0 -a $FUNC != "modtest" ]; then 108 echo "No cpu is managed by cpufreq core, exiting" 109 exit 2; 110 fi 111 112 case "$FUNC" in 113 "basic") 114 cpufreq_basic_tests 115 ;; 116 117 "suspend") 118 do_suspend "suspend" 1 119 ;; 120 121 "hibernate") 122 do_suspend "hibernate" 1 123 ;; 124 125 "modtest") 126 # Do we have modules in place? 127 if [ -z $DRIVER_MOD ] && [ -z $GOVERNOR_MOD ]; then 128 echo "No driver or governor module passed with -d or -g" 129 exit 2; 130 fi 131 132 if [ $DRIVER_MOD ]; then 133 if [ $GOVERNOR_MOD ]; then 134 module_test $DRIVER_MOD $GOVERNOR_MOD 135 else 136 module_driver_test $DRIVER_MOD 137 fi 138 else 139 if [ $count = 0 ]; then 140 echo "No cpu is managed by cpufreq core, exiting" 141 exit 2; 142 fi 143 144 module_governor_test $GOVERNOR_MOD 145 fi 146 ;; 147 148 "sptest1") 149 simple_lockdep 150 ;; 151 152 "sptest2") 153 concurrent_lockdep 154 ;; 155 156 "sptest3") 157 governor_race 158 ;; 159 160 "sptest4") 161 hotplug_with_updates 162 ;; 163 164 *) 165 echo "Invalid [-f] function type" 166 helpme 167 ;; 168 esac 169 } 170 171 # clear dumps 172 # $1: file name 173 clear_dumps() 174 { 175 echo "" > $1.txt 176 echo "" > $1.dmesg_cpufreq.txt 177 echo "" > $1.dmesg_full.txt 178 } 179 180 # $1: output file name 181 dmesg_dumps() 182 { 183 dmesg | grep cpufreq >> $1.dmesg_cpufreq.txt 184 185 # We may need the full logs as well 186 dmesg >> $1.dmesg_full.txt 187 } 188 189 # Parse arguments 190 parse_arguments $@ 191 192 # Make sure all requirements are met 193 prerequisite 194 195 # Run requested functions 196 clear_dumps $OUTFILE 197 do_test >> $OUTFILE.txt 198 dmesg_dumps $OUTFILE 199