162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Modules specific tests cases
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci# protect against multiple inclusion
762306a36Sopenharmony_ciif [ $FILE_MODULE ]; then
862306a36Sopenharmony_ci	return 0
962306a36Sopenharmony_cielse
1062306a36Sopenharmony_ci	FILE_MODULE=DONE
1162306a36Sopenharmony_cifi
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cisource cpu.sh
1462306a36Sopenharmony_cisource cpufreq.sh
1562306a36Sopenharmony_cisource governor.sh
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci# Check basic insmod/rmmod
1862306a36Sopenharmony_ci# $1: module
1962306a36Sopenharmony_citest_basic_insmod_rmmod()
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	printf "** Test: Running ${FUNCNAME[0]} **\n\n"
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci	printf "Inserting $1 module\n"
2462306a36Sopenharmony_ci	# insert module
2562306a36Sopenharmony_ci	insmod $1
2662306a36Sopenharmony_ci	if [ $? != 0 ]; then
2762306a36Sopenharmony_ci		printf "Insmod $1 failed\n"
2862306a36Sopenharmony_ci		exit;
2962306a36Sopenharmony_ci	fi
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci	printf "Removing $1 module\n"
3262306a36Sopenharmony_ci	# remove module
3362306a36Sopenharmony_ci	rmmod $1
3462306a36Sopenharmony_ci	if [ $? != 0 ]; then
3562306a36Sopenharmony_ci		printf "rmmod $1 failed\n"
3662306a36Sopenharmony_ci		exit;
3762306a36Sopenharmony_ci	fi
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	printf "\n"
4062306a36Sopenharmony_ci}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci# Insert cpufreq driver module and perform basic tests
4362306a36Sopenharmony_ci# $1: cpufreq-driver module to insert
4462306a36Sopenharmony_ci# $2: If we want to play with CPUs (1) or not (0)
4562306a36Sopenharmony_cimodule_driver_test_single()
4662306a36Sopenharmony_ci{
4762306a36Sopenharmony_ci	printf "** Test: Running ${FUNCNAME[0]} for driver $1 and cpus_hotplug=$2 **\n\n"
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	if [ $2 -eq 1 ]; then
5062306a36Sopenharmony_ci		# offline all non-boot CPUs
5162306a36Sopenharmony_ci		for_each_non_boot_cpu offline_cpu
5262306a36Sopenharmony_ci		printf "\n"
5362306a36Sopenharmony_ci	fi
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	# insert module
5662306a36Sopenharmony_ci	printf "Inserting $1 module\n\n"
5762306a36Sopenharmony_ci	insmod $1
5862306a36Sopenharmony_ci	if [ $? != 0 ]; then
5962306a36Sopenharmony_ci		printf "Insmod $1 failed\n"
6062306a36Sopenharmony_ci		return;
6162306a36Sopenharmony_ci	fi
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	if [ $2 -eq 1 ]; then
6462306a36Sopenharmony_ci		# online all non-boot CPUs
6562306a36Sopenharmony_ci		for_each_non_boot_cpu online_cpu
6662306a36Sopenharmony_ci		printf "\n"
6762306a36Sopenharmony_ci	fi
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	# run basic tests
7062306a36Sopenharmony_ci	cpufreq_basic_tests
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci	# remove module
7362306a36Sopenharmony_ci	printf "Removing $1 module\n\n"
7462306a36Sopenharmony_ci	rmmod $1
7562306a36Sopenharmony_ci	if [ $? != 0 ]; then
7662306a36Sopenharmony_ci		printf "rmmod $1 failed\n"
7762306a36Sopenharmony_ci		return;
7862306a36Sopenharmony_ci	fi
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ci	# There shouldn't be any cpufreq directories now.
8162306a36Sopenharmony_ci	for_each_cpu cpu_should_not_have_cpufreq_directory
8262306a36Sopenharmony_ci	printf "\n"
8362306a36Sopenharmony_ci}
8462306a36Sopenharmony_ci
8562306a36Sopenharmony_ci# $1: cpufreq-driver module to insert
8662306a36Sopenharmony_cimodule_driver_test()
8762306a36Sopenharmony_ci{
8862306a36Sopenharmony_ci	printf "** Test: Running ${FUNCNAME[0]} **\n\n"
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci	# check if module is present or not
9162306a36Sopenharmony_ci	ls $1 > /dev/null
9262306a36Sopenharmony_ci	if [ $? != 0 ]; then
9362306a36Sopenharmony_ci		printf "$1: not present in `pwd` folder\n"
9462306a36Sopenharmony_ci		return;
9562306a36Sopenharmony_ci	fi
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci	# test basic module tests
9862306a36Sopenharmony_ci	test_basic_insmod_rmmod $1
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci	# Do simple module test
10162306a36Sopenharmony_ci	module_driver_test_single $1 0
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	# Remove CPUs before inserting module and then bring them back
10462306a36Sopenharmony_ci	module_driver_test_single $1 1
10562306a36Sopenharmony_ci	printf "\n"
10662306a36Sopenharmony_ci}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci# find governor name based on governor module name
10962306a36Sopenharmony_ci# $1: governor module name
11062306a36Sopenharmony_cifind_gov_name()
11162306a36Sopenharmony_ci{
11262306a36Sopenharmony_ci	if [ $1 = "cpufreq_ondemand.ko" ]; then
11362306a36Sopenharmony_ci		printf "ondemand"
11462306a36Sopenharmony_ci	elif [ $1 = "cpufreq_conservative.ko" ]; then
11562306a36Sopenharmony_ci		printf "conservative"
11662306a36Sopenharmony_ci	elif [ $1 = "cpufreq_userspace.ko" ]; then
11762306a36Sopenharmony_ci		printf "userspace"
11862306a36Sopenharmony_ci	elif [ $1 = "cpufreq_performance.ko" ]; then
11962306a36Sopenharmony_ci		printf "performance"
12062306a36Sopenharmony_ci	elif [ $1 = "cpufreq_powersave.ko" ]; then
12162306a36Sopenharmony_ci		printf "powersave"
12262306a36Sopenharmony_ci	elif [ $1 = "cpufreq_schedutil.ko" ]; then
12362306a36Sopenharmony_ci		printf "schedutil"
12462306a36Sopenharmony_ci	fi
12562306a36Sopenharmony_ci}
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_ci# $1: governor string, $2: governor module, $3: policy
12862306a36Sopenharmony_ci# example: module_governor_test_single "ondemand" "cpufreq_ondemand.ko" 2
12962306a36Sopenharmony_cimodule_governor_test_single()
13062306a36Sopenharmony_ci{
13162306a36Sopenharmony_ci	printf "** Test: Running ${FUNCNAME[0]} for $3 **\n\n"
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	backup_governor $3
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	# switch to new governor
13662306a36Sopenharmony_ci	printf "Switch from $CUR_GOV to $1\n"
13762306a36Sopenharmony_ci	switch_show_governor $3 $1
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci	# try removing module, it should fail as governor is used
14062306a36Sopenharmony_ci	printf "Removing $2 module\n\n"
14162306a36Sopenharmony_ci	rmmod $2
14262306a36Sopenharmony_ci	if [ $? = 0 ]; then
14362306a36Sopenharmony_ci		printf "WARN: rmmod $2 succeeded even if governor is used\n"
14462306a36Sopenharmony_ci		insmod $2
14562306a36Sopenharmony_ci	else
14662306a36Sopenharmony_ci		printf "Pass: unable to remove $2 while it is being used\n\n"
14762306a36Sopenharmony_ci	fi
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	# switch back to old governor
15062306a36Sopenharmony_ci	printf "Switchback to $CUR_GOV from $1\n"
15162306a36Sopenharmony_ci	restore_governor $3
15262306a36Sopenharmony_ci	printf "\n"
15362306a36Sopenharmony_ci}
15462306a36Sopenharmony_ci
15562306a36Sopenharmony_ci# Insert cpufreq governor module and perform basic tests
15662306a36Sopenharmony_ci# $1: cpufreq-governor module to insert
15762306a36Sopenharmony_cimodule_governor_test()
15862306a36Sopenharmony_ci{
15962306a36Sopenharmony_ci	printf "** Test: Running ${FUNCNAME[0]} **\n\n"
16062306a36Sopenharmony_ci
16162306a36Sopenharmony_ci	# check if module is present or not
16262306a36Sopenharmony_ci	ls $1 > /dev/null
16362306a36Sopenharmony_ci	if [ $? != 0 ]; then
16462306a36Sopenharmony_ci		printf "$1: not present in `pwd` folder\n"
16562306a36Sopenharmony_ci		return;
16662306a36Sopenharmony_ci	fi
16762306a36Sopenharmony_ci
16862306a36Sopenharmony_ci	# test basic module tests
16962306a36Sopenharmony_ci	test_basic_insmod_rmmod $1
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci	# insert module
17262306a36Sopenharmony_ci	printf "Inserting $1 module\n\n"
17362306a36Sopenharmony_ci	insmod $1
17462306a36Sopenharmony_ci	if [ $? != 0 ]; then
17562306a36Sopenharmony_ci		printf "Insmod $1 failed\n"
17662306a36Sopenharmony_ci		return;
17762306a36Sopenharmony_ci	fi
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	# switch to new governor for each cpu
18062306a36Sopenharmony_ci	for_each_policy module_governor_test_single $(find_gov_name $1) $1
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	# remove module
18362306a36Sopenharmony_ci	printf "Removing $1 module\n\n"
18462306a36Sopenharmony_ci	rmmod $1
18562306a36Sopenharmony_ci	if [ $? != 0 ]; then
18662306a36Sopenharmony_ci		printf "rmmod $1 failed\n"
18762306a36Sopenharmony_ci		return;
18862306a36Sopenharmony_ci	fi
18962306a36Sopenharmony_ci	printf "\n"
19062306a36Sopenharmony_ci}
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci# test modules: driver and governor
19362306a36Sopenharmony_ci# $1: driver module, $2: governor module
19462306a36Sopenharmony_cimodule_test()
19562306a36Sopenharmony_ci{
19662306a36Sopenharmony_ci	printf "** Test: Running ${FUNCNAME[0]} **\n\n"
19762306a36Sopenharmony_ci
19862306a36Sopenharmony_ci	# check if modules are present or not
19962306a36Sopenharmony_ci	ls $1 $2 > /dev/null
20062306a36Sopenharmony_ci	if [ $? != 0 ]; then
20162306a36Sopenharmony_ci		printf "$1 or $2: is not present in `pwd` folder\n"
20262306a36Sopenharmony_ci		return;
20362306a36Sopenharmony_ci	fi
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	# TEST1: Insert gov after driver
20662306a36Sopenharmony_ci	# insert driver module
20762306a36Sopenharmony_ci	printf "Inserting $1 module\n\n"
20862306a36Sopenharmony_ci	insmod $1
20962306a36Sopenharmony_ci	if [ $? != 0 ]; then
21062306a36Sopenharmony_ci		printf "Insmod $1 failed\n"
21162306a36Sopenharmony_ci		return;
21262306a36Sopenharmony_ci	fi
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_ci	# run governor tests
21562306a36Sopenharmony_ci	module_governor_test $2
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	# remove driver module
21862306a36Sopenharmony_ci	printf "Removing $1 module\n\n"
21962306a36Sopenharmony_ci	rmmod $1
22062306a36Sopenharmony_ci	if [ $? != 0 ]; then
22162306a36Sopenharmony_ci		printf "rmmod $1 failed\n"
22262306a36Sopenharmony_ci		return;
22362306a36Sopenharmony_ci	fi
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci	# TEST2: Insert driver after governor
22662306a36Sopenharmony_ci	# insert governor module
22762306a36Sopenharmony_ci	printf "Inserting $2 module\n\n"
22862306a36Sopenharmony_ci	insmod $2
22962306a36Sopenharmony_ci	if [ $? != 0 ]; then
23062306a36Sopenharmony_ci		printf "Insmod $2 failed\n"
23162306a36Sopenharmony_ci		return;
23262306a36Sopenharmony_ci	fi
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_ci	# run governor tests
23562306a36Sopenharmony_ci	module_driver_test $1
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci	# remove driver module
23862306a36Sopenharmony_ci	printf "Removing $2 module\n\n"
23962306a36Sopenharmony_ci	rmmod $2
24062306a36Sopenharmony_ci	if [ $? != 0 ]; then
24162306a36Sopenharmony_ci		printf "rmmod $2 failed\n"
24262306a36Sopenharmony_ci		return;
24362306a36Sopenharmony_ci	fi
24462306a36Sopenharmony_ci}
245