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