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