aboutsummaryrefslogtreecommitdiffhomepage
path: root/tools
diff options
context:
space:
mode:
authorGravatar Chris Dalton <csmartdalton@google.com>2018-04-27 17:10:39 -0600
committerGravatar Skia Commit-Bot <skia-commit-bot@chromium.org>2018-04-30 15:29:13 +0000
commit117d9729c185b16ac6f26d7b0fb7acf0a5088bac (patch)
tree98512b220ae2e9c7d5c14a9065258ac985f6ab31 /tools
parent6eb85a1cf1b0829a16859f0e4b5b3f2064f38120 (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.py2
-rw-r--r--tools/skpbench/_hardware_android.py6
-rw-r--r--tools/skpbench/_hardware_pixel.py64
-rw-r--r--tools/skpbench/_hardware_pixel2.py119
-rwxr-xr-xtools/skpbench/skpbench.py3
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)