1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3 4# protect against multiple inclusion 5if [ $FILE_CPUFREQ ]; then 6 return 0 7else 8 FILE_CPUFREQ=DONE 9fi 10 11source cpu.sh 12 13 14# $1: cpu 15cpu_should_have_cpufreq_directory() 16{ 17 if [ ! -d $CPUROOT/$1/cpufreq ]; then 18 printf "Warning: No cpufreq directory present for $1\n" 19 fi 20} 21 22cpu_should_not_have_cpufreq_directory() 23{ 24 if [ -d $CPUROOT/$1/cpufreq ]; then 25 printf "Warning: cpufreq directory present for $1\n" 26 fi 27} 28 29for_each_policy() 30{ 31 policies=$(ls $CPUFREQROOT| grep "policy[0-9].*") 32 for policy in $policies; do 33 $@ $policy 34 done 35} 36 37for_each_policy_concurrent() 38{ 39 policies=$(ls $CPUFREQROOT| grep "policy[0-9].*") 40 for policy in $policies; do 41 $@ $policy & 42 done 43} 44 45# $1: Path 46read_cpufreq_files_in_dir() 47{ 48 local files=`ls $1` 49 50 printf "Printing directory: $1\n\n" 51 52 for file in $files; do 53 if [ -f $1/$file ]; then 54 printf "$file:" 55 #file is readable ? 56 local rfile=$(ls -l $1/$file | awk '$1 ~ /^.*r.*/ { print $NF; }') 57 58 if [ ! -z $rfile ]; then 59 cat $1/$file 60 else 61 printf "$file is not readable\n" 62 fi 63 else 64 printf "\n" 65 read_cpufreq_files_in_dir "$1/$file" 66 fi 67 done 68 printf "\n" 69} 70 71 72read_all_cpufreq_files() 73{ 74 printf "** Test: Running ${FUNCNAME[0]} **\n\n" 75 76 read_cpufreq_files_in_dir $CPUFREQROOT 77 78 printf "%s\n\n" "------------------------------------------------" 79} 80 81 82# UPDATE CPUFREQ FILES 83 84# $1: directory path 85update_cpufreq_files_in_dir() 86{ 87 local files=`ls $1` 88 89 printf "Updating directory: $1\n\n" 90 91 for file in $files; do 92 if [ -f $1/$file ]; then 93 # file is readable and writable ? 94 local rwfile=$(ls -l $1/$file | awk '$1 ~ /^.*rw.*/ { print $NF; }') 95 96 if [ ! -z $rwfile ]; then 97 # scaling_setspeed is a special file and we 98 # should skip updating it 99 if [ $file != "scaling_setspeed" ]; then 100 local val=$(cat $1/$file) 101 printf "Writing $val to: $file\n" 102 echo $val > $1/$file 103 fi 104 fi 105 else 106 printf "\n" 107 update_cpufreq_files_in_dir "$1/$file" 108 fi 109 done 110 111 printf "\n" 112} 113 114# Update all writable files with their existing values 115update_all_cpufreq_files() 116{ 117 printf "** Test: Running ${FUNCNAME[0]} **\n\n" 118 119 update_cpufreq_files_in_dir $CPUFREQROOT 120 121 printf "%s\n\n" "------------------------------------------------" 122} 123 124 125# CHANGE CPU FREQUENCIES 126 127# $1: policy 128find_current_freq() 129{ 130 cat $CPUFREQROOT/$1/scaling_cur_freq 131} 132 133# $1: policy 134# $2: frequency 135set_cpu_frequency() 136{ 137 printf "Change frequency for $1 to $2\n" 138 echo $2 > $CPUFREQROOT/$1/scaling_setspeed 139} 140 141# $1: policy 142test_all_frequencies() 143{ 144 local filepath="$CPUFREQROOT/$1" 145 146 backup_governor $1 147 148 local found=$(switch_governor $1 "userspace") 149 if [ $found = 1 ]; then 150 printf "${FUNCNAME[0]}: userspace governor not available for: $1\n" 151 return; 152 fi 153 154 printf "Switched governor for $1 to userspace\n\n" 155 156 local freqs=$(cat $filepath/scaling_available_frequencies) 157 printf "Available frequencies for $1: $freqs\n\n" 158 159 # Set all frequencies one-by-one 160 for freq in $freqs; do 161 set_cpu_frequency $1 $freq 162 done 163 164 printf "\n" 165 166 restore_governor $1 167} 168 169# $1: loop count 170shuffle_frequency_for_all_cpus() 171{ 172 printf "** Test: Running ${FUNCNAME[0]} for $1 loops **\n\n" 173 174 for i in `seq 1 $1`; do 175 for_each_policy test_all_frequencies 176 done 177 printf "\n%s\n\n" "------------------------------------------------" 178} 179 180# Basic cpufreq tests 181cpufreq_basic_tests() 182{ 183 printf "*** RUNNING CPUFREQ SANITY TESTS ***\n" 184 printf "====================================\n\n" 185 186 count=$(count_cpufreq_managed_cpus) 187 if [ $count = 0 ]; then 188 ktap_exit_fail_msg "No cpu is managed by cpufreq core, exiting\n" 189 else 190 printf "CPUFreq manages: $count CPUs\n\n" 191 fi 192 193 # Detect & print which CPUs are not managed by cpufreq 194 print_unmanaged_cpus 195 196 # read/update all cpufreq files 197 read_all_cpufreq_files 198 update_all_cpufreq_files 199 200 # hotplug cpus 201 reboot_cpus 5 202 203 # Test all frequencies 204 shuffle_frequency_for_all_cpus 2 205 206 # Test all governors 207 shuffle_governors_for_all_cpus 1 208} 209 210# Suspend/resume 211# $1: "suspend" or "hibernate", $2: loop count 212do_suspend() 213{ 214 printf "** Test: Running ${FUNCNAME[0]}: Trying $1 for $2 loops **\n\n" 215 216 # Is the directory available 217 if [ ! -d $SYSFS/power/ -o ! -f $SYSFS/power/state ]; then 218 printf "$SYSFS/power/state not available\n" 219 return 1 220 fi 221 222 if [ $1 = "suspend" ]; then 223 filename="mem" 224 elif [ $1 = "hibernate" ]; then 225 filename="disk" 226 else 227 printf "$1 is not a valid option\n" 228 return 1 229 fi 230 231 if [ -n $filename ]; then 232 present=$(cat $SYSFS/power/state | grep $filename) 233 234 if [ -z "$present" ]; then 235 printf "Tried to $1 but $filename isn't present in $SYSFS/power/state\n" 236 return 1; 237 fi 238 239 for i in `seq 1 $2`; do 240 printf "Starting $1\n" 241 242 if [ "$3" = "rtc" ]; then 243 if ! command -v rtcwake &> /dev/null; then 244 printf "rtcwake could not be found, please install it.\n" 245 return 1 246 fi 247 248 rtcwake -m $filename -s 15 249 250 if [ $? -ne 0 ]; then 251 printf "Failed to suspend using RTC wake alarm\n" 252 return 1 253 fi 254 else 255 echo $filename > $SYSFS/power/state 256 fi 257 258 printf "Came out of $1\n" 259 260 printf "Do basic tests after finishing $1 to verify cpufreq state\n\n" 261 cpufreq_basic_tests 262 done 263 fi 264} 265