Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1#!/bin/bash
2# SPDX-License-Identifier: GPL-2.0
3
4source cpu.sh
5source cpufreq.sh
6source governor.sh
7source module.sh
8source special-tests.sh
9
10DIR="$(dirname $(readlink -f "$0"))"
11source "${DIR}"/../kselftest/ktap_helpers.sh
12
13FUNC=basic # do basic tests by default
14OUTFILE=cpufreq_selftest
15SYSFS=
16CPUROOT=
17CPUFREQROOT=
18
19helpme()
20{
21 printf "Usage: $0 [-h] [-todg args]
22 [-h <help>]
23 [-o <output-file-for-dump>]
24 [-t <basic: Basic cpufreq testing
25 suspend: suspend/resume,
26 hibernate: hibernate/resume,
27 suspend_rtc: suspend/resume back using the RTC wakeup alarm,
28 hibernate_rtc: hibernate/resume back using the RTC wakeup alarm,
29 modtest: test driver or governor modules. Only to be used with -d or -g options,
30 sptest1: Simple governor switch to produce lockdep.
31 sptest2: Concurrent governor switch to produce lockdep.
32 sptest3: Governor races, shuffle between governors quickly.
33 sptest4: CPU hotplugs with updates to cpufreq files.>]
34 [-d <driver's module name: only with \"-t modtest>\"]
35 [-g <governor's module name: only with \"-t modtest>\"]
36 \n"
37 exit "${KSFT_FAIL}"
38}
39
40prerequisite()
41{
42 msg="skip all tests:"
43
44 if [ $UID != 0 ]; then
45 ktap_skip_all "$msg must be run as root"
46 exit "${KSFT_SKIP}"
47 fi
48
49 taskset -p 01 $$
50
51 SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
52
53 if [ ! -d "$SYSFS" ]; then
54 ktap_skip_all "$msg sysfs is not mounted"
55 exit "${KSFT_SKIP}"
56 fi
57
58 CPUROOT=$SYSFS/devices/system/cpu
59 CPUFREQROOT="$CPUROOT/cpufreq"
60
61 if ! ls $CPUROOT/cpu* > /dev/null 2>&1; then
62 ktap_skip_all "$msg cpus not available in sysfs"
63 exit "${KSFT_SKIP}"
64 fi
65
66 if ! ls $CPUROOT/cpufreq > /dev/null 2>&1; then
67 ktap_skip_all "$msg cpufreq directory not available in sysfs"
68 exit "${KSFT_SKIP}"
69 fi
70}
71
72parse_arguments()
73{
74 while getopts ht:o:d:g: arg
75 do
76 case $arg in
77 h) # --help
78 helpme
79 ;;
80
81 t) # --func_type (Function to perform: basic, suspend, hibernate,
82 # suspend_rtc, hibernate_rtc, modtest, sptest1/2/3/4 (default: basic))
83 FUNC=$OPTARG
84 ;;
85
86 o) # --output-file (Output file to store dumps)
87 OUTFILE=$OPTARG
88 ;;
89
90 d) # --driver-mod-name (Name of the driver module)
91 DRIVER_MOD=$OPTARG
92 ;;
93
94 g) # --governor-mod-name (Name of the governor module)
95 GOVERNOR_MOD=$OPTARG
96 ;;
97
98 \?)
99 helpme
100 ;;
101 esac
102 done
103}
104
105do_test()
106{
107 # Check if CPUs are managed by cpufreq or not
108 count=$(count_cpufreq_managed_cpus)
109
110 if [ $count = 0 -a $FUNC != "modtest" ]; then
111 ktap_exit_fail_msg "No cpu is managed by cpufreq core, exiting"
112 fi
113
114 case "$FUNC" in
115 "basic")
116 cpufreq_basic_tests
117 ;;
118
119 "suspend")
120 do_suspend "suspend" 1
121 ;;
122
123 "hibernate")
124 do_suspend "hibernate" 1
125 ;;
126
127 "suspend_rtc")
128 do_suspend "suspend" 1 rtc
129 ;;
130
131 "hibernate_rtc")
132 do_suspend "hibernate" 1 rtc
133 ;;
134
135 "modtest")
136 # Do we have modules in place?
137 if [ -z $DRIVER_MOD ] && [ -z $GOVERNOR_MOD ]; then
138 ktap_exit_fail_msg "No driver or governor module passed with -d or -g"
139 fi
140
141 if [ $DRIVER_MOD ]; then
142 if [ $GOVERNOR_MOD ]; then
143 module_test $DRIVER_MOD $GOVERNOR_MOD
144 else
145 module_driver_test $DRIVER_MOD
146 fi
147 else
148 if [ $count = 0 ]; then
149 ktap_exit_fail_msg "No cpu is managed by cpufreq core, exiting"
150 fi
151
152 module_governor_test $GOVERNOR_MOD
153 fi
154 ;;
155
156 "sptest1")
157 simple_lockdep
158 ;;
159
160 "sptest2")
161 concurrent_lockdep
162 ;;
163
164 "sptest3")
165 governor_race
166 ;;
167
168 "sptest4")
169 hotplug_with_updates
170 ;;
171
172 *)
173 ktap_print_msg "Invalid [-f] function type"
174 helpme
175 ;;
176 esac
177}
178
179# clear dumps
180# $1: file name
181clear_dumps()
182{
183 echo "" > $1.txt
184 echo "" > $1.dmesg_cpufreq.txt
185 echo "" > $1.dmesg_full.txt
186}
187
188# $1: output file name
189dmesg_dumps()
190{
191 dmesg | grep cpufreq >> $1.dmesg_cpufreq.txt
192
193 # We may need the full logs as well
194 dmesg >> $1.dmesg_full.txt
195}
196
197ktap_print_header
198
199# Parse arguments
200parse_arguments $@
201
202ktap_set_plan 1
203
204# Make sure all requirements are met
205prerequisite
206
207# Run requested functions
208clear_dumps $OUTFILE
209do_test | tee -a $OUTFILE.txt
210if [ "${PIPESTATUS[0]}" -ne 0 ]; then
211 exit ${PIPESTATUS[0]};
212fi
213dmesg_dumps $OUTFILE
214
215ktap_test_pass "Completed successfully"
216
217ktap_print_totals
218exit "${KSFT_PASS}"