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