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