1 /* SPDX-License-Identifier: GPL-2.0 */
3 * Copyright (c) 2014-2015, The Linux Foundation. All rights reserved.
6 #ifndef _CORESIGHT_CORESIGHT_ETM_H
7 #define _CORESIGHT_CORESIGHT_ETM_H
10 #include <linux/spinlock.h>
11 #include <linux/types.h>
12 #include "coresight-priv.h"
16 * 0x000 - 0x2FC: Trace registers
17 * 0x300 - 0x314: Management registers
18 * 0x318 - 0xEFC: Trace registers
19 * 0xF00: Management registers
20 * 0xFA0 - 0xFA4: Trace registers
21 * 0xFA8 - 0xFFC: Management registers
23 /* Trace registers (0x000-0x2FC) */
24 /* Main control and configuration registers */
25 #define TRCPRGCTLR 0x004
26 #define TRCPROCSELR 0x008
27 #define TRCSTATR 0x00C
28 #define TRCCONFIGR 0x010
29 #define TRCAUXCTLR 0x018
30 #define TRCEVENTCTL0R 0x020
31 #define TRCEVENTCTL1R 0x024
32 #define TRCSTALLCTLR 0x02C
33 #define TRCTSCTLR 0x030
34 #define TRCSYNCPR 0x034
35 #define TRCCCCTLR 0x038
36 #define TRCBBCTLR 0x03C
37 #define TRCTRACEIDR 0x040
38 #define TRCQCTLR 0x044
39 /* Filtering control registers */
40 #define TRCVICTLR 0x080
41 #define TRCVIIECTLR 0x084
42 #define TRCVISSCTLR 0x088
43 #define TRCVIPCSSCTLR 0x08C
44 #define TRCVDCTLR 0x0A0
45 #define TRCVDSACCTLR 0x0A4
46 #define TRCVDARCCTLR 0x0A8
47 /* Derived resources registers */
48 #define TRCSEQEVRn(n) (0x100 + (n * 4)) /* n = 0-2 */
49 #define TRCSEQRSTEVR 0x118
50 #define TRCSEQSTR 0x11C
51 #define TRCEXTINSELR 0x120
52 #define TRCCNTRLDVRn(n) (0x140 + (n * 4)) /* n = 0-3 */
53 #define TRCCNTCTLRn(n) (0x150 + (n * 4)) /* n = 0-3 */
54 #define TRCCNTVRn(n) (0x160 + (n * 4)) /* n = 0-3 */
58 #define TRCIDR10 0x188
59 #define TRCIDR11 0x18C
60 #define TRCIDR12 0x190
61 #define TRCIDR13 0x194
62 #define TRCIMSPEC0 0x1C0
63 #define TRCIMSPECn(n) (0x1C0 + (n * 4)) /* n = 1-7 */
73 * Resource selection registers, n = 2-31.
74 * First pair (regs 0, 1) is always present and is reserved.
76 #define TRCRSCTLRn(n) (0x200 + (n * 4))
77 /* Single-shot comparator registers, n = 0-7 */
78 #define TRCSSCCRn(n) (0x280 + (n * 4))
79 #define TRCSSCSRn(n) (0x2A0 + (n * 4))
80 #define TRCSSPCICRn(n) (0x2C0 + (n * 4))
81 /* Management registers (0x300-0x314) */
82 #define TRCOSLAR 0x300
83 #define TRCOSLSR 0x304
86 /* Trace registers (0x318-0xEFC) */
87 /* Address Comparator registers n = 0-15 */
88 #define TRCACVRn(n) (0x400 + (n * 8))
89 #define TRCACATRn(n) (0x480 + (n * 8))
90 /* Data Value Comparator Value registers, n = 0-7 */
91 #define TRCDVCVRn(n) (0x500 + (n * 16))
92 #define TRCDVCMRn(n) (0x580 + (n * 16))
93 /* ContextID/Virtual ContextID comparators, n = 0-7 */
94 #define TRCCIDCVRn(n) (0x600 + (n * 8))
95 #define TRCVMIDCVRn(n) (0x640 + (n * 8))
96 #define TRCCIDCCTLR0 0x680
97 #define TRCCIDCCTLR1 0x684
98 #define TRCVMIDCCTLR0 0x688
99 #define TRCVMIDCCTLR1 0x68C
100 /* Management register (0xF00) */
101 /* Integration control registers */
102 #define TRCITCTRL 0xF00
103 /* Trace registers (0xFA0-0xFA4) */
104 /* Claim tag registers */
105 #define TRCCLAIMSET 0xFA0
106 #define TRCCLAIMCLR 0xFA4
107 /* Management registers (0xFA8-0xFFC) */
108 #define TRCDEVAFF0 0xFA8
109 #define TRCDEVAFF1 0xFAC
112 #define TRCAUTHSTATUS 0xFB8
113 #define TRCDEVARCH 0xFBC
114 #define TRCDEVID 0xFC8
115 #define TRCDEVTYPE 0xFCC
116 #define TRCPIDR4 0xFD0
117 #define TRCPIDR5 0xFD4
118 #define TRCPIDR6 0xFD8
119 #define TRCPIDR7 0xFDC
120 #define TRCPIDR0 0xFE0
121 #define TRCPIDR1 0xFE4
122 #define TRCPIDR2 0xFE8
123 #define TRCPIDR3 0xFEC
124 #define TRCCIDR0 0xFF0
125 #define TRCCIDR1 0xFF4
126 #define TRCCIDR2 0xFF8
127 #define TRCCIDR3 0xFFC
130 * System instructions to access ETM registers.
131 * See ETMv4.4 spec ARM IHI0064F section 4.3.6 System instructions
133 #define ETM4x_OFFSET_TO_REG(x) ((x) >> 2)
135 #define ETM4x_CRn(n) (((n) >> 7) & 0x7)
136 #define ETM4x_Op2(n) (((n) >> 4) & 0x7)
137 #define ETM4x_CRm(n) ((n) & 0xf)
139 #include <asm/sysreg.h>
140 #define ETM4x_REG_NUM_TO_SYSREG(n) \
141 sys_reg(2, 1, ETM4x_CRn(n), ETM4x_CRm(n), ETM4x_Op2(n))
143 #define READ_ETM4x_REG(reg) \
144 read_sysreg_s(ETM4x_REG_NUM_TO_SYSREG((reg)))
145 #define WRITE_ETM4x_REG(val, reg) \
146 write_sysreg_s(val, ETM4x_REG_NUM_TO_SYSREG((reg)))
148 #define read_etm4x_sysreg_const_offset(offset) \
149 READ_ETM4x_REG(ETM4x_OFFSET_TO_REG(offset))
151 #define write_etm4x_sysreg_const_offset(val, offset) \
152 WRITE_ETM4x_REG(val, ETM4x_OFFSET_TO_REG(offset))
154 #define CASE_READ(res, x) \
155 case (x): { (res) = read_etm4x_sysreg_const_offset((x)); break; }
157 #define CASE_WRITE(val, x) \
158 case (x): { write_etm4x_sysreg_const_offset((val), (x)); break; }
160 /* List of registers accessible via System instructions */
161 #define ETM_SYSREG_LIST(op, val) \
162 CASE_##op((val), TRCPRGCTLR) \
163 CASE_##op((val), TRCPROCSELR) \
164 CASE_##op((val), TRCSTATR) \
165 CASE_##op((val), TRCCONFIGR) \
166 CASE_##op((val), TRCAUXCTLR) \
167 CASE_##op((val), TRCEVENTCTL0R) \
168 CASE_##op((val), TRCEVENTCTL1R) \
169 CASE_##op((val), TRCSTALLCTLR) \
170 CASE_##op((val), TRCTSCTLR) \
171 CASE_##op((val), TRCSYNCPR) \
172 CASE_##op((val), TRCCCCTLR) \
173 CASE_##op((val), TRCBBCTLR) \
174 CASE_##op((val), TRCTRACEIDR) \
175 CASE_##op((val), TRCQCTLR) \
176 CASE_##op((val), TRCVICTLR) \
177 CASE_##op((val), TRCVIIECTLR) \
178 CASE_##op((val), TRCVISSCTLR) \
179 CASE_##op((val), TRCVIPCSSCTLR) \
180 CASE_##op((val), TRCVDCTLR) \
181 CASE_##op((val), TRCVDSACCTLR) \
182 CASE_##op((val), TRCVDARCCTLR) \
183 CASE_##op((val), TRCSEQEVRn(0)) \
184 CASE_##op((val), TRCSEQEVRn(1)) \
185 CASE_##op((val), TRCSEQEVRn(2)) \
186 CASE_##op((val), TRCSEQRSTEVR) \
187 CASE_##op((val), TRCSEQSTR) \
188 CASE_##op((val), TRCEXTINSELR) \
189 CASE_##op((val), TRCCNTRLDVRn(0)) \
190 CASE_##op((val), TRCCNTRLDVRn(1)) \
191 CASE_##op((val), TRCCNTRLDVRn(2)) \
192 CASE_##op((val), TRCCNTRLDVRn(3)) \
193 CASE_##op((val), TRCCNTCTLRn(0)) \
194 CASE_##op((val), TRCCNTCTLRn(1)) \
195 CASE_##op((val), TRCCNTCTLRn(2)) \
196 CASE_##op((val), TRCCNTCTLRn(3)) \
197 CASE_##op((val), TRCCNTVRn(0)) \
198 CASE_##op((val), TRCCNTVRn(1)) \
199 CASE_##op((val), TRCCNTVRn(2)) \
200 CASE_##op((val), TRCCNTVRn(3)) \
201 CASE_##op((val), TRCIDR8) \
202 CASE_##op((val), TRCIDR9) \
203 CASE_##op((val), TRCIDR10) \
204 CASE_##op((val), TRCIDR11) \
205 CASE_##op((val), TRCIDR12) \
206 CASE_##op((val), TRCIDR13) \
207 CASE_##op((val), TRCIMSPECn(0)) \
208 CASE_##op((val), TRCIMSPECn(1)) \
209 CASE_##op((val), TRCIMSPECn(2)) \
210 CASE_##op((val), TRCIMSPECn(3)) \
211 CASE_##op((val), TRCIMSPECn(4)) \
212 CASE_##op((val), TRCIMSPECn(5)) \
213 CASE_##op((val), TRCIMSPECn(6)) \
214 CASE_##op((val), TRCIMSPECn(7)) \
215 CASE_##op((val), TRCIDR0) \
216 CASE_##op((val), TRCIDR1) \
217 CASE_##op((val), TRCIDR2) \
218 CASE_##op((val), TRCIDR3) \
219 CASE_##op((val), TRCIDR4) \
220 CASE_##op((val), TRCIDR5) \
221 CASE_##op((val), TRCIDR6) \
222 CASE_##op((val), TRCIDR7) \
223 CASE_##op((val), TRCRSCTLRn(2)) \
224 CASE_##op((val), TRCRSCTLRn(3)) \
225 CASE_##op((val), TRCRSCTLRn(4)) \
226 CASE_##op((val), TRCRSCTLRn(5)) \
227 CASE_##op((val), TRCRSCTLRn(6)) \
228 CASE_##op((val), TRCRSCTLRn(7)) \
229 CASE_##op((val), TRCRSCTLRn(8)) \
230 CASE_##op((val), TRCRSCTLRn(9)) \
231 CASE_##op((val), TRCRSCTLRn(10)) \
232 CASE_##op((val), TRCRSCTLRn(11)) \
233 CASE_##op((val), TRCRSCTLRn(12)) \
234 CASE_##op((val), TRCRSCTLRn(13)) \
235 CASE_##op((val), TRCRSCTLRn(14)) \
236 CASE_##op((val), TRCRSCTLRn(15)) \
237 CASE_##op((val), TRCRSCTLRn(16)) \
238 CASE_##op((val), TRCRSCTLRn(17)) \
239 CASE_##op((val), TRCRSCTLRn(18)) \
240 CASE_##op((val), TRCRSCTLRn(19)) \
241 CASE_##op((val), TRCRSCTLRn(20)) \
242 CASE_##op((val), TRCRSCTLRn(21)) \
243 CASE_##op((val), TRCRSCTLRn(22)) \
244 CASE_##op((val), TRCRSCTLRn(23)) \
245 CASE_##op((val), TRCRSCTLRn(24)) \
246 CASE_##op((val), TRCRSCTLRn(25)) \
247 CASE_##op((val), TRCRSCTLRn(26)) \
248 CASE_##op((val), TRCRSCTLRn(27)) \
249 CASE_##op((val), TRCRSCTLRn(28)) \
250 CASE_##op((val), TRCRSCTLRn(29)) \
251 CASE_##op((val), TRCRSCTLRn(30)) \
252 CASE_##op((val), TRCRSCTLRn(31)) \
253 CASE_##op((val), TRCSSCCRn(0)) \
254 CASE_##op((val), TRCSSCCRn(1)) \
255 CASE_##op((val), TRCSSCCRn(2)) \
256 CASE_##op((val), TRCSSCCRn(3)) \
257 CASE_##op((val), TRCSSCCRn(4)) \
258 CASE_##op((val), TRCSSCCRn(5)) \
259 CASE_##op((val), TRCSSCCRn(6)) \
260 CASE_##op((val), TRCSSCCRn(7)) \
261 CASE_##op((val), TRCSSCSRn(0)) \
262 CASE_##op((val), TRCSSCSRn(1)) \
263 CASE_##op((val), TRCSSCSRn(2)) \
264 CASE_##op((val), TRCSSCSRn(3)) \
265 CASE_##op((val), TRCSSCSRn(4)) \
266 CASE_##op((val), TRCSSCSRn(5)) \
267 CASE_##op((val), TRCSSCSRn(6)) \
268 CASE_##op((val), TRCSSCSRn(7)) \
269 CASE_##op((val), TRCSSPCICRn(0)) \
270 CASE_##op((val), TRCSSPCICRn(1)) \
271 CASE_##op((val), TRCSSPCICRn(2)) \
272 CASE_##op((val), TRCSSPCICRn(3)) \
273 CASE_##op((val), TRCSSPCICRn(4)) \
274 CASE_##op((val), TRCSSPCICRn(5)) \
275 CASE_##op((val), TRCSSPCICRn(6)) \
276 CASE_##op((val), TRCSSPCICRn(7)) \
277 CASE_##op((val), TRCOSLAR) \
278 CASE_##op((val), TRCOSLSR) \
279 CASE_##op((val), TRCACVRn(0)) \
280 CASE_##op((val), TRCACVRn(1)) \
281 CASE_##op((val), TRCACVRn(2)) \
282 CASE_##op((val), TRCACVRn(3)) \
283 CASE_##op((val), TRCACVRn(4)) \
284 CASE_##op((val), TRCACVRn(5)) \
285 CASE_##op((val), TRCACVRn(6)) \
286 CASE_##op((val), TRCACVRn(7)) \
287 CASE_##op((val), TRCACVRn(8)) \
288 CASE_##op((val), TRCACVRn(9)) \
289 CASE_##op((val), TRCACVRn(10)) \
290 CASE_##op((val), TRCACVRn(11)) \
291 CASE_##op((val), TRCACVRn(12)) \
292 CASE_##op((val), TRCACVRn(13)) \
293 CASE_##op((val), TRCACVRn(14)) \
294 CASE_##op((val), TRCACVRn(15)) \
295 CASE_##op((val), TRCACATRn(0)) \
296 CASE_##op((val), TRCACATRn(1)) \
297 CASE_##op((val), TRCACATRn(2)) \
298 CASE_##op((val), TRCACATRn(3)) \
299 CASE_##op((val), TRCACATRn(4)) \
300 CASE_##op((val), TRCACATRn(5)) \
301 CASE_##op((val), TRCACATRn(6)) \
302 CASE_##op((val), TRCACATRn(7)) \
303 CASE_##op((val), TRCACATRn(8)) \
304 CASE_##op((val), TRCACATRn(9)) \
305 CASE_##op((val), TRCACATRn(10)) \
306 CASE_##op((val), TRCACATRn(11)) \
307 CASE_##op((val), TRCACATRn(12)) \
308 CASE_##op((val), TRCACATRn(13)) \
309 CASE_##op((val), TRCACATRn(14)) \
310 CASE_##op((val), TRCACATRn(15)) \
311 CASE_##op((val), TRCDVCVRn(0)) \
312 CASE_##op((val), TRCDVCVRn(1)) \
313 CASE_##op((val), TRCDVCVRn(2)) \
314 CASE_##op((val), TRCDVCVRn(3)) \
315 CASE_##op((val), TRCDVCVRn(4)) \
316 CASE_##op((val), TRCDVCVRn(5)) \
317 CASE_##op((val), TRCDVCVRn(6)) \
318 CASE_##op((val), TRCDVCVRn(7)) \
319 CASE_##op((val), TRCDVCMRn(0)) \
320 CASE_##op((val), TRCDVCMRn(1)) \
321 CASE_##op((val), TRCDVCMRn(2)) \
322 CASE_##op((val), TRCDVCMRn(3)) \
323 CASE_##op((val), TRCDVCMRn(4)) \
324 CASE_##op((val), TRCDVCMRn(5)) \
325 CASE_##op((val), TRCDVCMRn(6)) \
326 CASE_##op((val), TRCDVCMRn(7)) \
327 CASE_##op((val), TRCCIDCVRn(0)) \
328 CASE_##op((val), TRCCIDCVRn(1)) \
329 CASE_##op((val), TRCCIDCVRn(2)) \
330 CASE_##op((val), TRCCIDCVRn(3)) \
331 CASE_##op((val), TRCCIDCVRn(4)) \
332 CASE_##op((val), TRCCIDCVRn(5)) \
333 CASE_##op((val), TRCCIDCVRn(6)) \
334 CASE_##op((val), TRCCIDCVRn(7)) \
335 CASE_##op((val), TRCVMIDCVRn(0)) \
336 CASE_##op((val), TRCVMIDCVRn(1)) \
337 CASE_##op((val), TRCVMIDCVRn(2)) \
338 CASE_##op((val), TRCVMIDCVRn(3)) \
339 CASE_##op((val), TRCVMIDCVRn(4)) \
340 CASE_##op((val), TRCVMIDCVRn(5)) \
341 CASE_##op((val), TRCVMIDCVRn(6)) \
342 CASE_##op((val), TRCVMIDCVRn(7)) \
343 CASE_##op((val), TRCCIDCCTLR0) \
344 CASE_##op((val), TRCCIDCCTLR1) \
345 CASE_##op((val), TRCVMIDCCTLR0) \
346 CASE_##op((val), TRCVMIDCCTLR1) \
347 CASE_##op((val), TRCCLAIMSET) \
348 CASE_##op((val), TRCCLAIMCLR) \
349 CASE_##op((val), TRCAUTHSTATUS) \
350 CASE_##op((val), TRCDEVARCH) \
351 CASE_##op((val), TRCDEVID)
353 /* List of registers only accessible via memory-mapped interface */
354 #define ETM_MMAP_LIST(op, val) \
355 CASE_##op((val), TRCDEVTYPE) \
356 CASE_##op((val), TRCPDCR) \
357 CASE_##op((val), TRCPDSR) \
358 CASE_##op((val), TRCDEVAFF0) \
359 CASE_##op((val), TRCDEVAFF1) \
360 CASE_##op((val), TRCLAR) \
361 CASE_##op((val), TRCLSR) \
362 CASE_##op((val), TRCITCTRL) \
363 CASE_##op((val), TRCPIDR4) \
364 CASE_##op((val), TRCPIDR0) \
365 CASE_##op((val), TRCPIDR1) \
366 CASE_##op((val), TRCPIDR2) \
367 CASE_##op((val), TRCPIDR3)
369 #define ETM4x_READ_SYSREG_CASES(res) ETM_SYSREG_LIST(READ, (res))
370 #define ETM4x_WRITE_SYSREG_CASES(val) ETM_SYSREG_LIST(WRITE, (val))
372 #define read_etm4x_sysreg_offset(offset, _64bit) \
376 if (__builtin_constant_p((offset))) \
377 __val = read_etm4x_sysreg_const_offset((offset)); \
379 __val = etm4x_sysreg_read((offset), true, (_64bit)); \
383 #define write_etm4x_sysreg_offset(val, offset, _64bit) \
385 if (__builtin_constant_p((offset))) \
386 write_etm4x_sysreg_const_offset((val), \
389 etm4x_sysreg_write((val), (offset), true, \
394 #define etm4x_relaxed_read32(csa, offset) \
395 ((u32)((csa)->io_mem ? \
396 readl_relaxed((csa)->base + (offset)) : \
397 read_etm4x_sysreg_offset((offset), false)))
399 #define etm4x_relaxed_read64(csa, offset) \
400 ((u64)((csa)->io_mem ? \
401 readq_relaxed((csa)->base + (offset)) : \
402 read_etm4x_sysreg_offset((offset), true)))
404 #define etm4x_read32(csa, offset) \
406 u32 __val = etm4x_relaxed_read32((csa), (offset)); \
411 #define etm4x_read64(csa, offset) \
413 u64 __val = etm4x_relaxed_read64((csa), (offset)); \
418 #define etm4x_relaxed_write32(csa, val, offset) \
421 writel_relaxed((val), (csa)->base + (offset)); \
423 write_etm4x_sysreg_offset((val), (offset), \
427 #define etm4x_relaxed_write64(csa, val, offset) \
430 writeq_relaxed((val), (csa)->base + (offset)); \
432 write_etm4x_sysreg_offset((val), (offset), \
436 #define etm4x_write32(csa, val, offset) \
439 etm4x_relaxed_write32((csa), (val), (offset)); \
442 #define etm4x_write64(csa, val, offset) \
445 etm4x_relaxed_write64((csa), (val), (offset)); \
449 /* ETMv4 resources */
450 #define ETM_MAX_NR_PE 8
451 #define ETMv4_MAX_CNTR 4
452 #define ETM_MAX_SEQ_STATES 4
453 #define ETM_MAX_EXT_INP_SEL 4
454 #define ETM_MAX_EXT_INP 256
455 #define ETM_MAX_EXT_OUT 4
456 #define ETM_MAX_SINGLE_ADDR_CMP 16
457 #define ETM_MAX_ADDR_RANGE_CMP (ETM_MAX_SINGLE_ADDR_CMP / 2)
458 #define ETM_MAX_DATA_VAL_CMP 8
459 #define ETMv4_MAX_CTXID_CMP 8
460 #define ETM_MAX_VMID_CMP 8
461 #define ETM_MAX_PE_CMP 8
462 #define ETM_MAX_RES_SEL 32
463 #define ETM_MAX_SS_CMP 8
465 #define ETM_ARCH_V4 0x40
466 #define ETMv4_SYNC_MASK 0x1F
467 #define ETM_CYC_THRESHOLD_MASK 0xFFF
468 #define ETM_CYC_THRESHOLD_DEFAULT 0x100
469 #define ETMv4_EVENT_MASK 0xFF
470 #define ETM_CNTR_MAX_VAL 0xFFFF
471 #define ETM_TRACEID_MASK 0x3f
473 /* ETMv4 programming modes */
474 #define ETM_MODE_EXCLUDE BIT(0)
475 #define ETM_MODE_LOAD BIT(1)
476 #define ETM_MODE_STORE BIT(2)
477 #define ETM_MODE_LOAD_STORE BIT(3)
478 #define ETM_MODE_BB BIT(4)
479 #define ETMv4_MODE_CYCACC BIT(5)
480 #define ETMv4_MODE_CTXID BIT(6)
481 #define ETM_MODE_VMID BIT(7)
482 #define ETM_MODE_COND(val) BMVAL(val, 8, 10)
483 #define ETMv4_MODE_TIMESTAMP BIT(11)
484 #define ETM_MODE_RETURNSTACK BIT(12)
485 #define ETM_MODE_QELEM(val) BMVAL(val, 13, 14)
486 #define ETM_MODE_DATA_TRACE_ADDR BIT(15)
487 #define ETM_MODE_DATA_TRACE_VAL BIT(16)
488 #define ETM_MODE_ISTALL BIT(17)
489 #define ETM_MODE_DSTALL BIT(18)
490 #define ETM_MODE_ATB_TRIGGER BIT(19)
491 #define ETM_MODE_LPOVERRIDE BIT(20)
492 #define ETM_MODE_ISTALL_EN BIT(21)
493 #define ETM_MODE_DSTALL_EN BIT(22)
494 #define ETM_MODE_INSTPRIO BIT(23)
495 #define ETM_MODE_NOOVERFLOW BIT(24)
496 #define ETM_MODE_TRACE_RESET BIT(25)
497 #define ETM_MODE_TRACE_ERR BIT(26)
498 #define ETM_MODE_VIEWINST_STARTSTOP BIT(27)
499 #define ETMv4_MODE_ALL (GENMASK(27, 0) | \
500 ETM_MODE_EXCL_KERN | \
503 #define TRCSTATR_IDLE_BIT 0
504 #define TRCSTATR_PMSTABLE_BIT 1
505 #define ETM_DEFAULT_ADDR_COMP 0
507 #define TRCSSCSRn_PC BIT(3)
509 /* PowerDown Control Register bits */
510 #define TRCPDCR_PU BIT(3)
512 /* secure state access levels - TRCACATRn */
513 #define ETM_EXLEVEL_S_APP BIT(8)
514 #define ETM_EXLEVEL_S_OS BIT(9)
515 #define ETM_EXLEVEL_S_HYP BIT(10)
516 #define ETM_EXLEVEL_S_MON BIT(11)
517 /* non-secure state access levels - TRCACATRn */
518 #define ETM_EXLEVEL_NS_APP BIT(12)
519 #define ETM_EXLEVEL_NS_OS BIT(13)
520 #define ETM_EXLEVEL_NS_HYP BIT(14)
521 #define ETM_EXLEVEL_NS_NA BIT(15)
523 /* access level control in TRCVICTLR - same bits as TRCACATRn but shifted */
524 #define ETM_EXLEVEL_LSHIFT_TRCVICTLR 8
526 /* secure / non secure masks - TRCVICTLR, IDR3 */
527 #define ETM_EXLEVEL_S_VICTLR_MASK GENMASK(19, 16)
528 /* NS MON (EL3) mode never implemented */
529 #define ETM_EXLEVEL_NS_VICTLR_MASK GENMASK(22, 20)
531 /* Interpretation of resource numbers change at ETM v4.3 architecture */
532 #define ETM4X_ARCH_4V3 0x43
534 enum etm_impdef_type {
535 ETM4_IMPDEF_HISI_CORE_COMMIT,
536 ETM4_IMPDEF_FEATURE_MAX,
540 * struct etmv4_config - configuration information related to an ETMv4
541 * @mode: Controls various modes supported by this ETM.
542 * @pe_sel: Controls which PE to trace.
543 * @cfg: Controls the tracing options.
544 * @eventctrl0: Controls the tracing of arbitrary events.
545 * @eventctrl1: Controls the behavior of the events that @event_ctrl0 selects.
546 * @stallctl: If functionality that prevents trace unit buffer overflows
548 * @ts_ctrl: Controls the insertion of global timestamps in the
550 * @syncfreq: Controls how often trace synchronization requests occur.
551 * the TRCCCCTLR register.
552 * @ccctlr: Sets the threshold value for cycle counting.
553 * @vinst_ctrl: Controls instruction trace filtering.
554 * @viiectlr: Set or read, the address range comparators.
555 * @vissctlr: Set, or read, the single address comparators that control the
556 * ViewInst start-stop logic.
557 * @vipcssctlr: Set, or read, which PE comparator inputs can control the
558 * ViewInst start-stop logic.
559 * @seq_idx: Sequencor index selector.
560 * @seq_ctrl: Control for the sequencer state transition control register.
561 * @seq_rst: Moves the sequencer to state 0 when a programmed event occurs.
562 * @seq_state: Set, or read the sequencer state.
563 * @cntr_idx: Counter index seletor.
564 * @cntrldvr: Sets or returns the reload count value for a counter.
565 * @cntr_ctrl: Controls the operation of a counter.
566 * @cntr_val: Sets or returns the value for a counter.
567 * @res_idx: Resource index selector.
568 * @res_ctrl: Controls the selection of the resources in the trace unit.
569 * @ss_idx: Single-shot index selector.
570 * @ss_ctrl: Controls the corresponding single-shot comparator resource.
571 * @ss_status: The status of the corresponding single-shot comparator.
572 * @ss_pe_cmp: Selects the PE comparator inputs for Single-shot control.
573 * @addr_idx: Address comparator index selector.
574 * @addr_val: Value for address comparator.
575 * @addr_acc: Address comparator access type.
576 * @addr_type: Current status of the comparator register.
577 * @ctxid_idx: Context ID index selector.
578 * @ctxid_pid: Value of the context ID comparator.
579 * @ctxid_mask0:Context ID comparator mask for comparator 0-3.
580 * @ctxid_mask1:Context ID comparator mask for comparator 4-7.
581 * @vmid_idx: VM ID index selector.
582 * @vmid_val: Value of the VM ID comparator.
583 * @vmid_mask0: VM ID comparator mask for comparator 0-3.
584 * @vmid_mask1: VM ID comparator mask for comparator 4-7.
585 * @ext_inp: External input selection.
586 * @arch: ETM architecture version (for arch dependent config).
588 struct etmv4_config {
604 u32 seq_ctrl[ETM_MAX_SEQ_STATES];
608 u32 cntrldvr[ETMv4_MAX_CNTR];
609 u32 cntr_ctrl[ETMv4_MAX_CNTR];
610 u32 cntr_val[ETMv4_MAX_CNTR];
612 u32 res_ctrl[ETM_MAX_RES_SEL];
614 u32 ss_ctrl[ETM_MAX_SS_CMP];
615 u32 ss_status[ETM_MAX_SS_CMP];
616 u32 ss_pe_cmp[ETM_MAX_SS_CMP];
618 u64 addr_val[ETM_MAX_SINGLE_ADDR_CMP];
619 u64 addr_acc[ETM_MAX_SINGLE_ADDR_CMP];
620 u8 addr_type[ETM_MAX_SINGLE_ADDR_CMP];
622 u64 ctxid_pid[ETMv4_MAX_CTXID_CMP];
626 u64 vmid_val[ETM_MAX_VMID_CMP];
634 * struct etm4_save_state - state to be preserved when ETM is without power
636 struct etmv4_save_state {
659 u32 trcseqevr[ETM_MAX_SEQ_STATES];
663 u32 trccntrldvr[ETMv4_MAX_CNTR];
664 u32 trccntctlr[ETMv4_MAX_CNTR];
665 u32 trccntvr[ETMv4_MAX_CNTR];
667 u32 trcrsctlr[ETM_MAX_RES_SEL];
669 u32 trcssccr[ETM_MAX_SS_CMP];
670 u32 trcsscsr[ETM_MAX_SS_CMP];
671 u32 trcsspcicr[ETM_MAX_SS_CMP];
673 u64 trcacvr[ETM_MAX_SINGLE_ADDR_CMP];
674 u64 trcacatr[ETM_MAX_SINGLE_ADDR_CMP];
675 u64 trccidcvr[ETMv4_MAX_CTXID_CMP];
676 u64 trcvmidcvr[ETM_MAX_VMID_CMP];
684 u32 cntr_val[ETMv4_MAX_CNTR];
687 u32 ss_status[ETM_MAX_SS_CMP];
693 * struct etm4_drvdata - specifics associated to an ETM component
694 * @base: Memory mapped base address for this component.
695 * @csdev: Component vitals needed by the framework.
696 * @spinlock: Only one at a time pls.
697 * @mode: This tracer's mode, i.e sysFS, Perf or disabled.
698 * @cpu: The cpu this component is affined to.
699 * @arch: ETM version number.
700 * @nr_pe: The number of processing entity available for tracing.
701 * @nr_pe_cmp: The number of processing entity comparator inputs that are
702 * available for tracing.
703 * @nr_addr_cmp:Number of pairs of address comparators available
704 * as found in ETMIDR4 0-3.
705 * @nr_cntr: Number of counters as found in ETMIDR5 bit 28-30.
706 * @nr_ext_inp: Number of external input.
707 * @numcidc: Number of contextID comparators.
708 * @numvmidc: Number of VMID comparators.
709 * @nrseqstate: The number of sequencer states that are implemented.
710 * @nr_event: Indicates how many events the trace unit support.
711 * @nr_resource:The number of resource selection pairs available for tracing.
712 * @nr_ss_cmp: Number of single-shot comparator controls that are available.
713 * @trcid: value of the current ID for this component.
714 * @trcid_size: Indicates the trace ID width.
715 * @ts_size: Global timestamp size field.
716 * @ctxid_size: Size of the context ID field to consider.
717 * @vmid_size: Size of the VM ID comparator to consider.
718 * @ccsize: Indicates the size of the cycle counter in bits.
719 * @ccitmin: minimum value that can be programmed in
720 * @s_ex_level: In secure state, indicates whether instruction tracing is
721 * supported for the corresponding Exception level.
722 * @ns_ex_level:In non-secure state, indicates whether instruction tracing is
723 * supported for the corresponding Exception level.
724 * @sticky_enable: true if ETM base configuration has been done.
725 * @boot_enable:True if we should start tracing at boot time.
726 * @os_unlock: True if access to management registers is allowed.
727 * @instrp0: Tracing of load and store instructions
728 * as P0 elements is supported.
729 * @trcbb: Indicates if the trace unit supports branch broadcast tracing.
730 * @trccond: If the trace unit supports conditional
731 * instruction tracing.
732 * @retstack: Indicates if the implementation supports a return stack.
733 * @trccci: Indicates if the trace unit supports cycle counting
735 * @q_support: Q element support characteristics.
736 * @trc_error: Whether a trace unit can trace a system
738 * @syncpr: Indicates if an implementation has a fixed
739 * synchronization period.
740 * @stall_ctrl: Enables trace unit functionality that prevents trace
741 * unit buffer overflows.
742 * @sysstall: Does the system support stall control of the PE?
743 * @nooverflow: Indicate if overflow prevention is supported.
744 * @atbtrig: If the implementation can support ATB triggers
745 * @lpoverride: If the implementation can support low-power state over.
746 * @config: structure holding configuration parameters.
747 * @save_state: State to be preserved across power loss
748 * @state_needs_restore: True when there is context to restore after PM exit
749 * @skip_power_up: Indicates if an implementation can skip powering up
751 * @arch_features: Bitmap of arch features of etmv4 devices.
753 struct etmv4_drvdata {
755 struct coresight_device *csdev;
796 struct etmv4_config config;
797 struct etmv4_save_state *save_state;
798 bool state_needs_restore;
800 DECLARE_BITMAP(arch_features, ETM4_IMPDEF_FEATURE_MAX);
803 /* Address comparator access types */
804 enum etm_addr_acctype {
808 ETM_DATA_LOAD_STORE_ADDR,
811 /* Address comparator context types */
812 enum etm_addr_ctxtype {
819 extern const struct attribute_group *coresight_etmv4_groups[];
820 void etm4_config_trace_mode(struct etmv4_config *config);
822 u64 etm4x_sysreg_read(u32 offset, bool _relaxed, bool _64bit);
823 void etm4x_sysreg_write(u64 val, u32 offset, bool _relaxed, bool _64bit);