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