#!/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"