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
22int 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
313int 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