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