• 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 cpu.freq;
17INCLUDE PERFETTO MODULE time.conversion;
18INCLUDE PERFETTO MODULE wattson.arm_dsu;
19INCLUDE PERFETTO MODULE wattson.cpu_idle;
20INCLUDE PERFETTO MODULE wattson.curves.utils;
21INCLUDE PERFETTO MODULE wattson.device_infos;
22
23CREATE PERFETTO TABLE _cpu_freq
24AS
25SELECT
26  ts,
27  dur,
28  freq,
29  cf.cpu,
30  d_map.policy
31FROM cpu_freq_counters as cf
32JOIN _dev_cpu_policy_map as d_map
33ON cf.cpu = d_map.cpu;
34
35-- Combines idle and freq tables of all CPUs to create system state.
36CREATE VIRTUAL TABLE _idle_freq
37USING
38  SPAN_OUTER_JOIN(
39    _cpu_freq partitioned cpu, _adjusted_deep_idle partitioned cpu
40  );
41
42-- Add extra column indicating that frequency info are present
43CREATE PERFETTO TABLE _valid_window
44AS
45WITH window_start AS (
46  SELECT ts as start_ts
47  FROM _idle_freq
48  WHERE cpu = 0 and freq GLOB '*[0-9]*'
49  ORDER BY ts ASC
50  LIMIT 1
51),
52window_end AS (
53  SELECT ts + dur as end_ts
54  FROM cpu_freq_counters
55  ORDER by ts DESC
56  LIMIT 1
57)
58SELECT
59  start_ts as ts,
60  end_ts - start_ts as dur
61FROM window_start, window_end;
62
63CREATE VIRTUAL TABLE _idle_freq_filtered
64USING
65  SPAN_JOIN(_valid_window, _idle_freq);
66
67-- Start matching split CPUs with curves
68CREATE PERFETTO TABLE _idle_freq_materialized
69AS
70SELECT
71  iff.ts, iff.dur, iff.cpu, iff.policy, iff.freq, iff.idle, lut.curve_value
72FROM _idle_freq_filtered iff
73-- Left join since some CPUs may only match the 2D LUT
74LEFT JOIN _filtered_curves_1d lut ON
75  iff.policy = lut.policy AND
76  iff.idle = lut.idle AND
77  iff.freq = lut.freq_khz;
78
79CREATE PERFETTO TABLE _stats_cpu0
80AS
81SELECT
82  ts,
83  dur,
84  curve_value as cpu0_curve,
85  freq as freq_0,
86  idle as idle_0
87FROM _idle_freq_materialized
88WHERE cpu = 0;
89
90CREATE PERFETTO TABLE _stats_cpu1
91AS
92SELECT
93  ts,
94  dur,
95  curve_value as cpu1_curve,
96  freq as freq_1,
97  idle as idle_1
98FROM _idle_freq_materialized
99WHERE cpu = 1;
100
101CREATE PERFETTO TABLE _stats_cpu2
102AS
103SELECT
104  ts,
105  dur,
106  curve_value as cpu2_curve,
107  freq as freq_2,
108  idle as idle_2
109FROM _idle_freq_materialized
110WHERE cpu = 2;
111
112CREATE PERFETTO TABLE _stats_cpu3
113AS
114SELECT
115  ts,
116  dur,
117  curve_value as cpu3_curve,
118  freq as freq_3,
119  idle as idle_3
120FROM _idle_freq_materialized
121WHERE cpu = 3;
122
123CREATE PERFETTO TABLE _stats_cpu4
124AS
125SELECT
126  ts,
127  dur,
128  policy as policy_4,
129  curve_value as cpu4_curve,
130  freq as freq_4,
131  idle as idle_4
132FROM _idle_freq_materialized
133WHERE cpu = 4;
134
135CREATE PERFETTO TABLE _stats_cpu5
136AS
137SELECT
138  ts,
139  dur,
140  policy as policy_5,
141  curve_value as cpu5_curve,
142  freq as freq_5,
143  idle as idle_5
144FROM _idle_freq_materialized
145WHERE cpu = 5;
146
147CREATE PERFETTO TABLE _stats_cpu6
148AS
149SELECT
150  ts,
151  dur,
152  policy as policy_6,
153  curve_value as cpu6_curve,
154  freq as freq_6,
155  idle as idle_6
156FROM _idle_freq_materialized
157WHERE cpu = 6;
158
159CREATE PERFETTO TABLE _stats_cpu7
160AS
161SELECT
162  ts,
163  dur,
164  policy as policy_7,
165  curve_value as cpu7_curve,
166  freq as freq_7,
167  idle as idle_7
168FROM _idle_freq_materialized
169WHERE cpu = 7;
170
171CREATE VIRTUAL TABLE _stats_cpu01
172USING
173  SPAN_OUTER_JOIN(_stats_cpu1, _stats_cpu0);
174
175CREATE VIRTUAL TABLE _stats_cpu012
176USING
177  SPAN_OUTER_JOIN(_stats_cpu2, _stats_cpu01);
178
179CREATE VIRTUAL TABLE _stats_cpu0123
180USING
181  SPAN_OUTER_JOIN(_stats_cpu3, _stats_cpu012);
182
183CREATE VIRTUAL TABLE _stats_cpu01234
184USING
185  SPAN_OUTER_JOIN(_stats_cpu4, _stats_cpu0123);
186
187CREATE VIRTUAL TABLE _stats_cpu012345
188USING
189  SPAN_OUTER_JOIN(_stats_cpu5, _stats_cpu01234);
190
191CREATE VIRTUAL TABLE _stats_cpu0123456
192USING
193  SPAN_OUTER_JOIN(_stats_cpu6, _stats_cpu012345);
194
195CREATE VIRTUAL TABLE _stats_cpu01234567
196USING
197  SPAN_OUTER_JOIN(_stats_cpu7, _stats_cpu0123456);
198
199-- get suspend resume state as logged by ftrace.
200CREATE PERFETTO TABLE _suspend_slice
201AS
202SELECT
203  ts, dur, TRUE AS suspended
204FROM slice
205WHERE name GLOB "timekeeping_freeze(0)";
206
207-- Combine suspend information with CPU idle and frequency system states.
208CREATE VIRTUAL TABLE _idle_freq_suspend_slice
209USING
210  SPAN_OUTER_JOIN(_stats_cpu01234567, _suspend_slice);
211
212-- Combine system state so that it has idle, freq, and L3 hit info.
213CREATE VIRTUAL TABLE _idle_freq_l3_hit_slice
214USING
215  SPAN_OUTER_JOIN(_idle_freq_suspend_slice, _arm_l3_hit_rate);
216
217-- Combine system state so that it has idle, freq, L3 hit, and L3 miss info.
218CREATE VIRTUAL TABLE _idle_freq_l3_hit_l3_miss_slice
219USING
220  SPAN_OUTER_JOIN(_idle_freq_l3_hit_slice, _arm_l3_miss_rate);
221