1-- 2-- Copyright 2024 The Android Open Source Project 3-- 4-- Licensed under the Apache License, Version 2.0 (the "License"); 5-- you may not use this file except in compliance with the License. 6-- You may obtain a copy of the License at 7-- 8-- https://www.apache.org/licenses/LICENSE-2.0 9-- 10-- Unless required by applicable law or agreed to in writing, software 11-- distributed under the License is distributed on an "AS IS" BASIS, 12-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13-- See the License for the specific language governing permissions and 14-- limitations under the License. 15 16INCLUDE PERFETTO MODULE android.device; 17 18-- Device specific info for deep idle time offsets 19CREATE PERFETTO TABLE _device_cpu_deep_idle_offsets AS 20WITH 21 data(device, cpu, offset_ns) AS ( 22 SELECT 23 * 24 FROM (VALUES 25 ("Tensor", 0, 0), 26 ("Tensor", 1, 0), 27 ("Tensor", 2, 0), 28 ("Tensor", 3, 0), 29 ("Tensor", 4, 0), 30 ("Tensor", 5, 0), 31 ("Tensor", 6, 200000), 32 ("Tensor", 7, 200000), 33 ("monaco", 0, 450000), 34 ("monaco", 1, 450000), 35 ("monaco", 2, 450000), 36 ("monaco", 3, 450000), 37 ("Tensor G4", 0, 0), 38 ("Tensor G4", 1, 0), 39 ("Tensor G4", 2, 0), 40 ("Tensor G4", 3, 0), 41 ("Tensor G4", 4, 110000), 42 ("Tensor G4", 5, 110000), 43 ("Tensor G4", 6, 110000), 44 ("Tensor G4", 7, 400000), 45 ("neo", 0, 100000), 46 ("neo", 1, 100000), 47 ("neo", 2, 100000), 48 ("neo", 3, 100000)) AS _values 49 ) 50SELECT 51 * 52FROM data; 53 54CREATE PERFETTO TABLE _wattson_device_map AS 55WITH 56 data(device, wattson_device) AS ( 57 SELECT 58 * 59 FROM (VALUES 60 ("oriole", "Tensor"), 61 ("raven", "Tensor"), 62 ("bluejay", "Tensor"), 63 ("eos", "monaco"), 64 ("aurora", "monaco")) AS _values 65 ) 66SELECT 67 * 68FROM data; 69 70CREATE PERFETTO TABLE _wattson_device AS 71WITH 72 soc_model AS ( 73 SELECT 74 coalesce( 75 -- Get guest model from metadata, which takes precedence if set 76 ( 77 SELECT 78 str_value 79 FROM metadata 80 WHERE 81 name = 'android_guest_soc_model' 82 ), 83 -- Get model from metadata 84 ( 85 SELECT 86 str_value 87 FROM metadata 88 WHERE 89 name = 'android_soc_model' 90 ), 91 -- Get device name from metadata and map it to model 92 ( 93 SELECT 94 wattson_device 95 FROM _wattson_device_map AS map 96 JOIN android_device_name AS ad 97 ON ad.name = map.device 98 ) 99 ) AS name 100 ) 101-- Once model is obtained, check to see if the model is supported by Wattson 102-- via checking if model is within a key-value pair mapping 103SELECT DISTINCT 104 name 105FROM soc_model 106JOIN _device_cpu_deep_idle_offsets AS map 107 ON map.device = name; 108 109-- Device specific mapping from CPU to policy 110CREATE PERFETTO TABLE _cpu_to_policy_map AS 111WITH 112 data(device, cpu, policy) AS ( 113 SELECT 114 * 115 FROM (VALUES 116 ("monaco", 0, 0), 117 ("monaco", 1, 0), 118 ("monaco", 2, 0), 119 ("monaco", 3, 0), 120 ("Tensor", 0, 0), 121 ("Tensor", 1, 0), 122 ("Tensor", 2, 0), 123 ("Tensor", 3, 0), 124 ("Tensor", 4, 4), 125 ("Tensor", 5, 4), 126 ("Tensor", 6, 6), 127 ("Tensor", 7, 6), 128 ("Tensor G4", 0, 0), 129 ("Tensor G4", 1, 0), 130 ("Tensor G4", 2, 0), 131 ("Tensor G4", 3, 0), 132 ("Tensor G4", 4, 4), 133 ("Tensor G4", 5, 4), 134 ("Tensor G4", 6, 4), 135 ("Tensor G4", 7, 7), 136 ("Tensor G4", 255, 255), 137 ("neo", 0, 0), 138 ("neo", 1, 0), 139 ("neo", 2, 0), 140 ("neo", 3, 0)) AS _values 141 ) 142SELECT 143 * 144FROM data; 145 146-- Prefilter table based on device 147CREATE PERFETTO TABLE _dev_cpu_policy_map AS 148SELECT 149 cpu, 150 policy 151FROM _cpu_to_policy_map AS cp_map 152JOIN _wattson_device AS device 153 ON cp_map.device = device.name 154ORDER BY 155 cpu; 156 157-- Policy and freq that will give minimum volt vote 158CREATE PERFETTO TABLE _device_min_volt_vote AS 159WITH 160 data(device, policy, freq) AS ( 161 SELECT 162 * 163 FROM (VALUES 164 ("monaco", 0, 614400), 165 ("Tensor", 4, 400000), 166 ("Tensor G4", 0, 700000), 167 ("neo", 0, 691200)) AS _values 168 ) 169SELECT 170 * 171FROM data; 172 173-- Get policy corresponding to minimum volt vote 174CREATE PERFETTO FUNCTION _get_min_policy_vote() 175RETURNS LONG AS 176SELECT 177 vote_tbl.policy 178FROM _device_min_volt_vote AS vote_tbl, _wattson_device AS device 179WHERE 180 vote_tbl.device = device.name; 181 182-- Get frequency corresponding to minimum volt vote 183CREATE PERFETTO FUNCTION _get_min_freq_vote() 184RETURNS LONG AS 185SELECT 186 vote_tbl.freq 187FROM _device_min_volt_vote AS vote_tbl, _wattson_device AS device 188WHERE 189 vote_tbl.device = device.name; 190 191-- Devices that require using devfreq 192CREATE PERFETTO TABLE _use_devfreq AS 193WITH 194 data(device) AS ( 195 SELECT 196 * 197 FROM (VALUES 198 ("Tensor G4")) AS _values 199 ) 200SELECT 201 * 202FROM data; 203 204-- Creates non-empty table if device needs devfreq 205CREATE PERFETTO TABLE _use_devfreq_for_calc AS 206SELECT 207 TRUE AS devfreq_necessary 208FROM _use_devfreq AS d 209JOIN _wattson_device AS device 210 ON d.device = device.name; 211 212-- Creates empty table if device needs devfreq; inverse of _use_devfreq_for_calc 213CREATE PERFETTO TABLE _skip_devfreq_for_calc AS 214SELECT 215 FALSE AS devfreq_necessary 216FROM _use_devfreq AS d 217JOIN _wattson_device AS device 218 ON d.device != device.name; 219 220-- Devices that require idle state mapping 221CREATE PERFETTO TABLE _idle_state_map AS 222WITH 223 data(device, nominal_idle, override_idle) AS ( 224 SELECT 225 * 226 FROM (VALUES 227 ("neo", 4294967295, -1), 228 ("neo", 0, 0), 229 ("neo", 1, 1), 230 ("neo", 2, 1)) AS _values 231 ) 232SELECT 233 * 234FROM data; 235 236-- idle_mapping override filtered for device 237CREATE PERFETTO TABLE _idle_state_map_override AS 238SELECT 239 nominal_idle, 240 override_idle 241FROM _idle_state_map AS idle_map 242JOIN _wattson_device AS device 243 ON idle_map.device = device.name; 244 245-- Get the device specific deepest idle state if defined, otherwise use 1 as the 246-- deepest idle state 247CREATE PERFETTO TABLE _deepest_idle AS 248SELECT 249 coalesce(( 250 SELECT 251 max(override_idle) 252 FROM _idle_state_map_override 253 ), 1) AS idle; 254