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