xref: /aosp_15_r20/frameworks/rs/perf-test-scripts/set-cpu-freq (revision e1eccf28f96817838ad6867f7f39d2351ec11f56)
1*e1eccf28SAndroid Build Coastguard Worker#!/bin/bash
2*e1eccf28SAndroid Build Coastguard Worker
3*e1eccf28SAndroid Build Coastguard Worker# defines
4*e1eccf28SAndroid Build Coastguard WorkerFREQ=0 #percent
5*e1eccf28SAndroid Build Coastguard WorkerSERVICES=(perfd thermal-engine mpdecision)
6*e1eccf28SAndroid Build Coastguard WorkerDIR="/sys/devices/system/cpu"
7*e1eccf28SAndroid Build Coastguard Worker
8*e1eccf28SAndroid Build Coastguard Worker
9*e1eccf28SAndroid Build Coastguard Worker###################### SETUP ######################
10*e1eccf28SAndroid Build Coastguard Worker
11*e1eccf28SAndroid Build Coastguard Worker# helper functions
12*e1eccf28SAndroid Build Coastguard Workerfileexists() {
13*e1eccf28SAndroid Build Coastguard Worker  [ `adb shell "[ -f $1 ] && echo 1 || echo 0" | tr -d '\r'` -eq 1 ]
14*e1eccf28SAndroid Build Coastguard Worker}
15*e1eccf28SAndroid Build Coastguard Workergetprop() {
16*e1eccf28SAndroid Build Coastguard Worker  if fileexists $1; then
17*e1eccf28SAndroid Build Coastguard Worker    echo `adb shell cat $1 | tr -d '\r'`
18*e1eccf28SAndroid Build Coastguard Worker  else
19*e1eccf28SAndroid Build Coastguard Worker    echo "FILE $1 NOT FOUND"
20*e1eccf28SAndroid Build Coastguard Worker  fi
21*e1eccf28SAndroid Build Coastguard Worker}
22*e1eccf28SAndroid Build Coastguard Workersetprop() {
23*e1eccf28SAndroid Build Coastguard Worker  if fileexists $1; then
24*e1eccf28SAndroid Build Coastguard Worker    adb shell "echo -n $2 > $1"
25*e1eccf28SAndroid Build Coastguard Worker  else
26*e1eccf28SAndroid Build Coastguard Worker    echo "FILE $1 NOT FOUND"
27*e1eccf28SAndroid Build Coastguard Worker  fi
28*e1eccf28SAndroid Build Coastguard Worker}
29*e1eccf28SAndroid Build Coastguard Worker
30*e1eccf28SAndroid Build Coastguard Worker# use passed in percent frequency
31*e1eccf28SAndroid Build Coastguard Workerif [[ $# -eq 1 ]]; then
32*e1eccf28SAndroid Build Coastguard Worker  FREQ=$1
33*e1eccf28SAndroid Build Coastguard Workerfi
34*e1eccf28SAndroid Build Coastguard Worker
35*e1eccf28SAndroid Build Coastguard Worker# switch to root
36*e1eccf28SAndroid Build Coastguard Workerif [[ "`adb shell id | tr -d '\r' | awk -F'[()]' '{print $2}'`" != "root" ]]; then
37*e1eccf28SAndroid Build Coastguard Worker  adb root
38*e1eccf28SAndroid Build Coastguard Worker  adb wait-for-device
39*e1eccf28SAndroid Build Coastguard Workerfi
40*e1eccf28SAndroid Build Coastguard Worker
41*e1eccf28SAndroid Build Coastguard Worker# device name
42*e1eccf28SAndroid Build Coastguard Workerecho Device: `adb shell getprop ro.product.model`
43*e1eccf28SAndroid Build Coastguard Workerecho
44*e1eccf28SAndroid Build Coastguard Worker
45*e1eccf28SAndroid Build Coastguard Worker# collect all cores
46*e1eccf28SAndroid Build Coastguard Workercores=`adb shell ls /sys/devices/system/cpu/ | grep cpu[0-9].* | tr -d '\r'`
47*e1eccf28SAndroid Build Coastguard Worker
48*e1eccf28SAndroid Build Coastguard Worker# disable GPU
49*e1eccf28SAndroid Build Coastguard Workeradb shell setprop debug.rs.default-CPU-driver 1
50*e1eccf28SAndroid Build Coastguard Worker
51*e1eccf28SAndroid Build Coastguard Worker
52*e1eccf28SAndroid Build Coastguard Worker###################### CONFIGURE ######################
53*e1eccf28SAndroid Build Coastguard Worker
54*e1eccf28SAndroid Build Coastguard Worker# freeze system
55*e1eccf28SAndroid Build Coastguard Workerfor service in ${SERVICES[@]}; do
56*e1eccf28SAndroid Build Coastguard Worker  adb shell stop $service
57*e1eccf28SAndroid Build Coastguard Workerdone
58*e1eccf28SAndroid Build Coastguard Worker
59*e1eccf28SAndroid Build Coastguard Worker# set frequencies
60*e1eccf28SAndroid Build Coastguard Workerdeclare -A selectedFreq
61*e1eccf28SAndroid Build Coastguard Workerfor core in $cores; do
62*e1eccf28SAndroid Build Coastguard Worker
63*e1eccf28SAndroid Build Coastguard Worker  # turn on core if possible
64*e1eccf28SAndroid Build Coastguard Worker  if fileexists $DIR/$core/online; then
65*e1eccf28SAndroid Build Coastguard Worker    adb shell "echo -n 1 > $DIR/$core/online"
66*e1eccf28SAndroid Build Coastguard Worker  fi
67*e1eccf28SAndroid Build Coastguard Worker
68*e1eccf28SAndroid Build Coastguard Worker  # get available frequencies in sorted order
69*e1eccf28SAndroid Build Coastguard Worker  if fileexists $DIR/$core/cpufreq/scaling_available_frequencies; then
70*e1eccf28SAndroid Build Coastguard Worker    frequencies=(`getprop $DIR/$core/cpufreq/scaling_available_frequencies`)
71*e1eccf28SAndroid Build Coastguard Worker  elif fileexists $DIR/$core/cpufreq/stats/time_in_state; then
72*e1eccf28SAndroid Build Coastguard Worker    frequencies=(`adb shell cat $DIR/$core/cpufreq/stats/time_in_state | cut -f1 -d " " | tr -d '\r'`)
73*e1eccf28SAndroid Build Coastguard Worker  fi
74*e1eccf28SAndroid Build Coastguard Worker  frequencies=(`printf "%s\n" "${frequencies[@]}" | sort -n`)
75*e1eccf28SAndroid Build Coastguard Worker
76*e1eccf28SAndroid Build Coastguard Worker  # find target frequency based on frequency percentage
77*e1eccf28SAndroid Build Coastguard Worker  minFreq=${frequencies[0]}
78*e1eccf28SAndroid Build Coastguard Worker  maxFreq=${frequencies[-1]}
79*e1eccf28SAndroid Build Coastguard Worker  targetFreq=$(( FREQ * ( maxFreq - minFreq ) / 100 + minFreq ))
80*e1eccf28SAndroid Build Coastguard Worker
81*e1eccf28SAndroid Build Coastguard Worker  # find closest frequency
82*e1eccf28SAndroid Build Coastguard Worker  freq=`printf "%d\n" "${frequencies[@]}" | awk -v c=${frequencies[0]} -v t=$targetFreq 'BEGIN{d=$0-t;if(d<0)d=-d;l=d}{d=$0-t;if(d<0)d=-d;if(d<l){l=d;c=$0}}END{print c}'`
83*e1eccf28SAndroid Build Coastguard Worker  selectedFreq[$core]=$freq
84*e1eccf28SAndroid Build Coastguard Worker
85*e1eccf28SAndroid Build Coastguard Worker  # set frequency
86*e1eccf28SAndroid Build Coastguard Worker  adb shell "echo -n $freq > $DIR/$core/cpufreq/scaling_min_freq"
87*e1eccf28SAndroid Build Coastguard Worker  adb shell "echo -n $freq > $DIR/$core/cpufreq/scaling_max_freq"
88*e1eccf28SAndroid Build Coastguard Worker
89*e1eccf28SAndroid Build Coastguard Workerdone
90*e1eccf28SAndroid Build Coastguard Worker
91*e1eccf28SAndroid Build Coastguard Worker
92*e1eccf28SAndroid Build Coastguard Worker# keep trying until the frequencies are properly set
93*e1eccf28SAndroid Build Coastguard Workerwhile true; do
94*e1eccf28SAndroid Build Coastguard Worker
95*e1eccf28SAndroid Build Coastguard Worker  # check to see if frequencies are correct
96*e1eccf28SAndroid Build Coastguard Worker  CORRECT=true
97*e1eccf28SAndroid Build Coastguard Worker  for core in $cores; do
98*e1eccf28SAndroid Build Coastguard Worker    if fileexists $DIR/$core/online && [ `getprop $DIR/$core/online` -eq 0 ]; then
99*e1eccf28SAndroid Build Coastguard Worker      echo "$core is offline"
100*e1eccf28SAndroid Build Coastguard Worker      CORRECT=false
101*e1eccf28SAndroid Build Coastguard Worker    else
102*e1eccf28SAndroid Build Coastguard Worker      if fileexists $DIR/$core/cpufreq/scaling_cur_freq; then
103*e1eccf28SAndroid Build Coastguard Worker        frequency=`getprop $DIR/$core/cpufreq/scaling_cur_freq`
104*e1eccf28SAndroid Build Coastguard Worker        if [ $frequency != ${selectedFreq[$core]} ]; then
105*e1eccf28SAndroid Build Coastguard Worker          echo "$core: $frequency != ${selectedFreq[$core]}"
106*e1eccf28SAndroid Build Coastguard Worker          CORRECT=false
107*e1eccf28SAndroid Build Coastguard Worker        fi
108*e1eccf28SAndroid Build Coastguard Worker      else
109*e1eccf28SAndroid Build Coastguard Worker        echo "$core is offline"
110*e1eccf28SAndroid Build Coastguard Worker        CORRECT=false
111*e1eccf28SAndroid Build Coastguard Worker      fi
112*e1eccf28SAndroid Build Coastguard Worker    fi
113*e1eccf28SAndroid Build Coastguard Worker  done
114*e1eccf28SAndroid Build Coastguard Worker
115*e1eccf28SAndroid Build Coastguard Worker  # finished
116*e1eccf28SAndroid Build Coastguard Worker  if [ $CORRECT == "true" ]; then
117*e1eccf28SAndroid Build Coastguard Worker    break
118*e1eccf28SAndroid Build Coastguard Worker  fi
119*e1eccf28SAndroid Build Coastguard Worker
120*e1eccf28SAndroid Build Coastguard Worker  # display
121*e1eccf28SAndroid Build Coastguard Worker  echo "Frequencies not properly set. Trying again..."
122*e1eccf28SAndroid Build Coastguard Worker
123*e1eccf28SAndroid Build Coastguard Worker  # unfreeze system
124*e1eccf28SAndroid Build Coastguard Worker  for service in ${SERVICES[@]}; do
125*e1eccf28SAndroid Build Coastguard Worker    adb shell start $service
126*e1eccf28SAndroid Build Coastguard Worker  done
127*e1eccf28SAndroid Build Coastguard Worker
128*e1eccf28SAndroid Build Coastguard Worker  # wait for changes to be made
129*e1eccf28SAndroid Build Coastguard Worker  sleep 1
130*e1eccf28SAndroid Build Coastguard Worker
131*e1eccf28SAndroid Build Coastguard Worker  # freeze system
132*e1eccf28SAndroid Build Coastguard Worker  for service in ${SERVICES[@]}; do
133*e1eccf28SAndroid Build Coastguard Worker    adb shell stop $service
134*e1eccf28SAndroid Build Coastguard Worker  done
135*e1eccf28SAndroid Build Coastguard Worker
136*e1eccf28SAndroid Build Coastguard Worker  # try resetting the values (only really needed for Nexus 7 for some reason)
137*e1eccf28SAndroid Build Coastguard Worker  for core in $cores; do
138*e1eccf28SAndroid Build Coastguard Worker    if fileexists $DIR/$core/online; then
139*e1eccf28SAndroid Build Coastguard Worker      adb shell "echo -n 1 > $DIR/$core/online"
140*e1eccf28SAndroid Build Coastguard Worker    fi
141*e1eccf28SAndroid Build Coastguard Worker    adb shell "echo -n $freq > $DIR/$core/cpufreq/scaling_min_freq"
142*e1eccf28SAndroid Build Coastguard Worker    adb shell "echo -n $freq > $DIR/$core/cpufreq/scaling_max_freq"
143*e1eccf28SAndroid Build Coastguard Worker  done
144*e1eccf28SAndroid Build Coastguard Worker
145*e1eccf28SAndroid Build Coastguard Worker  sleep 1
146*e1eccf28SAndroid Build Coastguard Worker
147*e1eccf28SAndroid Build Coastguard Workerdone
148*e1eccf28SAndroid Build Coastguard Worker
149*e1eccf28SAndroid Build Coastguard Worker# display
150*e1eccf28SAndroid Build Coastguard Workerfor core in $cores; do
151*e1eccf28SAndroid Build Coastguard Worker  echo "$core successfully set to ${selectedFreq[$core]}"
152*e1eccf28SAndroid Build Coastguard Workerdone
153*e1eccf28SAndroid Build Coastguard Worker
154*e1eccf28SAndroid Build Coastguard Worker
155