blob: d2aca56b88e8cb77d45c2a96f122b250cd8477b3 [file] [log] [blame]
Lei Zhangfe13a362022-01-19 16:38:11 -05001#!/bin/sh
2
3# Copyright 2022 The IREE Authors
4#
5# Licensed under the Apache License v2.0 with LLVM Exceptions.
6# See https://llvm.org/LICENSE.txt for license information.
7# SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
8
9# Runs on a phone with Adreno GPU to set the GPU frequency scaling policy.
10
11################################### WARNING ####################################
12# This will overheat the phone if it's not on a cooling plate, resulting in #
13# thermal throttling. To prevent anything catching on fire, the actual GPU #
14# frequencies will be throttled to below the maximum, skewing your results. #
15################################################################################
16
17set -euo pipefail
18
19POLICY="${1:-performance}"
20
21readonly ADRENO_GPU_PATH="/sys/class/kgsl/kgsl-3d0"
22
23# Available frequencies are sorted, either in ascending or descending order.
24readonly ADRENO_MIN_FREQ=$(cat "${ADRENO_GPU_PATH}/devfreq/available_frequencies" | tr " " "\n" | sort -u -n | head -1)
25readonly ADRENO_MAX_FREQ=$(cat "${ADRENO_GPU_PATH}/devfreq/available_frequencies" | tr " " "\n" | sort -u -n | tail -1)
26
27# Power levels match available freqencies.
28readonly ADRENO_MAX_PWRLEVEL=0
29(( ADRENO_MIN_PWRLEVEL = $(cat "${ADRENO_GPU_PATH}/num_pwrlevels") - 1 ))
30readonly ADRENO_MIN_PWRLEVEL
31
32# Idle timers affect governor change and frequncy reset.
33readonly ADRENO_DEFAULT_IDLE_TIMER=80 # ms
34readonly ADRENO_1HOUR_IDLE_TIMER=3600000 # ms
35
36echo "GPU info (before changing frequency scaling policy):"
37echo 'model\t\tcur\t\tmin\t\tmax'
38echo "---------------------------------------------------------"
39paste \
40 "${ADRENO_GPU_PATH}/gpu_model" \
41 "${ADRENO_GPU_PATH}/devfreq/cur_freq" \
42 "${ADRENO_GPU_PATH}/devfreq/min_freq" \
43 "${ADRENO_GPU_PATH}/devfreq/max_freq"
44
45echo "Setting GPU frequency scaling policy to ${POLICY}"
46
47case "$POLICY" in
48 performance)
49 echo 1 > "${ADRENO_GPU_PATH}/force_clk_on"
50 echo ${ADRENO_1HOUR_IDLE_TIMER} > "${ADRENO_GPU_PATH}/idle_timer"
51
52 # Some devices only expose the msm-adreno-tz governor, so allow the
53 # following to fail.
54 echo performance > "${ADRENO_GPU_PATH}/devfreq/governor" || true
55
56 echo ${ADRENO_MAX_FREQ} > "${ADRENO_GPU_PATH}/gpuclk"
57 echo ${ADRENO_MAX_FREQ} > "${ADRENO_GPU_PATH}/devfreq/max_freq"
58 echo ${ADRENO_MAX_FREQ} > "${ADRENO_GPU_PATH}/devfreq/min_freq"
59
60 echo ${ADRENO_MAX_PWRLEVEL} > "${ADRENO_GPU_PATH}/max_pwrlevel"
61 echo ${ADRENO_MAX_PWRLEVEL} > "${ADRENO_GPU_PATH}/min_pwrlevel"
62 ;;
63 default)
64 echo 0 > "${ADRENO_GPU_PATH}/force_clk_on"
65 echo ${ADRENO_DEFAULT_IDLE_TIMER} > "${ADRENO_GPU_PATH}/idle_timer"
66
67 # msm-adreno-tz is the default governor for Adreno GPUs.
68 echo msm-adreno-tz > "${ADRENO_GPU_PATH}/devfreq/governor"
69
70 echo ${ADRENO_MAX_FREQ} > "${ADRENO_GPU_PATH}/devfreq/max_freq"
71 echo ${ADRENO_MIN_FREQ} > "${ADRENO_GPU_PATH}/devfreq/min_freq"
72
73 echo ${ADRENO_MAX_PWRLEVEL} > "${ADRENO_GPU_PATH}/max_pwrlevel"
74 echo ${ADRENO_MIN_PWRLEVEL} > "${ADRENO_GPU_PATH}/min_pwrlevel"
75 ;;
76 *)
77 echo "Unknown frequency scaling policy: ${POLICY}"
78 exit 1
79 ;;
80esac
81
82echo "GPU info (after changing frequency scaling policy):"
83echo 'model\t\tcur\t\tmin\t\tmax'
84echo "---------------------------------------------------------"
85paste \
86 "${ADRENO_GPU_PATH}/gpu_model" \
87 "${ADRENO_GPU_PATH}/devfreq/cur_freq" \
88 "${ADRENO_GPU_PATH}/devfreq/min_freq" \
89 "${ADRENO_GPU_PATH}/devfreq/max_freq"