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