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