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
15int 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
306int 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