xref: /linux/tools/testing/selftests/cpufreq/main.sh (revision 0b631ed3ce922b34dad4938215f84e5321f7e524)
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}"
219