1# Copyright 2016 Google Inc. 2# 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5 6from _hardware import HardwareException, Expectation 7from _hardware_android import HardwareAndroid 8 9CPU_CLOCK_RATE = 1836000 10GPU_EMC_PROFILE = '0c: core 921 MHz emc 1600 MHz a A d D *' 11GPU_EMC_PROFILE_ID = '0c' 12 13class HardwarePixelC(HardwareAndroid): 14 def __init__(self, adb): 15 HardwareAndroid.__init__(self, adb) 16 17 def __enter__(self): 18 self._lock_clocks() 19 return HardwareAndroid.__enter__(self) 20 21 def __exit__(self, exception_type, exception_value, exception_traceback): 22 HardwareAndroid.__exit__(self, exception_type, 23 exception_value, exception_traceback) 24 self._unlock_clocks() 25 26 def filter_line(self, line): 27 JUNK = ['NvRmPrivGetChipPlatform: Could not read platform information', 28 'Expected on kernels without fuse support, using silicon'] 29 return False if line in JUNK else HardwareAndroid.filter_line(self, line) 30 31 def _lock_clocks(self): 32 if not self._adb.is_root(): 33 return 34 35 self._adb.shell('\n'.join([ 36 # turn on and lock the first 3 cores. 37 ''' 38 for N in 0 1 2; do 39 echo 1 > /sys/devices/system/cpu/cpu$N/online 40 echo userspace > /sys/devices/system/cpu/cpu$N/cpufreq/scaling_governor 41 echo %i > /sys/devices/system/cpu/cpu$N/cpufreq/scaling_max_freq 42 echo %i > /sys/devices/system/cpu/cpu$N/cpufreq/scaling_min_freq 43 echo %i > /sys/devices/system/cpu/cpu$N/cpufreq/scaling_setspeed 44 done''' % tuple(CPU_CLOCK_RATE for _ in range(3)), 45 46 # turn off the fourth core. 47 ''' 48 echo 0 > /sys/devices/system/cpu/cpu3/online''', 49 50 # lock gpu/emc clocks. 51 ''' 52 chown root:root /sys/devices/57000000.gpu/pstate 53 echo %s > /sys/devices/57000000.gpu/pstate''' % GPU_EMC_PROFILE_ID])) 54 55 def _unlock_clocks(self): 56 if not self._adb.is_root(): 57 return 58 59 self._adb.shell('\n'.join([ 60 # unlock gpu/emc clocks. 61 ''' 62 echo auto > /sys/devices/57000000.gpu/pstate 63 chown system:system /sys/devices/57000000.gpu/pstate''', 64 65 # turn the fourth core back on. 66 ''' 67 echo 1 > /sys/devices/system/cpu/cpu3/online''', 68 69 # unlock the first 3 cores. 70 ''' 71 for N in 2 1 0; do 72 echo 1912500 > /sys/devices/system/cpu/cpu$N/cpufreq/scaling_max_freq 73 echo 51000 > /sys/devices/system/cpu/cpu$N/cpufreq/scaling_min_freq 74 echo 0 > /sys/devices/system/cpu/cpu$N/cpufreq/scaling_setspeed 75 echo interactive >/sys/devices/system/cpu/cpu$N/cpufreq/scaling_governor 76 done'''])) 77 78 def sanity_check(self): 79 HardwareAndroid.sanity_check(self) 80 81 if not self._adb.is_root(): 82 return 83 84 # only issue one shell command in an attempt to minimize interference. 85 result = self._adb.check('''\ 86 cat /sys/class/power_supply/bq27742-0/capacity \ 87 /sys/devices/system/cpu/online \ 88 /sys/class/thermal/thermal_zone7/temp \ 89 /sys/class/thermal/thermal_zone0/temp \ 90 /sys/class/thermal/thermal_zone1/temp \ 91 /sys/class/thermal/thermal_zone7/cdev1/cur_state \ 92 /sys/class/thermal/thermal_zone7/cdev0/cur_state 93 for N in 0 1 2; do 94 cat /sys/devices/system/cpu/cpu$N/cpufreq/scaling_cur_freq 95 done 96 cat /sys/devices/57000000.gpu/pstate | grep \*$''') 97 98 expectations = \ 99 [Expectation(int, min_value=30, name='battery', sleeptime=30*60), 100 Expectation(str, exact_value='0-2', name='online cpus'), 101 Expectation(int, max_value=40000, name='skin temperature'), 102 Expectation(int, max_value=86000, name='cpu temperature'), 103 Expectation(int, max_value=87000, name='gpu temperature'), 104 Expectation(int, exact_value=0, name='cpu throttle'), 105 Expectation(int, exact_value=0, name='gpu throttle')] + \ 106 [Expectation(int, exact_value=CPU_CLOCK_RATE, 107 name='cpu_%i clock rate' % i, sleeptime=30) 108 for i in (0, 1, 2)] + \ 109 [Expectation(str, exact_value=GPU_EMC_PROFILE, name='gpu/emc profile')] 110 111 Expectation.check_all(expectations, result.splitlines()) 112 113 def sleep(self, sleeptime): 114 self._unlock_clocks() 115 HardwareAndroid.sleep(self, sleeptime) 116 self._lock_clocks() 117