1 // Copyright (c) 2023 Apple Inc. All rights reserved.
2 //
3 // @APPLE_OSREFERENCE_LICENSE_HEADER_START@
4 //
5 // This file contains Original Code and/or Modifications of Original Code
6 // as defined in and that are subject to the Apple Public Source License
7 // Version 2.0 (the 'License'). You may not use this file except in
8 // compliance with the License. The rights granted to you under the License
9 // may not be used to create, or enable the creation or redistribution of,
10 // unlawful or unlicensed copies of an Apple operating system, or to
11 // circumvent, violate, or enable the circumvention or violation of, any
12 // terms of an Apple operating system software license agreement.
13 //
14 // Please obtain a copy of the License at
15 // http://www.opensource.apple.com/apsl/ and read it before using this file.
16 //
17 // The Original Code and all software distributed under the License are
18 // distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
19 // EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
20 // INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
21 // FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
22 // Please see the License for the specific language governing rights and
23 // limitations under the License.
24 //
25 // @APPLE_OSREFERENCE_LICENSE_HEADER_END@
26
27 #include <arm/cpuid.h>
28 #include <arm64/cpc_arm64.h>
29 #include <kern/assert.h>
30 #include <kern/cpc.h>
31 #include <kern/startup.h>
32 #include <stdint.h>
33 #include <stdbool.h>
34 #include <stddef.h>
35
36 struct cpc_event {
37 const char *cev_name;
38 uint16_t cev_selector;
39 };
40
41 struct cpc_event_list {
42 unsigned int cel_event_count;
43 struct cpc_event cel_events[];
44 };
45 static const struct cpc_event_list _known_cpmu_events;
46
47 static const struct cpc_event_list _no_events = {
48 .cel_event_count = 0,
49 .cel_events = {},
50 };
51
52 const struct cpc_event_list * const _cpc_known_events[CPC_HW_COUNT] = {
53 [CPC_HW_CPMU] = &_known_cpmu_events,
54 [CPC_HW_UPMU] = &_no_events,
55 };
56
57 static const struct cpc_event *
_cpc_select_event(cpc_hw_t hw,uint16_t selector)58 _cpc_select_event(cpc_hw_t hw, uint16_t selector)
59 {
60 assert(hw < CPC_HW_COUNT);
61 const struct cpc_event_list *list = _cpc_known_events[hw];
62 for (unsigned int i = 0; i < list->cel_event_count; i++) {
63 if (list->cel_events[i].cev_selector == selector) {
64 return &list->cel_events[i];
65 }
66 }
67 return NULL;
68 }
69
70 static
71 #if !CPC_INSECURE
72 const
73 #endif // !CPC_INSECURE
74 cpc_event_policy_t _cpc_event_policy = CPC_EVPOL_DEFAULT;
75
76 cpc_event_policy_t
cpc_get_event_policy(void)77 cpc_get_event_policy(void)
78 {
79 return _cpc_event_policy;
80 }
81
82 #if CPC_INSECURE
83
84 void
cpc_set_event_policy(cpc_event_policy_t new_policy)85 cpc_set_event_policy(cpc_event_policy_t new_policy)
86 {
87 _cpc_event_policy = new_policy;
88 }
89
90 #endif // CPC_INSECURE
91
92 bool
cpc_event_allowed(cpc_hw_t hw,uint16_t event_selector)93 cpc_event_allowed(
94 cpc_hw_t hw,
95 uint16_t event_selector)
96 {
97 if (event_selector == 0) {
98 return true;
99 }
100 switch (_cpc_event_policy) {
101 #if CPC_INSECURE
102 case CPC_EVPOL_ALLOW_ALL:
103 return true;
104 #endif // CPC_INSECURE
105 case CPC_EVPOL_DENY_ALL:
106 return false;
107 case CPC_EVPOL_RESTRICT_TO_KNOWN:
108 return _cpc_select_event(hw, event_selector) != NULL;
109 }
110 return false;
111 }
112
113
114 static const struct cpc_event_list _known_cpmu_events = {
115 #if defined(ARM64_BOARD_CONFIG_T6000)
116 .cel_event_count = 60,
117 .cel_events = {
118 { .cev_selector = 0x0000, .cev_name = "NONE" },
119 { .cev_selector = 0x0001, .cev_name = "RETIRE_UOP" },
120 { .cev_selector = 0x0002, .cev_name = "CORE_ACTIVE_CYCLE" },
121 { .cev_selector = 0x0004, .cev_name = "L1I_TLB_FILL" },
122 { .cev_selector = 0x0005, .cev_name = "L1D_TLB_FILL" },
123 { .cev_selector = 0x0007, .cev_name = "MMU_TABLE_WALK_INSTRUCTION" },
124 { .cev_selector = 0x0008, .cev_name = "MMU_TABLE_WALK_DATA" },
125 { .cev_selector = 0x000a, .cev_name = "L2_TLB_MISS_INSTRUCTION" },
126 { .cev_selector = 0x000b, .cev_name = "L2_TLB_MISS_DATA" },
127 { .cev_selector = 0x000d, .cev_name = "MMU_VIRTUAL_MEMORY_FAULT_NONSPEC" },
128 { .cev_selector = 0x0052, .cev_name = "SCHEDULE_UOP" },
129 { .cev_selector = 0x006c, .cev_name = "INTERRUPT_PENDING" },
130 { .cev_selector = 0x0070, .cev_name = "MAP_STALL_DISPATCH" },
131 { .cev_selector = 0x0075, .cev_name = "MAP_REWIND" },
132 { .cev_selector = 0x0076, .cev_name = "MAP_STALL" },
133 { .cev_selector = 0x007c, .cev_name = "MAP_INT_UOP" },
134 { .cev_selector = 0x007d, .cev_name = "MAP_LDST_UOP" },
135 { .cev_selector = 0x007e, .cev_name = "MAP_SIMD_UOP" },
136 { .cev_selector = 0x0084, .cev_name = "FLUSH_RESTART_OTHER_NONSPEC" },
137 { .cev_selector = 0x008c, .cev_name = "INST_ALL" },
138 { .cev_selector = 0x008d, .cev_name = "INST_BRANCH" },
139 { .cev_selector = 0x008e, .cev_name = "INST_BRANCH_CALL" },
140 { .cev_selector = 0x008f, .cev_name = "INST_BRANCH_RET" },
141 { .cev_selector = 0x0090, .cev_name = "INST_BRANCH_TAKEN" },
142 { .cev_selector = 0x0093, .cev_name = "INST_BRANCH_INDIR" },
143 { .cev_selector = 0x0094, .cev_name = "INST_BRANCH_COND" },
144 { .cev_selector = 0x0095, .cev_name = "INST_INT_LD" },
145 { .cev_selector = 0x0096, .cev_name = "INST_INT_ST" },
146 { .cev_selector = 0x0097, .cev_name = "INST_INT_ALU" },
147 { .cev_selector = 0x0098, .cev_name = "INST_SIMD_LD" },
148 { .cev_selector = 0x0099, .cev_name = "INST_SIMD_ST" },
149 { .cev_selector = 0x009a, .cev_name = "INST_SIMD_ALU" },
150 { .cev_selector = 0x009b, .cev_name = "INST_LDST" },
151 { .cev_selector = 0x009c, .cev_name = "INST_BARRIER" },
152 { .cev_selector = 0x00a0, .cev_name = "L1D_TLB_ACCESS" },
153 { .cev_selector = 0x00a1, .cev_name = "L1D_TLB_MISS" },
154 { .cev_selector = 0x00a2, .cev_name = "L1D_CACHE_MISS_ST" },
155 { .cev_selector = 0x00a3, .cev_name = "L1D_CACHE_MISS_LD" },
156 { .cev_selector = 0x00a6, .cev_name = "LD_UNIT_UOP" },
157 { .cev_selector = 0x00a7, .cev_name = "ST_UNIT_UOP" },
158 { .cev_selector = 0x00a8, .cev_name = "L1D_CACHE_WRITEBACK" },
159 { .cev_selector = 0x00b1, .cev_name = "LDST_X64_UOP" },
160 { .cev_selector = 0x00b2, .cev_name = "LDST_XPG_UOP" },
161 { .cev_selector = 0x00b3, .cev_name = "ATOMIC_OR_EXCLUSIVE_SUCC" },
162 { .cev_selector = 0x00b4, .cev_name = "ATOMIC_OR_EXCLUSIVE_FAIL" },
163 { .cev_selector = 0x00bf, .cev_name = "L1D_CACHE_MISS_LD_NONSPEC" },
164 { .cev_selector = 0x00c0, .cev_name = "L1D_CACHE_MISS_ST_NONSPEC" },
165 { .cev_selector = 0x00c1, .cev_name = "L1D_TLB_MISS_NONSPEC" },
166 { .cev_selector = 0x00c4, .cev_name = "ST_MEMORY_ORDER_VIOLATION_NONSPEC" },
167 { .cev_selector = 0x00c5, .cev_name = "BRANCH_COND_MISPRED_NONSPEC" },
168 { .cev_selector = 0x00c6, .cev_name = "BRANCH_INDIR_MISPRED_NONSPEC" },
169 { .cev_selector = 0x00c8, .cev_name = "BRANCH_RET_INDIR_MISPRED_NONSPEC" },
170 { .cev_selector = 0x00ca, .cev_name = "BRANCH_CALL_INDIR_MISPRED_NONSPEC" },
171 { .cev_selector = 0x00cb, .cev_name = "BRANCH_MISPRED_NONSPEC" },
172 { .cev_selector = 0x00d4, .cev_name = "L1I_TLB_MISS_DEMAND" },
173 { .cev_selector = 0x00d6, .cev_name = "MAP_DISPATCH_BUBBLE" },
174 { .cev_selector = 0x00db, .cev_name = "L1I_CACHE_MISS_DEMAND" },
175 { .cev_selector = 0x00de, .cev_name = "FETCH_RESTART" },
176 { .cev_selector = 0x00e5, .cev_name = "ST_NT_UOP" },
177 { .cev_selector = 0x00e6, .cev_name = "LD_NT_UOP" },
178 },
179 #elif defined(ARM64_BOARD_CONFIG_T6020)
180 .cel_event_count = 59,
181 .cel_events = {
182 { .cev_selector = 0x0000, .cev_name = "NONE" },
183 { .cev_selector = 0x0001, .cev_name = "RETIRE_UOP" },
184 { .cev_selector = 0x0002, .cev_name = "CORE_ACTIVE_CYCLE" },
185 { .cev_selector = 0x0004, .cev_name = "L1I_TLB_FILL" },
186 { .cev_selector = 0x0005, .cev_name = "L1D_TLB_FILL" },
187 { .cev_selector = 0x0007, .cev_name = "MMU_TABLE_WALK_INSTRUCTION" },
188 { .cev_selector = 0x0008, .cev_name = "MMU_TABLE_WALK_DATA" },
189 { .cev_selector = 0x000a, .cev_name = "L2_TLB_MISS_INSTRUCTION" },
190 { .cev_selector = 0x000b, .cev_name = "L2_TLB_MISS_DATA" },
191 { .cev_selector = 0x000d, .cev_name = "MMU_VIRTUAL_MEMORY_FAULT_NONSPEC" },
192 { .cev_selector = 0x006c, .cev_name = "INTERRUPT_PENDING" },
193 { .cev_selector = 0x0070, .cev_name = "MAP_STALL_DISPATCH" },
194 { .cev_selector = 0x0075, .cev_name = "MAP_REWIND" },
195 { .cev_selector = 0x0076, .cev_name = "MAP_STALL" },
196 { .cev_selector = 0x007c, .cev_name = "MAP_INT_UOP" },
197 { .cev_selector = 0x007d, .cev_name = "MAP_LDST_UOP" },
198 { .cev_selector = 0x007e, .cev_name = "MAP_SIMD_UOP" },
199 { .cev_selector = 0x0084, .cev_name = "FLUSH_RESTART_OTHER_NONSPEC" },
200 { .cev_selector = 0x008c, .cev_name = "INST_ALL" },
201 { .cev_selector = 0x008d, .cev_name = "INST_BRANCH" },
202 { .cev_selector = 0x008e, .cev_name = "INST_BRANCH_CALL" },
203 { .cev_selector = 0x008f, .cev_name = "INST_BRANCH_RET" },
204 { .cev_selector = 0x0090, .cev_name = "INST_BRANCH_TAKEN" },
205 { .cev_selector = 0x0093, .cev_name = "INST_BRANCH_INDIR" },
206 { .cev_selector = 0x0094, .cev_name = "INST_BRANCH_COND" },
207 { .cev_selector = 0x0095, .cev_name = "INST_INT_LD" },
208 { .cev_selector = 0x0096, .cev_name = "INST_INT_ST" },
209 { .cev_selector = 0x0097, .cev_name = "INST_INT_ALU" },
210 { .cev_selector = 0x0098, .cev_name = "INST_SIMD_LD" },
211 { .cev_selector = 0x0099, .cev_name = "INST_SIMD_ST" },
212 { .cev_selector = 0x009a, .cev_name = "INST_SIMD_ALU" },
213 { .cev_selector = 0x009b, .cev_name = "INST_LDST" },
214 { .cev_selector = 0x009c, .cev_name = "INST_BARRIER" },
215 { .cev_selector = 0x00a0, .cev_name = "L1D_TLB_ACCESS" },
216 { .cev_selector = 0x00a1, .cev_name = "L1D_TLB_MISS" },
217 { .cev_selector = 0x00a2, .cev_name = "L1D_CACHE_MISS_ST" },
218 { .cev_selector = 0x00a3, .cev_name = "L1D_CACHE_MISS_LD" },
219 { .cev_selector = 0x00a6, .cev_name = "LD_UNIT_UOP" },
220 { .cev_selector = 0x00a7, .cev_name = "ST_UNIT_UOP" },
221 { .cev_selector = 0x00a8, .cev_name = "L1D_CACHE_WRITEBACK" },
222 { .cev_selector = 0x00b1, .cev_name = "LDST_X64_UOP" },
223 { .cev_selector = 0x00b2, .cev_name = "LDST_XPG_UOP" },
224 { .cev_selector = 0x00b3, .cev_name = "ATOMIC_OR_EXCLUSIVE_SUCC" },
225 { .cev_selector = 0x00b4, .cev_name = "ATOMIC_OR_EXCLUSIVE_FAIL" },
226 { .cev_selector = 0x00bf, .cev_name = "L1D_CACHE_MISS_LD_NONSPEC" },
227 { .cev_selector = 0x00c0, .cev_name = "L1D_CACHE_MISS_ST_NONSPEC" },
228 { .cev_selector = 0x00c1, .cev_name = "L1D_TLB_MISS_NONSPEC" },
229 { .cev_selector = 0x00c4, .cev_name = "ST_MEMORY_ORDER_VIOLATION_NONSPEC" },
230 { .cev_selector = 0x00c5, .cev_name = "BRANCH_COND_MISPRED_NONSPEC" },
231 { .cev_selector = 0x00c6, .cev_name = "BRANCH_INDIR_MISPRED_NONSPEC" },
232 { .cev_selector = 0x00c8, .cev_name = "BRANCH_RET_INDIR_MISPRED_NONSPEC" },
233 { .cev_selector = 0x00ca, .cev_name = "BRANCH_CALL_INDIR_MISPRED_NONSPEC" },
234 { .cev_selector = 0x00cb, .cev_name = "BRANCH_MISPRED_NONSPEC" },
235 { .cev_selector = 0x00d4, .cev_name = "L1I_TLB_MISS_DEMAND" },
236 { .cev_selector = 0x00d6, .cev_name = "MAP_DISPATCH_BUBBLE" },
237 { .cev_selector = 0x00db, .cev_name = "L1I_CACHE_MISS_DEMAND" },
238 { .cev_selector = 0x00de, .cev_name = "FETCH_RESTART" },
239 { .cev_selector = 0x00e5, .cev_name = "ST_NT_UOP" },
240 { .cev_selector = 0x00e6, .cev_name = "LD_NT_UOP" },
241 },
242 #elif defined(ARM64_BOARD_CONFIG_T6030)
243 .cel_event_count = 62,
244 .cel_events = {
245 { .cev_selector = 0x0000, .cev_name = "NONE" },
246 { .cev_selector = 0x0001, .cev_name = "RETIRE_UOP" },
247 { .cev_selector = 0x0002, .cev_name = "CORE_ACTIVE_CYCLE" },
248 { .cev_selector = 0x0084, .cev_name = "FLUSH_RESTART_OTHER_NONSPEC" },
249 { .cev_selector = 0x008c, .cev_name = "INST_ALL" },
250 { .cev_selector = 0x008d, .cev_name = "INST_BRANCH" },
251 { .cev_selector = 0x008e, .cev_name = "INST_BRANCH_CALL" },
252 { .cev_selector = 0x008f, .cev_name = "INST_BRANCH_RET" },
253 { .cev_selector = 0x0090, .cev_name = "INST_BRANCH_TAKEN" },
254 { .cev_selector = 0x0093, .cev_name = "INST_BRANCH_INDIR" },
255 { .cev_selector = 0x0094, .cev_name = "INST_BRANCH_COND" },
256 { .cev_selector = 0x0095, .cev_name = "INST_INT_LD" },
257 { .cev_selector = 0x0096, .cev_name = "INST_INT_ST" },
258 { .cev_selector = 0x0097, .cev_name = "INST_INT_ALU" },
259 { .cev_selector = 0x0098, .cev_name = "INST_SIMD_LD" },
260 { .cev_selector = 0x0099, .cev_name = "INST_SIMD_ST" },
261 { .cev_selector = 0x009a, .cev_name = "INST_SIMD_ALU" },
262 { .cev_selector = 0x009b, .cev_name = "INST_LDST" },
263 { .cev_selector = 0x009c, .cev_name = "INST_BARRIER" },
264 { .cev_selector = 0x00bf, .cev_name = "L1D_CACHE_MISS_LD_NONSPEC" },
265 { .cev_selector = 0x00c0, .cev_name = "L1D_CACHE_MISS_ST_NONSPEC" },
266 { .cev_selector = 0x00c1, .cev_name = "L1D_TLB_MISS_NONSPEC" },
267 { .cev_selector = 0x00c4, .cev_name = "ST_MEMORY_ORDER_VIOLATION_NONSPEC" },
268 { .cev_selector = 0x00c5, .cev_name = "BRANCH_COND_MISPRED_NONSPEC" },
269 { .cev_selector = 0x00c6, .cev_name = "BRANCH_INDIR_MISPRED_NONSPEC" },
270 { .cev_selector = 0x00c8, .cev_name = "BRANCH_RET_INDIR_MISPRED_NONSPEC" },
271 { .cev_selector = 0x00ca, .cev_name = "BRANCH_CALL_INDIR_MISPRED_NONSPEC" },
272 { .cev_selector = 0x00cb, .cev_name = "BRANCH_MISPRED_NONSPEC" },
273 { .cev_selector = 0x0182, .cev_name = "MAP_DISPATCH_BUBBLE_IC" },
274 { .cev_selector = 0x0183, .cev_name = "MAP_DISPATCH_BUBBLE_ITLB" },
275 { .cev_selector = 0x01d4, .cev_name = "L1I_TLB_MISS_DEMAND" },
276 { .cev_selector = 0x01d6, .cev_name = "MAP_DISPATCH_BUBBLE" },
277 { .cev_selector = 0x01db, .cev_name = "L1I_CACHE_MISS_DEMAND" },
278 { .cev_selector = 0x01de, .cev_name = "FETCH_RESTART" },
279 { .cev_selector = 0x0269, .cev_name = "MAP_UOP" },
280 { .cev_selector = 0x026c, .cev_name = "INTERRUPT_PENDING" },
281 { .cev_selector = 0x0270, .cev_name = "MAP_STALL_DISPATCH" },
282 { .cev_selector = 0x0275, .cev_name = "MAP_REWIND" },
283 { .cev_selector = 0x0276, .cev_name = "MAP_STALL" },
284 { .cev_selector = 0x027c, .cev_name = "MAP_INT_UOP" },
285 { .cev_selector = 0x027d, .cev_name = "MAP_LDST_UOP" },
286 { .cev_selector = 0x027e, .cev_name = "MAP_SIMD_UOP" },
287 { .cev_selector = 0x0404, .cev_name = "L1I_TLB_FILL" },
288 { .cev_selector = 0x0405, .cev_name = "L1D_TLB_FILL" },
289 { .cev_selector = 0x0407, .cev_name = "MMU_TABLE_WALK_INSTRUCTION" },
290 { .cev_selector = 0x0408, .cev_name = "MMU_TABLE_WALK_DATA" },
291 { .cev_selector = 0x040a, .cev_name = "L2_TLB_MISS_INSTRUCTION" },
292 { .cev_selector = 0x040b, .cev_name = "L2_TLB_MISS_DATA" },
293 { .cev_selector = 0x040d, .cev_name = "MMU_VIRTUAL_MEMORY_FAULT_NONSPEC" },
294 { .cev_selector = 0x05a0, .cev_name = "L1D_TLB_ACCESS" },
295 { .cev_selector = 0x05a1, .cev_name = "L1D_TLB_MISS" },
296 { .cev_selector = 0x05a2, .cev_name = "L1D_CACHE_MISS_ST" },
297 { .cev_selector = 0x05a3, .cev_name = "L1D_CACHE_MISS_LD" },
298 { .cev_selector = 0x05a6, .cev_name = "LD_UNIT_UOP" },
299 { .cev_selector = 0x05a7, .cev_name = "ST_UNIT_UOP" },
300 { .cev_selector = 0x05a8, .cev_name = "L1D_CACHE_WRITEBACK" },
301 { .cev_selector = 0x05b1, .cev_name = "LDST_X64_UOP" },
302 { .cev_selector = 0x05b2, .cev_name = "LDST_XPG_UOP" },
303 { .cev_selector = 0x05b3, .cev_name = "ATOMIC_OR_EXCLUSIVE_SUCC" },
304 { .cev_selector = 0x05b4, .cev_name = "ATOMIC_OR_EXCLUSIVE_FAIL" },
305 { .cev_selector = 0x05e5, .cev_name = "ST_NT_UOP" },
306 { .cev_selector = 0x05e6, .cev_name = "LD_NT_UOP" },
307 },
308 #elif defined(ARM64_BOARD_CONFIG_T6031)
309 .cel_event_count = 62,
310 .cel_events = {
311 { .cev_selector = 0x0000, .cev_name = "NONE" },
312 { .cev_selector = 0x0001, .cev_name = "RETIRE_UOP" },
313 { .cev_selector = 0x0002, .cev_name = "CORE_ACTIVE_CYCLE" },
314 { .cev_selector = 0x0084, .cev_name = "FLUSH_RESTART_OTHER_NONSPEC" },
315 { .cev_selector = 0x008c, .cev_name = "INST_ALL" },
316 { .cev_selector = 0x008d, .cev_name = "INST_BRANCH" },
317 { .cev_selector = 0x008e, .cev_name = "INST_BRANCH_CALL" },
318 { .cev_selector = 0x008f, .cev_name = "INST_BRANCH_RET" },
319 { .cev_selector = 0x0090, .cev_name = "INST_BRANCH_TAKEN" },
320 { .cev_selector = 0x0093, .cev_name = "INST_BRANCH_INDIR" },
321 { .cev_selector = 0x0094, .cev_name = "INST_BRANCH_COND" },
322 { .cev_selector = 0x0095, .cev_name = "INST_INT_LD" },
323 { .cev_selector = 0x0096, .cev_name = "INST_INT_ST" },
324 { .cev_selector = 0x0097, .cev_name = "INST_INT_ALU" },
325 { .cev_selector = 0x0098, .cev_name = "INST_SIMD_LD" },
326 { .cev_selector = 0x0099, .cev_name = "INST_SIMD_ST" },
327 { .cev_selector = 0x009a, .cev_name = "INST_SIMD_ALU" },
328 { .cev_selector = 0x009b, .cev_name = "INST_LDST" },
329 { .cev_selector = 0x009c, .cev_name = "INST_BARRIER" },
330 { .cev_selector = 0x00bf, .cev_name = "L1D_CACHE_MISS_LD_NONSPEC" },
331 { .cev_selector = 0x00c0, .cev_name = "L1D_CACHE_MISS_ST_NONSPEC" },
332 { .cev_selector = 0x00c1, .cev_name = "L1D_TLB_MISS_NONSPEC" },
333 { .cev_selector = 0x00c4, .cev_name = "ST_MEMORY_ORDER_VIOLATION_NONSPEC" },
334 { .cev_selector = 0x00c5, .cev_name = "BRANCH_COND_MISPRED_NONSPEC" },
335 { .cev_selector = 0x00c6, .cev_name = "BRANCH_INDIR_MISPRED_NONSPEC" },
336 { .cev_selector = 0x00c8, .cev_name = "BRANCH_RET_INDIR_MISPRED_NONSPEC" },
337 { .cev_selector = 0x00ca, .cev_name = "BRANCH_CALL_INDIR_MISPRED_NONSPEC" },
338 { .cev_selector = 0x00cb, .cev_name = "BRANCH_MISPRED_NONSPEC" },
339 { .cev_selector = 0x0182, .cev_name = "MAP_DISPATCH_BUBBLE_IC" },
340 { .cev_selector = 0x0183, .cev_name = "MAP_DISPATCH_BUBBLE_ITLB" },
341 { .cev_selector = 0x01d4, .cev_name = "L1I_TLB_MISS_DEMAND" },
342 { .cev_selector = 0x01d6, .cev_name = "MAP_DISPATCH_BUBBLE" },
343 { .cev_selector = 0x01db, .cev_name = "L1I_CACHE_MISS_DEMAND" },
344 { .cev_selector = 0x01de, .cev_name = "FETCH_RESTART" },
345 { .cev_selector = 0x0269, .cev_name = "MAP_UOP" },
346 { .cev_selector = 0x026c, .cev_name = "INTERRUPT_PENDING" },
347 { .cev_selector = 0x0270, .cev_name = "MAP_STALL_DISPATCH" },
348 { .cev_selector = 0x0275, .cev_name = "MAP_REWIND" },
349 { .cev_selector = 0x0276, .cev_name = "MAP_STALL" },
350 { .cev_selector = 0x027c, .cev_name = "MAP_INT_UOP" },
351 { .cev_selector = 0x027d, .cev_name = "MAP_LDST_UOP" },
352 { .cev_selector = 0x027e, .cev_name = "MAP_SIMD_UOP" },
353 { .cev_selector = 0x0404, .cev_name = "L1I_TLB_FILL" },
354 { .cev_selector = 0x0405, .cev_name = "L1D_TLB_FILL" },
355 { .cev_selector = 0x0407, .cev_name = "MMU_TABLE_WALK_INSTRUCTION" },
356 { .cev_selector = 0x0408, .cev_name = "MMU_TABLE_WALK_DATA" },
357 { .cev_selector = 0x040a, .cev_name = "L2_TLB_MISS_INSTRUCTION" },
358 { .cev_selector = 0x040b, .cev_name = "L2_TLB_MISS_DATA" },
359 { .cev_selector = 0x040d, .cev_name = "MMU_VIRTUAL_MEMORY_FAULT_NONSPEC" },
360 { .cev_selector = 0x05a0, .cev_name = "L1D_TLB_ACCESS" },
361 { .cev_selector = 0x05a1, .cev_name = "L1D_TLB_MISS" },
362 { .cev_selector = 0x05a2, .cev_name = "L1D_CACHE_MISS_ST" },
363 { .cev_selector = 0x05a3, .cev_name = "L1D_CACHE_MISS_LD" },
364 { .cev_selector = 0x05a6, .cev_name = "LD_UNIT_UOP" },
365 { .cev_selector = 0x05a7, .cev_name = "ST_UNIT_UOP" },
366 { .cev_selector = 0x05a8, .cev_name = "L1D_CACHE_WRITEBACK" },
367 { .cev_selector = 0x05b1, .cev_name = "LDST_X64_UOP" },
368 { .cev_selector = 0x05b2, .cev_name = "LDST_XPG_UOP" },
369 { .cev_selector = 0x05b3, .cev_name = "ATOMIC_OR_EXCLUSIVE_SUCC" },
370 { .cev_selector = 0x05b4, .cev_name = "ATOMIC_OR_EXCLUSIVE_FAIL" },
371 { .cev_selector = 0x05e5, .cev_name = "ST_NT_UOP" },
372 { .cev_selector = 0x05e6, .cev_name = "LD_NT_UOP" },
373 },
374 #elif defined(ARM64_BOARD_CONFIG_T6041)
375 .cel_event_count = 62,
376 .cel_events = {
377 { .cev_selector = 0x0000, .cev_name = "NONE" },
378 { .cev_selector = 0x0008, .cev_name = "INST_ALL" },
379 { .cev_selector = 0x0011, .cev_name = "CORE_ACTIVE_CYCLE" },
380 { .cev_selector = 0x0021, .cev_name = "INST_BRANCH" },
381 { .cev_selector = 0x0022, .cev_name = "BRANCH_MISPRED_NONSPEC" },
382 { .cev_selector = 0x003a, .cev_name = "RETIRE_UOP" },
383 { .cev_selector = 0x003b, .cev_name = "MAP_UOP" },
384 { .cev_selector = 0x0182, .cev_name = "MAP_DISPATCH_BUBBLE_IC" },
385 { .cev_selector = 0x0183, .cev_name = "MAP_DISPATCH_BUBBLE_ITLB" },
386 { .cev_selector = 0x01d4, .cev_name = "L1I_TLB_MISS_DEMAND" },
387 { .cev_selector = 0x01d6, .cev_name = "MAP_DISPATCH_BUBBLE" },
388 { .cev_selector = 0x01de, .cev_name = "FETCH_RESTART" },
389 { .cev_selector = 0x026c, .cev_name = "INTERRUPT_PENDING" },
390 { .cev_selector = 0x0270, .cev_name = "MAP_STALL_DISPATCH" },
391 { .cev_selector = 0x0275, .cev_name = "MAP_REWIND" },
392 { .cev_selector = 0x0276, .cev_name = "MAP_STALL" },
393 { .cev_selector = 0x027c, .cev_name = "MAP_INT_UOP" },
394 { .cev_selector = 0x027d, .cev_name = "MAP_LDST_UOP" },
395 { .cev_selector = 0x027e, .cev_name = "MAP_SIMD_UOP" },
396 { .cev_selector = 0x0404, .cev_name = "L1I_TLB_FILL" },
397 { .cev_selector = 0x0405, .cev_name = "L1D_TLB_FILL" },
398 { .cev_selector = 0x0407, .cev_name = "MMU_TABLE_WALK_INSTRUCTION" },
399 { .cev_selector = 0x0408, .cev_name = "MMU_TABLE_WALK_DATA" },
400 { .cev_selector = 0x040a, .cev_name = "L2_TLB_MISS_INSTRUCTION" },
401 { .cev_selector = 0x040b, .cev_name = "L2_TLB_MISS_DATA" },
402 { .cev_selector = 0x040d, .cev_name = "MMU_VIRTUAL_MEMORY_FAULT_NONSPEC" },
403 { .cev_selector = 0x05a0, .cev_name = "L1D_TLB_ACCESS" },
404 { .cev_selector = 0x05a1, .cev_name = "L1D_TLB_MISS" },
405 { .cev_selector = 0x05a2, .cev_name = "L1D_CACHE_MISS_ST" },
406 { .cev_selector = 0x05a3, .cev_name = "L1D_CACHE_MISS_LD" },
407 { .cev_selector = 0x05a6, .cev_name = "LD_UNIT_UOP" },
408 { .cev_selector = 0x05a7, .cev_name = "ST_UNIT_UOP" },
409 { .cev_selector = 0x05a8, .cev_name = "L1D_CACHE_WRITEBACK" },
410 { .cev_selector = 0x05b1, .cev_name = "LDST_X64_UOP" },
411 { .cev_selector = 0x05b2, .cev_name = "LDST_XPG_UOP" },
412 { .cev_selector = 0x05b3, .cev_name = "ATOMIC_OR_EXCLUSIVE_SUCC" },
413 { .cev_selector = 0x05b4, .cev_name = "ATOMIC_OR_EXCLUSIVE_FAIL" },
414 { .cev_selector = 0x05e5, .cev_name = "ST_NT_UOP" },
415 { .cev_selector = 0x05e6, .cev_name = "LD_NT_UOP" },
416 { .cev_selector = 0x0884, .cev_name = "FLUSH_RESTART_OTHER_NONSPEC" },
417 { .cev_selector = 0x088e, .cev_name = "INST_BRANCH_CALL" },
418 { .cev_selector = 0x088f, .cev_name = "INST_BRANCH_RET" },
419 { .cev_selector = 0x0890, .cev_name = "INST_BRANCH_TAKEN" },
420 { .cev_selector = 0x0893, .cev_name = "INST_BRANCH_INDIR" },
421 { .cev_selector = 0x0894, .cev_name = "INST_BRANCH_COND" },
422 { .cev_selector = 0x0895, .cev_name = "INST_INT_LD" },
423 { .cev_selector = 0x0896, .cev_name = "INST_INT_ST" },
424 { .cev_selector = 0x0897, .cev_name = "INST_INT_ALU" },
425 { .cev_selector = 0x0898, .cev_name = "INST_SIMD_LD" },
426 { .cev_selector = 0x0899, .cev_name = "INST_SIMD_ST" },
427 { .cev_selector = 0x089a, .cev_name = "INST_SIMD_ALU" },
428 { .cev_selector = 0x089b, .cev_name = "INST_LDST" },
429 { .cev_selector = 0x089c, .cev_name = "INST_BARRIER" },
430 { .cev_selector = 0x08bf, .cev_name = "L1D_CACHE_MISS_LD_NONSPEC" },
431 { .cev_selector = 0x08c0, .cev_name = "L1D_CACHE_MISS_ST_NONSPEC" },
432 { .cev_selector = 0x08c1, .cev_name = "L1D_TLB_MISS_NONSPEC" },
433 { .cev_selector = 0x08c4, .cev_name = "ST_MEMORY_ORDER_VIOLATION_NONSPEC" },
434 { .cev_selector = 0x08c5, .cev_name = "BRANCH_COND_MISPRED_NONSPEC" },
435 { .cev_selector = 0x08c6, .cev_name = "BRANCH_INDIR_MISPRED_NONSPEC" },
436 { .cev_selector = 0x08c8, .cev_name = "BRANCH_RET_INDIR_MISPRED_NONSPEC" },
437 { .cev_selector = 0x08ca, .cev_name = "BRANCH_CALL_INDIR_MISPRED_NONSPEC" },
438 { .cev_selector = 0x4006, .cev_name = "L1I_CACHE_MISS_DEMAND" },
439 },
440 #elif defined(ARM64_BOARD_CONFIG_T8101)
441 .cel_event_count = 60,
442 .cel_events = {
443 { .cev_selector = 0x0000, .cev_name = "NONE" },
444 { .cev_selector = 0x0001, .cev_name = "RETIRE_UOP" },
445 { .cev_selector = 0x0002, .cev_name = "CORE_ACTIVE_CYCLE" },
446 { .cev_selector = 0x0004, .cev_name = "L1I_TLB_FILL" },
447 { .cev_selector = 0x0005, .cev_name = "L1D_TLB_FILL" },
448 { .cev_selector = 0x0007, .cev_name = "MMU_TABLE_WALK_INSTRUCTION" },
449 { .cev_selector = 0x0008, .cev_name = "MMU_TABLE_WALK_DATA" },
450 { .cev_selector = 0x000a, .cev_name = "L2_TLB_MISS_INSTRUCTION" },
451 { .cev_selector = 0x000b, .cev_name = "L2_TLB_MISS_DATA" },
452 { .cev_selector = 0x000d, .cev_name = "MMU_VIRTUAL_MEMORY_FAULT_NONSPEC" },
453 { .cev_selector = 0x0052, .cev_name = "SCHEDULE_UOP" },
454 { .cev_selector = 0x006c, .cev_name = "INTERRUPT_PENDING" },
455 { .cev_selector = 0x0070, .cev_name = "MAP_STALL_DISPATCH" },
456 { .cev_selector = 0x0075, .cev_name = "MAP_REWIND" },
457 { .cev_selector = 0x0076, .cev_name = "MAP_STALL" },
458 { .cev_selector = 0x007c, .cev_name = "MAP_INT_UOP" },
459 { .cev_selector = 0x007d, .cev_name = "MAP_LDST_UOP" },
460 { .cev_selector = 0x007e, .cev_name = "MAP_SIMD_UOP" },
461 { .cev_selector = 0x0084, .cev_name = "FLUSH_RESTART_OTHER_NONSPEC" },
462 { .cev_selector = 0x008c, .cev_name = "INST_ALL" },
463 { .cev_selector = 0x008d, .cev_name = "INST_BRANCH" },
464 { .cev_selector = 0x008e, .cev_name = "INST_BRANCH_CALL" },
465 { .cev_selector = 0x008f, .cev_name = "INST_BRANCH_RET" },
466 { .cev_selector = 0x0090, .cev_name = "INST_BRANCH_TAKEN" },
467 { .cev_selector = 0x0093, .cev_name = "INST_BRANCH_INDIR" },
468 { .cev_selector = 0x0094, .cev_name = "INST_BRANCH_COND" },
469 { .cev_selector = 0x0095, .cev_name = "INST_INT_LD" },
470 { .cev_selector = 0x0096, .cev_name = "INST_INT_ST" },
471 { .cev_selector = 0x0097, .cev_name = "INST_INT_ALU" },
472 { .cev_selector = 0x0098, .cev_name = "INST_SIMD_LD" },
473 { .cev_selector = 0x0099, .cev_name = "INST_SIMD_ST" },
474 { .cev_selector = 0x009a, .cev_name = "INST_SIMD_ALU" },
475 { .cev_selector = 0x009b, .cev_name = "INST_LDST" },
476 { .cev_selector = 0x009c, .cev_name = "INST_BARRIER" },
477 { .cev_selector = 0x00a0, .cev_name = "L1D_TLB_ACCESS" },
478 { .cev_selector = 0x00a1, .cev_name = "L1D_TLB_MISS" },
479 { .cev_selector = 0x00a2, .cev_name = "L1D_CACHE_MISS_ST" },
480 { .cev_selector = 0x00a3, .cev_name = "L1D_CACHE_MISS_LD" },
481 { .cev_selector = 0x00a6, .cev_name = "LD_UNIT_UOP" },
482 { .cev_selector = 0x00a7, .cev_name = "ST_UNIT_UOP" },
483 { .cev_selector = 0x00a8, .cev_name = "L1D_CACHE_WRITEBACK" },
484 { .cev_selector = 0x00b1, .cev_name = "LDST_X64_UOP" },
485 { .cev_selector = 0x00b2, .cev_name = "LDST_XPG_UOP" },
486 { .cev_selector = 0x00b3, .cev_name = "ATOMIC_OR_EXCLUSIVE_SUCC" },
487 { .cev_selector = 0x00b4, .cev_name = "ATOMIC_OR_EXCLUSIVE_FAIL" },
488 { .cev_selector = 0x00bf, .cev_name = "L1D_CACHE_MISS_LD_NONSPEC" },
489 { .cev_selector = 0x00c0, .cev_name = "L1D_CACHE_MISS_ST_NONSPEC" },
490 { .cev_selector = 0x00c1, .cev_name = "L1D_TLB_MISS_NONSPEC" },
491 { .cev_selector = 0x00c4, .cev_name = "ST_MEMORY_ORDER_VIOLATION_NONSPEC" },
492 { .cev_selector = 0x00c5, .cev_name = "BRANCH_COND_MISPRED_NONSPEC" },
493 { .cev_selector = 0x00c6, .cev_name = "BRANCH_INDIR_MISPRED_NONSPEC" },
494 { .cev_selector = 0x00c8, .cev_name = "BRANCH_RET_INDIR_MISPRED_NONSPEC" },
495 { .cev_selector = 0x00ca, .cev_name = "BRANCH_CALL_INDIR_MISPRED_NONSPEC" },
496 { .cev_selector = 0x00cb, .cev_name = "BRANCH_MISPRED_NONSPEC" },
497 { .cev_selector = 0x00d4, .cev_name = "L1I_TLB_MISS_DEMAND" },
498 { .cev_selector = 0x00d6, .cev_name = "MAP_DISPATCH_BUBBLE" },
499 { .cev_selector = 0x00db, .cev_name = "L1I_CACHE_MISS_DEMAND" },
500 { .cev_selector = 0x00de, .cev_name = "FETCH_RESTART" },
501 { .cev_selector = 0x00e5, .cev_name = "ST_NT_UOP" },
502 { .cev_selector = 0x00e6, .cev_name = "LD_NT_UOP" },
503 },
504 #elif defined(ARM64_BOARD_CONFIG_T8103)
505 .cel_event_count = 60,
506 .cel_events = {
507 { .cev_selector = 0x0000, .cev_name = "NONE" },
508 { .cev_selector = 0x0001, .cev_name = "RETIRE_UOP" },
509 { .cev_selector = 0x0002, .cev_name = "CORE_ACTIVE_CYCLE" },
510 { .cev_selector = 0x0004, .cev_name = "L1I_TLB_FILL" },
511 { .cev_selector = 0x0005, .cev_name = "L1D_TLB_FILL" },
512 { .cev_selector = 0x0007, .cev_name = "MMU_TABLE_WALK_INSTRUCTION" },
513 { .cev_selector = 0x0008, .cev_name = "MMU_TABLE_WALK_DATA" },
514 { .cev_selector = 0x000a, .cev_name = "L2_TLB_MISS_INSTRUCTION" },
515 { .cev_selector = 0x000b, .cev_name = "L2_TLB_MISS_DATA" },
516 { .cev_selector = 0x000d, .cev_name = "MMU_VIRTUAL_MEMORY_FAULT_NONSPEC" },
517 { .cev_selector = 0x0052, .cev_name = "SCHEDULE_UOP" },
518 { .cev_selector = 0x006c, .cev_name = "INTERRUPT_PENDING" },
519 { .cev_selector = 0x0070, .cev_name = "MAP_STALL_DISPATCH" },
520 { .cev_selector = 0x0075, .cev_name = "MAP_REWIND" },
521 { .cev_selector = 0x0076, .cev_name = "MAP_STALL" },
522 { .cev_selector = 0x007c, .cev_name = "MAP_INT_UOP" },
523 { .cev_selector = 0x007d, .cev_name = "MAP_LDST_UOP" },
524 { .cev_selector = 0x007e, .cev_name = "MAP_SIMD_UOP" },
525 { .cev_selector = 0x0084, .cev_name = "FLUSH_RESTART_OTHER_NONSPEC" },
526 { .cev_selector = 0x008c, .cev_name = "INST_ALL" },
527 { .cev_selector = 0x008d, .cev_name = "INST_BRANCH" },
528 { .cev_selector = 0x008e, .cev_name = "INST_BRANCH_CALL" },
529 { .cev_selector = 0x008f, .cev_name = "INST_BRANCH_RET" },
530 { .cev_selector = 0x0090, .cev_name = "INST_BRANCH_TAKEN" },
531 { .cev_selector = 0x0093, .cev_name = "INST_BRANCH_INDIR" },
532 { .cev_selector = 0x0094, .cev_name = "INST_BRANCH_COND" },
533 { .cev_selector = 0x0095, .cev_name = "INST_INT_LD" },
534 { .cev_selector = 0x0096, .cev_name = "INST_INT_ST" },
535 { .cev_selector = 0x0097, .cev_name = "INST_INT_ALU" },
536 { .cev_selector = 0x0098, .cev_name = "INST_SIMD_LD" },
537 { .cev_selector = 0x0099, .cev_name = "INST_SIMD_ST" },
538 { .cev_selector = 0x009a, .cev_name = "INST_SIMD_ALU" },
539 { .cev_selector = 0x009b, .cev_name = "INST_LDST" },
540 { .cev_selector = 0x009c, .cev_name = "INST_BARRIER" },
541 { .cev_selector = 0x00a0, .cev_name = "L1D_TLB_ACCESS" },
542 { .cev_selector = 0x00a1, .cev_name = "L1D_TLB_MISS" },
543 { .cev_selector = 0x00a2, .cev_name = "L1D_CACHE_MISS_ST" },
544 { .cev_selector = 0x00a3, .cev_name = "L1D_CACHE_MISS_LD" },
545 { .cev_selector = 0x00a6, .cev_name = "LD_UNIT_UOP" },
546 { .cev_selector = 0x00a7, .cev_name = "ST_UNIT_UOP" },
547 { .cev_selector = 0x00a8, .cev_name = "L1D_CACHE_WRITEBACK" },
548 { .cev_selector = 0x00b1, .cev_name = "LDST_X64_UOP" },
549 { .cev_selector = 0x00b2, .cev_name = "LDST_XPG_UOP" },
550 { .cev_selector = 0x00b3, .cev_name = "ATOMIC_OR_EXCLUSIVE_SUCC" },
551 { .cev_selector = 0x00b4, .cev_name = "ATOMIC_OR_EXCLUSIVE_FAIL" },
552 { .cev_selector = 0x00bf, .cev_name = "L1D_CACHE_MISS_LD_NONSPEC" },
553 { .cev_selector = 0x00c0, .cev_name = "L1D_CACHE_MISS_ST_NONSPEC" },
554 { .cev_selector = 0x00c1, .cev_name = "L1D_TLB_MISS_NONSPEC" },
555 { .cev_selector = 0x00c4, .cev_name = "ST_MEMORY_ORDER_VIOLATION_NONSPEC" },
556 { .cev_selector = 0x00c5, .cev_name = "BRANCH_COND_MISPRED_NONSPEC" },
557 { .cev_selector = 0x00c6, .cev_name = "BRANCH_INDIR_MISPRED_NONSPEC" },
558 { .cev_selector = 0x00c8, .cev_name = "BRANCH_RET_INDIR_MISPRED_NONSPEC" },
559 { .cev_selector = 0x00ca, .cev_name = "BRANCH_CALL_INDIR_MISPRED_NONSPEC" },
560 { .cev_selector = 0x00cb, .cev_name = "BRANCH_MISPRED_NONSPEC" },
561 { .cev_selector = 0x00d4, .cev_name = "L1I_TLB_MISS_DEMAND" },
562 { .cev_selector = 0x00d6, .cev_name = "MAP_DISPATCH_BUBBLE" },
563 { .cev_selector = 0x00db, .cev_name = "L1I_CACHE_MISS_DEMAND" },
564 { .cev_selector = 0x00de, .cev_name = "FETCH_RESTART" },
565 { .cev_selector = 0x00e5, .cev_name = "ST_NT_UOP" },
566 { .cev_selector = 0x00e6, .cev_name = "LD_NT_UOP" },
567 },
568 #elif defined(ARM64_BOARD_CONFIG_T8112)
569 .cel_event_count = 59,
570 .cel_events = {
571 { .cev_selector = 0x0000, .cev_name = "NONE" },
572 { .cev_selector = 0x0001, .cev_name = "RETIRE_UOP" },
573 { .cev_selector = 0x0002, .cev_name = "CORE_ACTIVE_CYCLE" },
574 { .cev_selector = 0x0004, .cev_name = "L1I_TLB_FILL" },
575 { .cev_selector = 0x0005, .cev_name = "L1D_TLB_FILL" },
576 { .cev_selector = 0x0007, .cev_name = "MMU_TABLE_WALK_INSTRUCTION" },
577 { .cev_selector = 0x0008, .cev_name = "MMU_TABLE_WALK_DATA" },
578 { .cev_selector = 0x000a, .cev_name = "L2_TLB_MISS_INSTRUCTION" },
579 { .cev_selector = 0x000b, .cev_name = "L2_TLB_MISS_DATA" },
580 { .cev_selector = 0x000d, .cev_name = "MMU_VIRTUAL_MEMORY_FAULT_NONSPEC" },
581 { .cev_selector = 0x006c, .cev_name = "INTERRUPT_PENDING" },
582 { .cev_selector = 0x0070, .cev_name = "MAP_STALL_DISPATCH" },
583 { .cev_selector = 0x0075, .cev_name = "MAP_REWIND" },
584 { .cev_selector = 0x0076, .cev_name = "MAP_STALL" },
585 { .cev_selector = 0x007c, .cev_name = "MAP_INT_UOP" },
586 { .cev_selector = 0x007d, .cev_name = "MAP_LDST_UOP" },
587 { .cev_selector = 0x007e, .cev_name = "MAP_SIMD_UOP" },
588 { .cev_selector = 0x0084, .cev_name = "FLUSH_RESTART_OTHER_NONSPEC" },
589 { .cev_selector = 0x008c, .cev_name = "INST_ALL" },
590 { .cev_selector = 0x008d, .cev_name = "INST_BRANCH" },
591 { .cev_selector = 0x008e, .cev_name = "INST_BRANCH_CALL" },
592 { .cev_selector = 0x008f, .cev_name = "INST_BRANCH_RET" },
593 { .cev_selector = 0x0090, .cev_name = "INST_BRANCH_TAKEN" },
594 { .cev_selector = 0x0093, .cev_name = "INST_BRANCH_INDIR" },
595 { .cev_selector = 0x0094, .cev_name = "INST_BRANCH_COND" },
596 { .cev_selector = 0x0095, .cev_name = "INST_INT_LD" },
597 { .cev_selector = 0x0096, .cev_name = "INST_INT_ST" },
598 { .cev_selector = 0x0097, .cev_name = "INST_INT_ALU" },
599 { .cev_selector = 0x0098, .cev_name = "INST_SIMD_LD" },
600 { .cev_selector = 0x0099, .cev_name = "INST_SIMD_ST" },
601 { .cev_selector = 0x009a, .cev_name = "INST_SIMD_ALU" },
602 { .cev_selector = 0x009b, .cev_name = "INST_LDST" },
603 { .cev_selector = 0x009c, .cev_name = "INST_BARRIER" },
604 { .cev_selector = 0x00a0, .cev_name = "L1D_TLB_ACCESS" },
605 { .cev_selector = 0x00a1, .cev_name = "L1D_TLB_MISS" },
606 { .cev_selector = 0x00a2, .cev_name = "L1D_CACHE_MISS_ST" },
607 { .cev_selector = 0x00a3, .cev_name = "L1D_CACHE_MISS_LD" },
608 { .cev_selector = 0x00a6, .cev_name = "LD_UNIT_UOP" },
609 { .cev_selector = 0x00a7, .cev_name = "ST_UNIT_UOP" },
610 { .cev_selector = 0x00a8, .cev_name = "L1D_CACHE_WRITEBACK" },
611 { .cev_selector = 0x00b1, .cev_name = "LDST_X64_UOP" },
612 { .cev_selector = 0x00b2, .cev_name = "LDST_XPG_UOP" },
613 { .cev_selector = 0x00b3, .cev_name = "ATOMIC_OR_EXCLUSIVE_SUCC" },
614 { .cev_selector = 0x00b4, .cev_name = "ATOMIC_OR_EXCLUSIVE_FAIL" },
615 { .cev_selector = 0x00bf, .cev_name = "L1D_CACHE_MISS_LD_NONSPEC" },
616 { .cev_selector = 0x00c0, .cev_name = "L1D_CACHE_MISS_ST_NONSPEC" },
617 { .cev_selector = 0x00c1, .cev_name = "L1D_TLB_MISS_NONSPEC" },
618 { .cev_selector = 0x00c4, .cev_name = "ST_MEMORY_ORDER_VIOLATION_NONSPEC" },
619 { .cev_selector = 0x00c5, .cev_name = "BRANCH_COND_MISPRED_NONSPEC" },
620 { .cev_selector = 0x00c6, .cev_name = "BRANCH_INDIR_MISPRED_NONSPEC" },
621 { .cev_selector = 0x00c8, .cev_name = "BRANCH_RET_INDIR_MISPRED_NONSPEC" },
622 { .cev_selector = 0x00ca, .cev_name = "BRANCH_CALL_INDIR_MISPRED_NONSPEC" },
623 { .cev_selector = 0x00cb, .cev_name = "BRANCH_MISPRED_NONSPEC" },
624 { .cev_selector = 0x00d4, .cev_name = "L1I_TLB_MISS_DEMAND" },
625 { .cev_selector = 0x00d6, .cev_name = "MAP_DISPATCH_BUBBLE" },
626 { .cev_selector = 0x00db, .cev_name = "L1I_CACHE_MISS_DEMAND" },
627 { .cev_selector = 0x00de, .cev_name = "FETCH_RESTART" },
628 { .cev_selector = 0x00e5, .cev_name = "ST_NT_UOP" },
629 { .cev_selector = 0x00e6, .cev_name = "LD_NT_UOP" },
630 },
631 #elif defined(ARM64_BOARD_CONFIG_T8122_T8130)
632 .cel_event_count = 62,
633 .cel_events = {
634 { .cev_selector = 0x0000, .cev_name = "NONE" },
635 { .cev_selector = 0x0001, .cev_name = "RETIRE_UOP" },
636 { .cev_selector = 0x0002, .cev_name = "CORE_ACTIVE_CYCLE" },
637 { .cev_selector = 0x0084, .cev_name = "FLUSH_RESTART_OTHER_NONSPEC" },
638 { .cev_selector = 0x008c, .cev_name = "INST_ALL" },
639 { .cev_selector = 0x008d, .cev_name = "INST_BRANCH" },
640 { .cev_selector = 0x008e, .cev_name = "INST_BRANCH_CALL" },
641 { .cev_selector = 0x008f, .cev_name = "INST_BRANCH_RET" },
642 { .cev_selector = 0x0090, .cev_name = "INST_BRANCH_TAKEN" },
643 { .cev_selector = 0x0093, .cev_name = "INST_BRANCH_INDIR" },
644 { .cev_selector = 0x0094, .cev_name = "INST_BRANCH_COND" },
645 { .cev_selector = 0x0095, .cev_name = "INST_INT_LD" },
646 { .cev_selector = 0x0096, .cev_name = "INST_INT_ST" },
647 { .cev_selector = 0x0097, .cev_name = "INST_INT_ALU" },
648 { .cev_selector = 0x0098, .cev_name = "INST_SIMD_LD" },
649 { .cev_selector = 0x0099, .cev_name = "INST_SIMD_ST" },
650 { .cev_selector = 0x009a, .cev_name = "INST_SIMD_ALU" },
651 { .cev_selector = 0x009b, .cev_name = "INST_LDST" },
652 { .cev_selector = 0x009c, .cev_name = "INST_BARRIER" },
653 { .cev_selector = 0x00bf, .cev_name = "L1D_CACHE_MISS_LD_NONSPEC" },
654 { .cev_selector = 0x00c0, .cev_name = "L1D_CACHE_MISS_ST_NONSPEC" },
655 { .cev_selector = 0x00c1, .cev_name = "L1D_TLB_MISS_NONSPEC" },
656 { .cev_selector = 0x00c4, .cev_name = "ST_MEMORY_ORDER_VIOLATION_NONSPEC" },
657 { .cev_selector = 0x00c5, .cev_name = "BRANCH_COND_MISPRED_NONSPEC" },
658 { .cev_selector = 0x00c6, .cev_name = "BRANCH_INDIR_MISPRED_NONSPEC" },
659 { .cev_selector = 0x00c8, .cev_name = "BRANCH_RET_INDIR_MISPRED_NONSPEC" },
660 { .cev_selector = 0x00ca, .cev_name = "BRANCH_CALL_INDIR_MISPRED_NONSPEC" },
661 { .cev_selector = 0x00cb, .cev_name = "BRANCH_MISPRED_NONSPEC" },
662 { .cev_selector = 0x0182, .cev_name = "MAP_DISPATCH_BUBBLE_IC" },
663 { .cev_selector = 0x0183, .cev_name = "MAP_DISPATCH_BUBBLE_ITLB" },
664 { .cev_selector = 0x01d4, .cev_name = "L1I_TLB_MISS_DEMAND" },
665 { .cev_selector = 0x01d6, .cev_name = "MAP_DISPATCH_BUBBLE" },
666 { .cev_selector = 0x01db, .cev_name = "L1I_CACHE_MISS_DEMAND" },
667 { .cev_selector = 0x01de, .cev_name = "FETCH_RESTART" },
668 { .cev_selector = 0x0269, .cev_name = "MAP_UOP" },
669 { .cev_selector = 0x026c, .cev_name = "INTERRUPT_PENDING" },
670 { .cev_selector = 0x0270, .cev_name = "MAP_STALL_DISPATCH" },
671 { .cev_selector = 0x0275, .cev_name = "MAP_REWIND" },
672 { .cev_selector = 0x0276, .cev_name = "MAP_STALL" },
673 { .cev_selector = 0x027c, .cev_name = "MAP_INT_UOP" },
674 { .cev_selector = 0x027d, .cev_name = "MAP_LDST_UOP" },
675 { .cev_selector = 0x027e, .cev_name = "MAP_SIMD_UOP" },
676 { .cev_selector = 0x0404, .cev_name = "L1I_TLB_FILL" },
677 { .cev_selector = 0x0405, .cev_name = "L1D_TLB_FILL" },
678 { .cev_selector = 0x0407, .cev_name = "MMU_TABLE_WALK_INSTRUCTION" },
679 { .cev_selector = 0x0408, .cev_name = "MMU_TABLE_WALK_DATA" },
680 { .cev_selector = 0x040a, .cev_name = "L2_TLB_MISS_INSTRUCTION" },
681 { .cev_selector = 0x040b, .cev_name = "L2_TLB_MISS_DATA" },
682 { .cev_selector = 0x040d, .cev_name = "MMU_VIRTUAL_MEMORY_FAULT_NONSPEC" },
683 { .cev_selector = 0x05a0, .cev_name = "L1D_TLB_ACCESS" },
684 { .cev_selector = 0x05a1, .cev_name = "L1D_TLB_MISS" },
685 { .cev_selector = 0x05a2, .cev_name = "L1D_CACHE_MISS_ST" },
686 { .cev_selector = 0x05a3, .cev_name = "L1D_CACHE_MISS_LD" },
687 { .cev_selector = 0x05a6, .cev_name = "LD_UNIT_UOP" },
688 { .cev_selector = 0x05a7, .cev_name = "ST_UNIT_UOP" },
689 { .cev_selector = 0x05a8, .cev_name = "L1D_CACHE_WRITEBACK" },
690 { .cev_selector = 0x05b1, .cev_name = "LDST_X64_UOP" },
691 { .cev_selector = 0x05b2, .cev_name = "LDST_XPG_UOP" },
692 { .cev_selector = 0x05b3, .cev_name = "ATOMIC_OR_EXCLUSIVE_SUCC" },
693 { .cev_selector = 0x05b4, .cev_name = "ATOMIC_OR_EXCLUSIVE_FAIL" },
694 { .cev_selector = 0x05e5, .cev_name = "ST_NT_UOP" },
695 { .cev_selector = 0x05e6, .cev_name = "LD_NT_UOP" },
696 },
697 #elif defined(ARM64_BOARD_CONFIG_T8132)
698 .cel_event_count = 62,
699 .cel_events = {
700 { .cev_selector = 0x0000, .cev_name = "NONE" },
701 { .cev_selector = 0x0008, .cev_name = "INST_ALL" },
702 { .cev_selector = 0x0011, .cev_name = "CORE_ACTIVE_CYCLE" },
703 { .cev_selector = 0x0021, .cev_name = "INST_BRANCH" },
704 { .cev_selector = 0x0022, .cev_name = "BRANCH_MISPRED_NONSPEC" },
705 { .cev_selector = 0x003a, .cev_name = "RETIRE_UOP" },
706 { .cev_selector = 0x003b, .cev_name = "MAP_UOP" },
707 { .cev_selector = 0x0182, .cev_name = "MAP_DISPATCH_BUBBLE_IC" },
708 { .cev_selector = 0x0183, .cev_name = "MAP_DISPATCH_BUBBLE_ITLB" },
709 { .cev_selector = 0x01d4, .cev_name = "L1I_TLB_MISS_DEMAND" },
710 { .cev_selector = 0x01d6, .cev_name = "MAP_DISPATCH_BUBBLE" },
711 { .cev_selector = 0x01de, .cev_name = "FETCH_RESTART" },
712 { .cev_selector = 0x026c, .cev_name = "INTERRUPT_PENDING" },
713 { .cev_selector = 0x0270, .cev_name = "MAP_STALL_DISPATCH" },
714 { .cev_selector = 0x0275, .cev_name = "MAP_REWIND" },
715 { .cev_selector = 0x0276, .cev_name = "MAP_STALL" },
716 { .cev_selector = 0x027c, .cev_name = "MAP_INT_UOP" },
717 { .cev_selector = 0x027d, .cev_name = "MAP_LDST_UOP" },
718 { .cev_selector = 0x027e, .cev_name = "MAP_SIMD_UOP" },
719 { .cev_selector = 0x0404, .cev_name = "L1I_TLB_FILL" },
720 { .cev_selector = 0x0405, .cev_name = "L1D_TLB_FILL" },
721 { .cev_selector = 0x0407, .cev_name = "MMU_TABLE_WALK_INSTRUCTION" },
722 { .cev_selector = 0x0408, .cev_name = "MMU_TABLE_WALK_DATA" },
723 { .cev_selector = 0x040a, .cev_name = "L2_TLB_MISS_INSTRUCTION" },
724 { .cev_selector = 0x040b, .cev_name = "L2_TLB_MISS_DATA" },
725 { .cev_selector = 0x040d, .cev_name = "MMU_VIRTUAL_MEMORY_FAULT_NONSPEC" },
726 { .cev_selector = 0x05a0, .cev_name = "L1D_TLB_ACCESS" },
727 { .cev_selector = 0x05a1, .cev_name = "L1D_TLB_MISS" },
728 { .cev_selector = 0x05a2, .cev_name = "L1D_CACHE_MISS_ST" },
729 { .cev_selector = 0x05a3, .cev_name = "L1D_CACHE_MISS_LD" },
730 { .cev_selector = 0x05a6, .cev_name = "LD_UNIT_UOP" },
731 { .cev_selector = 0x05a7, .cev_name = "ST_UNIT_UOP" },
732 { .cev_selector = 0x05a8, .cev_name = "L1D_CACHE_WRITEBACK" },
733 { .cev_selector = 0x05b1, .cev_name = "LDST_X64_UOP" },
734 { .cev_selector = 0x05b2, .cev_name = "LDST_XPG_UOP" },
735 { .cev_selector = 0x05b3, .cev_name = "ATOMIC_OR_EXCLUSIVE_SUCC" },
736 { .cev_selector = 0x05b4, .cev_name = "ATOMIC_OR_EXCLUSIVE_FAIL" },
737 { .cev_selector = 0x05e5, .cev_name = "ST_NT_UOP" },
738 { .cev_selector = 0x05e6, .cev_name = "LD_NT_UOP" },
739 { .cev_selector = 0x0884, .cev_name = "FLUSH_RESTART_OTHER_NONSPEC" },
740 { .cev_selector = 0x088e, .cev_name = "INST_BRANCH_CALL" },
741 { .cev_selector = 0x088f, .cev_name = "INST_BRANCH_RET" },
742 { .cev_selector = 0x0890, .cev_name = "INST_BRANCH_TAKEN" },
743 { .cev_selector = 0x0893, .cev_name = "INST_BRANCH_INDIR" },
744 { .cev_selector = 0x0894, .cev_name = "INST_BRANCH_COND" },
745 { .cev_selector = 0x0895, .cev_name = "INST_INT_LD" },
746 { .cev_selector = 0x0896, .cev_name = "INST_INT_ST" },
747 { .cev_selector = 0x0897, .cev_name = "INST_INT_ALU" },
748 { .cev_selector = 0x0898, .cev_name = "INST_SIMD_LD" },
749 { .cev_selector = 0x0899, .cev_name = "INST_SIMD_ST" },
750 { .cev_selector = 0x089a, .cev_name = "INST_SIMD_ALU" },
751 { .cev_selector = 0x089b, .cev_name = "INST_LDST" },
752 { .cev_selector = 0x089c, .cev_name = "INST_BARRIER" },
753 { .cev_selector = 0x08bf, .cev_name = "L1D_CACHE_MISS_LD_NONSPEC" },
754 { .cev_selector = 0x08c0, .cev_name = "L1D_CACHE_MISS_ST_NONSPEC" },
755 { .cev_selector = 0x08c1, .cev_name = "L1D_TLB_MISS_NONSPEC" },
756 { .cev_selector = 0x08c4, .cev_name = "ST_MEMORY_ORDER_VIOLATION_NONSPEC" },
757 { .cev_selector = 0x08c5, .cev_name = "BRANCH_COND_MISPRED_NONSPEC" },
758 { .cev_selector = 0x08c6, .cev_name = "BRANCH_INDIR_MISPRED_NONSPEC" },
759 { .cev_selector = 0x08c8, .cev_name = "BRANCH_RET_INDIR_MISPRED_NONSPEC" },
760 { .cev_selector = 0x08ca, .cev_name = "BRANCH_CALL_INDIR_MISPRED_NONSPEC" },
761 { .cev_selector = 0x4006, .cev_name = "L1I_CACHE_MISS_DEMAND" },
762 },
763 #else
764 .cel_event_count = 0,
765 .cel_events = {
766 },
767 #endif
768 };
769