162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci
462306a36Sopenharmony_ci# protect against multiple inclusion
562306a36Sopenharmony_ciif [ $FILE_CPUFREQ ]; then
662306a36Sopenharmony_ci	return 0
762306a36Sopenharmony_cielse
862306a36Sopenharmony_ci	FILE_CPUFREQ=DONE
962306a36Sopenharmony_cifi
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_cisource cpu.sh
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci# $1: cpu
1562306a36Sopenharmony_cicpu_should_have_cpufreq_directory()
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	if [ ! -d $CPUROOT/$1/cpufreq ]; then
1862306a36Sopenharmony_ci		printf "Warning: No cpufreq directory present for $1\n"
1962306a36Sopenharmony_ci	fi
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cicpu_should_not_have_cpufreq_directory()
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	if [ -d $CPUROOT/$1/cpufreq ]; then
2562306a36Sopenharmony_ci		printf "Warning: cpufreq directory present for $1\n"
2662306a36Sopenharmony_ci	fi
2762306a36Sopenharmony_ci}
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_cifor_each_policy()
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")
3262306a36Sopenharmony_ci	for policy in $policies; do
3362306a36Sopenharmony_ci		$@ $policy
3462306a36Sopenharmony_ci	done
3562306a36Sopenharmony_ci}
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cifor_each_policy_concurrent()
3862306a36Sopenharmony_ci{
3962306a36Sopenharmony_ci	policies=$(ls $CPUFREQROOT| grep "policy[0-9].*")
4062306a36Sopenharmony_ci	for policy in $policies; do
4162306a36Sopenharmony_ci		$@ $policy &
4262306a36Sopenharmony_ci	done
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci# $1: Path
4662306a36Sopenharmony_ciread_cpufreq_files_in_dir()
4762306a36Sopenharmony_ci{
4862306a36Sopenharmony_ci	local files=`ls $1`
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	printf "Printing directory: $1\n\n"
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	for file in $files; do
5362306a36Sopenharmony_ci		if [ -f $1/$file ]; then
5462306a36Sopenharmony_ci			printf "$file:"
5562306a36Sopenharmony_ci			cat $1/$file
5662306a36Sopenharmony_ci		else
5762306a36Sopenharmony_ci			printf "\n"
5862306a36Sopenharmony_ci			read_cpufreq_files_in_dir "$1/$file"
5962306a36Sopenharmony_ci		fi
6062306a36Sopenharmony_ci	done
6162306a36Sopenharmony_ci	printf "\n"
6262306a36Sopenharmony_ci}
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciread_all_cpufreq_files()
6662306a36Sopenharmony_ci{
6762306a36Sopenharmony_ci	printf "** Test: Running ${FUNCNAME[0]} **\n\n"
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci	read_cpufreq_files_in_dir $CPUFREQROOT
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci	printf "%s\n\n" "------------------------------------------------"
7262306a36Sopenharmony_ci}
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci# UPDATE CPUFREQ FILES
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci# $1: directory path
7862306a36Sopenharmony_ciupdate_cpufreq_files_in_dir()
7962306a36Sopenharmony_ci{
8062306a36Sopenharmony_ci	local files=`ls $1`
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci	printf "Updating directory: $1\n\n"
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci	for file in $files; do
8562306a36Sopenharmony_ci		if [ -f $1/$file ]; then
8662306a36Sopenharmony_ci			# file is writable ?
8762306a36Sopenharmony_ci			local wfile=$(ls -l $1/$file | awk '$1 ~ /^.*w.*/ { print $NF; }')
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci			if [ ! -z $wfile ]; then
9062306a36Sopenharmony_ci				# scaling_setspeed is a special file and we
9162306a36Sopenharmony_ci				# should skip updating it
9262306a36Sopenharmony_ci				if [ $file != "scaling_setspeed" ]; then
9362306a36Sopenharmony_ci					local val=$(cat $1/$file)
9462306a36Sopenharmony_ci					printf "Writing $val to: $file\n"
9562306a36Sopenharmony_ci					echo $val > $1/$file
9662306a36Sopenharmony_ci				fi
9762306a36Sopenharmony_ci			fi
9862306a36Sopenharmony_ci		else
9962306a36Sopenharmony_ci			printf "\n"
10062306a36Sopenharmony_ci			update_cpufreq_files_in_dir "$1/$file"
10162306a36Sopenharmony_ci		fi
10262306a36Sopenharmony_ci	done
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	printf "\n"
10562306a36Sopenharmony_ci}
10662306a36Sopenharmony_ci
10762306a36Sopenharmony_ci# Update all writable files with their existing values
10862306a36Sopenharmony_ciupdate_all_cpufreq_files()
10962306a36Sopenharmony_ci{
11062306a36Sopenharmony_ci	printf "** Test: Running ${FUNCNAME[0]} **\n\n"
11162306a36Sopenharmony_ci
11262306a36Sopenharmony_ci	update_cpufreq_files_in_dir $CPUFREQROOT
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ci	printf "%s\n\n" "------------------------------------------------"
11562306a36Sopenharmony_ci}
11662306a36Sopenharmony_ci
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci# CHANGE CPU FREQUENCIES
11962306a36Sopenharmony_ci
12062306a36Sopenharmony_ci# $1: policy
12162306a36Sopenharmony_cifind_current_freq()
12262306a36Sopenharmony_ci{
12362306a36Sopenharmony_ci	cat $CPUFREQROOT/$1/scaling_cur_freq
12462306a36Sopenharmony_ci}
12562306a36Sopenharmony_ci
12662306a36Sopenharmony_ci# $1: policy
12762306a36Sopenharmony_ci# $2: frequency
12862306a36Sopenharmony_ciset_cpu_frequency()
12962306a36Sopenharmony_ci{
13062306a36Sopenharmony_ci	printf "Change frequency for $1 to $2\n"
13162306a36Sopenharmony_ci	echo $2 > $CPUFREQROOT/$1/scaling_setspeed
13262306a36Sopenharmony_ci}
13362306a36Sopenharmony_ci
13462306a36Sopenharmony_ci# $1: policy
13562306a36Sopenharmony_citest_all_frequencies()
13662306a36Sopenharmony_ci{
13762306a36Sopenharmony_ci	local filepath="$CPUFREQROOT/$1"
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_ci	backup_governor $1
14062306a36Sopenharmony_ci
14162306a36Sopenharmony_ci	local found=$(switch_governor $1 "userspace")
14262306a36Sopenharmony_ci	if [ $found = 1 ]; then
14362306a36Sopenharmony_ci		printf "${FUNCNAME[0]}: userspace governor not available for: $1\n"
14462306a36Sopenharmony_ci		return;
14562306a36Sopenharmony_ci	fi
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	printf "Switched governor for $1 to userspace\n\n"
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci	local freqs=$(cat $filepath/scaling_available_frequencies)
15062306a36Sopenharmony_ci	printf "Available frequencies for $1: $freqs\n\n"
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci	# Set all frequencies one-by-one
15362306a36Sopenharmony_ci	for freq in $freqs; do
15462306a36Sopenharmony_ci		set_cpu_frequency $1 $freq
15562306a36Sopenharmony_ci	done
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_ci	printf "\n"
15862306a36Sopenharmony_ci
15962306a36Sopenharmony_ci	restore_governor $1
16062306a36Sopenharmony_ci}
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci# $1: loop count
16362306a36Sopenharmony_cishuffle_frequency_for_all_cpus()
16462306a36Sopenharmony_ci{
16562306a36Sopenharmony_ci	printf "** Test: Running ${FUNCNAME[0]} for $1 loops **\n\n"
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_ci	for i in `seq 1 $1`; do
16862306a36Sopenharmony_ci		for_each_policy test_all_frequencies
16962306a36Sopenharmony_ci	done
17062306a36Sopenharmony_ci	printf "\n%s\n\n" "------------------------------------------------"
17162306a36Sopenharmony_ci}
17262306a36Sopenharmony_ci
17362306a36Sopenharmony_ci# Basic cpufreq tests
17462306a36Sopenharmony_cicpufreq_basic_tests()
17562306a36Sopenharmony_ci{
17662306a36Sopenharmony_ci	printf "*** RUNNING CPUFREQ SANITY TESTS ***\n"
17762306a36Sopenharmony_ci	printf "====================================\n\n"
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci	count=$(count_cpufreq_managed_cpus)
18062306a36Sopenharmony_ci	if [ $count = 0 ]; then
18162306a36Sopenharmony_ci		printf "No cpu is managed by cpufreq core, exiting\n"
18262306a36Sopenharmony_ci		exit;
18362306a36Sopenharmony_ci	else
18462306a36Sopenharmony_ci		printf "CPUFreq manages: $count CPUs\n\n"
18562306a36Sopenharmony_ci	fi
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_ci	# Detect & print which CPUs are not managed by cpufreq
18862306a36Sopenharmony_ci	print_unmanaged_cpus
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci	# read/update all cpufreq files
19162306a36Sopenharmony_ci	read_all_cpufreq_files
19262306a36Sopenharmony_ci	update_all_cpufreq_files
19362306a36Sopenharmony_ci
19462306a36Sopenharmony_ci	# hotplug cpus
19562306a36Sopenharmony_ci	reboot_cpus 5
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	# Test all frequencies
19862306a36Sopenharmony_ci	shuffle_frequency_for_all_cpus 2
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_ci	# Test all governors
20162306a36Sopenharmony_ci	shuffle_governors_for_all_cpus 1
20262306a36Sopenharmony_ci}
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci# Suspend/resume
20562306a36Sopenharmony_ci# $1: "suspend" or "hibernate", $2: loop count
20662306a36Sopenharmony_cido_suspend()
20762306a36Sopenharmony_ci{
20862306a36Sopenharmony_ci	printf "** Test: Running ${FUNCNAME[0]}: Trying $1 for $2 loops **\n\n"
20962306a36Sopenharmony_ci
21062306a36Sopenharmony_ci	# Is the directory available
21162306a36Sopenharmony_ci	if [ ! -d $SYSFS/power/ -o ! -f $SYSFS/power/state ]; then
21262306a36Sopenharmony_ci		printf "$SYSFS/power/state not available\n"
21362306a36Sopenharmony_ci		return 1
21462306a36Sopenharmony_ci	fi
21562306a36Sopenharmony_ci
21662306a36Sopenharmony_ci	if [ $1 = "suspend" ]; then
21762306a36Sopenharmony_ci		filename="mem"
21862306a36Sopenharmony_ci	elif [ $1 = "hibernate" ]; then
21962306a36Sopenharmony_ci		filename="disk"
22062306a36Sopenharmony_ci	else
22162306a36Sopenharmony_ci		printf "$1 is not a valid option\n"
22262306a36Sopenharmony_ci		return 1
22362306a36Sopenharmony_ci	fi
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci	if [ -n $filename ]; then
22662306a36Sopenharmony_ci		present=$(cat $SYSFS/power/state | grep $filename)
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci		if [ -z "$present" ]; then
22962306a36Sopenharmony_ci			printf "Tried to $1 but $filename isn't present in $SYSFS/power/state\n"
23062306a36Sopenharmony_ci			return 1;
23162306a36Sopenharmony_ci		fi
23262306a36Sopenharmony_ci
23362306a36Sopenharmony_ci		for i in `seq 1 $2`; do
23462306a36Sopenharmony_ci			printf "Starting $1\n"
23562306a36Sopenharmony_ci			echo $filename > $SYSFS/power/state
23662306a36Sopenharmony_ci			printf "Came out of $1\n"
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci			printf "Do basic tests after finishing $1 to verify cpufreq state\n\n"
23962306a36Sopenharmony_ci			cpufreq_basic_tests
24062306a36Sopenharmony_ci		done
24162306a36Sopenharmony_ci	fi
24262306a36Sopenharmony_ci}
243