92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			92 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
| #!/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"
 | |
| 
 | |
| 
 |