Merge tag 'clk-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/clk/linux
[linux-2.6-microblaze.git] / drivers / hwtracing / coresight / coresight-etm4x-sysfs.c
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright(C) 2015 Linaro Limited. All rights reserved.
4  * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
5  */
6
7 #include <linux/pid_namespace.h>
8 #include <linux/pm_runtime.h>
9 #include <linux/sysfs.h>
10 #include "coresight-etm4x.h"
11 #include "coresight-priv.h"
12 #include "coresight-syscfg.h"
13
14 static int etm4_set_mode_exclude(struct etmv4_drvdata *drvdata, bool exclude)
15 {
16         u8 idx;
17         struct etmv4_config *config = &drvdata->config;
18
19         idx = config->addr_idx;
20
21         /*
22          * TRCACATRn.TYPE bit[1:0]: type of comparison
23          * the trace unit performs
24          */
25         if (BMVAL(config->addr_acc[idx], 0, 1) == ETM_INSTR_ADDR) {
26                 if (idx % 2 != 0)
27                         return -EINVAL;
28
29                 /*
30                  * We are performing instruction address comparison. Set the
31                  * relevant bit of ViewInst Include/Exclude Control register
32                  * for corresponding address comparator pair.
33                  */
34                 if (config->addr_type[idx] != ETM_ADDR_TYPE_RANGE ||
35                     config->addr_type[idx + 1] != ETM_ADDR_TYPE_RANGE)
36                         return -EINVAL;
37
38                 if (exclude == true) {
39                         /*
40                          * Set exclude bit and unset the include bit
41                          * corresponding to comparator pair
42                          */
43                         config->viiectlr |= BIT(idx / 2 + 16);
44                         config->viiectlr &= ~BIT(idx / 2);
45                 } else {
46                         /*
47                          * Set include bit and unset exclude bit
48                          * corresponding to comparator pair
49                          */
50                         config->viiectlr |= BIT(idx / 2);
51                         config->viiectlr &= ~BIT(idx / 2 + 16);
52                 }
53         }
54         return 0;
55 }
56
57 static ssize_t nr_pe_cmp_show(struct device *dev,
58                               struct device_attribute *attr,
59                               char *buf)
60 {
61         unsigned long val;
62         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
63
64         val = drvdata->nr_pe_cmp;
65         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
66 }
67 static DEVICE_ATTR_RO(nr_pe_cmp);
68
69 static ssize_t nr_addr_cmp_show(struct device *dev,
70                                 struct device_attribute *attr,
71                                 char *buf)
72 {
73         unsigned long val;
74         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
75
76         val = drvdata->nr_addr_cmp;
77         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
78 }
79 static DEVICE_ATTR_RO(nr_addr_cmp);
80
81 static ssize_t nr_cntr_show(struct device *dev,
82                             struct device_attribute *attr,
83                             char *buf)
84 {
85         unsigned long val;
86         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
87
88         val = drvdata->nr_cntr;
89         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
90 }
91 static DEVICE_ATTR_RO(nr_cntr);
92
93 static ssize_t nr_ext_inp_show(struct device *dev,
94                                struct device_attribute *attr,
95                                char *buf)
96 {
97         unsigned long val;
98         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
99
100         val = drvdata->nr_ext_inp;
101         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
102 }
103 static DEVICE_ATTR_RO(nr_ext_inp);
104
105 static ssize_t numcidc_show(struct device *dev,
106                             struct device_attribute *attr,
107                             char *buf)
108 {
109         unsigned long val;
110         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
111
112         val = drvdata->numcidc;
113         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
114 }
115 static DEVICE_ATTR_RO(numcidc);
116
117 static ssize_t numvmidc_show(struct device *dev,
118                              struct device_attribute *attr,
119                              char *buf)
120 {
121         unsigned long val;
122         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
123
124         val = drvdata->numvmidc;
125         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
126 }
127 static DEVICE_ATTR_RO(numvmidc);
128
129 static ssize_t nrseqstate_show(struct device *dev,
130                                struct device_attribute *attr,
131                                char *buf)
132 {
133         unsigned long val;
134         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
135
136         val = drvdata->nrseqstate;
137         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
138 }
139 static DEVICE_ATTR_RO(nrseqstate);
140
141 static ssize_t nr_resource_show(struct device *dev,
142                                 struct device_attribute *attr,
143                                 char *buf)
144 {
145         unsigned long val;
146         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
147
148         val = drvdata->nr_resource;
149         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
150 }
151 static DEVICE_ATTR_RO(nr_resource);
152
153 static ssize_t nr_ss_cmp_show(struct device *dev,
154                               struct device_attribute *attr,
155                               char *buf)
156 {
157         unsigned long val;
158         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
159
160         val = drvdata->nr_ss_cmp;
161         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
162 }
163 static DEVICE_ATTR_RO(nr_ss_cmp);
164
165 static ssize_t reset_store(struct device *dev,
166                            struct device_attribute *attr,
167                            const char *buf, size_t size)
168 {
169         int i;
170         unsigned long val;
171         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
172         struct etmv4_config *config = &drvdata->config;
173
174         if (kstrtoul(buf, 16, &val))
175                 return -EINVAL;
176
177         spin_lock(&drvdata->spinlock);
178         if (val)
179                 config->mode = 0x0;
180
181         /* Disable data tracing: do not trace load and store data transfers */
182         config->mode &= ~(ETM_MODE_LOAD | ETM_MODE_STORE);
183         config->cfg &= ~(BIT(1) | BIT(2));
184
185         /* Disable data value and data address tracing */
186         config->mode &= ~(ETM_MODE_DATA_TRACE_ADDR |
187                            ETM_MODE_DATA_TRACE_VAL);
188         config->cfg &= ~(BIT(16) | BIT(17));
189
190         /* Disable all events tracing */
191         config->eventctrl0 = 0x0;
192         config->eventctrl1 = 0x0;
193
194         /* Disable timestamp event */
195         config->ts_ctrl = 0x0;
196
197         /* Disable stalling */
198         config->stall_ctrl = 0x0;
199
200         /* Reset trace synchronization period  to 2^8 = 256 bytes*/
201         if (drvdata->syncpr == false)
202                 config->syncfreq = 0x8;
203
204         /*
205          * Enable ViewInst to trace everything with start-stop logic in
206          * started state. ARM recommends start-stop logic is set before
207          * each trace run.
208          */
209         config->vinst_ctrl = BIT(0);
210         if (drvdata->nr_addr_cmp > 0) {
211                 config->mode |= ETM_MODE_VIEWINST_STARTSTOP;
212                 /* SSSTATUS, bit[9] */
213                 config->vinst_ctrl |= BIT(9);
214         }
215
216         /* No address range filtering for ViewInst */
217         config->viiectlr = 0x0;
218
219         /* No start-stop filtering for ViewInst */
220         config->vissctlr = 0x0;
221         config->vipcssctlr = 0x0;
222
223         /* Disable seq events */
224         for (i = 0; i < drvdata->nrseqstate-1; i++)
225                 config->seq_ctrl[i] = 0x0;
226         config->seq_rst = 0x0;
227         config->seq_state = 0x0;
228
229         /* Disable external input events */
230         config->ext_inp = 0x0;
231
232         config->cntr_idx = 0x0;
233         for (i = 0; i < drvdata->nr_cntr; i++) {
234                 config->cntrldvr[i] = 0x0;
235                 config->cntr_ctrl[i] = 0x0;
236                 config->cntr_val[i] = 0x0;
237         }
238
239         config->res_idx = 0x0;
240         for (i = 2; i < 2 * drvdata->nr_resource; i++)
241                 config->res_ctrl[i] = 0x0;
242
243         config->ss_idx = 0x0;
244         for (i = 0; i < drvdata->nr_ss_cmp; i++) {
245                 config->ss_ctrl[i] = 0x0;
246                 config->ss_pe_cmp[i] = 0x0;
247         }
248
249         config->addr_idx = 0x0;
250         for (i = 0; i < drvdata->nr_addr_cmp * 2; i++) {
251                 config->addr_val[i] = 0x0;
252                 config->addr_acc[i] = 0x0;
253                 config->addr_type[i] = ETM_ADDR_TYPE_NONE;
254         }
255
256         config->ctxid_idx = 0x0;
257         for (i = 0; i < drvdata->numcidc; i++)
258                 config->ctxid_pid[i] = 0x0;
259
260         config->ctxid_mask0 = 0x0;
261         config->ctxid_mask1 = 0x0;
262
263         config->vmid_idx = 0x0;
264         for (i = 0; i < drvdata->numvmidc; i++)
265                 config->vmid_val[i] = 0x0;
266         config->vmid_mask0 = 0x0;
267         config->vmid_mask1 = 0x0;
268
269         drvdata->trcid = drvdata->cpu + 1;
270
271         spin_unlock(&drvdata->spinlock);
272
273         cscfg_csdev_reset_feats(to_coresight_device(dev));
274
275         return size;
276 }
277 static DEVICE_ATTR_WO(reset);
278
279 static ssize_t mode_show(struct device *dev,
280                          struct device_attribute *attr,
281                          char *buf)
282 {
283         unsigned long val;
284         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
285         struct etmv4_config *config = &drvdata->config;
286
287         val = config->mode;
288         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
289 }
290
291 static ssize_t mode_store(struct device *dev,
292                           struct device_attribute *attr,
293                           const char *buf, size_t size)
294 {
295         unsigned long val, mode;
296         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
297         struct etmv4_config *config = &drvdata->config;
298
299         if (kstrtoul(buf, 16, &val))
300                 return -EINVAL;
301
302         spin_lock(&drvdata->spinlock);
303         config->mode = val & ETMv4_MODE_ALL;
304
305         if (drvdata->instrp0 == true) {
306                 /* start by clearing instruction P0 field */
307                 config->cfg  &= ~(BIT(1) | BIT(2));
308                 if (config->mode & ETM_MODE_LOAD)
309                         /* 0b01 Trace load instructions as P0 instructions */
310                         config->cfg  |= BIT(1);
311                 if (config->mode & ETM_MODE_STORE)
312                         /* 0b10 Trace store instructions as P0 instructions */
313                         config->cfg  |= BIT(2);
314                 if (config->mode & ETM_MODE_LOAD_STORE)
315                         /*
316                          * 0b11 Trace load and store instructions
317                          * as P0 instructions
318                          */
319                         config->cfg  |= BIT(1) | BIT(2);
320         }
321
322         /* bit[3], Branch broadcast mode */
323         if ((config->mode & ETM_MODE_BB) && (drvdata->trcbb == true))
324                 config->cfg |= BIT(3);
325         else
326                 config->cfg &= ~BIT(3);
327
328         /* bit[4], Cycle counting instruction trace bit */
329         if ((config->mode & ETMv4_MODE_CYCACC) &&
330                 (drvdata->trccci == true))
331                 config->cfg |= BIT(4);
332         else
333                 config->cfg &= ~BIT(4);
334
335         /* bit[6], Context ID tracing bit */
336         if ((config->mode & ETMv4_MODE_CTXID) && (drvdata->ctxid_size))
337                 config->cfg |= BIT(6);
338         else
339                 config->cfg &= ~BIT(6);
340
341         if ((config->mode & ETM_MODE_VMID) && (drvdata->vmid_size))
342                 config->cfg |= BIT(7);
343         else
344                 config->cfg &= ~BIT(7);
345
346         /* bits[10:8], Conditional instruction tracing bit */
347         mode = ETM_MODE_COND(config->mode);
348         if (drvdata->trccond == true) {
349                 config->cfg &= ~(BIT(8) | BIT(9) | BIT(10));
350                 config->cfg |= mode << 8;
351         }
352
353         /* bit[11], Global timestamp tracing bit */
354         if ((config->mode & ETMv4_MODE_TIMESTAMP) && (drvdata->ts_size))
355                 config->cfg |= BIT(11);
356         else
357                 config->cfg &= ~BIT(11);
358
359         /* bit[12], Return stack enable bit */
360         if ((config->mode & ETM_MODE_RETURNSTACK) &&
361                                         (drvdata->retstack == true))
362                 config->cfg |= BIT(12);
363         else
364                 config->cfg &= ~BIT(12);
365
366         /* bits[14:13], Q element enable field */
367         mode = ETM_MODE_QELEM(config->mode);
368         /* start by clearing QE bits */
369         config->cfg &= ~(BIT(13) | BIT(14));
370         /*
371          * if supported, Q elements with instruction counts are enabled.
372          * Always set the low bit for any requested mode. Valid combos are
373          * 0b00, 0b01 and 0b11.
374          */
375         if (mode && drvdata->q_support)
376                 config->cfg |= BIT(13);
377         /*
378          * if supported, Q elements with and without instruction
379          * counts are enabled
380          */
381         if ((mode & BIT(1)) && (drvdata->q_support & BIT(1)))
382                 config->cfg |= BIT(14);
383
384         /* bit[11], AMBA Trace Bus (ATB) trigger enable bit */
385         if ((config->mode & ETM_MODE_ATB_TRIGGER) &&
386             (drvdata->atbtrig == true))
387                 config->eventctrl1 |= BIT(11);
388         else
389                 config->eventctrl1 &= ~BIT(11);
390
391         /* bit[12], Low-power state behavior override bit */
392         if ((config->mode & ETM_MODE_LPOVERRIDE) &&
393             (drvdata->lpoverride == true))
394                 config->eventctrl1 |= BIT(12);
395         else
396                 config->eventctrl1 &= ~BIT(12);
397
398         /* bit[8], Instruction stall bit */
399         if ((config->mode & ETM_MODE_ISTALL_EN) && (drvdata->stallctl == true))
400                 config->stall_ctrl |= BIT(8);
401         else
402                 config->stall_ctrl &= ~BIT(8);
403
404         /* bit[10], Prioritize instruction trace bit */
405         if (config->mode & ETM_MODE_INSTPRIO)
406                 config->stall_ctrl |= BIT(10);
407         else
408                 config->stall_ctrl &= ~BIT(10);
409
410         /* bit[13], Trace overflow prevention bit */
411         if ((config->mode & ETM_MODE_NOOVERFLOW) &&
412                 (drvdata->nooverflow == true))
413                 config->stall_ctrl |= BIT(13);
414         else
415                 config->stall_ctrl &= ~BIT(13);
416
417         /* bit[9] Start/stop logic control bit */
418         if (config->mode & ETM_MODE_VIEWINST_STARTSTOP)
419                 config->vinst_ctrl |= BIT(9);
420         else
421                 config->vinst_ctrl &= ~BIT(9);
422
423         /* bit[10], Whether a trace unit must trace a Reset exception */
424         if (config->mode & ETM_MODE_TRACE_RESET)
425                 config->vinst_ctrl |= BIT(10);
426         else
427                 config->vinst_ctrl &= ~BIT(10);
428
429         /* bit[11], Whether a trace unit must trace a system error exception */
430         if ((config->mode & ETM_MODE_TRACE_ERR) &&
431                 (drvdata->trc_error == true))
432                 config->vinst_ctrl |= BIT(11);
433         else
434                 config->vinst_ctrl &= ~BIT(11);
435
436         if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER))
437                 etm4_config_trace_mode(config);
438
439         spin_unlock(&drvdata->spinlock);
440
441         return size;
442 }
443 static DEVICE_ATTR_RW(mode);
444
445 static ssize_t pe_show(struct device *dev,
446                        struct device_attribute *attr,
447                        char *buf)
448 {
449         unsigned long val;
450         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
451         struct etmv4_config *config = &drvdata->config;
452
453         val = config->pe_sel;
454         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
455 }
456
457 static ssize_t pe_store(struct device *dev,
458                         struct device_attribute *attr,
459                         const char *buf, size_t size)
460 {
461         unsigned long val;
462         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
463         struct etmv4_config *config = &drvdata->config;
464
465         if (kstrtoul(buf, 16, &val))
466                 return -EINVAL;
467
468         spin_lock(&drvdata->spinlock);
469         if (val > drvdata->nr_pe) {
470                 spin_unlock(&drvdata->spinlock);
471                 return -EINVAL;
472         }
473
474         config->pe_sel = val;
475         spin_unlock(&drvdata->spinlock);
476         return size;
477 }
478 static DEVICE_ATTR_RW(pe);
479
480 static ssize_t event_show(struct device *dev,
481                           struct device_attribute *attr,
482                           char *buf)
483 {
484         unsigned long val;
485         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
486         struct etmv4_config *config = &drvdata->config;
487
488         val = config->eventctrl0;
489         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
490 }
491
492 static ssize_t event_store(struct device *dev,
493                            struct device_attribute *attr,
494                            const char *buf, size_t size)
495 {
496         unsigned long val;
497         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
498         struct etmv4_config *config = &drvdata->config;
499
500         if (kstrtoul(buf, 16, &val))
501                 return -EINVAL;
502
503         spin_lock(&drvdata->spinlock);
504         switch (drvdata->nr_event) {
505         case 0x0:
506                 /* EVENT0, bits[7:0] */
507                 config->eventctrl0 = val & 0xFF;
508                 break;
509         case 0x1:
510                  /* EVENT1, bits[15:8] */
511                 config->eventctrl0 = val & 0xFFFF;
512                 break;
513         case 0x2:
514                 /* EVENT2, bits[23:16] */
515                 config->eventctrl0 = val & 0xFFFFFF;
516                 break;
517         case 0x3:
518                 /* EVENT3, bits[31:24] */
519                 config->eventctrl0 = val;
520                 break;
521         default:
522                 break;
523         }
524         spin_unlock(&drvdata->spinlock);
525         return size;
526 }
527 static DEVICE_ATTR_RW(event);
528
529 static ssize_t event_instren_show(struct device *dev,
530                                   struct device_attribute *attr,
531                                   char *buf)
532 {
533         unsigned long val;
534         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
535         struct etmv4_config *config = &drvdata->config;
536
537         val = BMVAL(config->eventctrl1, 0, 3);
538         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
539 }
540
541 static ssize_t event_instren_store(struct device *dev,
542                                    struct device_attribute *attr,
543                                    const char *buf, size_t size)
544 {
545         unsigned long val;
546         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
547         struct etmv4_config *config = &drvdata->config;
548
549         if (kstrtoul(buf, 16, &val))
550                 return -EINVAL;
551
552         spin_lock(&drvdata->spinlock);
553         /* start by clearing all instruction event enable bits */
554         config->eventctrl1 &= ~(BIT(0) | BIT(1) | BIT(2) | BIT(3));
555         switch (drvdata->nr_event) {
556         case 0x0:
557                 /* generate Event element for event 1 */
558                 config->eventctrl1 |= val & BIT(1);
559                 break;
560         case 0x1:
561                 /* generate Event element for event 1 and 2 */
562                 config->eventctrl1 |= val & (BIT(0) | BIT(1));
563                 break;
564         case 0x2:
565                 /* generate Event element for event 1, 2 and 3 */
566                 config->eventctrl1 |= val & (BIT(0) | BIT(1) | BIT(2));
567                 break;
568         case 0x3:
569                 /* generate Event element for all 4 events */
570                 config->eventctrl1 |= val & 0xF;
571                 break;
572         default:
573                 break;
574         }
575         spin_unlock(&drvdata->spinlock);
576         return size;
577 }
578 static DEVICE_ATTR_RW(event_instren);
579
580 static ssize_t event_ts_show(struct device *dev,
581                              struct device_attribute *attr,
582                              char *buf)
583 {
584         unsigned long val;
585         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
586         struct etmv4_config *config = &drvdata->config;
587
588         val = config->ts_ctrl;
589         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
590 }
591
592 static ssize_t event_ts_store(struct device *dev,
593                               struct device_attribute *attr,
594                               const char *buf, size_t size)
595 {
596         unsigned long val;
597         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
598         struct etmv4_config *config = &drvdata->config;
599
600         if (kstrtoul(buf, 16, &val))
601                 return -EINVAL;
602         if (!drvdata->ts_size)
603                 return -EINVAL;
604
605         config->ts_ctrl = val & ETMv4_EVENT_MASK;
606         return size;
607 }
608 static DEVICE_ATTR_RW(event_ts);
609
610 static ssize_t syncfreq_show(struct device *dev,
611                              struct device_attribute *attr,
612                              char *buf)
613 {
614         unsigned long val;
615         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
616         struct etmv4_config *config = &drvdata->config;
617
618         val = config->syncfreq;
619         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
620 }
621
622 static ssize_t syncfreq_store(struct device *dev,
623                               struct device_attribute *attr,
624                               const char *buf, size_t size)
625 {
626         unsigned long val;
627         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
628         struct etmv4_config *config = &drvdata->config;
629
630         if (kstrtoul(buf, 16, &val))
631                 return -EINVAL;
632         if (drvdata->syncpr == true)
633                 return -EINVAL;
634
635         config->syncfreq = val & ETMv4_SYNC_MASK;
636         return size;
637 }
638 static DEVICE_ATTR_RW(syncfreq);
639
640 static ssize_t cyc_threshold_show(struct device *dev,
641                                   struct device_attribute *attr,
642                                   char *buf)
643 {
644         unsigned long val;
645         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
646         struct etmv4_config *config = &drvdata->config;
647
648         val = config->ccctlr;
649         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
650 }
651
652 static ssize_t cyc_threshold_store(struct device *dev,
653                                    struct device_attribute *attr,
654                                    const char *buf, size_t size)
655 {
656         unsigned long val;
657         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
658         struct etmv4_config *config = &drvdata->config;
659
660         if (kstrtoul(buf, 16, &val))
661                 return -EINVAL;
662
663         /* mask off max threshold before checking min value */
664         val &= ETM_CYC_THRESHOLD_MASK;
665         if (val < drvdata->ccitmin)
666                 return -EINVAL;
667
668         config->ccctlr = val;
669         return size;
670 }
671 static DEVICE_ATTR_RW(cyc_threshold);
672
673 static ssize_t bb_ctrl_show(struct device *dev,
674                             struct device_attribute *attr,
675                             char *buf)
676 {
677         unsigned long val;
678         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
679         struct etmv4_config *config = &drvdata->config;
680
681         val = config->bb_ctrl;
682         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
683 }
684
685 static ssize_t bb_ctrl_store(struct device *dev,
686                              struct device_attribute *attr,
687                              const char *buf, size_t size)
688 {
689         unsigned long val;
690         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
691         struct etmv4_config *config = &drvdata->config;
692
693         if (kstrtoul(buf, 16, &val))
694                 return -EINVAL;
695         if (drvdata->trcbb == false)
696                 return -EINVAL;
697         if (!drvdata->nr_addr_cmp)
698                 return -EINVAL;
699
700         /*
701          * Bit[8] controls include(1) / exclude(0), bits[0-7] select
702          * individual range comparators. If include then at least 1
703          * range must be selected.
704          */
705         if ((val & BIT(8)) && (BMVAL(val, 0, 7) == 0))
706                 return -EINVAL;
707
708         config->bb_ctrl = val & GENMASK(8, 0);
709         return size;
710 }
711 static DEVICE_ATTR_RW(bb_ctrl);
712
713 static ssize_t event_vinst_show(struct device *dev,
714                                 struct device_attribute *attr,
715                                 char *buf)
716 {
717         unsigned long val;
718         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
719         struct etmv4_config *config = &drvdata->config;
720
721         val = config->vinst_ctrl & ETMv4_EVENT_MASK;
722         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
723 }
724
725 static ssize_t event_vinst_store(struct device *dev,
726                                  struct device_attribute *attr,
727                                  const char *buf, size_t size)
728 {
729         unsigned long val;
730         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
731         struct etmv4_config *config = &drvdata->config;
732
733         if (kstrtoul(buf, 16, &val))
734                 return -EINVAL;
735
736         spin_lock(&drvdata->spinlock);
737         val &= ETMv4_EVENT_MASK;
738         config->vinst_ctrl &= ~ETMv4_EVENT_MASK;
739         config->vinst_ctrl |= val;
740         spin_unlock(&drvdata->spinlock);
741         return size;
742 }
743 static DEVICE_ATTR_RW(event_vinst);
744
745 static ssize_t s_exlevel_vinst_show(struct device *dev,
746                                     struct device_attribute *attr,
747                                     char *buf)
748 {
749         unsigned long val;
750         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
751         struct etmv4_config *config = &drvdata->config;
752
753         val = (config->vinst_ctrl & TRCVICTLR_EXLEVEL_S_MASK) >> TRCVICTLR_EXLEVEL_S_SHIFT;
754         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
755 }
756
757 static ssize_t s_exlevel_vinst_store(struct device *dev,
758                                      struct device_attribute *attr,
759                                      const char *buf, size_t size)
760 {
761         unsigned long val;
762         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
763         struct etmv4_config *config = &drvdata->config;
764
765         if (kstrtoul(buf, 16, &val))
766                 return -EINVAL;
767
768         spin_lock(&drvdata->spinlock);
769         /* clear all EXLEVEL_S bits  */
770         config->vinst_ctrl &= ~(TRCVICTLR_EXLEVEL_S_MASK);
771         /* enable instruction tracing for corresponding exception level */
772         val &= drvdata->s_ex_level;
773         config->vinst_ctrl |= (val << TRCVICTLR_EXLEVEL_S_SHIFT);
774         spin_unlock(&drvdata->spinlock);
775         return size;
776 }
777 static DEVICE_ATTR_RW(s_exlevel_vinst);
778
779 static ssize_t ns_exlevel_vinst_show(struct device *dev,
780                                      struct device_attribute *attr,
781                                      char *buf)
782 {
783         unsigned long val;
784         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
785         struct etmv4_config *config = &drvdata->config;
786
787         /* EXLEVEL_NS, bits[23:20] */
788         val = (config->vinst_ctrl & TRCVICTLR_EXLEVEL_NS_MASK) >> TRCVICTLR_EXLEVEL_NS_SHIFT;
789         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
790 }
791
792 static ssize_t ns_exlevel_vinst_store(struct device *dev,
793                                       struct device_attribute *attr,
794                                       const char *buf, size_t size)
795 {
796         unsigned long val;
797         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
798         struct etmv4_config *config = &drvdata->config;
799
800         if (kstrtoul(buf, 16, &val))
801                 return -EINVAL;
802
803         spin_lock(&drvdata->spinlock);
804         /* clear EXLEVEL_NS bits  */
805         config->vinst_ctrl &= ~(TRCVICTLR_EXLEVEL_NS_MASK);
806         /* enable instruction tracing for corresponding exception level */
807         val &= drvdata->ns_ex_level;
808         config->vinst_ctrl |= (val << TRCVICTLR_EXLEVEL_NS_SHIFT);
809         spin_unlock(&drvdata->spinlock);
810         return size;
811 }
812 static DEVICE_ATTR_RW(ns_exlevel_vinst);
813
814 static ssize_t addr_idx_show(struct device *dev,
815                              struct device_attribute *attr,
816                              char *buf)
817 {
818         unsigned long val;
819         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
820         struct etmv4_config *config = &drvdata->config;
821
822         val = config->addr_idx;
823         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
824 }
825
826 static ssize_t addr_idx_store(struct device *dev,
827                               struct device_attribute *attr,
828                               const char *buf, size_t size)
829 {
830         unsigned long val;
831         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
832         struct etmv4_config *config = &drvdata->config;
833
834         if (kstrtoul(buf, 16, &val))
835                 return -EINVAL;
836         if (val >= drvdata->nr_addr_cmp * 2)
837                 return -EINVAL;
838
839         /*
840          * Use spinlock to ensure index doesn't change while it gets
841          * dereferenced multiple times within a spinlock block elsewhere.
842          */
843         spin_lock(&drvdata->spinlock);
844         config->addr_idx = val;
845         spin_unlock(&drvdata->spinlock);
846         return size;
847 }
848 static DEVICE_ATTR_RW(addr_idx);
849
850 static ssize_t addr_instdatatype_show(struct device *dev,
851                                       struct device_attribute *attr,
852                                       char *buf)
853 {
854         ssize_t len;
855         u8 val, idx;
856         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
857         struct etmv4_config *config = &drvdata->config;
858
859         spin_lock(&drvdata->spinlock);
860         idx = config->addr_idx;
861         val = BMVAL(config->addr_acc[idx], 0, 1);
862         len = scnprintf(buf, PAGE_SIZE, "%s\n",
863                         val == ETM_INSTR_ADDR ? "instr" :
864                         (val == ETM_DATA_LOAD_ADDR ? "data_load" :
865                         (val == ETM_DATA_STORE_ADDR ? "data_store" :
866                         "data_load_store")));
867         spin_unlock(&drvdata->spinlock);
868         return len;
869 }
870
871 static ssize_t addr_instdatatype_store(struct device *dev,
872                                        struct device_attribute *attr,
873                                        const char *buf, size_t size)
874 {
875         u8 idx;
876         char str[20] = "";
877         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
878         struct etmv4_config *config = &drvdata->config;
879
880         if (strlen(buf) >= 20)
881                 return -EINVAL;
882         if (sscanf(buf, "%s", str) != 1)
883                 return -EINVAL;
884
885         spin_lock(&drvdata->spinlock);
886         idx = config->addr_idx;
887         if (!strcmp(str, "instr"))
888                 /* TYPE, bits[1:0] */
889                 config->addr_acc[idx] &= ~(BIT(0) | BIT(1));
890
891         spin_unlock(&drvdata->spinlock);
892         return size;
893 }
894 static DEVICE_ATTR_RW(addr_instdatatype);
895
896 static ssize_t addr_single_show(struct device *dev,
897                                 struct device_attribute *attr,
898                                 char *buf)
899 {
900         u8 idx;
901         unsigned long val;
902         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
903         struct etmv4_config *config = &drvdata->config;
904
905         idx = config->addr_idx;
906         spin_lock(&drvdata->spinlock);
907         if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
908               config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
909                 spin_unlock(&drvdata->spinlock);
910                 return -EPERM;
911         }
912         val = (unsigned long)config->addr_val[idx];
913         spin_unlock(&drvdata->spinlock);
914         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
915 }
916
917 static ssize_t addr_single_store(struct device *dev,
918                                  struct device_attribute *attr,
919                                  const char *buf, size_t size)
920 {
921         u8 idx;
922         unsigned long val;
923         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
924         struct etmv4_config *config = &drvdata->config;
925
926         if (kstrtoul(buf, 16, &val))
927                 return -EINVAL;
928
929         spin_lock(&drvdata->spinlock);
930         idx = config->addr_idx;
931         if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
932               config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
933                 spin_unlock(&drvdata->spinlock);
934                 return -EPERM;
935         }
936
937         config->addr_val[idx] = (u64)val;
938         config->addr_type[idx] = ETM_ADDR_TYPE_SINGLE;
939         spin_unlock(&drvdata->spinlock);
940         return size;
941 }
942 static DEVICE_ATTR_RW(addr_single);
943
944 static ssize_t addr_range_show(struct device *dev,
945                                struct device_attribute *attr,
946                                char *buf)
947 {
948         u8 idx;
949         unsigned long val1, val2;
950         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
951         struct etmv4_config *config = &drvdata->config;
952
953         spin_lock(&drvdata->spinlock);
954         idx = config->addr_idx;
955         if (idx % 2 != 0) {
956                 spin_unlock(&drvdata->spinlock);
957                 return -EPERM;
958         }
959         if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
960                config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
961               (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
962                config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
963                 spin_unlock(&drvdata->spinlock);
964                 return -EPERM;
965         }
966
967         val1 = (unsigned long)config->addr_val[idx];
968         val2 = (unsigned long)config->addr_val[idx + 1];
969         spin_unlock(&drvdata->spinlock);
970         return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
971 }
972
973 static ssize_t addr_range_store(struct device *dev,
974                                 struct device_attribute *attr,
975                                 const char *buf, size_t size)
976 {
977         u8 idx;
978         unsigned long val1, val2;
979         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
980         struct etmv4_config *config = &drvdata->config;
981         int elements, exclude;
982
983         elements = sscanf(buf, "%lx %lx %x", &val1, &val2, &exclude);
984
985         /*  exclude is optional, but need at least two parameter */
986         if (elements < 2)
987                 return -EINVAL;
988         /* lower address comparator cannot have a higher address value */
989         if (val1 > val2)
990                 return -EINVAL;
991
992         spin_lock(&drvdata->spinlock);
993         idx = config->addr_idx;
994         if (idx % 2 != 0) {
995                 spin_unlock(&drvdata->spinlock);
996                 return -EPERM;
997         }
998
999         if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
1000                config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
1001               (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
1002                config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
1003                 spin_unlock(&drvdata->spinlock);
1004                 return -EPERM;
1005         }
1006
1007         config->addr_val[idx] = (u64)val1;
1008         config->addr_type[idx] = ETM_ADDR_TYPE_RANGE;
1009         config->addr_val[idx + 1] = (u64)val2;
1010         config->addr_type[idx + 1] = ETM_ADDR_TYPE_RANGE;
1011         /*
1012          * Program include or exclude control bits for vinst or vdata
1013          * whenever we change addr comparators to ETM_ADDR_TYPE_RANGE
1014          * use supplied value, or default to bit set in 'mode'
1015          */
1016         if (elements != 3)
1017                 exclude = config->mode & ETM_MODE_EXCLUDE;
1018         etm4_set_mode_exclude(drvdata, exclude ? true : false);
1019
1020         spin_unlock(&drvdata->spinlock);
1021         return size;
1022 }
1023 static DEVICE_ATTR_RW(addr_range);
1024
1025 static ssize_t addr_start_show(struct device *dev,
1026                                struct device_attribute *attr,
1027                                char *buf)
1028 {
1029         u8 idx;
1030         unsigned long val;
1031         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1032         struct etmv4_config *config = &drvdata->config;
1033
1034         spin_lock(&drvdata->spinlock);
1035         idx = config->addr_idx;
1036
1037         if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
1038               config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
1039                 spin_unlock(&drvdata->spinlock);
1040                 return -EPERM;
1041         }
1042
1043         val = (unsigned long)config->addr_val[idx];
1044         spin_unlock(&drvdata->spinlock);
1045         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1046 }
1047
1048 static ssize_t addr_start_store(struct device *dev,
1049                                 struct device_attribute *attr,
1050                                 const char *buf, size_t size)
1051 {
1052         u8 idx;
1053         unsigned long val;
1054         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1055         struct etmv4_config *config = &drvdata->config;
1056
1057         if (kstrtoul(buf, 16, &val))
1058                 return -EINVAL;
1059
1060         spin_lock(&drvdata->spinlock);
1061         idx = config->addr_idx;
1062         if (!drvdata->nr_addr_cmp) {
1063                 spin_unlock(&drvdata->spinlock);
1064                 return -EINVAL;
1065         }
1066         if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
1067               config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
1068                 spin_unlock(&drvdata->spinlock);
1069                 return -EPERM;
1070         }
1071
1072         config->addr_val[idx] = (u64)val;
1073         config->addr_type[idx] = ETM_ADDR_TYPE_START;
1074         config->vissctlr |= BIT(idx);
1075         spin_unlock(&drvdata->spinlock);
1076         return size;
1077 }
1078 static DEVICE_ATTR_RW(addr_start);
1079
1080 static ssize_t addr_stop_show(struct device *dev,
1081                               struct device_attribute *attr,
1082                               char *buf)
1083 {
1084         u8 idx;
1085         unsigned long val;
1086         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1087         struct etmv4_config *config = &drvdata->config;
1088
1089         spin_lock(&drvdata->spinlock);
1090         idx = config->addr_idx;
1091
1092         if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
1093               config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
1094                 spin_unlock(&drvdata->spinlock);
1095                 return -EPERM;
1096         }
1097
1098         val = (unsigned long)config->addr_val[idx];
1099         spin_unlock(&drvdata->spinlock);
1100         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1101 }
1102
1103 static ssize_t addr_stop_store(struct device *dev,
1104                                struct device_attribute *attr,
1105                                const char *buf, size_t size)
1106 {
1107         u8 idx;
1108         unsigned long val;
1109         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1110         struct etmv4_config *config = &drvdata->config;
1111
1112         if (kstrtoul(buf, 16, &val))
1113                 return -EINVAL;
1114
1115         spin_lock(&drvdata->spinlock);
1116         idx = config->addr_idx;
1117         if (!drvdata->nr_addr_cmp) {
1118                 spin_unlock(&drvdata->spinlock);
1119                 return -EINVAL;
1120         }
1121         if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
1122                config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
1123                 spin_unlock(&drvdata->spinlock);
1124                 return -EPERM;
1125         }
1126
1127         config->addr_val[idx] = (u64)val;
1128         config->addr_type[idx] = ETM_ADDR_TYPE_STOP;
1129         config->vissctlr |= BIT(idx + 16);
1130         spin_unlock(&drvdata->spinlock);
1131         return size;
1132 }
1133 static DEVICE_ATTR_RW(addr_stop);
1134
1135 static ssize_t addr_ctxtype_show(struct device *dev,
1136                                  struct device_attribute *attr,
1137                                  char *buf)
1138 {
1139         ssize_t len;
1140         u8 idx, val;
1141         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1142         struct etmv4_config *config = &drvdata->config;
1143
1144         spin_lock(&drvdata->spinlock);
1145         idx = config->addr_idx;
1146         /* CONTEXTTYPE, bits[3:2] */
1147         val = BMVAL(config->addr_acc[idx], 2, 3);
1148         len = scnprintf(buf, PAGE_SIZE, "%s\n", val == ETM_CTX_NONE ? "none" :
1149                         (val == ETM_CTX_CTXID ? "ctxid" :
1150                         (val == ETM_CTX_VMID ? "vmid" : "all")));
1151         spin_unlock(&drvdata->spinlock);
1152         return len;
1153 }
1154
1155 static ssize_t addr_ctxtype_store(struct device *dev,
1156                                   struct device_attribute *attr,
1157                                   const char *buf, size_t size)
1158 {
1159         u8 idx;
1160         char str[10] = "";
1161         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1162         struct etmv4_config *config = &drvdata->config;
1163
1164         if (strlen(buf) >= 10)
1165                 return -EINVAL;
1166         if (sscanf(buf, "%s", str) != 1)
1167                 return -EINVAL;
1168
1169         spin_lock(&drvdata->spinlock);
1170         idx = config->addr_idx;
1171         if (!strcmp(str, "none"))
1172                 /* start by clearing context type bits */
1173                 config->addr_acc[idx] &= ~(BIT(2) | BIT(3));
1174         else if (!strcmp(str, "ctxid")) {
1175                 /* 0b01 The trace unit performs a Context ID */
1176                 if (drvdata->numcidc) {
1177                         config->addr_acc[idx] |= BIT(2);
1178                         config->addr_acc[idx] &= ~BIT(3);
1179                 }
1180         } else if (!strcmp(str, "vmid")) {
1181                 /* 0b10 The trace unit performs a VMID */
1182                 if (drvdata->numvmidc) {
1183                         config->addr_acc[idx] &= ~BIT(2);
1184                         config->addr_acc[idx] |= BIT(3);
1185                 }
1186         } else if (!strcmp(str, "all")) {
1187                 /*
1188                  * 0b11 The trace unit performs a Context ID
1189                  * comparison and a VMID
1190                  */
1191                 if (drvdata->numcidc)
1192                         config->addr_acc[idx] |= BIT(2);
1193                 if (drvdata->numvmidc)
1194                         config->addr_acc[idx] |= BIT(3);
1195         }
1196         spin_unlock(&drvdata->spinlock);
1197         return size;
1198 }
1199 static DEVICE_ATTR_RW(addr_ctxtype);
1200
1201 static ssize_t addr_context_show(struct device *dev,
1202                                  struct device_attribute *attr,
1203                                  char *buf)
1204 {
1205         u8 idx;
1206         unsigned long val;
1207         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1208         struct etmv4_config *config = &drvdata->config;
1209
1210         spin_lock(&drvdata->spinlock);
1211         idx = config->addr_idx;
1212         /* context ID comparator bits[6:4] */
1213         val = BMVAL(config->addr_acc[idx], 4, 6);
1214         spin_unlock(&drvdata->spinlock);
1215         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1216 }
1217
1218 static ssize_t addr_context_store(struct device *dev,
1219                                   struct device_attribute *attr,
1220                                   const char *buf, size_t size)
1221 {
1222         u8 idx;
1223         unsigned long val;
1224         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1225         struct etmv4_config *config = &drvdata->config;
1226
1227         if (kstrtoul(buf, 16, &val))
1228                 return -EINVAL;
1229         if ((drvdata->numcidc <= 1) && (drvdata->numvmidc <= 1))
1230                 return -EINVAL;
1231         if (val >=  (drvdata->numcidc >= drvdata->numvmidc ?
1232                      drvdata->numcidc : drvdata->numvmidc))
1233                 return -EINVAL;
1234
1235         spin_lock(&drvdata->spinlock);
1236         idx = config->addr_idx;
1237         /* clear context ID comparator bits[6:4] */
1238         config->addr_acc[idx] &= ~(BIT(4) | BIT(5) | BIT(6));
1239         config->addr_acc[idx] |= (val << 4);
1240         spin_unlock(&drvdata->spinlock);
1241         return size;
1242 }
1243 static DEVICE_ATTR_RW(addr_context);
1244
1245 static ssize_t addr_exlevel_s_ns_show(struct device *dev,
1246                                       struct device_attribute *attr,
1247                                       char *buf)
1248 {
1249         u8 idx;
1250         unsigned long val;
1251         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1252         struct etmv4_config *config = &drvdata->config;
1253
1254         spin_lock(&drvdata->spinlock);
1255         idx = config->addr_idx;
1256         val = BMVAL(config->addr_acc[idx], 8, 14);
1257         spin_unlock(&drvdata->spinlock);
1258         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1259 }
1260
1261 static ssize_t addr_exlevel_s_ns_store(struct device *dev,
1262                                        struct device_attribute *attr,
1263                                        const char *buf, size_t size)
1264 {
1265         u8 idx;
1266         unsigned long val;
1267         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1268         struct etmv4_config *config = &drvdata->config;
1269
1270         if (kstrtoul(buf, 0, &val))
1271                 return -EINVAL;
1272
1273         if (val & ~((GENMASK(14, 8) >> 8)))
1274                 return -EINVAL;
1275
1276         spin_lock(&drvdata->spinlock);
1277         idx = config->addr_idx;
1278         /* clear Exlevel_ns & Exlevel_s bits[14:12, 11:8], bit[15] is res0 */
1279         config->addr_acc[idx] &= ~(GENMASK(14, 8));
1280         config->addr_acc[idx] |= (val << 8);
1281         spin_unlock(&drvdata->spinlock);
1282         return size;
1283 }
1284 static DEVICE_ATTR_RW(addr_exlevel_s_ns);
1285
1286 static const char * const addr_type_names[] = {
1287         "unused",
1288         "single",
1289         "range",
1290         "start",
1291         "stop"
1292 };
1293
1294 static ssize_t addr_cmp_view_show(struct device *dev,
1295                                   struct device_attribute *attr, char *buf)
1296 {
1297         u8 idx, addr_type;
1298         unsigned long addr_v, addr_v2, addr_ctrl;
1299         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1300         struct etmv4_config *config = &drvdata->config;
1301         int size = 0;
1302         bool exclude = false;
1303
1304         spin_lock(&drvdata->spinlock);
1305         idx = config->addr_idx;
1306         addr_v = config->addr_val[idx];
1307         addr_ctrl = config->addr_acc[idx];
1308         addr_type = config->addr_type[idx];
1309         if (addr_type == ETM_ADDR_TYPE_RANGE) {
1310                 if (idx & 0x1) {
1311                         idx -= 1;
1312                         addr_v2 = addr_v;
1313                         addr_v = config->addr_val[idx];
1314                 } else {
1315                         addr_v2 = config->addr_val[idx + 1];
1316                 }
1317                 exclude = config->viiectlr & BIT(idx / 2 + 16);
1318         }
1319         spin_unlock(&drvdata->spinlock);
1320         if (addr_type) {
1321                 size = scnprintf(buf, PAGE_SIZE, "addr_cmp[%i] %s %#lx", idx,
1322                                  addr_type_names[addr_type], addr_v);
1323                 if (addr_type == ETM_ADDR_TYPE_RANGE) {
1324                         size += scnprintf(buf + size, PAGE_SIZE - size,
1325                                           " %#lx %s", addr_v2,
1326                                           exclude ? "exclude" : "include");
1327                 }
1328                 size += scnprintf(buf + size, PAGE_SIZE - size,
1329                                   " ctrl(%#lx)\n", addr_ctrl);
1330         } else {
1331                 size = scnprintf(buf, PAGE_SIZE, "addr_cmp[%i] unused\n", idx);
1332         }
1333         return size;
1334 }
1335 static DEVICE_ATTR_RO(addr_cmp_view);
1336
1337 static ssize_t vinst_pe_cmp_start_stop_show(struct device *dev,
1338                                             struct device_attribute *attr,
1339                                             char *buf)
1340 {
1341         unsigned long val;
1342         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1343         struct etmv4_config *config = &drvdata->config;
1344
1345         if (!drvdata->nr_pe_cmp)
1346                 return -EINVAL;
1347         val = config->vipcssctlr;
1348         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1349 }
1350 static ssize_t vinst_pe_cmp_start_stop_store(struct device *dev,
1351                                              struct device_attribute *attr,
1352                                              const char *buf, size_t size)
1353 {
1354         unsigned long val;
1355         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1356         struct etmv4_config *config = &drvdata->config;
1357
1358         if (kstrtoul(buf, 16, &val))
1359                 return -EINVAL;
1360         if (!drvdata->nr_pe_cmp)
1361                 return -EINVAL;
1362
1363         spin_lock(&drvdata->spinlock);
1364         config->vipcssctlr = val;
1365         spin_unlock(&drvdata->spinlock);
1366         return size;
1367 }
1368 static DEVICE_ATTR_RW(vinst_pe_cmp_start_stop);
1369
1370 static ssize_t seq_idx_show(struct device *dev,
1371                             struct device_attribute *attr,
1372                             char *buf)
1373 {
1374         unsigned long val;
1375         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1376         struct etmv4_config *config = &drvdata->config;
1377
1378         val = config->seq_idx;
1379         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1380 }
1381
1382 static ssize_t seq_idx_store(struct device *dev,
1383                              struct device_attribute *attr,
1384                              const char *buf, size_t size)
1385 {
1386         unsigned long val;
1387         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1388         struct etmv4_config *config = &drvdata->config;
1389
1390         if (kstrtoul(buf, 16, &val))
1391                 return -EINVAL;
1392         if (val >= drvdata->nrseqstate - 1)
1393                 return -EINVAL;
1394
1395         /*
1396          * Use spinlock to ensure index doesn't change while it gets
1397          * dereferenced multiple times within a spinlock block elsewhere.
1398          */
1399         spin_lock(&drvdata->spinlock);
1400         config->seq_idx = val;
1401         spin_unlock(&drvdata->spinlock);
1402         return size;
1403 }
1404 static DEVICE_ATTR_RW(seq_idx);
1405
1406 static ssize_t seq_state_show(struct device *dev,
1407                               struct device_attribute *attr,
1408                               char *buf)
1409 {
1410         unsigned long val;
1411         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1412         struct etmv4_config *config = &drvdata->config;
1413
1414         val = config->seq_state;
1415         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1416 }
1417
1418 static ssize_t seq_state_store(struct device *dev,
1419                                struct device_attribute *attr,
1420                                const char *buf, size_t size)
1421 {
1422         unsigned long val;
1423         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1424         struct etmv4_config *config = &drvdata->config;
1425
1426         if (kstrtoul(buf, 16, &val))
1427                 return -EINVAL;
1428         if (val >= drvdata->nrseqstate)
1429                 return -EINVAL;
1430
1431         config->seq_state = val;
1432         return size;
1433 }
1434 static DEVICE_ATTR_RW(seq_state);
1435
1436 static ssize_t seq_event_show(struct device *dev,
1437                               struct device_attribute *attr,
1438                               char *buf)
1439 {
1440         u8 idx;
1441         unsigned long val;
1442         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1443         struct etmv4_config *config = &drvdata->config;
1444
1445         spin_lock(&drvdata->spinlock);
1446         idx = config->seq_idx;
1447         val = config->seq_ctrl[idx];
1448         spin_unlock(&drvdata->spinlock);
1449         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1450 }
1451
1452 static ssize_t seq_event_store(struct device *dev,
1453                                struct device_attribute *attr,
1454                                const char *buf, size_t size)
1455 {
1456         u8 idx;
1457         unsigned long val;
1458         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1459         struct etmv4_config *config = &drvdata->config;
1460
1461         if (kstrtoul(buf, 16, &val))
1462                 return -EINVAL;
1463
1464         spin_lock(&drvdata->spinlock);
1465         idx = config->seq_idx;
1466         /* Seq control has two masks B[15:8] F[7:0] */
1467         config->seq_ctrl[idx] = val & 0xFFFF;
1468         spin_unlock(&drvdata->spinlock);
1469         return size;
1470 }
1471 static DEVICE_ATTR_RW(seq_event);
1472
1473 static ssize_t seq_reset_event_show(struct device *dev,
1474                                     struct device_attribute *attr,
1475                                     char *buf)
1476 {
1477         unsigned long val;
1478         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1479         struct etmv4_config *config = &drvdata->config;
1480
1481         val = config->seq_rst;
1482         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1483 }
1484
1485 static ssize_t seq_reset_event_store(struct device *dev,
1486                                      struct device_attribute *attr,
1487                                      const char *buf, size_t size)
1488 {
1489         unsigned long val;
1490         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1491         struct etmv4_config *config = &drvdata->config;
1492
1493         if (kstrtoul(buf, 16, &val))
1494                 return -EINVAL;
1495         if (!(drvdata->nrseqstate))
1496                 return -EINVAL;
1497
1498         config->seq_rst = val & ETMv4_EVENT_MASK;
1499         return size;
1500 }
1501 static DEVICE_ATTR_RW(seq_reset_event);
1502
1503 static ssize_t cntr_idx_show(struct device *dev,
1504                              struct device_attribute *attr,
1505                              char *buf)
1506 {
1507         unsigned long val;
1508         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1509         struct etmv4_config *config = &drvdata->config;
1510
1511         val = config->cntr_idx;
1512         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1513 }
1514
1515 static ssize_t cntr_idx_store(struct device *dev,
1516                               struct device_attribute *attr,
1517                               const char *buf, size_t size)
1518 {
1519         unsigned long val;
1520         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1521         struct etmv4_config *config = &drvdata->config;
1522
1523         if (kstrtoul(buf, 16, &val))
1524                 return -EINVAL;
1525         if (val >= drvdata->nr_cntr)
1526                 return -EINVAL;
1527
1528         /*
1529          * Use spinlock to ensure index doesn't change while it gets
1530          * dereferenced multiple times within a spinlock block elsewhere.
1531          */
1532         spin_lock(&drvdata->spinlock);
1533         config->cntr_idx = val;
1534         spin_unlock(&drvdata->spinlock);
1535         return size;
1536 }
1537 static DEVICE_ATTR_RW(cntr_idx);
1538
1539 static ssize_t cntrldvr_show(struct device *dev,
1540                              struct device_attribute *attr,
1541                              char *buf)
1542 {
1543         u8 idx;
1544         unsigned long val;
1545         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1546         struct etmv4_config *config = &drvdata->config;
1547
1548         spin_lock(&drvdata->spinlock);
1549         idx = config->cntr_idx;
1550         val = config->cntrldvr[idx];
1551         spin_unlock(&drvdata->spinlock);
1552         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1553 }
1554
1555 static ssize_t cntrldvr_store(struct device *dev,
1556                               struct device_attribute *attr,
1557                               const char *buf, size_t size)
1558 {
1559         u8 idx;
1560         unsigned long val;
1561         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1562         struct etmv4_config *config = &drvdata->config;
1563
1564         if (kstrtoul(buf, 16, &val))
1565                 return -EINVAL;
1566         if (val > ETM_CNTR_MAX_VAL)
1567                 return -EINVAL;
1568
1569         spin_lock(&drvdata->spinlock);
1570         idx = config->cntr_idx;
1571         config->cntrldvr[idx] = val;
1572         spin_unlock(&drvdata->spinlock);
1573         return size;
1574 }
1575 static DEVICE_ATTR_RW(cntrldvr);
1576
1577 static ssize_t cntr_val_show(struct device *dev,
1578                              struct device_attribute *attr,
1579                              char *buf)
1580 {
1581         u8 idx;
1582         unsigned long val;
1583         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1584         struct etmv4_config *config = &drvdata->config;
1585
1586         spin_lock(&drvdata->spinlock);
1587         idx = config->cntr_idx;
1588         val = config->cntr_val[idx];
1589         spin_unlock(&drvdata->spinlock);
1590         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1591 }
1592
1593 static ssize_t cntr_val_store(struct device *dev,
1594                               struct device_attribute *attr,
1595                               const char *buf, size_t size)
1596 {
1597         u8 idx;
1598         unsigned long val;
1599         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1600         struct etmv4_config *config = &drvdata->config;
1601
1602         if (kstrtoul(buf, 16, &val))
1603                 return -EINVAL;
1604         if (val > ETM_CNTR_MAX_VAL)
1605                 return -EINVAL;
1606
1607         spin_lock(&drvdata->spinlock);
1608         idx = config->cntr_idx;
1609         config->cntr_val[idx] = val;
1610         spin_unlock(&drvdata->spinlock);
1611         return size;
1612 }
1613 static DEVICE_ATTR_RW(cntr_val);
1614
1615 static ssize_t cntr_ctrl_show(struct device *dev,
1616                               struct device_attribute *attr,
1617                               char *buf)
1618 {
1619         u8 idx;
1620         unsigned long val;
1621         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1622         struct etmv4_config *config = &drvdata->config;
1623
1624         spin_lock(&drvdata->spinlock);
1625         idx = config->cntr_idx;
1626         val = config->cntr_ctrl[idx];
1627         spin_unlock(&drvdata->spinlock);
1628         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1629 }
1630
1631 static ssize_t cntr_ctrl_store(struct device *dev,
1632                                struct device_attribute *attr,
1633                                const char *buf, size_t size)
1634 {
1635         u8 idx;
1636         unsigned long val;
1637         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1638         struct etmv4_config *config = &drvdata->config;
1639
1640         if (kstrtoul(buf, 16, &val))
1641                 return -EINVAL;
1642
1643         spin_lock(&drvdata->spinlock);
1644         idx = config->cntr_idx;
1645         config->cntr_ctrl[idx] = val;
1646         spin_unlock(&drvdata->spinlock);
1647         return size;
1648 }
1649 static DEVICE_ATTR_RW(cntr_ctrl);
1650
1651 static ssize_t res_idx_show(struct device *dev,
1652                             struct device_attribute *attr,
1653                             char *buf)
1654 {
1655         unsigned long val;
1656         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1657         struct etmv4_config *config = &drvdata->config;
1658
1659         val = config->res_idx;
1660         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1661 }
1662
1663 static ssize_t res_idx_store(struct device *dev,
1664                              struct device_attribute *attr,
1665                              const char *buf, size_t size)
1666 {
1667         unsigned long val;
1668         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1669         struct etmv4_config *config = &drvdata->config;
1670
1671         if (kstrtoul(buf, 16, &val))
1672                 return -EINVAL;
1673         /*
1674          * Resource selector pair 0 is always implemented and reserved,
1675          * namely an idx with 0 and 1 is illegal.
1676          */
1677         if ((val < 2) || (val >= 2 * drvdata->nr_resource))
1678                 return -EINVAL;
1679
1680         /*
1681          * Use spinlock to ensure index doesn't change while it gets
1682          * dereferenced multiple times within a spinlock block elsewhere.
1683          */
1684         spin_lock(&drvdata->spinlock);
1685         config->res_idx = val;
1686         spin_unlock(&drvdata->spinlock);
1687         return size;
1688 }
1689 static DEVICE_ATTR_RW(res_idx);
1690
1691 static ssize_t res_ctrl_show(struct device *dev,
1692                              struct device_attribute *attr,
1693                              char *buf)
1694 {
1695         u8 idx;
1696         unsigned long val;
1697         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1698         struct etmv4_config *config = &drvdata->config;
1699
1700         spin_lock(&drvdata->spinlock);
1701         idx = config->res_idx;
1702         val = config->res_ctrl[idx];
1703         spin_unlock(&drvdata->spinlock);
1704         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1705 }
1706
1707 static ssize_t res_ctrl_store(struct device *dev,
1708                               struct device_attribute *attr,
1709                               const char *buf, size_t size)
1710 {
1711         u8 idx;
1712         unsigned long val;
1713         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1714         struct etmv4_config *config = &drvdata->config;
1715
1716         if (kstrtoul(buf, 16, &val))
1717                 return -EINVAL;
1718
1719         spin_lock(&drvdata->spinlock);
1720         idx = config->res_idx;
1721         /* For odd idx pair inversal bit is RES0 */
1722         if (idx % 2 != 0)
1723                 /* PAIRINV, bit[21] */
1724                 val &= ~BIT(21);
1725         config->res_ctrl[idx] = val & GENMASK(21, 0);
1726         spin_unlock(&drvdata->spinlock);
1727         return size;
1728 }
1729 static DEVICE_ATTR_RW(res_ctrl);
1730
1731 static ssize_t sshot_idx_show(struct device *dev,
1732                               struct device_attribute *attr, char *buf)
1733 {
1734         unsigned long val;
1735         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1736         struct etmv4_config *config = &drvdata->config;
1737
1738         val = config->ss_idx;
1739         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1740 }
1741
1742 static ssize_t sshot_idx_store(struct device *dev,
1743                                struct device_attribute *attr,
1744                                const char *buf, size_t size)
1745 {
1746         unsigned long val;
1747         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1748         struct etmv4_config *config = &drvdata->config;
1749
1750         if (kstrtoul(buf, 16, &val))
1751                 return -EINVAL;
1752         if (val >= drvdata->nr_ss_cmp)
1753                 return -EINVAL;
1754
1755         spin_lock(&drvdata->spinlock);
1756         config->ss_idx = val;
1757         spin_unlock(&drvdata->spinlock);
1758         return size;
1759 }
1760 static DEVICE_ATTR_RW(sshot_idx);
1761
1762 static ssize_t sshot_ctrl_show(struct device *dev,
1763                                struct device_attribute *attr,
1764                                char *buf)
1765 {
1766         unsigned long val;
1767         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1768         struct etmv4_config *config = &drvdata->config;
1769
1770         spin_lock(&drvdata->spinlock);
1771         val = config->ss_ctrl[config->ss_idx];
1772         spin_unlock(&drvdata->spinlock);
1773         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1774 }
1775
1776 static ssize_t sshot_ctrl_store(struct device *dev,
1777                                 struct device_attribute *attr,
1778                                 const char *buf, size_t size)
1779 {
1780         u8 idx;
1781         unsigned long val;
1782         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1783         struct etmv4_config *config = &drvdata->config;
1784
1785         if (kstrtoul(buf, 16, &val))
1786                 return -EINVAL;
1787
1788         spin_lock(&drvdata->spinlock);
1789         idx = config->ss_idx;
1790         config->ss_ctrl[idx] = val & GENMASK(24, 0);
1791         /* must clear bit 31 in related status register on programming */
1792         config->ss_status[idx] &= ~BIT(31);
1793         spin_unlock(&drvdata->spinlock);
1794         return size;
1795 }
1796 static DEVICE_ATTR_RW(sshot_ctrl);
1797
1798 static ssize_t sshot_status_show(struct device *dev,
1799                                  struct device_attribute *attr, char *buf)
1800 {
1801         unsigned long val;
1802         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1803         struct etmv4_config *config = &drvdata->config;
1804
1805         spin_lock(&drvdata->spinlock);
1806         val = config->ss_status[config->ss_idx];
1807         spin_unlock(&drvdata->spinlock);
1808         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1809 }
1810 static DEVICE_ATTR_RO(sshot_status);
1811
1812 static ssize_t sshot_pe_ctrl_show(struct device *dev,
1813                                   struct device_attribute *attr,
1814                                   char *buf)
1815 {
1816         unsigned long val;
1817         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1818         struct etmv4_config *config = &drvdata->config;
1819
1820         spin_lock(&drvdata->spinlock);
1821         val = config->ss_pe_cmp[config->ss_idx];
1822         spin_unlock(&drvdata->spinlock);
1823         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1824 }
1825
1826 static ssize_t sshot_pe_ctrl_store(struct device *dev,
1827                                    struct device_attribute *attr,
1828                                    const char *buf, size_t size)
1829 {
1830         u8 idx;
1831         unsigned long val;
1832         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1833         struct etmv4_config *config = &drvdata->config;
1834
1835         if (kstrtoul(buf, 16, &val))
1836                 return -EINVAL;
1837
1838         spin_lock(&drvdata->spinlock);
1839         idx = config->ss_idx;
1840         config->ss_pe_cmp[idx] = val & GENMASK(7, 0);
1841         /* must clear bit 31 in related status register on programming */
1842         config->ss_status[idx] &= ~BIT(31);
1843         spin_unlock(&drvdata->spinlock);
1844         return size;
1845 }
1846 static DEVICE_ATTR_RW(sshot_pe_ctrl);
1847
1848 static ssize_t ctxid_idx_show(struct device *dev,
1849                               struct device_attribute *attr,
1850                               char *buf)
1851 {
1852         unsigned long val;
1853         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1854         struct etmv4_config *config = &drvdata->config;
1855
1856         val = config->ctxid_idx;
1857         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1858 }
1859
1860 static ssize_t ctxid_idx_store(struct device *dev,
1861                                struct device_attribute *attr,
1862                                const char *buf, size_t size)
1863 {
1864         unsigned long val;
1865         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1866         struct etmv4_config *config = &drvdata->config;
1867
1868         if (kstrtoul(buf, 16, &val))
1869                 return -EINVAL;
1870         if (val >= drvdata->numcidc)
1871                 return -EINVAL;
1872
1873         /*
1874          * Use spinlock to ensure index doesn't change while it gets
1875          * dereferenced multiple times within a spinlock block elsewhere.
1876          */
1877         spin_lock(&drvdata->spinlock);
1878         config->ctxid_idx = val;
1879         spin_unlock(&drvdata->spinlock);
1880         return size;
1881 }
1882 static DEVICE_ATTR_RW(ctxid_idx);
1883
1884 static ssize_t ctxid_pid_show(struct device *dev,
1885                               struct device_attribute *attr,
1886                               char *buf)
1887 {
1888         u8 idx;
1889         unsigned long val;
1890         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1891         struct etmv4_config *config = &drvdata->config;
1892
1893         /*
1894          * Don't use contextID tracing if coming from a PID namespace.  See
1895          * comment in ctxid_pid_store().
1896          */
1897         if (task_active_pid_ns(current) != &init_pid_ns)
1898                 return -EINVAL;
1899
1900         spin_lock(&drvdata->spinlock);
1901         idx = config->ctxid_idx;
1902         val = (unsigned long)config->ctxid_pid[idx];
1903         spin_unlock(&drvdata->spinlock);
1904         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
1905 }
1906
1907 static ssize_t ctxid_pid_store(struct device *dev,
1908                                struct device_attribute *attr,
1909                                const char *buf, size_t size)
1910 {
1911         u8 idx;
1912         unsigned long pid;
1913         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1914         struct etmv4_config *config = &drvdata->config;
1915
1916         /*
1917          * When contextID tracing is enabled the tracers will insert the
1918          * value found in the contextID register in the trace stream.  But if
1919          * a process is in a namespace the PID of that process as seen from the
1920          * namespace won't be what the kernel sees, something that makes the
1921          * feature confusing and can potentially leak kernel only information.
1922          * As such refuse to use the feature if @current is not in the initial
1923          * PID namespace.
1924          */
1925         if (task_active_pid_ns(current) != &init_pid_ns)
1926                 return -EINVAL;
1927
1928         /*
1929          * only implemented when ctxid tracing is enabled, i.e. at least one
1930          * ctxid comparator is implemented and ctxid is greater than 0 bits
1931          * in length
1932          */
1933         if (!drvdata->ctxid_size || !drvdata->numcidc)
1934                 return -EINVAL;
1935         if (kstrtoul(buf, 16, &pid))
1936                 return -EINVAL;
1937
1938         spin_lock(&drvdata->spinlock);
1939         idx = config->ctxid_idx;
1940         config->ctxid_pid[idx] = (u64)pid;
1941         spin_unlock(&drvdata->spinlock);
1942         return size;
1943 }
1944 static DEVICE_ATTR_RW(ctxid_pid);
1945
1946 static ssize_t ctxid_masks_show(struct device *dev,
1947                                 struct device_attribute *attr,
1948                                 char *buf)
1949 {
1950         unsigned long val1, val2;
1951         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1952         struct etmv4_config *config = &drvdata->config;
1953
1954         /*
1955          * Don't use contextID tracing if coming from a PID namespace.  See
1956          * comment in ctxid_pid_store().
1957          */
1958         if (task_active_pid_ns(current) != &init_pid_ns)
1959                 return -EINVAL;
1960
1961         spin_lock(&drvdata->spinlock);
1962         val1 = config->ctxid_mask0;
1963         val2 = config->ctxid_mask1;
1964         spin_unlock(&drvdata->spinlock);
1965         return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
1966 }
1967
1968 static ssize_t ctxid_masks_store(struct device *dev,
1969                                 struct device_attribute *attr,
1970                                 const char *buf, size_t size)
1971 {
1972         u8 i, j, maskbyte;
1973         unsigned long val1, val2, mask;
1974         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
1975         struct etmv4_config *config = &drvdata->config;
1976         int nr_inputs;
1977
1978         /*
1979          * Don't use contextID tracing if coming from a PID namespace.  See
1980          * comment in ctxid_pid_store().
1981          */
1982         if (task_active_pid_ns(current) != &init_pid_ns)
1983                 return -EINVAL;
1984
1985         /*
1986          * only implemented when ctxid tracing is enabled, i.e. at least one
1987          * ctxid comparator is implemented and ctxid is greater than 0 bits
1988          * in length
1989          */
1990         if (!drvdata->ctxid_size || !drvdata->numcidc)
1991                 return -EINVAL;
1992         /* one mask if <= 4 comparators, two for up to 8 */
1993         nr_inputs = sscanf(buf, "%lx %lx", &val1, &val2);
1994         if ((drvdata->numcidc > 4) && (nr_inputs != 2))
1995                 return -EINVAL;
1996
1997         spin_lock(&drvdata->spinlock);
1998         /*
1999          * each byte[0..3] controls mask value applied to ctxid
2000          * comparator[0..3]
2001          */
2002         switch (drvdata->numcidc) {
2003         case 0x1:
2004                 /* COMP0, bits[7:0] */
2005                 config->ctxid_mask0 = val1 & 0xFF;
2006                 break;
2007         case 0x2:
2008                 /* COMP1, bits[15:8] */
2009                 config->ctxid_mask0 = val1 & 0xFFFF;
2010                 break;
2011         case 0x3:
2012                 /* COMP2, bits[23:16] */
2013                 config->ctxid_mask0 = val1 & 0xFFFFFF;
2014                 break;
2015         case 0x4:
2016                  /* COMP3, bits[31:24] */
2017                 config->ctxid_mask0 = val1;
2018                 break;
2019         case 0x5:
2020                 /* COMP4, bits[7:0] */
2021                 config->ctxid_mask0 = val1;
2022                 config->ctxid_mask1 = val2 & 0xFF;
2023                 break;
2024         case 0x6:
2025                 /* COMP5, bits[15:8] */
2026                 config->ctxid_mask0 = val1;
2027                 config->ctxid_mask1 = val2 & 0xFFFF;
2028                 break;
2029         case 0x7:
2030                 /* COMP6, bits[23:16] */
2031                 config->ctxid_mask0 = val1;
2032                 config->ctxid_mask1 = val2 & 0xFFFFFF;
2033                 break;
2034         case 0x8:
2035                 /* COMP7, bits[31:24] */
2036                 config->ctxid_mask0 = val1;
2037                 config->ctxid_mask1 = val2;
2038                 break;
2039         default:
2040                 break;
2041         }
2042         /*
2043          * If software sets a mask bit to 1, it must program relevant byte
2044          * of ctxid comparator value 0x0, otherwise behavior is unpredictable.
2045          * For example, if bit[3] of ctxid_mask0 is 1, we must clear bits[31:24]
2046          * of ctxid comparator0 value (corresponding to byte 0) register.
2047          */
2048         mask = config->ctxid_mask0;
2049         for (i = 0; i < drvdata->numcidc; i++) {
2050                 /* mask value of corresponding ctxid comparator */
2051                 maskbyte = mask & ETMv4_EVENT_MASK;
2052                 /*
2053                  * each bit corresponds to a byte of respective ctxid comparator
2054                  * value register
2055                  */
2056                 for (j = 0; j < 8; j++) {
2057                         if (maskbyte & 1)
2058                                 config->ctxid_pid[i] &= ~(0xFFUL << (j * 8));
2059                         maskbyte >>= 1;
2060                 }
2061                 /* Select the next ctxid comparator mask value */
2062                 if (i == 3)
2063                         /* ctxid comparators[4-7] */
2064                         mask = config->ctxid_mask1;
2065                 else
2066                         mask >>= 0x8;
2067         }
2068
2069         spin_unlock(&drvdata->spinlock);
2070         return size;
2071 }
2072 static DEVICE_ATTR_RW(ctxid_masks);
2073
2074 static ssize_t vmid_idx_show(struct device *dev,
2075                              struct device_attribute *attr,
2076                              char *buf)
2077 {
2078         unsigned long val;
2079         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
2080         struct etmv4_config *config = &drvdata->config;
2081
2082         val = config->vmid_idx;
2083         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
2084 }
2085
2086 static ssize_t vmid_idx_store(struct device *dev,
2087                               struct device_attribute *attr,
2088                               const char *buf, size_t size)
2089 {
2090         unsigned long val;
2091         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
2092         struct etmv4_config *config = &drvdata->config;
2093
2094         if (kstrtoul(buf, 16, &val))
2095                 return -EINVAL;
2096         if (val >= drvdata->numvmidc)
2097                 return -EINVAL;
2098
2099         /*
2100          * Use spinlock to ensure index doesn't change while it gets
2101          * dereferenced multiple times within a spinlock block elsewhere.
2102          */
2103         spin_lock(&drvdata->spinlock);
2104         config->vmid_idx = val;
2105         spin_unlock(&drvdata->spinlock);
2106         return size;
2107 }
2108 static DEVICE_ATTR_RW(vmid_idx);
2109
2110 static ssize_t vmid_val_show(struct device *dev,
2111                              struct device_attribute *attr,
2112                              char *buf)
2113 {
2114         unsigned long val;
2115         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
2116         struct etmv4_config *config = &drvdata->config;
2117
2118         /*
2119          * Don't use virtual contextID tracing if coming from a PID namespace.
2120          * See comment in ctxid_pid_store().
2121          */
2122         if (!task_is_in_init_pid_ns(current))
2123                 return -EINVAL;
2124
2125         spin_lock(&drvdata->spinlock);
2126         val = (unsigned long)config->vmid_val[config->vmid_idx];
2127         spin_unlock(&drvdata->spinlock);
2128         return scnprintf(buf, PAGE_SIZE, "%#lx\n", val);
2129 }
2130
2131 static ssize_t vmid_val_store(struct device *dev,
2132                               struct device_attribute *attr,
2133                               const char *buf, size_t size)
2134 {
2135         unsigned long val;
2136         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
2137         struct etmv4_config *config = &drvdata->config;
2138
2139         /*
2140          * Don't use virtual contextID tracing if coming from a PID namespace.
2141          * See comment in ctxid_pid_store().
2142          */
2143         if (!task_is_in_init_pid_ns(current))
2144                 return -EINVAL;
2145
2146         /*
2147          * only implemented when vmid tracing is enabled, i.e. at least one
2148          * vmid comparator is implemented and at least 8 bit vmid size
2149          */
2150         if (!drvdata->vmid_size || !drvdata->numvmidc)
2151                 return -EINVAL;
2152         if (kstrtoul(buf, 16, &val))
2153                 return -EINVAL;
2154
2155         spin_lock(&drvdata->spinlock);
2156         config->vmid_val[config->vmid_idx] = (u64)val;
2157         spin_unlock(&drvdata->spinlock);
2158         return size;
2159 }
2160 static DEVICE_ATTR_RW(vmid_val);
2161
2162 static ssize_t vmid_masks_show(struct device *dev,
2163                                struct device_attribute *attr, char *buf)
2164 {
2165         unsigned long val1, val2;
2166         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
2167         struct etmv4_config *config = &drvdata->config;
2168
2169         /*
2170          * Don't use virtual contextID tracing if coming from a PID namespace.
2171          * See comment in ctxid_pid_store().
2172          */
2173         if (!task_is_in_init_pid_ns(current))
2174                 return -EINVAL;
2175
2176         spin_lock(&drvdata->spinlock);
2177         val1 = config->vmid_mask0;
2178         val2 = config->vmid_mask1;
2179         spin_unlock(&drvdata->spinlock);
2180         return scnprintf(buf, PAGE_SIZE, "%#lx %#lx\n", val1, val2);
2181 }
2182
2183 static ssize_t vmid_masks_store(struct device *dev,
2184                                 struct device_attribute *attr,
2185                                 const char *buf, size_t size)
2186 {
2187         u8 i, j, maskbyte;
2188         unsigned long val1, val2, mask;
2189         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
2190         struct etmv4_config *config = &drvdata->config;
2191         int nr_inputs;
2192
2193         /*
2194          * Don't use virtual contextID tracing if coming from a PID namespace.
2195          * See comment in ctxid_pid_store().
2196          */
2197         if (!task_is_in_init_pid_ns(current))
2198                 return -EINVAL;
2199
2200         /*
2201          * only implemented when vmid tracing is enabled, i.e. at least one
2202          * vmid comparator is implemented and at least 8 bit vmid size
2203          */
2204         if (!drvdata->vmid_size || !drvdata->numvmidc)
2205                 return -EINVAL;
2206         /* one mask if <= 4 comparators, two for up to 8 */
2207         nr_inputs = sscanf(buf, "%lx %lx", &val1, &val2);
2208         if ((drvdata->numvmidc > 4) && (nr_inputs != 2))
2209                 return -EINVAL;
2210
2211         spin_lock(&drvdata->spinlock);
2212
2213         /*
2214          * each byte[0..3] controls mask value applied to vmid
2215          * comparator[0..3]
2216          */
2217         switch (drvdata->numvmidc) {
2218         case 0x1:
2219                 /* COMP0, bits[7:0] */
2220                 config->vmid_mask0 = val1 & 0xFF;
2221                 break;
2222         case 0x2:
2223                 /* COMP1, bits[15:8] */
2224                 config->vmid_mask0 = val1 & 0xFFFF;
2225                 break;
2226         case 0x3:
2227                 /* COMP2, bits[23:16] */
2228                 config->vmid_mask0 = val1 & 0xFFFFFF;
2229                 break;
2230         case 0x4:
2231                 /* COMP3, bits[31:24] */
2232                 config->vmid_mask0 = val1;
2233                 break;
2234         case 0x5:
2235                 /* COMP4, bits[7:0] */
2236                 config->vmid_mask0 = val1;
2237                 config->vmid_mask1 = val2 & 0xFF;
2238                 break;
2239         case 0x6:
2240                 /* COMP5, bits[15:8] */
2241                 config->vmid_mask0 = val1;
2242                 config->vmid_mask1 = val2 & 0xFFFF;
2243                 break;
2244         case 0x7:
2245                 /* COMP6, bits[23:16] */
2246                 config->vmid_mask0 = val1;
2247                 config->vmid_mask1 = val2 & 0xFFFFFF;
2248                 break;
2249         case 0x8:
2250                 /* COMP7, bits[31:24] */
2251                 config->vmid_mask0 = val1;
2252                 config->vmid_mask1 = val2;
2253                 break;
2254         default:
2255                 break;
2256         }
2257
2258         /*
2259          * If software sets a mask bit to 1, it must program relevant byte
2260          * of vmid comparator value 0x0, otherwise behavior is unpredictable.
2261          * For example, if bit[3] of vmid_mask0 is 1, we must clear bits[31:24]
2262          * of vmid comparator0 value (corresponding to byte 0) register.
2263          */
2264         mask = config->vmid_mask0;
2265         for (i = 0; i < drvdata->numvmidc; i++) {
2266                 /* mask value of corresponding vmid comparator */
2267                 maskbyte = mask & ETMv4_EVENT_MASK;
2268                 /*
2269                  * each bit corresponds to a byte of respective vmid comparator
2270                  * value register
2271                  */
2272                 for (j = 0; j < 8; j++) {
2273                         if (maskbyte & 1)
2274                                 config->vmid_val[i] &= ~(0xFFUL << (j * 8));
2275                         maskbyte >>= 1;
2276                 }
2277                 /* Select the next vmid comparator mask value */
2278                 if (i == 3)
2279                         /* vmid comparators[4-7] */
2280                         mask = config->vmid_mask1;
2281                 else
2282                         mask >>= 0x8;
2283         }
2284         spin_unlock(&drvdata->spinlock);
2285         return size;
2286 }
2287 static DEVICE_ATTR_RW(vmid_masks);
2288
2289 static ssize_t cpu_show(struct device *dev,
2290                         struct device_attribute *attr, char *buf)
2291 {
2292         int val;
2293         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
2294
2295         val = drvdata->cpu;
2296         return scnprintf(buf, PAGE_SIZE, "%d\n", val);
2297
2298 }
2299 static DEVICE_ATTR_RO(cpu);
2300
2301 static struct attribute *coresight_etmv4_attrs[] = {
2302         &dev_attr_nr_pe_cmp.attr,
2303         &dev_attr_nr_addr_cmp.attr,
2304         &dev_attr_nr_cntr.attr,
2305         &dev_attr_nr_ext_inp.attr,
2306         &dev_attr_numcidc.attr,
2307         &dev_attr_numvmidc.attr,
2308         &dev_attr_nrseqstate.attr,
2309         &dev_attr_nr_resource.attr,
2310         &dev_attr_nr_ss_cmp.attr,
2311         &dev_attr_reset.attr,
2312         &dev_attr_mode.attr,
2313         &dev_attr_pe.attr,
2314         &dev_attr_event.attr,
2315         &dev_attr_event_instren.attr,
2316         &dev_attr_event_ts.attr,
2317         &dev_attr_syncfreq.attr,
2318         &dev_attr_cyc_threshold.attr,
2319         &dev_attr_bb_ctrl.attr,
2320         &dev_attr_event_vinst.attr,
2321         &dev_attr_s_exlevel_vinst.attr,
2322         &dev_attr_ns_exlevel_vinst.attr,
2323         &dev_attr_addr_idx.attr,
2324         &dev_attr_addr_instdatatype.attr,
2325         &dev_attr_addr_single.attr,
2326         &dev_attr_addr_range.attr,
2327         &dev_attr_addr_start.attr,
2328         &dev_attr_addr_stop.attr,
2329         &dev_attr_addr_ctxtype.attr,
2330         &dev_attr_addr_context.attr,
2331         &dev_attr_addr_exlevel_s_ns.attr,
2332         &dev_attr_addr_cmp_view.attr,
2333         &dev_attr_vinst_pe_cmp_start_stop.attr,
2334         &dev_attr_sshot_idx.attr,
2335         &dev_attr_sshot_ctrl.attr,
2336         &dev_attr_sshot_pe_ctrl.attr,
2337         &dev_attr_sshot_status.attr,
2338         &dev_attr_seq_idx.attr,
2339         &dev_attr_seq_state.attr,
2340         &dev_attr_seq_event.attr,
2341         &dev_attr_seq_reset_event.attr,
2342         &dev_attr_cntr_idx.attr,
2343         &dev_attr_cntrldvr.attr,
2344         &dev_attr_cntr_val.attr,
2345         &dev_attr_cntr_ctrl.attr,
2346         &dev_attr_res_idx.attr,
2347         &dev_attr_res_ctrl.attr,
2348         &dev_attr_ctxid_idx.attr,
2349         &dev_attr_ctxid_pid.attr,
2350         &dev_attr_ctxid_masks.attr,
2351         &dev_attr_vmid_idx.attr,
2352         &dev_attr_vmid_val.attr,
2353         &dev_attr_vmid_masks.attr,
2354         &dev_attr_cpu.attr,
2355         NULL,
2356 };
2357
2358 struct etmv4_reg {
2359         struct coresight_device *csdev;
2360         u32 offset;
2361         u32 data;
2362 };
2363
2364 static void do_smp_cross_read(void *data)
2365 {
2366         struct etmv4_reg *reg = data;
2367
2368         reg->data = etm4x_relaxed_read32(&reg->csdev->access, reg->offset);
2369 }
2370
2371 static u32 etmv4_cross_read(const struct etmv4_drvdata *drvdata, u32 offset)
2372 {
2373         struct etmv4_reg reg;
2374
2375         reg.offset = offset;
2376         reg.csdev = drvdata->csdev;
2377
2378         /*
2379          * smp cross call ensures the CPU will be powered up before
2380          * accessing the ETMv4 trace core registers
2381          */
2382         smp_call_function_single(drvdata->cpu, do_smp_cross_read, &reg, 1);
2383         return reg.data;
2384 }
2385
2386 static inline u32 coresight_etm4x_attr_to_offset(struct device_attribute *attr)
2387 {
2388         struct dev_ext_attribute *eattr;
2389
2390         eattr = container_of(attr, struct dev_ext_attribute, attr);
2391         return (u32)(unsigned long)eattr->var;
2392 }
2393
2394 static ssize_t coresight_etm4x_reg_show(struct device *dev,
2395                                         struct device_attribute *d_attr,
2396                                         char *buf)
2397 {
2398         u32 val, offset;
2399         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
2400
2401         offset = coresight_etm4x_attr_to_offset(d_attr);
2402
2403         pm_runtime_get_sync(dev->parent);
2404         val = etmv4_cross_read(drvdata, offset);
2405         pm_runtime_put_sync(dev->parent);
2406
2407         return scnprintf(buf, PAGE_SIZE, "0x%x\n", val);
2408 }
2409
2410 static inline bool
2411 etm4x_register_implemented(struct etmv4_drvdata *drvdata, u32 offset)
2412 {
2413         switch (offset) {
2414         ETM_COMMON_SYSREG_LIST_CASES
2415                 /*
2416                  * Common registers to ETE & ETM4x accessible via system
2417                  * instructions are always implemented.
2418                  */
2419                 return true;
2420
2421         ETM4x_ONLY_SYSREG_LIST_CASES
2422                 /*
2423                  * We only support etm4x and ete. So if the device is not
2424                  * ETE, it must be ETMv4x.
2425                  */
2426                 return !etm4x_is_ete(drvdata);
2427
2428         ETM4x_MMAP_LIST_CASES
2429                 /*
2430                  * Registers accessible only via memory-mapped registers
2431                  * must not be accessed via system instructions.
2432                  * We cannot access the drvdata->csdev here, as this
2433                  * function is called during the device creation, via
2434                  * coresight_register() and the csdev is not initialized
2435                  * until that is done. So rely on the drvdata->base to
2436                  * detect if we have a memory mapped access.
2437                  * Also ETE doesn't implement memory mapped access, thus
2438                  * it is sufficient to check that we are using mmio.
2439                  */
2440                 return !!drvdata->base;
2441
2442         ETE_ONLY_SYSREG_LIST_CASES
2443                 return etm4x_is_ete(drvdata);
2444         }
2445
2446         return false;
2447 }
2448
2449 /*
2450  * Hide the ETM4x registers that may not be available on the
2451  * hardware.
2452  * There are certain management registers unavailable via system
2453  * instructions. Make those sysfs attributes hidden on such
2454  * systems.
2455  */
2456 static umode_t
2457 coresight_etm4x_attr_reg_implemented(struct kobject *kobj,
2458                                      struct attribute *attr, int unused)
2459 {
2460         struct device *dev = kobj_to_dev(kobj);
2461         struct etmv4_drvdata *drvdata = dev_get_drvdata(dev->parent);
2462         struct device_attribute *d_attr;
2463         u32 offset;
2464
2465         d_attr = container_of(attr, struct device_attribute, attr);
2466         offset = coresight_etm4x_attr_to_offset(d_attr);
2467
2468         if (etm4x_register_implemented(drvdata, offset))
2469                 return attr->mode;
2470         return 0;
2471 }
2472
2473 #define coresight_etm4x_reg(name, offset)                               \
2474         &((struct dev_ext_attribute[]) {                                \
2475            {                                                            \
2476                 __ATTR(name, 0444, coresight_etm4x_reg_show, NULL),     \
2477                 (void *)(unsigned long)offset                           \
2478            }                                                            \
2479         })[0].attr.attr
2480
2481 static struct attribute *coresight_etmv4_mgmt_attrs[] = {
2482         coresight_etm4x_reg(trcpdcr, TRCPDCR),
2483         coresight_etm4x_reg(trcpdsr, TRCPDSR),
2484         coresight_etm4x_reg(trclsr, TRCLSR),
2485         coresight_etm4x_reg(trcauthstatus, TRCAUTHSTATUS),
2486         coresight_etm4x_reg(trcdevid, TRCDEVID),
2487         coresight_etm4x_reg(trcdevtype, TRCDEVTYPE),
2488         coresight_etm4x_reg(trcpidr0, TRCPIDR0),
2489         coresight_etm4x_reg(trcpidr1, TRCPIDR1),
2490         coresight_etm4x_reg(trcpidr2, TRCPIDR2),
2491         coresight_etm4x_reg(trcpidr3, TRCPIDR3),
2492         coresight_etm4x_reg(trcoslsr, TRCOSLSR),
2493         coresight_etm4x_reg(trcconfig, TRCCONFIGR),
2494         coresight_etm4x_reg(trctraceid, TRCTRACEIDR),
2495         coresight_etm4x_reg(trcdevarch, TRCDEVARCH),
2496         NULL,
2497 };
2498
2499 static struct attribute *coresight_etmv4_trcidr_attrs[] = {
2500         coresight_etm4x_reg(trcidr0, TRCIDR0),
2501         coresight_etm4x_reg(trcidr1, TRCIDR1),
2502         coresight_etm4x_reg(trcidr2, TRCIDR2),
2503         coresight_etm4x_reg(trcidr3, TRCIDR3),
2504         coresight_etm4x_reg(trcidr4, TRCIDR4),
2505         coresight_etm4x_reg(trcidr5, TRCIDR5),
2506         /* trcidr[6,7] are reserved */
2507         coresight_etm4x_reg(trcidr8, TRCIDR8),
2508         coresight_etm4x_reg(trcidr9, TRCIDR9),
2509         coresight_etm4x_reg(trcidr10, TRCIDR10),
2510         coresight_etm4x_reg(trcidr11, TRCIDR11),
2511         coresight_etm4x_reg(trcidr12, TRCIDR12),
2512         coresight_etm4x_reg(trcidr13, TRCIDR13),
2513         NULL,
2514 };
2515
2516 static const struct attribute_group coresight_etmv4_group = {
2517         .attrs = coresight_etmv4_attrs,
2518 };
2519
2520 static const struct attribute_group coresight_etmv4_mgmt_group = {
2521         .is_visible = coresight_etm4x_attr_reg_implemented,
2522         .attrs = coresight_etmv4_mgmt_attrs,
2523         .name = "mgmt",
2524 };
2525
2526 static const struct attribute_group coresight_etmv4_trcidr_group = {
2527         .attrs = coresight_etmv4_trcidr_attrs,
2528         .name = "trcidr",
2529 };
2530
2531 const struct attribute_group *coresight_etmv4_groups[] = {
2532         &coresight_etmv4_group,
2533         &coresight_etmv4_mgmt_group,
2534         &coresight_etmv4_trcidr_group,
2535         NULL,
2536 };