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