• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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