xref: /linux/tools/testing/selftests/cpufreq/governor.sh (revision a5778046a02570fd23bdf0b48dce330237d1996c)
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3#
4# Test governors
5
6# protect against multiple inclusion
7if [ $FILE_GOVERNOR ]; then
8	return 0
9else
10	FILE_GOVERNOR=DONE
11fi
12
13source cpu.sh
14source cpufreq.sh
15
16CUR_GOV=
17CUR_FREQ=
18
19# Per-policy backup, keyed by policy so multiple policies can be saved at once
20# (backup_governor/restore_governor also keep CUR_GOV/CUR_FREQ for callers that
21# read them directly).
22declare -A SAVED_GOVERNORS
23declare -A SAVED_FREQS
24
25# Find governor's directory path
26# $1: policy, $2: governor
27find_gov_directory()
28{
29	if [ -d $CPUFREQROOT/$2 ]; then
30		printf "$CPUFREQROOT/$2\n"
31	elif [ -d $CPUFREQROOT/$1/$2 ]; then
32		printf "$CPUFREQROOT/$1/$2\n"
33	else
34		printf "INVALID\n"
35	fi
36}
37
38# $1: policy
39find_current_governor()
40{
41	cat $CPUFREQROOT/$1/scaling_governor
42}
43
44# $1: policy
45backup_governor()
46{
47	CUR_GOV=$(find_current_governor $1)
48	SAVED_GOVERNORS[$1]=$CUR_GOV
49
50	printf "Governor backup done for $1: $CUR_GOV\n"
51
52	if [ $CUR_GOV == "userspace" ]; then
53		CUR_FREQ=$(find_current_freq $1)
54		SAVED_FREQS[$1]=$CUR_FREQ
55		printf "Governor frequency backup done for $1: $CUR_FREQ\n"
56	fi
57
58	printf "\n"
59}
60
61# $1: policy
62restore_governor()
63{
64	CUR_GOV=${SAVED_GOVERNORS[$1]}
65	__switch_governor $1 $CUR_GOV
66
67	printf "Governor restored for $1 to $CUR_GOV\n"
68
69	if [ $CUR_GOV == "userspace" ]; then
70		CUR_FREQ=${SAVED_FREQS[$1]}
71		set_cpu_frequency $1 $CUR_FREQ
72		printf "Governor frequency restored for $1: $CUR_FREQ\n"
73	fi
74
75	printf "\n"
76}
77
78# Save/restore governors for every policy at once
79save_all_governors()
80{
81	for_each_policy backup_governor
82}
83
84restore_all_governors()
85{
86	for_each_policy restore_governor
87}
88
89# param:
90# $1: policy, $2: governor
91__switch_governor()
92{
93	echo $2 > $CPUFREQROOT/$1/scaling_governor
94}
95
96# param:
97# $1: cpu, $2: governor
98__switch_governor_for_cpu()
99{
100	echo $2 > $CPUROOT/$1/cpufreq/scaling_governor
101}
102
103# SWITCH GOVERNORS
104
105# $1: cpu, $2: governor
106switch_governor()
107{
108	local filepath=$CPUFREQROOT/$1/scaling_available_governors
109
110	# check if governor is available
111	local found=$(cat $filepath | grep $2 | wc -l)
112	if [ $found = 0 ]; then
113		echo 1;
114		return
115	fi
116
117	__switch_governor $1 $2
118	echo 0;
119}
120
121# $1: policy, $2: governor
122switch_show_governor()
123{
124	# switch governor
125	__switch_governor $1 $2
126
127	printf "\nSwitched governor for $1 to $2\n\n"
128
129	if [ $2 == "userspace" -o $2 == "powersave" -o $2 == "performance" ]; then
130		printf "No files to read for $2 governor\n\n"
131		return
132	fi
133
134	# show governor files
135	local govpath=$(find_gov_directory $1 $2)
136	read_cpufreq_files_in_dir $govpath
137}
138
139# $1: function to be called, $2: policy
140call_for_each_governor()
141{
142	local filepath=$CPUFREQROOT/$2/scaling_available_governors
143
144	# Exit if cpu isn't managed by cpufreq core
145	if [ ! -f $filepath ]; then
146		return;
147	fi
148
149	backup_governor $2
150
151	local governors=$(cat $filepath)
152	printf "Available governors for $2: $governors\n"
153
154	for governor in $governors; do
155		$1 $2 $governor
156	done
157
158	restore_governor $2
159}
160
161# $1: loop count
162shuffle_governors_for_all_cpus()
163{
164	printf "** Test: Running ${FUNCNAME[0]} for $1 loops **\n\n"
165
166	for i in `seq 1 $1`; do
167		for_each_policy call_for_each_governor switch_show_governor
168	done
169	printf "%s\n\n" "------------------------------------------------"
170}
171