1#!/bin/bash 2# SPDX-License-Identifier: GPL-2.0 3# 4# Test governors 5 6# protect against multiple inclusion 7if [ $FILE_GOVERNOR ]; then 8 return 0 9else 10 FILE_GOVERNOR=DONE 11fi 12 13source cpu.sh 14source cpufreq.sh 15 16CUR_GOV= 17CUR_FREQ= 18 19# Per-policy backup, keyed by policy so multiple policies can be saved at once 20# (backup_governor/restore_governor also keep CUR_GOV/CUR_FREQ for callers that 21# read them directly). 22declare -A SAVED_GOVERNORS 23declare -A SAVED_FREQS 24 25# Find governor's directory path 26# $1: policy, $2: governor 27find_gov_directory() 28{ 29 if [ -d $CPUFREQROOT/$2 ]; then 30 printf "$CPUFREQROOT/$2\n" 31 elif [ -d $CPUFREQROOT/$1/$2 ]; then 32 printf "$CPUFREQROOT/$1/$2\n" 33 else 34 printf "INVALID\n" 35 fi 36} 37 38# $1: policy 39find_current_governor() 40{ 41 cat $CPUFREQROOT/$1/scaling_governor 42} 43 44# $1: policy 45backup_governor() 46{ 47 CUR_GOV=$(find_current_governor $1) 48 SAVED_GOVERNORS[$1]=$CUR_GOV 49 50 printf "Governor backup done for $1: $CUR_GOV\n" 51 52 if [ $CUR_GOV == "userspace" ]; then 53 CUR_FREQ=$(find_current_freq $1) 54 SAVED_FREQS[$1]=$CUR_FREQ 55 printf "Governor frequency backup done for $1: $CUR_FREQ\n" 56 fi 57 58 printf "\n" 59} 60 61# $1: policy 62restore_governor() 63{ 64 CUR_GOV=${SAVED_GOVERNORS[$1]} 65 __switch_governor $1 $CUR_GOV 66 67 printf "Governor restored for $1 to $CUR_GOV\n" 68 69 if [ $CUR_GOV == "userspace" ]; then 70 CUR_FREQ=${SAVED_FREQS[$1]} 71 set_cpu_frequency $1 $CUR_FREQ 72 printf "Governor frequency restored for $1: $CUR_FREQ\n" 73 fi 74 75 printf "\n" 76} 77 78# Save/restore governors for every policy at once 79save_all_governors() 80{ 81 for_each_policy backup_governor 82} 83 84restore_all_governors() 85{ 86 for_each_policy restore_governor 87} 88 89# param: 90# $1: policy, $2: governor 91__switch_governor() 92{ 93 echo $2 > $CPUFREQROOT/$1/scaling_governor 94} 95 96# param: 97# $1: cpu, $2: governor 98__switch_governor_for_cpu() 99{ 100 echo $2 > $CPUROOT/$1/cpufreq/scaling_governor 101} 102 103# SWITCH GOVERNORS 104 105# $1: cpu, $2: governor 106switch_governor() 107{ 108 local filepath=$CPUFREQROOT/$1/scaling_available_governors 109 110 # check if governor is available 111 local found=$(cat $filepath | grep $2 | wc -l) 112 if [ $found = 0 ]; then 113 echo 1; 114 return 115 fi 116 117 __switch_governor $1 $2 118 echo 0; 119} 120 121# $1: policy, $2: governor 122switch_show_governor() 123{ 124 # switch governor 125 __switch_governor $1 $2 126 127 printf "\nSwitched governor for $1 to $2\n\n" 128 129 if [ $2 == "userspace" -o $2 == "powersave" -o $2 == "performance" ]; then 130 printf "No files to read for $2 governor\n\n" 131 return 132 fi 133 134 # show governor files 135 local govpath=$(find_gov_directory $1 $2) 136 read_cpufreq_files_in_dir $govpath 137} 138 139# $1: function to be called, $2: policy 140call_for_each_governor() 141{ 142 local filepath=$CPUFREQROOT/$2/scaling_available_governors 143 144 # Exit if cpu isn't managed by cpufreq core 145 if [ ! -f $filepath ]; then 146 return; 147 fi 148 149 backup_governor $2 150 151 local governors=$(cat $filepath) 152 printf "Available governors for $2: $governors\n" 153 154 for governor in $governors; do 155 $1 $2 $governor 156 done 157 158 restore_governor $2 159} 160 161# $1: loop count 162shuffle_governors_for_all_cpus() 163{ 164 printf "** Test: Running ${FUNCNAME[0]} for $1 loops **\n\n" 165 166 for i in `seq 1 $1`; do 167 for_each_policy call_for_each_governor switch_show_governor 168 done 169 printf "%s\n\n" "------------------------------------------------" 170} 171