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