diff options
author | Chris Dalton <csmartdalton@google.com> | 2018-04-27 17:10:39 -0600 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-04-30 15:29:13 +0000 |
commit | 117d9729c185b16ac6f26d7b0fb7acf0a5088bac (patch) | |
tree | 98512b220ae2e9c7d5c14a9065258ac985f6ab31 /tools | |
parent | 6eb85a1cf1b0829a16859f0e4b5b3f2064f38120 (diff) |
skpbench: Add support for Pixel 2
Bug: skia:
Change-Id: Ic0901ca84bf8e3fda29b3bd7a0504396445ca0f4
Reviewed-on: https://skia-review.googlesource.com/124282
Reviewed-by: Kevin Lubick <kjlubick@google.com>
Commit-Queue: Chris Dalton <csmartdalton@google.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/skpbench/_adb_path.py | 2 | ||||
-rw-r--r-- | tools/skpbench/_hardware_android.py | 6 | ||||
-rw-r--r-- | tools/skpbench/_hardware_pixel.py | 64 | ||||
-rw-r--r-- | tools/skpbench/_hardware_pixel2.py | 119 | ||||
-rwxr-xr-x | tools/skpbench/skpbench.py | 3 |
5 files changed, 128 insertions, 66 deletions
diff --git a/tools/skpbench/_adb_path.py b/tools/skpbench/_adb_path.py index dc23fc5895..407f4039e3 100644 --- a/tools/skpbench/_adb_path.py +++ b/tools/skpbench/_adb_path.py @@ -20,6 +20,8 @@ def basename(pathname): return pathname.rsplit('/', maxsplit=1)[-1] def find_skps(skps): + # root first, in case skps reside in a protected directory + __ADB.root() escapedskps = [re.sub(r'([^a-zA-Z0-9_/\.\*\?\[\!\]])', r'\\\1', x) for x in skps] return __ADB.check('''\ diff --git a/tools/skpbench/_hardware_android.py b/tools/skpbench/_hardware_android.py index 62e3ddd420..499247b03b 100644 --- a/tools/skpbench/_hardware_android.py +++ b/tools/skpbench/_hardware_android.py @@ -29,9 +29,9 @@ class HardwareAndroid(Hardware): # disable GPS. ''' - for MODE in gps wifi network; do - settings put secure location_providers_allowed -$MODE - done'''])) + settings put secure location_providers_allowed -gps + settings put secure location_providers_allowed -wifi + settings put secure location_providers_allowed -network'''])) if self._adb.is_root(): self._adb.shell('\n'.join([ diff --git a/tools/skpbench/_hardware_pixel.py b/tools/skpbench/_hardware_pixel.py index 02465b0186..7c254acf03 100644 --- a/tools/skpbench/_hardware_pixel.py +++ b/tools/skpbench/_hardware_pixel.py @@ -3,26 +3,15 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -from _hardware import HardwareException, Expectation +from _hardware import Expectation from _hardware_android import HardwareAndroid -from collections import namedtuple -import itertools CPU_CLOCK_RATE = 1670400 GPU_CLOCK_RATE = 315000000 -DEVFREQ_DIRNAME = '/sys/class/devfreq' -DEVFREQ_THROTTLE = 0.74 -DEVFREQ_BLACKLIST = ('b00000.qcom,kgsl-3d0', 'soc:qcom,kgsl-busmon', - 'soc:qcom,m4m') -DevfreqKnobs = namedtuple('knobs', - ('available_governors', 'available_frequencies', - 'governor', 'min_freq', 'max_freq', 'cur_freq')) - class HardwarePixel(HardwareAndroid): def __init__(self, adb): HardwareAndroid.__init__(self, adb) - self._discover_devfreqs() def __enter__(self): HardwareAndroid.__enter__(self) @@ -99,54 +88,3 @@ class HardwarePixel(HardwareAndroid): Expectation(int, max_value=40, name='msm_therm temperature')] Expectation.check_all(expectations, result.splitlines()) - - def _discover_devfreqs(self): - self._devfreq_lock_cmds = list() - self._devfreq_sanity_knobs = list() - self._devfreq_sanity_expectations = list() - - results = iter(self._adb.check('''\ - KNOBS='%s' - for DEVICE in %s/*; do - if cd $DEVICE && ls $KNOBS >/dev/null; then - basename $DEVICE - cat $KNOBS - fi - done 2>/dev/null''' % - (' '.join(DevfreqKnobs._fields), DEVFREQ_DIRNAME)).splitlines()) - - while True: - batch = tuple(itertools.islice(results, 1 + len(DevfreqKnobs._fields))) - if not batch: - break - - devfreq = batch[0] - if devfreq in DEVFREQ_BLACKLIST: - continue - - path = '%s/%s' % (DEVFREQ_DIRNAME, devfreq) - - knobs = DevfreqKnobs(*batch[1:]) - if not 'performance' in knobs.available_governors.split(): - print('WARNING: devfreq %s does not have performance governor' % path) - continue - - self._devfreq_lock_cmds.append('echo performance > %s/governor' % path) - - frequencies = map(int, knobs.available_frequencies.split()) - if frequencies: - # choose the lowest frequency that is >= DEVFREQ_THROTTLE * max. - frequencies.sort() - target = DEVFREQ_THROTTLE * frequencies[-1] - idx = len(frequencies) - 1 - while idx > 0 and frequencies[idx - 1] >= target: - idx -= 1 - bench_frequency = frequencies[idx] - self._devfreq_lock_cmds.append('echo %i > %s/min_freq' % - (bench_frequency, path)) - self._devfreq_lock_cmds.append('echo %i > %s/max_freq' % - (bench_frequency, path)) - self._devfreq_sanity_knobs.append('%s/cur_freq' % path) - self._devfreq_sanity_expectations.append( - Expectation(int, exact_value=bench_frequency, - name='%s/cur_freq' % path)) diff --git a/tools/skpbench/_hardware_pixel2.py b/tools/skpbench/_hardware_pixel2.py new file mode 100644 index 0000000000..a42cafa516 --- /dev/null +++ b/tools/skpbench/_hardware_pixel2.py @@ -0,0 +1,119 @@ +# Copyright 2018 Google Inc. +# +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +from _hardware import Expectation +from _hardware_android import HardwareAndroid + +CPU_CLOCK_RATE = 2035200 +MEM_CLOCK_RATE = 13763 +GPU_CLOCK_RATE = 670000000 +GPU_POWER_LEVEL = 1 # lower is faster, minimum is 0 + +class HardwarePixel2(HardwareAndroid): + def __init__(self, adb): + HardwareAndroid.__init__(self, adb) + + def __enter__(self): + HardwareAndroid.__enter__(self) + if not self._adb.is_root(): + return self + + self._adb.shell('\n'.join([ + ''' + stop thermal-engine + stop perfd''', + + # turn off the slow cores and one fast core + ''' + for N in 0 1 2 3 7; do + echo 0 > /sys/devices/system/cpu/cpu$N/online + done''', + + # lock 3 fast cores: two for Skia and one for the OS + ''' + for N in 4 5 6; do + echo 1 > /sys/devices/system/cpu/cpu$N/online + echo userspace > /sys/devices/system/cpu/cpu$N/cpufreq/scaling_governor + echo %i > /sys/devices/system/cpu/cpu$N/cpufreq/scaling_max_freq + echo %i > /sys/devices/system/cpu/cpu$N/cpufreq/scaling_min_freq + echo %i > /sys/devices/system/cpu/cpu$N/cpufreq/scaling_setspeed + done''' % tuple(CPU_CLOCK_RATE for _ in range(3)), + + # Set GPU bus and idle timer + ''' + echo 0 > /sys/class/kgsl/kgsl-3d0/bus_split''', + # csmartdalton, 4-26-2018: this line hangs my device + # echo 1 > /sys/class/kgsl/kgsl-3d0/force_clk_on + ''' + echo 10000 > /sys/class/kgsl/kgsl-3d0/idle_timer''', + + # Set mem frequency to max + ''' + echo %i > /sys/class/devfreq/soc\:qcom,gpubw/min_freq + echo %i > /sys/class/devfreq/soc\:qcom,gpubw/max_freq + echo %i > /sys/class/devfreq/soc\:qcom,cpubw/min_freq + echo %i > /sys/class/devfreq/soc\:qcom,cpubw/max_freq + echo %i > /sys/class/devfreq/soc\:qcom,mincpubw/min_freq + echo %i > /sys/class/devfreq/soc\:qcom,mincpubw/max_freq + echo %i > /sys/class/devfreq/soc\:qcom,memlat-cpu0/min_freq + echo %i > /sys/class/devfreq/soc\:qcom,memlat-cpu0/max_freq''' % + tuple(MEM_CLOCK_RATE for _ in range(8)), + + # Set GPU to performance mode + ''' + echo performance > /sys/class/kgsl/kgsl-3d0/devfreq/governor + echo %i > /sys/class/kgsl/kgsl-3d0/devfreq/max_freq + echo %i > /sys/class/kgsl/kgsl-3d0/devfreq/min_freq''' % + tuple(GPU_CLOCK_RATE for _ in range(2)), + + # Set GPU power level + ''' + echo %i > /sys/class/kgsl/kgsl-3d0/max_pwrlevel + echo %i > /sys/class/kgsl/kgsl-3d0/min_pwrlevel''' % + tuple(GPU_POWER_LEVEL for _ in range(2))])) + + assert('msm_therm' == self._adb.check(\ + 'cat /sys/class/thermal/thermal_zone10/type').strip()) + assert('pm8998_tz' == self._adb.check(\ + 'cat /sys/class/thermal/thermal_zone7/type').strip()) + + return self + + def sanity_check(self): + HardwareAndroid.sanity_check(self) + + if not self._adb.is_root(): + return + + result = self._adb.check(' '.join( + ['cat', + '/sys/class/power_supply/battery/capacity', + '/sys/devices/system/cpu/online'] + \ + ['/sys/devices/system/cpu/cpu%i/cpufreq/scaling_cur_freq' % i + for i in range(4, 7)] + \ + # Unfortunately we can't monitor the gpu clock: + # + # /sys/class/kgsl/kgsl-3d0/devfreq/cur_freq + # + # It doesn't respect the min_freq/max_freq values when not under load. + ['/sys/kernel/debug/clk/bimc_clk/measure', + '/sys/class/kgsl/kgsl-3d0/temp', + '/sys/class/kgsl/kgsl-3d0/throttling', + '/sys/class/thermal/thermal_zone10/temp', + '/sys/class/thermal/thermal_zone7/temp'])) + + expectations = \ + [Expectation(int, min_value=30, name='battery', sleeptime=30*60), + Expectation(str, exact_value='4-6', name='online cpus')] + \ + [Expectation(int, exact_value=CPU_CLOCK_RATE, name='cpu_%i clock rate' %i) + for i in range(4, 7)] + \ + [Expectation(long, min_value=902390000, max_value=902409999, + name='measured ddr clock', sleeptime=10), + Expectation(int, max_value=750, name='gpu temperature'), + Expectation(int, exact_value=1, name='gpu throttling'), + Expectation(int, max_value=75, name='msm_therm temperature'), + Expectation(int, max_value=75000, name='pm8998_tz temperature')] + + Expectation.check_all(expectations, result.splitlines()) diff --git a/tools/skpbench/skpbench.py b/tools/skpbench/skpbench.py index f2df9b679d..243beaf795 100755 --- a/tools/skpbench/skpbench.py +++ b/tools/skpbench/skpbench.py @@ -307,6 +307,9 @@ def main(): elif model == 'Pixel': from _hardware_pixel import HardwarePixel hardware = HardwarePixel(adb) + elif model == 'Pixel 2': + from _hardware_pixel2 import HardwarePixel2 + hardware = HardwarePixel2(adb) elif model == 'Nexus 6P': from _hardware_nexus_6p import HardwareNexus6P hardware = HardwareNexus6P(adb) |