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