| #!/bin/bash | 
 | # SPDX-License-Identifier: GPL-2.0 | 
 | # | 
 | # Test governors | 
 |  | 
 | # protect against multiple inclusion | 
 | if [ $FILE_GOVERNOR ]; then | 
 | 	return 0 | 
 | else | 
 | 	FILE_GOVERNOR=DONE | 
 | fi | 
 |  | 
 | source cpu.sh | 
 | source cpufreq.sh | 
 |  | 
 | CUR_GOV= | 
 | CUR_FREQ= | 
 |  | 
 | # Find governor's directory path | 
 | # $1: policy, $2: governor | 
 | find_gov_directory() | 
 | { | 
 | 	if [ -d $CPUFREQROOT/$2 ]; then | 
 | 		printf "$CPUFREQROOT/$2\n" | 
 | 	elif [ -d $CPUFREQROOT/$1/$2 ]; then | 
 | 		printf "$CPUFREQROOT/$1/$2\n" | 
 | 	else | 
 | 		printf "INVALID\n" | 
 | 	fi | 
 | } | 
 |  | 
 | # $1: policy | 
 | find_current_governor() | 
 | { | 
 | 	cat $CPUFREQROOT/$1/scaling_governor | 
 | } | 
 |  | 
 | # $1: policy | 
 | backup_governor() | 
 | { | 
 | 	CUR_GOV=$(find_current_governor $1) | 
 |  | 
 | 	printf "Governor backup done for $1: $CUR_GOV\n" | 
 |  | 
 | 	if [ $CUR_GOV == "userspace" ]; then | 
 | 		CUR_FREQ=$(find_current_freq $1) | 
 | 		printf "Governor frequency backup done for $1: $CUR_FREQ\n" | 
 | 	fi | 
 |  | 
 | 	printf "\n" | 
 | } | 
 |  | 
 | # $1: policy | 
 | restore_governor() | 
 | { | 
 | 	__switch_governor $1 $CUR_GOV | 
 |  | 
 | 	printf "Governor restored for $1 to $CUR_GOV\n" | 
 |  | 
 | 	if [ $CUR_GOV == "userspace" ]; then | 
 | 		set_cpu_frequency $1 $CUR_FREQ | 
 | 		printf "Governor frequency restored for $1: $CUR_FREQ\n" | 
 | 	fi | 
 |  | 
 | 	printf "\n" | 
 | } | 
 |  | 
 | # param: | 
 | # $1: policy, $2: governor | 
 | __switch_governor() | 
 | { | 
 | 	echo $2 > $CPUFREQROOT/$1/scaling_governor | 
 | } | 
 |  | 
 | # param: | 
 | # $1: cpu, $2: governor | 
 | __switch_governor_for_cpu() | 
 | { | 
 | 	echo $2 > $CPUROOT/$1/cpufreq/scaling_governor | 
 | } | 
 |  | 
 | # SWITCH GOVERNORS | 
 |  | 
 | # $1: cpu, $2: governor | 
 | switch_governor() | 
 | { | 
 | 	local filepath=$CPUFREQROOT/$1/scaling_available_governors | 
 |  | 
 | 	# check if governor is available | 
 | 	local found=$(cat $filepath | grep $2 | wc -l) | 
 | 	if [ $found = 0 ]; then | 
 | 		echo 1; | 
 | 		return | 
 | 	fi | 
 |  | 
 | 	__switch_governor $1 $2 | 
 | 	echo 0; | 
 | } | 
 |  | 
 | # $1: policy, $2: governor | 
 | switch_show_governor() | 
 | { | 
 | 	cur_gov=find_current_governor | 
 | 	if [ $cur_gov == "userspace" ]; then | 
 | 		cur_freq=find_current_freq | 
 | 	fi | 
 |  | 
 | 	# switch governor | 
 | 	__switch_governor $1 $2 | 
 |  | 
 | 	printf "\nSwitched governor for $1 to $2\n\n" | 
 |  | 
 | 	if [ $2 == "userspace" -o $2 == "powersave" -o $2 == "performance" ]; then | 
 | 		printf "No files to read for $2 governor\n\n" | 
 | 		return | 
 | 	fi | 
 |  | 
 | 	# show governor files | 
 | 	local govpath=$(find_gov_directory $1 $2) | 
 | 	read_cpufreq_files_in_dir $govpath | 
 | } | 
 |  | 
 | # $1: function to be called, $2: policy | 
 | call_for_each_governor() | 
 | { | 
 | 	local filepath=$CPUFREQROOT/$2/scaling_available_governors | 
 |  | 
 | 	# Exit if cpu isn't managed by cpufreq core | 
 | 	if [ ! -f $filepath ]; then | 
 | 		return; | 
 | 	fi | 
 |  | 
 | 	backup_governor $2 | 
 |  | 
 | 	local governors=$(cat $filepath) | 
 | 	printf "Available governors for $2: $governors\n" | 
 |  | 
 | 	for governor in $governors; do | 
 | 		$1 $2 $governor | 
 | 	done | 
 |  | 
 | 	restore_governor $2 | 
 | } | 
 |  | 
 | # $1: loop count | 
 | shuffle_governors_for_all_cpus() | 
 | { | 
 | 	printf "** Test: Running ${FUNCNAME[0]} for $1 loops **\n\n" | 
 |  | 
 | 	for i in `seq 1 $1`; do | 
 | 		for_each_policy call_for_each_governor switch_show_governor | 
 | 	done | 
 | 	printf "%s\n\n" "------------------------------------------------" | 
 | } |