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