1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* |
3 | * Copyright (c) 2012, The Linux Foundation. All rights reserved. |
4 | */ |
5 | |
6 | #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
7 | |
8 | #include <linux/kernel.h> |
9 | #include <linux/types.h> |
10 | #include <linux/bug.h> |
11 | #include <asm/hardware/cp14.h> |
12 | |
13 | #include "coresight-etm.h" |
14 | |
15 | int etm_readl_cp14(u32 reg, unsigned int *val) |
16 | { |
17 | switch (reg) { |
18 | case ETMCR: |
19 | *val = etm_read(ETMCR); |
20 | return 0; |
21 | case ETMCCR: |
22 | *val = etm_read(ETMCCR); |
23 | return 0; |
24 | case ETMTRIGGER: |
25 | *val = etm_read(ETMTRIGGER); |
26 | return 0; |
27 | case ETMSR: |
28 | *val = etm_read(ETMSR); |
29 | return 0; |
30 | case ETMSCR: |
31 | *val = etm_read(ETMSCR); |
32 | return 0; |
33 | case ETMTSSCR: |
34 | *val = etm_read(ETMTSSCR); |
35 | return 0; |
36 | case ETMTEEVR: |
37 | *val = etm_read(ETMTEEVR); |
38 | return 0; |
39 | case ETMTECR1: |
40 | *val = etm_read(ETMTECR1); |
41 | return 0; |
42 | case ETMFFLR: |
43 | *val = etm_read(ETMFFLR); |
44 | return 0; |
45 | case ETMACVRn(0): |
46 | *val = etm_read(ETMACVR0); |
47 | return 0; |
48 | case ETMACVRn(1): |
49 | *val = etm_read(ETMACVR1); |
50 | return 0; |
51 | case ETMACVRn(2): |
52 | *val = etm_read(ETMACVR2); |
53 | return 0; |
54 | case ETMACVRn(3): |
55 | *val = etm_read(ETMACVR3); |
56 | return 0; |
57 | case ETMACVRn(4): |
58 | *val = etm_read(ETMACVR4); |
59 | return 0; |
60 | case ETMACVRn(5): |
61 | *val = etm_read(ETMACVR5); |
62 | return 0; |
63 | case ETMACVRn(6): |
64 | *val = etm_read(ETMACVR6); |
65 | return 0; |
66 | case ETMACVRn(7): |
67 | *val = etm_read(ETMACVR7); |
68 | return 0; |
69 | case ETMACVRn(8): |
70 | *val = etm_read(ETMACVR8); |
71 | return 0; |
72 | case ETMACVRn(9): |
73 | *val = etm_read(ETMACVR9); |
74 | return 0; |
75 | case ETMACVRn(10): |
76 | *val = etm_read(ETMACVR10); |
77 | return 0; |
78 | case ETMACVRn(11): |
79 | *val = etm_read(ETMACVR11); |
80 | return 0; |
81 | case ETMACVRn(12): |
82 | *val = etm_read(ETMACVR12); |
83 | return 0; |
84 | case ETMACVRn(13): |
85 | *val = etm_read(ETMACVR13); |
86 | return 0; |
87 | case ETMACVRn(14): |
88 | *val = etm_read(ETMACVR14); |
89 | return 0; |
90 | case ETMACVRn(15): |
91 | *val = etm_read(ETMACVR15); |
92 | return 0; |
93 | case ETMACTRn(0): |
94 | *val = etm_read(ETMACTR0); |
95 | return 0; |
96 | case ETMACTRn(1): |
97 | *val = etm_read(ETMACTR1); |
98 | return 0; |
99 | case ETMACTRn(2): |
100 | *val = etm_read(ETMACTR2); |
101 | return 0; |
102 | case ETMACTRn(3): |
103 | *val = etm_read(ETMACTR3); |
104 | return 0; |
105 | case ETMACTRn(4): |
106 | *val = etm_read(ETMACTR4); |
107 | return 0; |
108 | case ETMACTRn(5): |
109 | *val = etm_read(ETMACTR5); |
110 | return 0; |
111 | case ETMACTRn(6): |
112 | *val = etm_read(ETMACTR6); |
113 | return 0; |
114 | case ETMACTRn(7): |
115 | *val = etm_read(ETMACTR7); |
116 | return 0; |
117 | case ETMACTRn(8): |
118 | *val = etm_read(ETMACTR8); |
119 | return 0; |
120 | case ETMACTRn(9): |
121 | *val = etm_read(ETMACTR9); |
122 | return 0; |
123 | case ETMACTRn(10): |
124 | *val = etm_read(ETMACTR10); |
125 | return 0; |
126 | case ETMACTRn(11): |
127 | *val = etm_read(ETMACTR11); |
128 | return 0; |
129 | case ETMACTRn(12): |
130 | *val = etm_read(ETMACTR12); |
131 | return 0; |
132 | case ETMACTRn(13): |
133 | *val = etm_read(ETMACTR13); |
134 | return 0; |
135 | case ETMACTRn(14): |
136 | *val = etm_read(ETMACTR14); |
137 | return 0; |
138 | case ETMACTRn(15): |
139 | *val = etm_read(ETMACTR15); |
140 | return 0; |
141 | case ETMCNTRLDVRn(0): |
142 | *val = etm_read(ETMCNTRLDVR0); |
143 | return 0; |
144 | case ETMCNTRLDVRn(1): |
145 | *val = etm_read(ETMCNTRLDVR1); |
146 | return 0; |
147 | case ETMCNTRLDVRn(2): |
148 | *val = etm_read(ETMCNTRLDVR2); |
149 | return 0; |
150 | case ETMCNTRLDVRn(3): |
151 | *val = etm_read(ETMCNTRLDVR3); |
152 | return 0; |
153 | case ETMCNTENRn(0): |
154 | *val = etm_read(ETMCNTENR0); |
155 | return 0; |
156 | case ETMCNTENRn(1): |
157 | *val = etm_read(ETMCNTENR1); |
158 | return 0; |
159 | case ETMCNTENRn(2): |
160 | *val = etm_read(ETMCNTENR2); |
161 | return 0; |
162 | case ETMCNTENRn(3): |
163 | *val = etm_read(ETMCNTENR3); |
164 | return 0; |
165 | case ETMCNTRLDEVRn(0): |
166 | *val = etm_read(ETMCNTRLDEVR0); |
167 | return 0; |
168 | case ETMCNTRLDEVRn(1): |
169 | *val = etm_read(ETMCNTRLDEVR1); |
170 | return 0; |
171 | case ETMCNTRLDEVRn(2): |
172 | *val = etm_read(ETMCNTRLDEVR2); |
173 | return 0; |
174 | case ETMCNTRLDEVRn(3): |
175 | *val = etm_read(ETMCNTRLDEVR3); |
176 | return 0; |
177 | case ETMCNTVRn(0): |
178 | *val = etm_read(ETMCNTVR0); |
179 | return 0; |
180 | case ETMCNTVRn(1): |
181 | *val = etm_read(ETMCNTVR1); |
182 | return 0; |
183 | case ETMCNTVRn(2): |
184 | *val = etm_read(ETMCNTVR2); |
185 | return 0; |
186 | case ETMCNTVRn(3): |
187 | *val = etm_read(ETMCNTVR3); |
188 | return 0; |
189 | case ETMSQ12EVR: |
190 | *val = etm_read(ETMSQ12EVR); |
191 | return 0; |
192 | case ETMSQ21EVR: |
193 | *val = etm_read(ETMSQ21EVR); |
194 | return 0; |
195 | case ETMSQ23EVR: |
196 | *val = etm_read(ETMSQ23EVR); |
197 | return 0; |
198 | case ETMSQ31EVR: |
199 | *val = etm_read(ETMSQ31EVR); |
200 | return 0; |
201 | case ETMSQ32EVR: |
202 | *val = etm_read(ETMSQ32EVR); |
203 | return 0; |
204 | case ETMSQ13EVR: |
205 | *val = etm_read(ETMSQ13EVR); |
206 | return 0; |
207 | case ETMSQR: |
208 | *val = etm_read(ETMSQR); |
209 | return 0; |
210 | case ETMEXTOUTEVRn(0): |
211 | *val = etm_read(ETMEXTOUTEVR0); |
212 | return 0; |
213 | case ETMEXTOUTEVRn(1): |
214 | *val = etm_read(ETMEXTOUTEVR1); |
215 | return 0; |
216 | case ETMEXTOUTEVRn(2): |
217 | *val = etm_read(ETMEXTOUTEVR2); |
218 | return 0; |
219 | case ETMEXTOUTEVRn(3): |
220 | *val = etm_read(ETMEXTOUTEVR3); |
221 | return 0; |
222 | case ETMCIDCVRn(0): |
223 | *val = etm_read(ETMCIDCVR0); |
224 | return 0; |
225 | case ETMCIDCVRn(1): |
226 | *val = etm_read(ETMCIDCVR1); |
227 | return 0; |
228 | case ETMCIDCVRn(2): |
229 | *val = etm_read(ETMCIDCVR2); |
230 | return 0; |
231 | case ETMCIDCMR: |
232 | *val = etm_read(ETMCIDCMR); |
233 | return 0; |
234 | case ETMIMPSPEC0: |
235 | *val = etm_read(ETMIMPSPEC0); |
236 | return 0; |
237 | case ETMIMPSPEC1: |
238 | *val = etm_read(ETMIMPSPEC1); |
239 | return 0; |
240 | case ETMIMPSPEC2: |
241 | *val = etm_read(ETMIMPSPEC2); |
242 | return 0; |
243 | case ETMIMPSPEC3: |
244 | *val = etm_read(ETMIMPSPEC3); |
245 | return 0; |
246 | case ETMIMPSPEC4: |
247 | *val = etm_read(ETMIMPSPEC4); |
248 | return 0; |
249 | case ETMIMPSPEC5: |
250 | *val = etm_read(ETMIMPSPEC5); |
251 | return 0; |
252 | case ETMIMPSPEC6: |
253 | *val = etm_read(ETMIMPSPEC6); |
254 | return 0; |
255 | case ETMIMPSPEC7: |
256 | *val = etm_read(ETMIMPSPEC7); |
257 | return 0; |
258 | case ETMSYNCFR: |
259 | *val = etm_read(ETMSYNCFR); |
260 | return 0; |
261 | case ETMIDR: |
262 | *val = etm_read(ETMIDR); |
263 | return 0; |
264 | case ETMCCER: |
265 | *val = etm_read(ETMCCER); |
266 | return 0; |
267 | case ETMEXTINSELR: |
268 | *val = etm_read(ETMEXTINSELR); |
269 | return 0; |
270 | case ETMTESSEICR: |
271 | *val = etm_read(ETMTESSEICR); |
272 | return 0; |
273 | case ETMEIBCR: |
274 | *val = etm_read(ETMEIBCR); |
275 | return 0; |
276 | case ETMTSEVR: |
277 | *val = etm_read(ETMTSEVR); |
278 | return 0; |
279 | case ETMAUXCR: |
280 | *val = etm_read(ETMAUXCR); |
281 | return 0; |
282 | case ETMTRACEIDR: |
283 | *val = etm_read(ETMTRACEIDR); |
284 | return 0; |
285 | case ETMVMIDCVR: |
286 | *val = etm_read(ETMVMIDCVR); |
287 | return 0; |
288 | case ETMOSLSR: |
289 | *val = etm_read(ETMOSLSR); |
290 | return 0; |
291 | case ETMOSSRR: |
292 | *val = etm_read(ETMOSSRR); |
293 | return 0; |
294 | case ETMPDCR: |
295 | *val = etm_read(ETMPDCR); |
296 | return 0; |
297 | case ETMPDSR: |
298 | *val = etm_read(ETMPDSR); |
299 | return 0; |
300 | default: |
301 | *val = 0; |
302 | return -EINVAL; |
303 | } |
304 | } |
305 | |
306 | int etm_writel_cp14(u32 reg, u32 val) |
307 | { |
308 | switch (reg) { |
309 | case ETMCR: |
310 | etm_write(val, ETMCR); |
311 | break; |
312 | case ETMTRIGGER: |
313 | etm_write(val, ETMTRIGGER); |
314 | break; |
315 | case ETMSR: |
316 | etm_write(val, ETMSR); |
317 | break; |
318 | case ETMTSSCR: |
319 | etm_write(val, ETMTSSCR); |
320 | break; |
321 | case ETMTEEVR: |
322 | etm_write(val, ETMTEEVR); |
323 | break; |
324 | case ETMTECR1: |
325 | etm_write(val, ETMTECR1); |
326 | break; |
327 | case ETMFFLR: |
328 | etm_write(val, ETMFFLR); |
329 | break; |
330 | case ETMACVRn(0): |
331 | etm_write(val, ETMACVR0); |
332 | break; |
333 | case ETMACVRn(1): |
334 | etm_write(val, ETMACVR1); |
335 | break; |
336 | case ETMACVRn(2): |
337 | etm_write(val, ETMACVR2); |
338 | break; |
339 | case ETMACVRn(3): |
340 | etm_write(val, ETMACVR3); |
341 | break; |
342 | case ETMACVRn(4): |
343 | etm_write(val, ETMACVR4); |
344 | break; |
345 | case ETMACVRn(5): |
346 | etm_write(val, ETMACVR5); |
347 | break; |
348 | case ETMACVRn(6): |
349 | etm_write(val, ETMACVR6); |
350 | break; |
351 | case ETMACVRn(7): |
352 | etm_write(val, ETMACVR7); |
353 | break; |
354 | case ETMACVRn(8): |
355 | etm_write(val, ETMACVR8); |
356 | break; |
357 | case ETMACVRn(9): |
358 | etm_write(val, ETMACVR9); |
359 | break; |
360 | case ETMACVRn(10): |
361 | etm_write(val, ETMACVR10); |
362 | break; |
363 | case ETMACVRn(11): |
364 | etm_write(val, ETMACVR11); |
365 | break; |
366 | case ETMACVRn(12): |
367 | etm_write(val, ETMACVR12); |
368 | break; |
369 | case ETMACVRn(13): |
370 | etm_write(val, ETMACVR13); |
371 | break; |
372 | case ETMACVRn(14): |
373 | etm_write(val, ETMACVR14); |
374 | break; |
375 | case ETMACVRn(15): |
376 | etm_write(val, ETMACVR15); |
377 | break; |
378 | case ETMACTRn(0): |
379 | etm_write(val, ETMACTR0); |
380 | break; |
381 | case ETMACTRn(1): |
382 | etm_write(val, ETMACTR1); |
383 | break; |
384 | case ETMACTRn(2): |
385 | etm_write(val, ETMACTR2); |
386 | break; |
387 | case ETMACTRn(3): |
388 | etm_write(val, ETMACTR3); |
389 | break; |
390 | case ETMACTRn(4): |
391 | etm_write(val, ETMACTR4); |
392 | break; |
393 | case ETMACTRn(5): |
394 | etm_write(val, ETMACTR5); |
395 | break; |
396 | case ETMACTRn(6): |
397 | etm_write(val, ETMACTR6); |
398 | break; |
399 | case ETMACTRn(7): |
400 | etm_write(val, ETMACTR7); |
401 | break; |
402 | case ETMACTRn(8): |
403 | etm_write(val, ETMACTR8); |
404 | break; |
405 | case ETMACTRn(9): |
406 | etm_write(val, ETMACTR9); |
407 | break; |
408 | case ETMACTRn(10): |
409 | etm_write(val, ETMACTR10); |
410 | break; |
411 | case ETMACTRn(11): |
412 | etm_write(val, ETMACTR11); |
413 | break; |
414 | case ETMACTRn(12): |
415 | etm_write(val, ETMACTR12); |
416 | break; |
417 | case ETMACTRn(13): |
418 | etm_write(val, ETMACTR13); |
419 | break; |
420 | case ETMACTRn(14): |
421 | etm_write(val, ETMACTR14); |
422 | break; |
423 | case ETMACTRn(15): |
424 | etm_write(val, ETMACTR15); |
425 | break; |
426 | case ETMCNTRLDVRn(0): |
427 | etm_write(val, ETMCNTRLDVR0); |
428 | break; |
429 | case ETMCNTRLDVRn(1): |
430 | etm_write(val, ETMCNTRLDVR1); |
431 | break; |
432 | case ETMCNTRLDVRn(2): |
433 | etm_write(val, ETMCNTRLDVR2); |
434 | break; |
435 | case ETMCNTRLDVRn(3): |
436 | etm_write(val, ETMCNTRLDVR3); |
437 | break; |
438 | case ETMCNTENRn(0): |
439 | etm_write(val, ETMCNTENR0); |
440 | break; |
441 | case ETMCNTENRn(1): |
442 | etm_write(val, ETMCNTENR1); |
443 | break; |
444 | case ETMCNTENRn(2): |
445 | etm_write(val, ETMCNTENR2); |
446 | break; |
447 | case ETMCNTENRn(3): |
448 | etm_write(val, ETMCNTENR3); |
449 | break; |
450 | case ETMCNTRLDEVRn(0): |
451 | etm_write(val, ETMCNTRLDEVR0); |
452 | break; |
453 | case ETMCNTRLDEVRn(1): |
454 | etm_write(val, ETMCNTRLDEVR1); |
455 | break; |
456 | case ETMCNTRLDEVRn(2): |
457 | etm_write(val, ETMCNTRLDEVR2); |
458 | break; |
459 | case ETMCNTRLDEVRn(3): |
460 | etm_write(val, ETMCNTRLDEVR3); |
461 | break; |
462 | case ETMCNTVRn(0): |
463 | etm_write(val, ETMCNTVR0); |
464 | break; |
465 | case ETMCNTVRn(1): |
466 | etm_write(val, ETMCNTVR1); |
467 | break; |
468 | case ETMCNTVRn(2): |
469 | etm_write(val, ETMCNTVR2); |
470 | break; |
471 | case ETMCNTVRn(3): |
472 | etm_write(val, ETMCNTVR3); |
473 | break; |
474 | case ETMSQ12EVR: |
475 | etm_write(val, ETMSQ12EVR); |
476 | break; |
477 | case ETMSQ21EVR: |
478 | etm_write(val, ETMSQ21EVR); |
479 | break; |
480 | case ETMSQ23EVR: |
481 | etm_write(val, ETMSQ23EVR); |
482 | break; |
483 | case ETMSQ31EVR: |
484 | etm_write(val, ETMSQ31EVR); |
485 | break; |
486 | case ETMSQ32EVR: |
487 | etm_write(val, ETMSQ32EVR); |
488 | break; |
489 | case ETMSQ13EVR: |
490 | etm_write(val, ETMSQ13EVR); |
491 | break; |
492 | case ETMSQR: |
493 | etm_write(val, ETMSQR); |
494 | break; |
495 | case ETMEXTOUTEVRn(0): |
496 | etm_write(val, ETMEXTOUTEVR0); |
497 | break; |
498 | case ETMEXTOUTEVRn(1): |
499 | etm_write(val, ETMEXTOUTEVR1); |
500 | break; |
501 | case ETMEXTOUTEVRn(2): |
502 | etm_write(val, ETMEXTOUTEVR2); |
503 | break; |
504 | case ETMEXTOUTEVRn(3): |
505 | etm_write(val, ETMEXTOUTEVR3); |
506 | break; |
507 | case ETMCIDCVRn(0): |
508 | etm_write(val, ETMCIDCVR0); |
509 | break; |
510 | case ETMCIDCVRn(1): |
511 | etm_write(val, ETMCIDCVR1); |
512 | break; |
513 | case ETMCIDCVRn(2): |
514 | etm_write(val, ETMCIDCVR2); |
515 | break; |
516 | case ETMCIDCMR: |
517 | etm_write(val, ETMCIDCMR); |
518 | break; |
519 | case ETMIMPSPEC0: |
520 | etm_write(val, ETMIMPSPEC0); |
521 | break; |
522 | case ETMIMPSPEC1: |
523 | etm_write(val, ETMIMPSPEC1); |
524 | break; |
525 | case ETMIMPSPEC2: |
526 | etm_write(val, ETMIMPSPEC2); |
527 | break; |
528 | case ETMIMPSPEC3: |
529 | etm_write(val, ETMIMPSPEC3); |
530 | break; |
531 | case ETMIMPSPEC4: |
532 | etm_write(val, ETMIMPSPEC4); |
533 | break; |
534 | case ETMIMPSPEC5: |
535 | etm_write(val, ETMIMPSPEC5); |
536 | break; |
537 | case ETMIMPSPEC6: |
538 | etm_write(val, ETMIMPSPEC6); |
539 | break; |
540 | case ETMIMPSPEC7: |
541 | etm_write(val, ETMIMPSPEC7); |
542 | break; |
543 | case ETMSYNCFR: |
544 | etm_write(val, ETMSYNCFR); |
545 | break; |
546 | case ETMEXTINSELR: |
547 | etm_write(val, ETMEXTINSELR); |
548 | break; |
549 | case ETMTESSEICR: |
550 | etm_write(val, ETMTESSEICR); |
551 | break; |
552 | case ETMEIBCR: |
553 | etm_write(val, ETMEIBCR); |
554 | break; |
555 | case ETMTSEVR: |
556 | etm_write(val, ETMTSEVR); |
557 | break; |
558 | case ETMAUXCR: |
559 | etm_write(val, ETMAUXCR); |
560 | break; |
561 | case ETMTRACEIDR: |
562 | etm_write(val, ETMTRACEIDR); |
563 | break; |
564 | case ETMVMIDCVR: |
565 | etm_write(val, ETMVMIDCVR); |
566 | break; |
567 | case ETMOSLAR: |
568 | etm_write(val, ETMOSLAR); |
569 | break; |
570 | case ETMOSSRR: |
571 | etm_write(val, ETMOSSRR); |
572 | break; |
573 | case ETMPDCR: |
574 | etm_write(val, ETMPDCR); |
575 | break; |
576 | case ETMPDSR: |
577 | etm_write(val, ETMPDSR); |
578 | break; |
579 | default: |
580 | return -EINVAL; |
581 | } |
582 | |
583 | return 0; |
584 | } |
585 | |