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