lin
2025-07-30 fcd736bf35fd93b563e9bbf594f2aa7b62028cc9
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
#!/bin/bash
 
# defines
FREQ=0 #percent
SERVICES=(perfd thermal-engine thermald mpdecision)
DIR="/sys/class/kgsl/kgsl-3d0"
 
 
###################### SETUP ######################
 
# helper functions
fileexists() {
  [ `adb shell "[ -f $1 ] && echo found"` ]
}
getprop() {
  if fileexists $1; then
    echo `adb shell cat $1 | tr -d '\r'`
  else
    echo "FILE $1 NOT FOUND"
  fi
}
setprop() {
  if fileexists $1; then
    adb shell "echo -n $2 > $1"
  else
    echo "FILE $1 NOT FOUND"
  fi
}
 
# use passed in percent frequency
if [[ $# -eq 1 ]]; then
  FREQ=$1
fi
 
# setup
if [[ "`adb shell id | tr -d '\r' | awk -F'[()]' '{print $2}'`" != "root" ]]; then
  adb root
fi
adb wait-for-device
 
# device name
echo Device: `adb shell getprop ro.product.model`
 
# get available gpu frequencies in sorted order
if fileexists $DIR/devfreq/available_frequencies; then
  frequencies=(`getprop $DIR/devfreq/available_frequencies`)
elif fileexists $DIR/gpu_available_frequencies; then
  frequencies=(`getprop $DIR/gpu_available_frequencies`)
elif fileexists /d/clock/gbus/possible_rates; then
  frequencies=(`getprop /d/clock/gbus/possible_rates`)
else
  echo "Unable to find available GPU frequencies"
  echo
  exit
fi
frequencies=( `printf "%s\n" "${frequencies[@]}" | sort -n` )
if [ ${frequencies[0]} == "(kHz)" ]; then
  frequencies=(`printf "%s000\n" "${frequencies[@]:1}"`)
fi
minFreq=${frequencies[0]}
maxFreq=${frequencies[-1]}
echo Frequencies: ${frequencies[@]}
 
# find closest frequency
targetFreq=$(( FREQ * ( maxFreq - minFreq ) / 100 + minFreq ))
freq=`printf "%d\n" "${frequencies[@]}" | awk -v closest=${frequencies[0]} -v target=$targetFreq 'BEGIN{diff=$0-target;if(diff<0)diff=-diff;lowest=diff};{diff=$0-target;if(diff<0)diff=-diff;if(diff<lowest){lowest=diff;closest=$0}};END{print closest}'`
echo Selected: $freq
 
echo
 
# freeze system
for service in ${SERVICES[@]}; do
  adb shell stop $service
done
 
# set GPU properties if possible
setprop $DIR/bus_split 0
setprop $DIR/devfreq/governor performance
setprop $DIR/force_bus_on 1
setprop $DIR/force_rail_on 1
setprop $DIR/force_clk_on 1
setprop $DIR/idle_timer 1000000
setprop $DIR/max_gpuclk $freq
setprop $DIR/gpuclk $freq
setprop /d/clock/override.gbus/state 1
setprop /d/clock/override.gbus/rate $freq
 
# final message
echo "GPU Frequency set to $freq"