hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
#!/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" "------------------------------------------------"
}