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