162306a36Sopenharmony_ci#!/bin/bash
262306a36Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0
362306a36Sopenharmony_ci#
462306a36Sopenharmony_ci# Test governors
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci# protect against multiple inclusion
762306a36Sopenharmony_ciif [ $FILE_GOVERNOR ]; then
862306a36Sopenharmony_ci	return 0
962306a36Sopenharmony_cielse
1062306a36Sopenharmony_ci	FILE_GOVERNOR=DONE
1162306a36Sopenharmony_cifi
1262306a36Sopenharmony_ci
1362306a36Sopenharmony_cisource cpu.sh
1462306a36Sopenharmony_cisource cpufreq.sh
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciCUR_GOV=
1762306a36Sopenharmony_ciCUR_FREQ=
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci# Find governor's directory path
2062306a36Sopenharmony_ci# $1: policy, $2: governor
2162306a36Sopenharmony_cifind_gov_directory()
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci	if [ -d $CPUFREQROOT/$2 ]; then
2462306a36Sopenharmony_ci		printf "$CPUFREQROOT/$2\n"
2562306a36Sopenharmony_ci	elif [ -d $CPUFREQROOT/$1/$2 ]; then
2662306a36Sopenharmony_ci		printf "$CPUFREQROOT/$1/$2\n"
2762306a36Sopenharmony_ci	else
2862306a36Sopenharmony_ci		printf "INVALID\n"
2962306a36Sopenharmony_ci	fi
3062306a36Sopenharmony_ci}
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci# $1: policy
3362306a36Sopenharmony_cifind_current_governor()
3462306a36Sopenharmony_ci{
3562306a36Sopenharmony_ci	cat $CPUFREQROOT/$1/scaling_governor
3662306a36Sopenharmony_ci}
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci# $1: policy
3962306a36Sopenharmony_cibackup_governor()
4062306a36Sopenharmony_ci{
4162306a36Sopenharmony_ci	CUR_GOV=$(find_current_governor $1)
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	printf "Governor backup done for $1: $CUR_GOV\n"
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	if [ $CUR_GOV == "userspace" ]; then
4662306a36Sopenharmony_ci		CUR_FREQ=$(find_current_freq $1)
4762306a36Sopenharmony_ci		printf "Governor frequency backup done for $1: $CUR_FREQ\n"
4862306a36Sopenharmony_ci	fi
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	printf "\n"
5162306a36Sopenharmony_ci}
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci# $1: policy
5462306a36Sopenharmony_cirestore_governor()
5562306a36Sopenharmony_ci{
5662306a36Sopenharmony_ci	__switch_governor $1 $CUR_GOV
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci	printf "Governor restored for $1 to $CUR_GOV\n"
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci	if [ $CUR_GOV == "userspace" ]; then
6162306a36Sopenharmony_ci		set_cpu_frequency $1 $CUR_FREQ
6262306a36Sopenharmony_ci		printf "Governor frequency restored for $1: $CUR_FREQ\n"
6362306a36Sopenharmony_ci	fi
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci	printf "\n"
6662306a36Sopenharmony_ci}
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci# param:
6962306a36Sopenharmony_ci# $1: policy, $2: governor
7062306a36Sopenharmony_ci__switch_governor()
7162306a36Sopenharmony_ci{
7262306a36Sopenharmony_ci	echo $2 > $CPUFREQROOT/$1/scaling_governor
7362306a36Sopenharmony_ci}
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci# param:
7662306a36Sopenharmony_ci# $1: cpu, $2: governor
7762306a36Sopenharmony_ci__switch_governor_for_cpu()
7862306a36Sopenharmony_ci{
7962306a36Sopenharmony_ci	echo $2 > $CPUROOT/$1/cpufreq/scaling_governor
8062306a36Sopenharmony_ci}
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci# SWITCH GOVERNORS
8362306a36Sopenharmony_ci
8462306a36Sopenharmony_ci# $1: cpu, $2: governor
8562306a36Sopenharmony_ciswitch_governor()
8662306a36Sopenharmony_ci{
8762306a36Sopenharmony_ci	local filepath=$CPUFREQROOT/$1/scaling_available_governors
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci	# check if governor is available
9062306a36Sopenharmony_ci	local found=$(cat $filepath | grep $2 | wc -l)
9162306a36Sopenharmony_ci	if [ $found = 0 ]; then
9262306a36Sopenharmony_ci		echo 1;
9362306a36Sopenharmony_ci		return
9462306a36Sopenharmony_ci	fi
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci	__switch_governor $1 $2
9762306a36Sopenharmony_ci	echo 0;
9862306a36Sopenharmony_ci}
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_ci# $1: policy, $2: governor
10162306a36Sopenharmony_ciswitch_show_governor()
10262306a36Sopenharmony_ci{
10362306a36Sopenharmony_ci	cur_gov=find_current_governor
10462306a36Sopenharmony_ci	if [ $cur_gov == "userspace" ]; then
10562306a36Sopenharmony_ci		cur_freq=find_current_freq
10662306a36Sopenharmony_ci	fi
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci	# switch governor
10962306a36Sopenharmony_ci	__switch_governor $1 $2
11062306a36Sopenharmony_ci
11162306a36Sopenharmony_ci	printf "\nSwitched governor for $1 to $2\n\n"
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci	if [ $2 == "userspace" -o $2 == "powersave" -o $2 == "performance" ]; then
11462306a36Sopenharmony_ci		printf "No files to read for $2 governor\n\n"
11562306a36Sopenharmony_ci		return
11662306a36Sopenharmony_ci	fi
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	# show governor files
11962306a36Sopenharmony_ci	local govpath=$(find_gov_directory $1 $2)
12062306a36Sopenharmony_ci	read_cpufreq_files_in_dir $govpath
12162306a36Sopenharmony_ci}
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci# $1: function to be called, $2: policy
12462306a36Sopenharmony_cicall_for_each_governor()
12562306a36Sopenharmony_ci{
12662306a36Sopenharmony_ci	local filepath=$CPUFREQROOT/$2/scaling_available_governors
12762306a36Sopenharmony_ci
12862306a36Sopenharmony_ci	# Exit if cpu isn't managed by cpufreq core
12962306a36Sopenharmony_ci	if [ ! -f $filepath ]; then
13062306a36Sopenharmony_ci		return;
13162306a36Sopenharmony_ci	fi
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_ci	backup_governor $2
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci	local governors=$(cat $filepath)
13662306a36Sopenharmony_ci	printf "Available governors for $2: $governors\n"
13762306a36Sopenharmony_ci
13862306a36Sopenharmony_ci	for governor in $governors; do
13962306a36Sopenharmony_ci		$1 $2 $governor
14062306a36Sopenharmony_ci	done
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_ci	restore_governor $2
14362306a36Sopenharmony_ci}
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci# $1: loop count
14662306a36Sopenharmony_cishuffle_governors_for_all_cpus()
14762306a36Sopenharmony_ci{
14862306a36Sopenharmony_ci	printf "** Test: Running ${FUNCNAME[0]} for $1 loops **\n\n"
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci	for i in `seq 1 $1`; do
15162306a36Sopenharmony_ci		for_each_policy call_for_each_governor switch_show_governor
15262306a36Sopenharmony_ci	done
15362306a36Sopenharmony_ci	printf "%s\n\n" "------------------------------------------------"
15462306a36Sopenharmony_ci}
155