162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci
462306a36Sopenharmony_cisource cpu.sh
562306a36Sopenharmony_cisource cpufreq.sh
662306a36Sopenharmony_cisource governor.sh
762306a36Sopenharmony_cisource module.sh
862306a36Sopenharmony_cisource special-tests.sh
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciFUNC=basic	# do basic tests by default
1162306a36Sopenharmony_ciOUTFILE=cpufreq_selftest
1262306a36Sopenharmony_ciSYSFS=
1362306a36Sopenharmony_ciCPUROOT=
1462306a36Sopenharmony_ciCPUFREQROOT=
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci# Kselftest framework requirement - SKIP code is 4.
1762306a36Sopenharmony_ciksft_skip=4
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_cihelpme()
2062306a36Sopenharmony_ci{
2162306a36Sopenharmony_ci	printf "Usage: $0 [-h] [-todg args]
2262306a36Sopenharmony_ci	[-h <help>]
2362306a36Sopenharmony_ci	[-o <output-file-for-dump>]
2462306a36Sopenharmony_ci	[-t <basic: Basic cpufreq testing
2562306a36Sopenharmony_ci	     suspend: suspend/resume,
2662306a36Sopenharmony_ci	     hibernate: hibernate/resume,
2762306a36Sopenharmony_ci	     modtest: test driver or governor modules. Only to be used with -d or -g options,
2862306a36Sopenharmony_ci	     sptest1: Simple governor switch to produce lockdep.
2962306a36Sopenharmony_ci	     sptest2: Concurrent governor switch to produce lockdep.
3062306a36Sopenharmony_ci	     sptest3: Governor races, shuffle between governors quickly.
3162306a36Sopenharmony_ci	     sptest4: CPU hotplugs with updates to cpufreq files.>]
3262306a36Sopenharmony_ci	[-d <driver's module name: only with \"-t modtest>\"]
3362306a36Sopenharmony_ci	[-g <governor's module name: only with \"-t modtest>\"]
3462306a36Sopenharmony_ci	\n"
3562306a36Sopenharmony_ci	exit 2
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ciprerequisite()
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	msg="skip all tests:"
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	if [ $UID != 0 ]; then
4362306a36Sopenharmony_ci		echo $msg must be run as root >&2
4462306a36Sopenharmony_ci		exit $ksft_skip
4562306a36Sopenharmony_ci	fi
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	taskset -p 01 $$
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci	SYSFS=`mount -t sysfs | head -1 | awk '{ print $3 }'`
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci	if [ ! -d "$SYSFS" ]; then
5262306a36Sopenharmony_ci		echo $msg sysfs is not mounted >&2
5362306a36Sopenharmony_ci		exit 2
5462306a36Sopenharmony_ci	fi
5562306a36Sopenharmony_ci
5662306a36Sopenharmony_ci	CPUROOT=$SYSFS/devices/system/cpu
5762306a36Sopenharmony_ci	CPUFREQROOT="$CPUROOT/cpufreq"
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	if ! ls $CPUROOT/cpu* > /dev/null 2>&1; then
6062306a36Sopenharmony_ci		echo $msg cpus not available in sysfs >&2
6162306a36Sopenharmony_ci		exit 2
6262306a36Sopenharmony_ci	fi
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci	if ! ls $CPUROOT/cpufreq > /dev/null 2>&1; then
6562306a36Sopenharmony_ci		echo $msg cpufreq directory not available in sysfs >&2
6662306a36Sopenharmony_ci		exit 2
6762306a36Sopenharmony_ci	fi
6862306a36Sopenharmony_ci}
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ciparse_arguments()
7162306a36Sopenharmony_ci{
7262306a36Sopenharmony_ci	while getopts ht:o:d:g: arg
7362306a36Sopenharmony_ci	do
7462306a36Sopenharmony_ci		case $arg in
7562306a36Sopenharmony_ci			h) # --help
7662306a36Sopenharmony_ci				helpme
7762306a36Sopenharmony_ci				;;
7862306a36Sopenharmony_ci
7962306a36Sopenharmony_ci			t) # --func_type (Function to perform: basic, suspend, hibernate, modtest, sptest1/2/3/4 (default: basic))
8062306a36Sopenharmony_ci				FUNC=$OPTARG
8162306a36Sopenharmony_ci				;;
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci			o) # --output-file (Output file to store dumps)
8462306a36Sopenharmony_ci				OUTFILE=$OPTARG
8562306a36Sopenharmony_ci				;;
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci			d) # --driver-mod-name (Name of the driver module)
8862306a36Sopenharmony_ci				DRIVER_MOD=$OPTARG
8962306a36Sopenharmony_ci				;;
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci			g) # --governor-mod-name (Name of the governor module)
9262306a36Sopenharmony_ci				GOVERNOR_MOD=$OPTARG
9362306a36Sopenharmony_ci				;;
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci			\?)
9662306a36Sopenharmony_ci				helpme
9762306a36Sopenharmony_ci				;;
9862306a36Sopenharmony_ci		esac
9962306a36Sopenharmony_ci	done
10062306a36Sopenharmony_ci}
10162306a36Sopenharmony_ci
10262306a36Sopenharmony_cido_test()
10362306a36Sopenharmony_ci{
10462306a36Sopenharmony_ci	# Check if CPUs are managed by cpufreq or not
10562306a36Sopenharmony_ci	count=$(count_cpufreq_managed_cpus)
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci	if [ $count = 0 -a $FUNC != "modtest" ]; then
10862306a36Sopenharmony_ci		echo "No cpu is managed by cpufreq core, exiting"
10962306a36Sopenharmony_ci		exit 2;
11062306a36Sopenharmony_ci	fi
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	case "$FUNC" in
11362306a36Sopenharmony_ci		"basic")
11462306a36Sopenharmony_ci		cpufreq_basic_tests
11562306a36Sopenharmony_ci		;;
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci		"suspend")
11862306a36Sopenharmony_ci		do_suspend "suspend" 1
11962306a36Sopenharmony_ci		;;
12062306a36Sopenharmony_ci
12162306a36Sopenharmony_ci		"hibernate")
12262306a36Sopenharmony_ci		do_suspend "hibernate" 1
12362306a36Sopenharmony_ci		;;
12462306a36Sopenharmony_ci
12562306a36Sopenharmony_ci		"modtest")
12662306a36Sopenharmony_ci		# Do we have modules in place?
12762306a36Sopenharmony_ci		if [ -z $DRIVER_MOD ] && [ -z $GOVERNOR_MOD ]; then
12862306a36Sopenharmony_ci			echo "No driver or governor module passed with -d or -g"
12962306a36Sopenharmony_ci			exit 2;
13062306a36Sopenharmony_ci		fi
13162306a36Sopenharmony_ci
13262306a36Sopenharmony_ci		if [ $DRIVER_MOD ]; then
13362306a36Sopenharmony_ci			if [ $GOVERNOR_MOD ]; then
13462306a36Sopenharmony_ci				module_test $DRIVER_MOD $GOVERNOR_MOD
13562306a36Sopenharmony_ci			else
13662306a36Sopenharmony_ci				module_driver_test $DRIVER_MOD
13762306a36Sopenharmony_ci			fi
13862306a36Sopenharmony_ci		else
13962306a36Sopenharmony_ci			if [ $count = 0 ]; then
14062306a36Sopenharmony_ci				echo "No cpu is managed by cpufreq core, exiting"
14162306a36Sopenharmony_ci				exit 2;
14262306a36Sopenharmony_ci			fi
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci			module_governor_test $GOVERNOR_MOD
14562306a36Sopenharmony_ci		fi
14662306a36Sopenharmony_ci		;;
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_ci		"sptest1")
14962306a36Sopenharmony_ci		simple_lockdep
15062306a36Sopenharmony_ci		;;
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci		"sptest2")
15362306a36Sopenharmony_ci		concurrent_lockdep
15462306a36Sopenharmony_ci		;;
15562306a36Sopenharmony_ci
15662306a36Sopenharmony_ci		"sptest3")
15762306a36Sopenharmony_ci		governor_race
15862306a36Sopenharmony_ci		;;
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci		"sptest4")
16162306a36Sopenharmony_ci		hotplug_with_updates
16262306a36Sopenharmony_ci		;;
16362306a36Sopenharmony_ci
16462306a36Sopenharmony_ci		*)
16562306a36Sopenharmony_ci		echo "Invalid [-f] function type"
16662306a36Sopenharmony_ci		helpme
16762306a36Sopenharmony_ci		;;
16862306a36Sopenharmony_ci	esac
16962306a36Sopenharmony_ci}
17062306a36Sopenharmony_ci
17162306a36Sopenharmony_ci# clear dumps
17262306a36Sopenharmony_ci# $1: file name
17362306a36Sopenharmony_ciclear_dumps()
17462306a36Sopenharmony_ci{
17562306a36Sopenharmony_ci	echo "" > $1.txt
17662306a36Sopenharmony_ci	echo "" > $1.dmesg_cpufreq.txt
17762306a36Sopenharmony_ci	echo "" > $1.dmesg_full.txt
17862306a36Sopenharmony_ci}
17962306a36Sopenharmony_ci
18062306a36Sopenharmony_ci# $1: output file name
18162306a36Sopenharmony_cidmesg_dumps()
18262306a36Sopenharmony_ci{
18362306a36Sopenharmony_ci	dmesg | grep cpufreq >> $1.dmesg_cpufreq.txt
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci	# We may need the full logs as well
18662306a36Sopenharmony_ci	dmesg >> $1.dmesg_full.txt
18762306a36Sopenharmony_ci}
18862306a36Sopenharmony_ci
18962306a36Sopenharmony_ci# Parse arguments
19062306a36Sopenharmony_ciparse_arguments $@
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_ci# Make sure all requirements are met
19362306a36Sopenharmony_ciprerequisite
19462306a36Sopenharmony_ci
19562306a36Sopenharmony_ci# Run requested functions
19662306a36Sopenharmony_ciclear_dumps $OUTFILE
19762306a36Sopenharmony_cido_test | tee -a $OUTFILE.txt
19862306a36Sopenharmony_cidmesg_dumps $OUTFILE
199