]>
Commit | Line | Data |
---|---|---|
e66d5b67 | 1 | #!/bin/bash |
b2441318 | 2 | # SPDX-License-Identifier: GPL-2.0 |
e66d5b67 VK |
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 | } | |
b03eaf8d VK |
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 | } |