xref: /OK3568_Linux_fs/kernel/tools/testing/selftests/cpufreq/module.sh (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun#!/bin/bash
2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0
3*4882a593Smuzhiyun#
4*4882a593Smuzhiyun# Modules specific tests cases
5*4882a593Smuzhiyun
6*4882a593Smuzhiyun# protect against multiple inclusion
7*4882a593Smuzhiyunif [ $FILE_MODULE ]; then
8*4882a593Smuzhiyun	return 0
9*4882a593Smuzhiyunelse
10*4882a593Smuzhiyun	FILE_MODULE=DONE
11*4882a593Smuzhiyunfi
12*4882a593Smuzhiyun
13*4882a593Smuzhiyunsource cpu.sh
14*4882a593Smuzhiyunsource cpufreq.sh
15*4882a593Smuzhiyunsource governor.sh
16*4882a593Smuzhiyun
17*4882a593Smuzhiyun# Check basic insmod/rmmod
18*4882a593Smuzhiyun# $1: module
19*4882a593Smuzhiyuntest_basic_insmod_rmmod()
20*4882a593Smuzhiyun{
21*4882a593Smuzhiyun	printf "** Test: Running ${FUNCNAME[0]} **\n\n"
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun	printf "Inserting $1 module\n"
24*4882a593Smuzhiyun	# insert module
25*4882a593Smuzhiyun	insmod $1
26*4882a593Smuzhiyun	if [ $? != 0 ]; then
27*4882a593Smuzhiyun		printf "Insmod $1 failed\n"
28*4882a593Smuzhiyun		exit;
29*4882a593Smuzhiyun	fi
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun	printf "Removing $1 module\n"
32*4882a593Smuzhiyun	# remove module
33*4882a593Smuzhiyun	rmmod $1
34*4882a593Smuzhiyun	if [ $? != 0 ]; then
35*4882a593Smuzhiyun		printf "rmmod $1 failed\n"
36*4882a593Smuzhiyun		exit;
37*4882a593Smuzhiyun	fi
38*4882a593Smuzhiyun
39*4882a593Smuzhiyun	printf "\n"
40*4882a593Smuzhiyun}
41*4882a593Smuzhiyun
42*4882a593Smuzhiyun# Insert cpufreq driver module and perform basic tests
43*4882a593Smuzhiyun# $1: cpufreq-driver module to insert
44*4882a593Smuzhiyun# $2: If we want to play with CPUs (1) or not (0)
45*4882a593Smuzhiyunmodule_driver_test_single()
46*4882a593Smuzhiyun{
47*4882a593Smuzhiyun	printf "** Test: Running ${FUNCNAME[0]} for driver $1 and cpus_hotplug=$2 **\n\n"
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun	if [ $2 -eq 1 ]; then
50*4882a593Smuzhiyun		# offline all non-boot CPUs
51*4882a593Smuzhiyun		for_each_non_boot_cpu offline_cpu
52*4882a593Smuzhiyun		printf "\n"
53*4882a593Smuzhiyun	fi
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun	# insert module
56*4882a593Smuzhiyun	printf "Inserting $1 module\n\n"
57*4882a593Smuzhiyun	insmod $1
58*4882a593Smuzhiyun	if [ $? != 0 ]; then
59*4882a593Smuzhiyun		printf "Insmod $1 failed\n"
60*4882a593Smuzhiyun		return;
61*4882a593Smuzhiyun	fi
62*4882a593Smuzhiyun
63*4882a593Smuzhiyun	if [ $2 -eq 1 ]; then
64*4882a593Smuzhiyun		# online all non-boot CPUs
65*4882a593Smuzhiyun		for_each_non_boot_cpu online_cpu
66*4882a593Smuzhiyun		printf "\n"
67*4882a593Smuzhiyun	fi
68*4882a593Smuzhiyun
69*4882a593Smuzhiyun	# run basic tests
70*4882a593Smuzhiyun	cpufreq_basic_tests
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun	# remove module
73*4882a593Smuzhiyun	printf "Removing $1 module\n\n"
74*4882a593Smuzhiyun	rmmod $1
75*4882a593Smuzhiyun	if [ $? != 0 ]; then
76*4882a593Smuzhiyun		printf "rmmod $1 failed\n"
77*4882a593Smuzhiyun		return;
78*4882a593Smuzhiyun	fi
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun	# There shouldn't be any cpufreq directories now.
81*4882a593Smuzhiyun	for_each_cpu cpu_should_not_have_cpufreq_directory
82*4882a593Smuzhiyun	printf "\n"
83*4882a593Smuzhiyun}
84*4882a593Smuzhiyun
85*4882a593Smuzhiyun# $1: cpufreq-driver module to insert
86*4882a593Smuzhiyunmodule_driver_test()
87*4882a593Smuzhiyun{
88*4882a593Smuzhiyun	printf "** Test: Running ${FUNCNAME[0]} **\n\n"
89*4882a593Smuzhiyun
90*4882a593Smuzhiyun	# check if module is present or not
91*4882a593Smuzhiyun	ls $1 > /dev/null
92*4882a593Smuzhiyun	if [ $? != 0 ]; then
93*4882a593Smuzhiyun		printf "$1: not present in `pwd` folder\n"
94*4882a593Smuzhiyun		return;
95*4882a593Smuzhiyun	fi
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun	# test basic module tests
98*4882a593Smuzhiyun	test_basic_insmod_rmmod $1
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun	# Do simple module test
101*4882a593Smuzhiyun	module_driver_test_single $1 0
102*4882a593Smuzhiyun
103*4882a593Smuzhiyun	# Remove CPUs before inserting module and then bring them back
104*4882a593Smuzhiyun	module_driver_test_single $1 1
105*4882a593Smuzhiyun	printf "\n"
106*4882a593Smuzhiyun}
107*4882a593Smuzhiyun
108*4882a593Smuzhiyun# find governor name based on governor module name
109*4882a593Smuzhiyun# $1: governor module name
110*4882a593Smuzhiyunfind_gov_name()
111*4882a593Smuzhiyun{
112*4882a593Smuzhiyun	if [ $1 = "cpufreq_ondemand.ko" ]; then
113*4882a593Smuzhiyun		printf "ondemand"
114*4882a593Smuzhiyun	elif [ $1 = "cpufreq_conservative.ko" ]; then
115*4882a593Smuzhiyun		printf "conservative"
116*4882a593Smuzhiyun	elif [ $1 = "cpufreq_userspace.ko" ]; then
117*4882a593Smuzhiyun		printf "userspace"
118*4882a593Smuzhiyun	elif [ $1 = "cpufreq_performance.ko" ]; then
119*4882a593Smuzhiyun		printf "performance"
120*4882a593Smuzhiyun	elif [ $1 = "cpufreq_powersave.ko" ]; then
121*4882a593Smuzhiyun		printf "powersave"
122*4882a593Smuzhiyun	elif [ $1 = "cpufreq_schedutil.ko" ]; then
123*4882a593Smuzhiyun		printf "schedutil"
124*4882a593Smuzhiyun	fi
125*4882a593Smuzhiyun}
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun# $1: governor string, $2: governor module, $3: policy
128*4882a593Smuzhiyun# example: module_governor_test_single "ondemand" "cpufreq_ondemand.ko" 2
129*4882a593Smuzhiyunmodule_governor_test_single()
130*4882a593Smuzhiyun{
131*4882a593Smuzhiyun	printf "** Test: Running ${FUNCNAME[0]} for $3 **\n\n"
132*4882a593Smuzhiyun
133*4882a593Smuzhiyun	backup_governor $3
134*4882a593Smuzhiyun
135*4882a593Smuzhiyun	# switch to new governor
136*4882a593Smuzhiyun	printf "Switch from $CUR_GOV to $1\n"
137*4882a593Smuzhiyun	switch_show_governor $3 $1
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun	# try removing module, it should fail as governor is used
140*4882a593Smuzhiyun	printf "Removing $2 module\n\n"
141*4882a593Smuzhiyun	rmmod $2
142*4882a593Smuzhiyun	if [ $? = 0 ]; then
143*4882a593Smuzhiyun		printf "WARN: rmmod $2 succeeded even if governor is used\n"
144*4882a593Smuzhiyun		insmod $2
145*4882a593Smuzhiyun	else
146*4882a593Smuzhiyun		printf "Pass: unable to remove $2 while it is being used\n\n"
147*4882a593Smuzhiyun	fi
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun	# switch back to old governor
150*4882a593Smuzhiyun	printf "Switchback to $CUR_GOV from $1\n"
151*4882a593Smuzhiyun	restore_governor $3
152*4882a593Smuzhiyun	printf "\n"
153*4882a593Smuzhiyun}
154*4882a593Smuzhiyun
155*4882a593Smuzhiyun# Insert cpufreq governor module and perform basic tests
156*4882a593Smuzhiyun# $1: cpufreq-governor module to insert
157*4882a593Smuzhiyunmodule_governor_test()
158*4882a593Smuzhiyun{
159*4882a593Smuzhiyun	printf "** Test: Running ${FUNCNAME[0]} **\n\n"
160*4882a593Smuzhiyun
161*4882a593Smuzhiyun	# check if module is present or not
162*4882a593Smuzhiyun	ls $1 > /dev/null
163*4882a593Smuzhiyun	if [ $? != 0 ]; then
164*4882a593Smuzhiyun		printf "$1: not present in `pwd` folder\n"
165*4882a593Smuzhiyun		return;
166*4882a593Smuzhiyun	fi
167*4882a593Smuzhiyun
168*4882a593Smuzhiyun	# test basic module tests
169*4882a593Smuzhiyun	test_basic_insmod_rmmod $1
170*4882a593Smuzhiyun
171*4882a593Smuzhiyun	# insert module
172*4882a593Smuzhiyun	printf "Inserting $1 module\n\n"
173*4882a593Smuzhiyun	insmod $1
174*4882a593Smuzhiyun	if [ $? != 0 ]; then
175*4882a593Smuzhiyun		printf "Insmod $1 failed\n"
176*4882a593Smuzhiyun		return;
177*4882a593Smuzhiyun	fi
178*4882a593Smuzhiyun
179*4882a593Smuzhiyun	# switch to new governor for each cpu
180*4882a593Smuzhiyun	for_each_policy module_governor_test_single $(find_gov_name $1) $1
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun	# remove module
183*4882a593Smuzhiyun	printf "Removing $1 module\n\n"
184*4882a593Smuzhiyun	rmmod $1
185*4882a593Smuzhiyun	if [ $? != 0 ]; then
186*4882a593Smuzhiyun		printf "rmmod $1 failed\n"
187*4882a593Smuzhiyun		return;
188*4882a593Smuzhiyun	fi
189*4882a593Smuzhiyun	printf "\n"
190*4882a593Smuzhiyun}
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun# test modules: driver and governor
193*4882a593Smuzhiyun# $1: driver module, $2: governor module
194*4882a593Smuzhiyunmodule_test()
195*4882a593Smuzhiyun{
196*4882a593Smuzhiyun	printf "** Test: Running ${FUNCNAME[0]} **\n\n"
197*4882a593Smuzhiyun
198*4882a593Smuzhiyun	# check if modules are present or not
199*4882a593Smuzhiyun	ls $1 $2 > /dev/null
200*4882a593Smuzhiyun	if [ $? != 0 ]; then
201*4882a593Smuzhiyun		printf "$1 or $2: is not present in `pwd` folder\n"
202*4882a593Smuzhiyun		return;
203*4882a593Smuzhiyun	fi
204*4882a593Smuzhiyun
205*4882a593Smuzhiyun	# TEST1: Insert gov after driver
206*4882a593Smuzhiyun	# insert driver module
207*4882a593Smuzhiyun	printf "Inserting $1 module\n\n"
208*4882a593Smuzhiyun	insmod $1
209*4882a593Smuzhiyun	if [ $? != 0 ]; then
210*4882a593Smuzhiyun		printf "Insmod $1 failed\n"
211*4882a593Smuzhiyun		return;
212*4882a593Smuzhiyun	fi
213*4882a593Smuzhiyun
214*4882a593Smuzhiyun	# run governor tests
215*4882a593Smuzhiyun	module_governor_test $2
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun	# remove driver module
218*4882a593Smuzhiyun	printf "Removing $1 module\n\n"
219*4882a593Smuzhiyun	rmmod $1
220*4882a593Smuzhiyun	if [ $? != 0 ]; then
221*4882a593Smuzhiyun		printf "rmmod $1 failed\n"
222*4882a593Smuzhiyun		return;
223*4882a593Smuzhiyun	fi
224*4882a593Smuzhiyun
225*4882a593Smuzhiyun	# TEST2: Insert driver after governor
226*4882a593Smuzhiyun	# insert governor module
227*4882a593Smuzhiyun	printf "Inserting $2 module\n\n"
228*4882a593Smuzhiyun	insmod $2
229*4882a593Smuzhiyun	if [ $? != 0 ]; then
230*4882a593Smuzhiyun		printf "Insmod $2 failed\n"
231*4882a593Smuzhiyun		return;
232*4882a593Smuzhiyun	fi
233*4882a593Smuzhiyun
234*4882a593Smuzhiyun	# run governor tests
235*4882a593Smuzhiyun	module_driver_test $1
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun	# remove driver module
238*4882a593Smuzhiyun	printf "Removing $2 module\n\n"
239*4882a593Smuzhiyun	rmmod $2
240*4882a593Smuzhiyun	if [ $? != 0 ]; then
241*4882a593Smuzhiyun		printf "rmmod $2 failed\n"
242*4882a593Smuzhiyun		return;
243*4882a593Smuzhiyun	fi
244*4882a593Smuzhiyun}
245