blob: e01d0dc21cbdf012adfef14115ede774edb5ce49 [file] [log] [blame]
Daniel Lezcanod84ec062011-07-26 14:38:59 +02001#!/bin/bash
2#
3# PM-QA validation test suite for the power management on ARM
4#
5# Copyright (C) 2011, Linaro Limited.
6#
7# This program is free software; you can redistribute it and/or
8# modify it under the terms of the GNU General Public License
9# as published by the Free Software Foundation; either version 2
10# of the License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU General Public License for more details.
16#
17# You should have received a copy of the GNU General Public License
18# along with this program; if not, write to the Free Software
19# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20#
21# Contributors:
22# Daniel Lezcano <daniel.lezcano@linaro.org> (IBM Corporation)
23# - initial API and implementation
24#
25
26CPU_PATH="/sys/devices/system/cpu"
27TEST_NAME=$(basename ${0%.sh})
28PREFIX=$TEST_NAME
29BLOCK=$(basename $(pwd))
30
31setprefix_cpu() {
32 PREFIX=$BLOCK:$TEST_NAME/$1
33}
34
35log_begin() {
36 printf "%-75s" "$PREFIX $@ ... "
37}
38
39log_end() {
40 printf "$*\n"
41}
42
43log_skip() {
44 log_begin "$@"
45 log_end "SKIP"
46}
47
48for_each_cpu() {
49
50 local func=$1
51 shift 1
52
53 cpus=$(ls $CPU_PATH | grep "cpu[0-9].*")
54
55 for cpu in $cpus; do
56 setprefix_cpu $cpu
57 $func $cpu $@
58 done
59
60 return 0
61}
62
63for_each_governor() {
64
65 local cpu=$1
66 local func=$2
67 local dirpath=$CPU_PATH/$cpu/cpufreq
68 local governors=$(cat $dirpath/scaling_available_governors)
69 shift 2
70
71 for governor in $governors; do
72 $func $cpu $governor $@
73 done
74
75 return 0
76}
77
78for_each_frequency() {
79
80 local cpu=$1
81 local func=$2
82 local dirpath=$CPU_PATH/$cpu/cpufreq
83 local frequencies=$(cat $dirpath/scaling_available_frequencies)
84 shift 2
85
86 for frequency in $frequencies; do
87 $func $cpu $frequency $@
88 done
89
90 return 0
91}
92
93set_governor() {
94
95 local cpu=$1
96 local dirpath=$CPU_PATH/$cpu/cpufreq/scaling_governor
97 local newgov=$2
98
99 echo $newgov > $dirpath
100}
101
102get_governor() {
103
104 local cpu=$1
105 local dirpath=$CPU_PATH/$cpu/cpufreq/scaling_governor
106
107 cat $dirpath
108}
109
110wait_latency() {
111 local cpu=$1
112 local dirpath=$CPU_PATH/$cpu/cpufreq
113 local latency=$(cat $dirpath/cpuinfo_transition_latency)
114 local nrfreq=$(cat $dirpath/scaling_available_frequencies | wc -w)
115
116 nrfreq=$((nrfreq + 1))
117 ../utils/nanosleep $(($nrfreq * $latency))
118}
119
120frequnit() {
121 local freq=$1
122 local ghz=$(echo "scale=1;($freq / 1000000)" | bc -l)
123 local mhz=$(echo "scale=1;($freq / 1000)" | bc -l)
124
125 res=$(echo "($ghz > 1.0)" | bc -l)
126 if [ "$res" = "1" ]; then
127 echo $ghz GHz
128 return 0
129 fi
130
131 res=$(echo "($mhz > 1.0)" | bc -l)
132 if [ "$res" = "1" ];then
133 echo $mhz MHz
134 return 0
135 fi
136
137 echo $freq KHz
138}
139
140set_frequency() {
141
142 local cpu=$1
143 local dirpath=$CPU_PATH/$cpu/cpufreq
144 local newfreq=$2
145 local setfreqpath=$dirpath/scaling_setspeed
146
147 echo $newfreq > $setfreqpath
148 wait_latency $cpu
149}
150
151get_frequency() {
152 local cpu=$1
153 local dirpath=$CPU_PATH/$cpu/cpufreq/scaling_cur_freq
154 cat $dirpath
155}
156
157get_max_frequency() {
158 local cpu=$1
159 local dirpath=$CPU_PATH/$cpu/cpufreq/scaling_max_freq
160 cat $dirpath
161}
162
163get_min_frequency() {
164 local cpu=$1
165 local dirpath=$CPU_PATH/$cpu/cpufreq/scaling_min_freq
166 cat $dirpath
167}
168
169check() {
170
171 local descr=$1
172 local func=$2
173 shift 2;
174
175 log_begin "checking $descr"
176
177 $func $@
178 if [ $? != 0 ]; then
179 log_end "FAIL"
180 return 1
181 fi
182
183 log_end "PASS"
184
185 return 0
186}
187
188check_cpufreq_files() {
189
190 local dirpath=$CPU_PATH/$1/cpufreq
191 shift 1
192
193 for i in $@; do
194 check "$i exists" "test -f" $dirpath/$i || return 1
195 done
196
197 return 0
198}
199
Daniel Lezcanoa7da5202011-08-05 15:01:42 +0200200check_sched_mc_files() {
201
202 local dirpath=$CPU_PATH
203
204 for i in $@; do
205 check "$i exists" "test -f" $dirpath/$i || return 1
206 done
207
208 return 0
209}
210
Daniel Lezcanod84ec062011-07-26 14:38:59 +0200211save_governors() {
212
213 governors_backup=
214 local index=0
215
216 for i in $(ls $CPU_PATH | grep "cpu[0-9].*"); do
217 governors_backup[$index]=$(cat $CPU_PATH/$i/cpufreq/scaling_governor)
218 index=$((index + 1))
219 done
220}
221
222restore_governors() {
223
224 local index=0
225 local oldgov=
226
227 for i in $(ls $CPU_PATH | grep "cpu[0-9].*"); do
228 oldgov=${governors_backup[$index]}
229 echo $oldgov > $CPU_PATH/$i/cpufreq/scaling_governor
230 index=$((index + 1))
231 done
232}
233
234save_frequencies() {
235
236 frequencies_backup=
237 local index=0
238 local cpus=$(ls $CPU_PATH | grep "cpu[0-9].*")
239 local cpu=
240
241 for cpu in $cpus; do
242 frequencies_backup[$index]=$(cat $CPU_PATH/$cpu/cpufreq/scaling_cur_freq)
243 index=$((index + 1))
244 done
245}
246
247restore_frequencies() {
248
249 local index=0
250 local oldfreq=
251 local cpus=$(ls $CPU_PATH | grep "cpu[0-9].*")
252
253 for cpu in $cpus; do
254 oldfreq=${frequencies_backup[$index]}
255 echo $oldfreq > $CPU_PATH/$cpu/cpufreq/scaling_setspeed
256 index=$((index + 1))
257 done
258}
259
260sigtrap() {
261 exit 255
262}