Loading...
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-etm.h"
21
22static ssize_t nr_addr_cmp_show(struct device *dev,
23 struct device_attribute *attr, char *buf)
24{
25 unsigned long val;
26 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
27
28 val = drvdata->nr_addr_cmp;
29 return sprintf(buf, "%#lx\n", val);
30}
31static DEVICE_ATTR_RO(nr_addr_cmp);
32
33static ssize_t nr_cntr_show(struct device *dev,
34 struct device_attribute *attr, char *buf)
35{ unsigned long val;
36 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
37
38 val = drvdata->nr_cntr;
39 return sprintf(buf, "%#lx\n", val);
40}
41static DEVICE_ATTR_RO(nr_cntr);
42
43static ssize_t nr_ctxid_cmp_show(struct device *dev,
44 struct device_attribute *attr, char *buf)
45{
46 unsigned long val;
47 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
48
49 val = drvdata->nr_ctxid_cmp;
50 return sprintf(buf, "%#lx\n", val);
51}
52static DEVICE_ATTR_RO(nr_ctxid_cmp);
53
54static ssize_t etmsr_show(struct device *dev,
55 struct device_attribute *attr, char *buf)
56{
57 unsigned long flags, val;
58 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
59
60 pm_runtime_get_sync(drvdata->dev);
61 spin_lock_irqsave(&drvdata->spinlock, flags);
62 CS_UNLOCK(drvdata->base);
63
64 val = etm_readl(drvdata, ETMSR);
65
66 CS_LOCK(drvdata->base);
67 spin_unlock_irqrestore(&drvdata->spinlock, flags);
68 pm_runtime_put(drvdata->dev);
69
70 return sprintf(buf, "%#lx\n", val);
71}
72static DEVICE_ATTR_RO(etmsr);
73
74static ssize_t reset_store(struct device *dev,
75 struct device_attribute *attr,
76 const char *buf, size_t size)
77{
78 int i, ret;
79 unsigned long val;
80 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
81 struct etm_config *config = &drvdata->config;
82
83 ret = kstrtoul(buf, 16, &val);
84 if (ret)
85 return ret;
86
87 if (val) {
88 spin_lock(&drvdata->spinlock);
89 memset(config, 0, sizeof(struct etm_config));
90 config->mode = ETM_MODE_EXCLUDE;
91 config->trigger_event = ETM_DEFAULT_EVENT_VAL;
92 for (i = 0; i < drvdata->nr_addr_cmp; i++) {
93 config->addr_type[i] = ETM_ADDR_TYPE_NONE;
94 }
95
96 etm_set_default(config);
97 spin_unlock(&drvdata->spinlock);
98 }
99
100 return size;
101}
102static DEVICE_ATTR_WO(reset);
103
104static ssize_t mode_show(struct device *dev,
105 struct device_attribute *attr, char *buf)
106{
107 unsigned long val;
108 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
109 struct etm_config *config = &drvdata->config;
110
111 val = config->mode;
112 return sprintf(buf, "%#lx\n", val);
113}
114
115static ssize_t mode_store(struct device *dev,
116 struct device_attribute *attr,
117 const char *buf, size_t size)
118{
119 int ret;
120 unsigned long val;
121 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
122 struct etm_config *config = &drvdata->config;
123
124 ret = kstrtoul(buf, 16, &val);
125 if (ret)
126 return ret;
127
128 spin_lock(&drvdata->spinlock);
129 config->mode = val & ETM_MODE_ALL;
130
131 if (config->mode & ETM_MODE_EXCLUDE)
132 config->enable_ctrl1 |= ETMTECR1_INC_EXC;
133 else
134 config->enable_ctrl1 &= ~ETMTECR1_INC_EXC;
135
136 if (config->mode & ETM_MODE_CYCACC)
137 config->ctrl |= ETMCR_CYC_ACC;
138 else
139 config->ctrl &= ~ETMCR_CYC_ACC;
140
141 if (config->mode & ETM_MODE_STALL) {
142 if (!(drvdata->etmccr & ETMCCR_FIFOFULL)) {
143 dev_warn(drvdata->dev, "stall mode not supported\n");
144 ret = -EINVAL;
145 goto err_unlock;
146 }
147 config->ctrl |= ETMCR_STALL_MODE;
148 } else
149 config->ctrl &= ~ETMCR_STALL_MODE;
150
151 if (config->mode & ETM_MODE_TIMESTAMP) {
152 if (!(drvdata->etmccer & ETMCCER_TIMESTAMP)) {
153 dev_warn(drvdata->dev, "timestamp not supported\n");
154 ret = -EINVAL;
155 goto err_unlock;
156 }
157 config->ctrl |= ETMCR_TIMESTAMP_EN;
158 } else
159 config->ctrl &= ~ETMCR_TIMESTAMP_EN;
160
161 if (config->mode & ETM_MODE_CTXID)
162 config->ctrl |= ETMCR_CTXID_SIZE;
163 else
164 config->ctrl &= ~ETMCR_CTXID_SIZE;
165
166 if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER))
167 etm_config_trace_mode(config);
168
169 spin_unlock(&drvdata->spinlock);
170
171 return size;
172
173err_unlock:
174 spin_unlock(&drvdata->spinlock);
175 return ret;
176}
177static DEVICE_ATTR_RW(mode);
178
179static ssize_t trigger_event_show(struct device *dev,
180 struct device_attribute *attr, char *buf)
181{
182 unsigned long val;
183 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
184 struct etm_config *config = &drvdata->config;
185
186 val = config->trigger_event;
187 return sprintf(buf, "%#lx\n", val);
188}
189
190static ssize_t trigger_event_store(struct device *dev,
191 struct device_attribute *attr,
192 const char *buf, size_t size)
193{
194 int ret;
195 unsigned long val;
196 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
197 struct etm_config *config = &drvdata->config;
198
199 ret = kstrtoul(buf, 16, &val);
200 if (ret)
201 return ret;
202
203 config->trigger_event = val & ETM_EVENT_MASK;
204
205 return size;
206}
207static DEVICE_ATTR_RW(trigger_event);
208
209static ssize_t enable_event_show(struct device *dev,
210 struct device_attribute *attr, char *buf)
211{
212 unsigned long val;
213 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
214 struct etm_config *config = &drvdata->config;
215
216 val = config->enable_event;
217 return sprintf(buf, "%#lx\n", val);
218}
219
220static ssize_t enable_event_store(struct device *dev,
221 struct device_attribute *attr,
222 const char *buf, size_t size)
223{
224 int ret;
225 unsigned long val;
226 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
227 struct etm_config *config = &drvdata->config;
228
229 ret = kstrtoul(buf, 16, &val);
230 if (ret)
231 return ret;
232
233 config->enable_event = val & ETM_EVENT_MASK;
234
235 return size;
236}
237static DEVICE_ATTR_RW(enable_event);
238
239static ssize_t fifofull_level_show(struct device *dev,
240 struct device_attribute *attr, char *buf)
241{
242 unsigned long val;
243 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
244 struct etm_config *config = &drvdata->config;
245
246 val = config->fifofull_level;
247 return sprintf(buf, "%#lx\n", val);
248}
249
250static ssize_t fifofull_level_store(struct device *dev,
251 struct device_attribute *attr,
252 const char *buf, size_t size)
253{
254 int ret;
255 unsigned long val;
256 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
257 struct etm_config *config = &drvdata->config;
258
259 ret = kstrtoul(buf, 16, &val);
260 if (ret)
261 return ret;
262
263 config->fifofull_level = val;
264
265 return size;
266}
267static DEVICE_ATTR_RW(fifofull_level);
268
269static ssize_t addr_idx_show(struct device *dev,
270 struct device_attribute *attr, char *buf)
271{
272 unsigned long val;
273 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
274 struct etm_config *config = &drvdata->config;
275
276 val = config->addr_idx;
277 return sprintf(buf, "%#lx\n", val);
278}
279
280static ssize_t addr_idx_store(struct device *dev,
281 struct device_attribute *attr,
282 const char *buf, size_t size)
283{
284 int ret;
285 unsigned long val;
286 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
287 struct etm_config *config = &drvdata->config;
288
289 ret = kstrtoul(buf, 16, &val);
290 if (ret)
291 return ret;
292
293 if (val >= drvdata->nr_addr_cmp)
294 return -EINVAL;
295
296 /*
297 * Use spinlock to ensure index doesn't change while it gets
298 * dereferenced multiple times within a spinlock block elsewhere.
299 */
300 spin_lock(&drvdata->spinlock);
301 config->addr_idx = val;
302 spin_unlock(&drvdata->spinlock);
303
304 return size;
305}
306static DEVICE_ATTR_RW(addr_idx);
307
308static ssize_t addr_single_show(struct device *dev,
309 struct device_attribute *attr, char *buf)
310{
311 u8 idx;
312 unsigned long val;
313 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
314 struct etm_config *config = &drvdata->config;
315
316 spin_lock(&drvdata->spinlock);
317 idx = config->addr_idx;
318 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
319 config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
320 spin_unlock(&drvdata->spinlock);
321 return -EINVAL;
322 }
323
324 val = config->addr_val[idx];
325 spin_unlock(&drvdata->spinlock);
326
327 return sprintf(buf, "%#lx\n", val);
328}
329
330static ssize_t addr_single_store(struct device *dev,
331 struct device_attribute *attr,
332 const char *buf, size_t size)
333{
334 u8 idx;
335 int ret;
336 unsigned long val;
337 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
338 struct etm_config *config = &drvdata->config;
339
340 ret = kstrtoul(buf, 16, &val);
341 if (ret)
342 return ret;
343
344 spin_lock(&drvdata->spinlock);
345 idx = config->addr_idx;
346 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
347 config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
348 spin_unlock(&drvdata->spinlock);
349 return -EINVAL;
350 }
351
352 config->addr_val[idx] = val;
353 config->addr_type[idx] = ETM_ADDR_TYPE_SINGLE;
354 spin_unlock(&drvdata->spinlock);
355
356 return size;
357}
358static DEVICE_ATTR_RW(addr_single);
359
360static ssize_t addr_range_show(struct device *dev,
361 struct device_attribute *attr, char *buf)
362{
363 u8 idx;
364 unsigned long val1, val2;
365 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
366 struct etm_config *config = &drvdata->config;
367
368 spin_lock(&drvdata->spinlock);
369 idx = config->addr_idx;
370 if (idx % 2 != 0) {
371 spin_unlock(&drvdata->spinlock);
372 return -EPERM;
373 }
374 if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
375 config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
376 (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
377 config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
378 spin_unlock(&drvdata->spinlock);
379 return -EPERM;
380 }
381
382 val1 = config->addr_val[idx];
383 val2 = config->addr_val[idx + 1];
384 spin_unlock(&drvdata->spinlock);
385
386 return sprintf(buf, "%#lx %#lx\n", val1, val2);
387}
388
389static ssize_t addr_range_store(struct device *dev,
390 struct device_attribute *attr,
391 const char *buf, size_t size)
392{
393 u8 idx;
394 unsigned long val1, val2;
395 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
396 struct etm_config *config = &drvdata->config;
397
398 if (sscanf(buf, "%lx %lx", &val1, &val2) != 2)
399 return -EINVAL;
400 /* Lower address comparator cannot have a higher address value */
401 if (val1 > val2)
402 return -EINVAL;
403
404 spin_lock(&drvdata->spinlock);
405 idx = config->addr_idx;
406 if (idx % 2 != 0) {
407 spin_unlock(&drvdata->spinlock);
408 return -EPERM;
409 }
410 if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
411 config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
412 (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
413 config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
414 spin_unlock(&drvdata->spinlock);
415 return -EPERM;
416 }
417
418 config->addr_val[idx] = val1;
419 config->addr_type[idx] = ETM_ADDR_TYPE_RANGE;
420 config->addr_val[idx + 1] = val2;
421 config->addr_type[idx + 1] = ETM_ADDR_TYPE_RANGE;
422 config->enable_ctrl1 |= (1 << (idx/2));
423 spin_unlock(&drvdata->spinlock);
424
425 return size;
426}
427static DEVICE_ATTR_RW(addr_range);
428
429static ssize_t addr_start_show(struct device *dev,
430 struct device_attribute *attr, char *buf)
431{
432 u8 idx;
433 unsigned long val;
434 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
435 struct etm_config *config = &drvdata->config;
436
437 spin_lock(&drvdata->spinlock);
438 idx = config->addr_idx;
439 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
440 config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
441 spin_unlock(&drvdata->spinlock);
442 return -EPERM;
443 }
444
445 val = config->addr_val[idx];
446 spin_unlock(&drvdata->spinlock);
447
448 return sprintf(buf, "%#lx\n", val);
449}
450
451static ssize_t addr_start_store(struct device *dev,
452 struct device_attribute *attr,
453 const char *buf, size_t size)
454{
455 u8 idx;
456 int ret;
457 unsigned long val;
458 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
459 struct etm_config *config = &drvdata->config;
460
461 ret = kstrtoul(buf, 16, &val);
462 if (ret)
463 return ret;
464
465 spin_lock(&drvdata->spinlock);
466 idx = config->addr_idx;
467 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
468 config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
469 spin_unlock(&drvdata->spinlock);
470 return -EPERM;
471 }
472
473 config->addr_val[idx] = val;
474 config->addr_type[idx] = ETM_ADDR_TYPE_START;
475 config->startstop_ctrl |= (1 << idx);
476 config->enable_ctrl1 |= BIT(25);
477 spin_unlock(&drvdata->spinlock);
478
479 return size;
480}
481static DEVICE_ATTR_RW(addr_start);
482
483static ssize_t addr_stop_show(struct device *dev,
484 struct device_attribute *attr, char *buf)
485{
486 u8 idx;
487 unsigned long val;
488 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
489 struct etm_config *config = &drvdata->config;
490
491 spin_lock(&drvdata->spinlock);
492 idx = config->addr_idx;
493 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
494 config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
495 spin_unlock(&drvdata->spinlock);
496 return -EPERM;
497 }
498
499 val = config->addr_val[idx];
500 spin_unlock(&drvdata->spinlock);
501
502 return sprintf(buf, "%#lx\n", val);
503}
504
505static ssize_t addr_stop_store(struct device *dev,
506 struct device_attribute *attr,
507 const char *buf, size_t size)
508{
509 u8 idx;
510 int ret;
511 unsigned long val;
512 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
513 struct etm_config *config = &drvdata->config;
514
515 ret = kstrtoul(buf, 16, &val);
516 if (ret)
517 return ret;
518
519 spin_lock(&drvdata->spinlock);
520 idx = config->addr_idx;
521 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
522 config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
523 spin_unlock(&drvdata->spinlock);
524 return -EPERM;
525 }
526
527 config->addr_val[idx] = val;
528 config->addr_type[idx] = ETM_ADDR_TYPE_STOP;
529 config->startstop_ctrl |= (1 << (idx + 16));
530 config->enable_ctrl1 |= ETMTECR1_START_STOP;
531 spin_unlock(&drvdata->spinlock);
532
533 return size;
534}
535static DEVICE_ATTR_RW(addr_stop);
536
537static ssize_t addr_acctype_show(struct device *dev,
538 struct device_attribute *attr, char *buf)
539{
540 unsigned long val;
541 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
542 struct etm_config *config = &drvdata->config;
543
544 spin_lock(&drvdata->spinlock);
545 val = config->addr_acctype[config->addr_idx];
546 spin_unlock(&drvdata->spinlock);
547
548 return sprintf(buf, "%#lx\n", val);
549}
550
551static ssize_t addr_acctype_store(struct device *dev,
552 struct device_attribute *attr,
553 const char *buf, size_t size)
554{
555 int ret;
556 unsigned long val;
557 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
558 struct etm_config *config = &drvdata->config;
559
560 ret = kstrtoul(buf, 16, &val);
561 if (ret)
562 return ret;
563
564 spin_lock(&drvdata->spinlock);
565 config->addr_acctype[config->addr_idx] = val;
566 spin_unlock(&drvdata->spinlock);
567
568 return size;
569}
570static DEVICE_ATTR_RW(addr_acctype);
571
572static ssize_t cntr_idx_show(struct device *dev,
573 struct device_attribute *attr, char *buf)
574{
575 unsigned long val;
576 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
577 struct etm_config *config = &drvdata->config;
578
579 val = config->cntr_idx;
580 return sprintf(buf, "%#lx\n", val);
581}
582
583static ssize_t cntr_idx_store(struct device *dev,
584 struct device_attribute *attr,
585 const char *buf, size_t size)
586{
587 int ret;
588 unsigned long val;
589 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
590 struct etm_config *config = &drvdata->config;
591
592 ret = kstrtoul(buf, 16, &val);
593 if (ret)
594 return ret;
595
596 if (val >= drvdata->nr_cntr)
597 return -EINVAL;
598 /*
599 * Use spinlock to ensure index doesn't change while it gets
600 * dereferenced multiple times within a spinlock block elsewhere.
601 */
602 spin_lock(&drvdata->spinlock);
603 config->cntr_idx = val;
604 spin_unlock(&drvdata->spinlock);
605
606 return size;
607}
608static DEVICE_ATTR_RW(cntr_idx);
609
610static ssize_t cntr_rld_val_show(struct device *dev,
611 struct device_attribute *attr, char *buf)
612{
613 unsigned long val;
614 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
615 struct etm_config *config = &drvdata->config;
616
617 spin_lock(&drvdata->spinlock);
618 val = config->cntr_rld_val[config->cntr_idx];
619 spin_unlock(&drvdata->spinlock);
620
621 return sprintf(buf, "%#lx\n", val);
622}
623
624static ssize_t cntr_rld_val_store(struct device *dev,
625 struct device_attribute *attr,
626 const char *buf, size_t size)
627{
628 int ret;
629 unsigned long val;
630 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
631 struct etm_config *config = &drvdata->config;
632
633 ret = kstrtoul(buf, 16, &val);
634 if (ret)
635 return ret;
636
637 spin_lock(&drvdata->spinlock);
638 config->cntr_rld_val[config->cntr_idx] = val;
639 spin_unlock(&drvdata->spinlock);
640
641 return size;
642}
643static DEVICE_ATTR_RW(cntr_rld_val);
644
645static ssize_t cntr_event_show(struct device *dev,
646 struct device_attribute *attr, char *buf)
647{
648 unsigned long val;
649 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
650 struct etm_config *config = &drvdata->config;
651
652 spin_lock(&drvdata->spinlock);
653 val = config->cntr_event[config->cntr_idx];
654 spin_unlock(&drvdata->spinlock);
655
656 return sprintf(buf, "%#lx\n", val);
657}
658
659static ssize_t cntr_event_store(struct device *dev,
660 struct device_attribute *attr,
661 const char *buf, size_t size)
662{
663 int ret;
664 unsigned long val;
665 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
666 struct etm_config *config = &drvdata->config;
667
668 ret = kstrtoul(buf, 16, &val);
669 if (ret)
670 return ret;
671
672 spin_lock(&drvdata->spinlock);
673 config->cntr_event[config->cntr_idx] = val & ETM_EVENT_MASK;
674 spin_unlock(&drvdata->spinlock);
675
676 return size;
677}
678static DEVICE_ATTR_RW(cntr_event);
679
680static ssize_t cntr_rld_event_show(struct device *dev,
681 struct device_attribute *attr, char *buf)
682{
683 unsigned long val;
684 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
685 struct etm_config *config = &drvdata->config;
686
687 spin_lock(&drvdata->spinlock);
688 val = config->cntr_rld_event[config->cntr_idx];
689 spin_unlock(&drvdata->spinlock);
690
691 return sprintf(buf, "%#lx\n", val);
692}
693
694static ssize_t cntr_rld_event_store(struct device *dev,
695 struct device_attribute *attr,
696 const char *buf, size_t size)
697{
698 int ret;
699 unsigned long val;
700 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
701 struct etm_config *config = &drvdata->config;
702
703 ret = kstrtoul(buf, 16, &val);
704 if (ret)
705 return ret;
706
707 spin_lock(&drvdata->spinlock);
708 config->cntr_rld_event[config->cntr_idx] = val & ETM_EVENT_MASK;
709 spin_unlock(&drvdata->spinlock);
710
711 return size;
712}
713static DEVICE_ATTR_RW(cntr_rld_event);
714
715static ssize_t cntr_val_show(struct device *dev,
716 struct device_attribute *attr, char *buf)
717{
718 int i, ret = 0;
719 u32 val;
720 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
721 struct etm_config *config = &drvdata->config;
722
723 if (!local_read(&drvdata->mode)) {
724 spin_lock(&drvdata->spinlock);
725 for (i = 0; i < drvdata->nr_cntr; i++)
726 ret += sprintf(buf, "counter %d: %x\n",
727 i, config->cntr_val[i]);
728 spin_unlock(&drvdata->spinlock);
729 return ret;
730 }
731
732 for (i = 0; i < drvdata->nr_cntr; i++) {
733 val = etm_readl(drvdata, ETMCNTVRn(i));
734 ret += sprintf(buf, "counter %d: %x\n", i, val);
735 }
736
737 return ret;
738}
739
740static ssize_t cntr_val_store(struct device *dev,
741 struct device_attribute *attr,
742 const char *buf, size_t size)
743{
744 int ret;
745 unsigned long val;
746 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
747 struct etm_config *config = &drvdata->config;
748
749 ret = kstrtoul(buf, 16, &val);
750 if (ret)
751 return ret;
752
753 spin_lock(&drvdata->spinlock);
754 config->cntr_val[config->cntr_idx] = val;
755 spin_unlock(&drvdata->spinlock);
756
757 return size;
758}
759static DEVICE_ATTR_RW(cntr_val);
760
761static ssize_t seq_12_event_show(struct device *dev,
762 struct device_attribute *attr, char *buf)
763{
764 unsigned long val;
765 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
766 struct etm_config *config = &drvdata->config;
767
768 val = config->seq_12_event;
769 return sprintf(buf, "%#lx\n", val);
770}
771
772static ssize_t seq_12_event_store(struct device *dev,
773 struct device_attribute *attr,
774 const char *buf, size_t size)
775{
776 int ret;
777 unsigned long val;
778 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
779 struct etm_config *config = &drvdata->config;
780
781 ret = kstrtoul(buf, 16, &val);
782 if (ret)
783 return ret;
784
785 config->seq_12_event = val & ETM_EVENT_MASK;
786 return size;
787}
788static DEVICE_ATTR_RW(seq_12_event);
789
790static ssize_t seq_21_event_show(struct device *dev,
791 struct device_attribute *attr, char *buf)
792{
793 unsigned long val;
794 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
795 struct etm_config *config = &drvdata->config;
796
797 val = config->seq_21_event;
798 return sprintf(buf, "%#lx\n", val);
799}
800
801static ssize_t seq_21_event_store(struct device *dev,
802 struct device_attribute *attr,
803 const char *buf, size_t size)
804{
805 int ret;
806 unsigned long val;
807 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
808 struct etm_config *config = &drvdata->config;
809
810 ret = kstrtoul(buf, 16, &val);
811 if (ret)
812 return ret;
813
814 config->seq_21_event = val & ETM_EVENT_MASK;
815 return size;
816}
817static DEVICE_ATTR_RW(seq_21_event);
818
819static ssize_t seq_23_event_show(struct device *dev,
820 struct device_attribute *attr, char *buf)
821{
822 unsigned long val;
823 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
824 struct etm_config *config = &drvdata->config;
825
826 val = config->seq_23_event;
827 return sprintf(buf, "%#lx\n", val);
828}
829
830static ssize_t seq_23_event_store(struct device *dev,
831 struct device_attribute *attr,
832 const char *buf, size_t size)
833{
834 int ret;
835 unsigned long val;
836 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
837 struct etm_config *config = &drvdata->config;
838
839 ret = kstrtoul(buf, 16, &val);
840 if (ret)
841 return ret;
842
843 config->seq_23_event = val & ETM_EVENT_MASK;
844 return size;
845}
846static DEVICE_ATTR_RW(seq_23_event);
847
848static ssize_t seq_31_event_show(struct device *dev,
849 struct device_attribute *attr, char *buf)
850{
851 unsigned long val;
852 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
853 struct etm_config *config = &drvdata->config;
854
855 val = config->seq_31_event;
856 return sprintf(buf, "%#lx\n", val);
857}
858
859static ssize_t seq_31_event_store(struct device *dev,
860 struct device_attribute *attr,
861 const char *buf, size_t size)
862{
863 int ret;
864 unsigned long val;
865 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
866 struct etm_config *config = &drvdata->config;
867
868 ret = kstrtoul(buf, 16, &val);
869 if (ret)
870 return ret;
871
872 config->seq_31_event = val & ETM_EVENT_MASK;
873 return size;
874}
875static DEVICE_ATTR_RW(seq_31_event);
876
877static ssize_t seq_32_event_show(struct device *dev,
878 struct device_attribute *attr, char *buf)
879{
880 unsigned long val;
881 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
882 struct etm_config *config = &drvdata->config;
883
884 val = config->seq_32_event;
885 return sprintf(buf, "%#lx\n", val);
886}
887
888static ssize_t seq_32_event_store(struct device *dev,
889 struct device_attribute *attr,
890 const char *buf, size_t size)
891{
892 int ret;
893 unsigned long val;
894 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
895 struct etm_config *config = &drvdata->config;
896
897 ret = kstrtoul(buf, 16, &val);
898 if (ret)
899 return ret;
900
901 config->seq_32_event = val & ETM_EVENT_MASK;
902 return size;
903}
904static DEVICE_ATTR_RW(seq_32_event);
905
906static ssize_t seq_13_event_show(struct device *dev,
907 struct device_attribute *attr, char *buf)
908{
909 unsigned long val;
910 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
911 struct etm_config *config = &drvdata->config;
912
913 val = config->seq_13_event;
914 return sprintf(buf, "%#lx\n", val);
915}
916
917static ssize_t seq_13_event_store(struct device *dev,
918 struct device_attribute *attr,
919 const char *buf, size_t size)
920{
921 int ret;
922 unsigned long val;
923 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
924 struct etm_config *config = &drvdata->config;
925
926 ret = kstrtoul(buf, 16, &val);
927 if (ret)
928 return ret;
929
930 config->seq_13_event = val & ETM_EVENT_MASK;
931 return size;
932}
933static DEVICE_ATTR_RW(seq_13_event);
934
935static ssize_t seq_curr_state_show(struct device *dev,
936 struct device_attribute *attr, char *buf)
937{
938 unsigned long val, flags;
939 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
940 struct etm_config *config = &drvdata->config;
941
942 if (!local_read(&drvdata->mode)) {
943 val = config->seq_curr_state;
944 goto out;
945 }
946
947 pm_runtime_get_sync(drvdata->dev);
948 spin_lock_irqsave(&drvdata->spinlock, flags);
949
950 CS_UNLOCK(drvdata->base);
951 val = (etm_readl(drvdata, ETMSQR) & ETM_SQR_MASK);
952 CS_LOCK(drvdata->base);
953
954 spin_unlock_irqrestore(&drvdata->spinlock, flags);
955 pm_runtime_put(drvdata->dev);
956out:
957 return sprintf(buf, "%#lx\n", val);
958}
959
960static ssize_t seq_curr_state_store(struct device *dev,
961 struct device_attribute *attr,
962 const char *buf, size_t size)
963{
964 int ret;
965 unsigned long val;
966 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
967 struct etm_config *config = &drvdata->config;
968
969 ret = kstrtoul(buf, 16, &val);
970 if (ret)
971 return ret;
972
973 if (val > ETM_SEQ_STATE_MAX_VAL)
974 return -EINVAL;
975
976 config->seq_curr_state = val;
977
978 return size;
979}
980static DEVICE_ATTR_RW(seq_curr_state);
981
982static ssize_t ctxid_idx_show(struct device *dev,
983 struct device_attribute *attr, char *buf)
984{
985 unsigned long val;
986 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
987 struct etm_config *config = &drvdata->config;
988
989 val = config->ctxid_idx;
990 return sprintf(buf, "%#lx\n", val);
991}
992
993static ssize_t ctxid_idx_store(struct device *dev,
994 struct device_attribute *attr,
995 const char *buf, size_t size)
996{
997 int ret;
998 unsigned long val;
999 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1000 struct etm_config *config = &drvdata->config;
1001
1002 ret = kstrtoul(buf, 16, &val);
1003 if (ret)
1004 return ret;
1005
1006 if (val >= drvdata->nr_ctxid_cmp)
1007 return -EINVAL;
1008
1009 /*
1010 * Use spinlock to ensure index doesn't change while it gets
1011 * dereferenced multiple times within a spinlock block elsewhere.
1012 */
1013 spin_lock(&drvdata->spinlock);
1014 config->ctxid_idx = val;
1015 spin_unlock(&drvdata->spinlock);
1016
1017 return size;
1018}
1019static DEVICE_ATTR_RW(ctxid_idx);
1020
1021static ssize_t ctxid_pid_show(struct device *dev,
1022 struct device_attribute *attr, char *buf)
1023{
1024 unsigned long val;
1025 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1026 struct etm_config *config = &drvdata->config;
1027
1028 spin_lock(&drvdata->spinlock);
1029 val = config->ctxid_vpid[config->ctxid_idx];
1030 spin_unlock(&drvdata->spinlock);
1031
1032 return sprintf(buf, "%#lx\n", val);
1033}
1034
1035static ssize_t ctxid_pid_store(struct device *dev,
1036 struct device_attribute *attr,
1037 const char *buf, size_t size)
1038{
1039 int ret;
1040 unsigned long vpid, pid;
1041 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1042 struct etm_config *config = &drvdata->config;
1043
1044 ret = kstrtoul(buf, 16, &vpid);
1045 if (ret)
1046 return ret;
1047
1048 pid = coresight_vpid_to_pid(vpid);
1049
1050 spin_lock(&drvdata->spinlock);
1051 config->ctxid_pid[config->ctxid_idx] = pid;
1052 config->ctxid_vpid[config->ctxid_idx] = vpid;
1053 spin_unlock(&drvdata->spinlock);
1054
1055 return size;
1056}
1057static DEVICE_ATTR_RW(ctxid_pid);
1058
1059static ssize_t ctxid_mask_show(struct device *dev,
1060 struct device_attribute *attr, char *buf)
1061{
1062 unsigned long val;
1063 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1064 struct etm_config *config = &drvdata->config;
1065
1066 val = config->ctxid_mask;
1067 return sprintf(buf, "%#lx\n", val);
1068}
1069
1070static ssize_t ctxid_mask_store(struct device *dev,
1071 struct device_attribute *attr,
1072 const char *buf, size_t size)
1073{
1074 int ret;
1075 unsigned long val;
1076 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1077 struct etm_config *config = &drvdata->config;
1078
1079 ret = kstrtoul(buf, 16, &val);
1080 if (ret)
1081 return ret;
1082
1083 config->ctxid_mask = val;
1084 return size;
1085}
1086static DEVICE_ATTR_RW(ctxid_mask);
1087
1088static ssize_t sync_freq_show(struct device *dev,
1089 struct device_attribute *attr, char *buf)
1090{
1091 unsigned long val;
1092 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1093 struct etm_config *config = &drvdata->config;
1094
1095 val = config->sync_freq;
1096 return sprintf(buf, "%#lx\n", val);
1097}
1098
1099static ssize_t sync_freq_store(struct device *dev,
1100 struct device_attribute *attr,
1101 const char *buf, size_t size)
1102{
1103 int ret;
1104 unsigned long val;
1105 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1106 struct etm_config *config = &drvdata->config;
1107
1108 ret = kstrtoul(buf, 16, &val);
1109 if (ret)
1110 return ret;
1111
1112 config->sync_freq = val & ETM_SYNC_MASK;
1113 return size;
1114}
1115static DEVICE_ATTR_RW(sync_freq);
1116
1117static ssize_t timestamp_event_show(struct device *dev,
1118 struct device_attribute *attr, char *buf)
1119{
1120 unsigned long val;
1121 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1122 struct etm_config *config = &drvdata->config;
1123
1124 val = config->timestamp_event;
1125 return sprintf(buf, "%#lx\n", val);
1126}
1127
1128static ssize_t timestamp_event_store(struct device *dev,
1129 struct device_attribute *attr,
1130 const char *buf, size_t size)
1131{
1132 int ret;
1133 unsigned long val;
1134 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1135 struct etm_config *config = &drvdata->config;
1136
1137 ret = kstrtoul(buf, 16, &val);
1138 if (ret)
1139 return ret;
1140
1141 config->timestamp_event = val & ETM_EVENT_MASK;
1142 return size;
1143}
1144static DEVICE_ATTR_RW(timestamp_event);
1145
1146static ssize_t cpu_show(struct device *dev,
1147 struct device_attribute *attr, char *buf)
1148{
1149 int val;
1150 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1151
1152 val = drvdata->cpu;
1153 return scnprintf(buf, PAGE_SIZE, "%d\n", val);
1154
1155}
1156static DEVICE_ATTR_RO(cpu);
1157
1158static ssize_t traceid_show(struct device *dev,
1159 struct device_attribute *attr, char *buf)
1160{
1161 unsigned long val;
1162 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1163
1164 val = etm_get_trace_id(drvdata);
1165
1166 return sprintf(buf, "%#lx\n", val);
1167}
1168
1169static ssize_t traceid_store(struct device *dev,
1170 struct device_attribute *attr,
1171 const char *buf, size_t size)
1172{
1173 int ret;
1174 unsigned long val;
1175 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1176
1177 ret = kstrtoul(buf, 16, &val);
1178 if (ret)
1179 return ret;
1180
1181 drvdata->traceid = val & ETM_TRACEID_MASK;
1182 return size;
1183}
1184static DEVICE_ATTR_RW(traceid);
1185
1186static struct attribute *coresight_etm_attrs[] = {
1187 &dev_attr_nr_addr_cmp.attr,
1188 &dev_attr_nr_cntr.attr,
1189 &dev_attr_nr_ctxid_cmp.attr,
1190 &dev_attr_etmsr.attr,
1191 &dev_attr_reset.attr,
1192 &dev_attr_mode.attr,
1193 &dev_attr_trigger_event.attr,
1194 &dev_attr_enable_event.attr,
1195 &dev_attr_fifofull_level.attr,
1196 &dev_attr_addr_idx.attr,
1197 &dev_attr_addr_single.attr,
1198 &dev_attr_addr_range.attr,
1199 &dev_attr_addr_start.attr,
1200 &dev_attr_addr_stop.attr,
1201 &dev_attr_addr_acctype.attr,
1202 &dev_attr_cntr_idx.attr,
1203 &dev_attr_cntr_rld_val.attr,
1204 &dev_attr_cntr_event.attr,
1205 &dev_attr_cntr_rld_event.attr,
1206 &dev_attr_cntr_val.attr,
1207 &dev_attr_seq_12_event.attr,
1208 &dev_attr_seq_21_event.attr,
1209 &dev_attr_seq_23_event.attr,
1210 &dev_attr_seq_31_event.attr,
1211 &dev_attr_seq_32_event.attr,
1212 &dev_attr_seq_13_event.attr,
1213 &dev_attr_seq_curr_state.attr,
1214 &dev_attr_ctxid_idx.attr,
1215 &dev_attr_ctxid_pid.attr,
1216 &dev_attr_ctxid_mask.attr,
1217 &dev_attr_sync_freq.attr,
1218 &dev_attr_timestamp_event.attr,
1219 &dev_attr_traceid.attr,
1220 &dev_attr_cpu.attr,
1221 NULL,
1222};
1223
1224#define coresight_simple_func(name, offset) \
1225static ssize_t name##_show(struct device *_dev, \
1226 struct device_attribute *attr, char *buf) \
1227{ \
1228 struct etm_drvdata *drvdata = dev_get_drvdata(_dev->parent); \
1229 return scnprintf(buf, PAGE_SIZE, "0x%x\n", \
1230 readl_relaxed(drvdata->base + offset)); \
1231} \
1232DEVICE_ATTR_RO(name)
1233
1234coresight_simple_func(etmccr, ETMCCR);
1235coresight_simple_func(etmccer, ETMCCER);
1236coresight_simple_func(etmscr, ETMSCR);
1237coresight_simple_func(etmidr, ETMIDR);
1238coresight_simple_func(etmcr, ETMCR);
1239coresight_simple_func(etmtraceidr, ETMTRACEIDR);
1240coresight_simple_func(etmteevr, ETMTEEVR);
1241coresight_simple_func(etmtssvr, ETMTSSCR);
1242coresight_simple_func(etmtecr1, ETMTECR1);
1243coresight_simple_func(etmtecr2, ETMTECR2);
1244
1245static struct attribute *coresight_etm_mgmt_attrs[] = {
1246 &dev_attr_etmccr.attr,
1247 &dev_attr_etmccer.attr,
1248 &dev_attr_etmscr.attr,
1249 &dev_attr_etmidr.attr,
1250 &dev_attr_etmcr.attr,
1251 &dev_attr_etmtraceidr.attr,
1252 &dev_attr_etmteevr.attr,
1253 &dev_attr_etmtssvr.attr,
1254 &dev_attr_etmtecr1.attr,
1255 &dev_attr_etmtecr2.attr,
1256 NULL,
1257};
1258
1259static const struct attribute_group coresight_etm_group = {
1260 .attrs = coresight_etm_attrs,
1261};
1262
1263static const struct attribute_group coresight_etm_mgmt_group = {
1264 .attrs = coresight_etm_mgmt_attrs,
1265 .name = "mgmt",
1266};
1267
1268const struct attribute_group *coresight_etm_groups[] = {
1269 &coresight_etm_group,
1270 &coresight_etm_mgmt_group,
1271 NULL,
1272};
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-etm.h"
11#include "coresight-priv.h"
12
13static ssize_t nr_addr_cmp_show(struct device *dev,
14 struct device_attribute *attr, char *buf)
15{
16 unsigned long val;
17 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
18
19 val = drvdata->nr_addr_cmp;
20 return sprintf(buf, "%#lx\n", val);
21}
22static DEVICE_ATTR_RO(nr_addr_cmp);
23
24static ssize_t nr_cntr_show(struct device *dev,
25 struct device_attribute *attr, char *buf)
26{ unsigned long val;
27 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
28
29 val = drvdata->nr_cntr;
30 return sprintf(buf, "%#lx\n", val);
31}
32static DEVICE_ATTR_RO(nr_cntr);
33
34static ssize_t nr_ctxid_cmp_show(struct device *dev,
35 struct device_attribute *attr, char *buf)
36{
37 unsigned long val;
38 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
39
40 val = drvdata->nr_ctxid_cmp;
41 return sprintf(buf, "%#lx\n", val);
42}
43static DEVICE_ATTR_RO(nr_ctxid_cmp);
44
45static ssize_t etmsr_show(struct device *dev,
46 struct device_attribute *attr, char *buf)
47{
48 unsigned long flags, val;
49 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
50
51 pm_runtime_get_sync(dev->parent);
52 spin_lock_irqsave(&drvdata->spinlock, flags);
53 CS_UNLOCK(drvdata->base);
54
55 val = etm_readl(drvdata, ETMSR);
56
57 CS_LOCK(drvdata->base);
58 spin_unlock_irqrestore(&drvdata->spinlock, flags);
59 pm_runtime_put(dev->parent);
60
61 return sprintf(buf, "%#lx\n", val);
62}
63static DEVICE_ATTR_RO(etmsr);
64
65static ssize_t reset_store(struct device *dev,
66 struct device_attribute *attr,
67 const char *buf, size_t size)
68{
69 int i, ret;
70 unsigned long val;
71 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
72 struct etm_config *config = &drvdata->config;
73
74 ret = kstrtoul(buf, 16, &val);
75 if (ret)
76 return ret;
77
78 if (val) {
79 spin_lock(&drvdata->spinlock);
80 memset(config, 0, sizeof(struct etm_config));
81 config->mode = ETM_MODE_EXCLUDE;
82 config->trigger_event = ETM_DEFAULT_EVENT_VAL;
83 for (i = 0; i < drvdata->nr_addr_cmp; i++) {
84 config->addr_type[i] = ETM_ADDR_TYPE_NONE;
85 }
86
87 etm_set_default(config);
88 spin_unlock(&drvdata->spinlock);
89 }
90
91 return size;
92}
93static DEVICE_ATTR_WO(reset);
94
95static ssize_t mode_show(struct device *dev,
96 struct device_attribute *attr, char *buf)
97{
98 unsigned long val;
99 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
100 struct etm_config *config = &drvdata->config;
101
102 val = config->mode;
103 return sprintf(buf, "%#lx\n", val);
104}
105
106static ssize_t mode_store(struct device *dev,
107 struct device_attribute *attr,
108 const char *buf, size_t size)
109{
110 int ret;
111 unsigned long val;
112 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
113 struct etm_config *config = &drvdata->config;
114
115 ret = kstrtoul(buf, 16, &val);
116 if (ret)
117 return ret;
118
119 spin_lock(&drvdata->spinlock);
120 config->mode = val & ETM_MODE_ALL;
121
122 if (config->mode & ETM_MODE_EXCLUDE)
123 config->enable_ctrl1 |= ETMTECR1_INC_EXC;
124 else
125 config->enable_ctrl1 &= ~ETMTECR1_INC_EXC;
126
127 if (config->mode & ETM_MODE_CYCACC)
128 config->ctrl |= ETMCR_CYC_ACC;
129 else
130 config->ctrl &= ~ETMCR_CYC_ACC;
131
132 if (config->mode & ETM_MODE_STALL) {
133 if (!(drvdata->etmccr & ETMCCR_FIFOFULL)) {
134 dev_warn(dev, "stall mode not supported\n");
135 ret = -EINVAL;
136 goto err_unlock;
137 }
138 config->ctrl |= ETMCR_STALL_MODE;
139 } else
140 config->ctrl &= ~ETMCR_STALL_MODE;
141
142 if (config->mode & ETM_MODE_TIMESTAMP) {
143 if (!(drvdata->etmccer & ETMCCER_TIMESTAMP)) {
144 dev_warn(dev, "timestamp not supported\n");
145 ret = -EINVAL;
146 goto err_unlock;
147 }
148 config->ctrl |= ETMCR_TIMESTAMP_EN;
149 } else
150 config->ctrl &= ~ETMCR_TIMESTAMP_EN;
151
152 if (config->mode & ETM_MODE_CTXID)
153 config->ctrl |= ETMCR_CTXID_SIZE;
154 else
155 config->ctrl &= ~ETMCR_CTXID_SIZE;
156
157 if (config->mode & ETM_MODE_BBROAD)
158 config->ctrl |= ETMCR_BRANCH_BROADCAST;
159 else
160 config->ctrl &= ~ETMCR_BRANCH_BROADCAST;
161
162 if (config->mode & ETM_MODE_RET_STACK)
163 config->ctrl |= ETMCR_RETURN_STACK;
164 else
165 config->ctrl &= ~ETMCR_RETURN_STACK;
166
167 if (config->mode & (ETM_MODE_EXCL_KERN | ETM_MODE_EXCL_USER))
168 etm_config_trace_mode(config);
169
170 spin_unlock(&drvdata->spinlock);
171
172 return size;
173
174err_unlock:
175 spin_unlock(&drvdata->spinlock);
176 return ret;
177}
178static DEVICE_ATTR_RW(mode);
179
180static ssize_t trigger_event_show(struct device *dev,
181 struct device_attribute *attr, char *buf)
182{
183 unsigned long val;
184 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
185 struct etm_config *config = &drvdata->config;
186
187 val = config->trigger_event;
188 return sprintf(buf, "%#lx\n", val);
189}
190
191static ssize_t trigger_event_store(struct device *dev,
192 struct device_attribute *attr,
193 const char *buf, size_t size)
194{
195 int ret;
196 unsigned long val;
197 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
198 struct etm_config *config = &drvdata->config;
199
200 ret = kstrtoul(buf, 16, &val);
201 if (ret)
202 return ret;
203
204 config->trigger_event = val & ETM_EVENT_MASK;
205
206 return size;
207}
208static DEVICE_ATTR_RW(trigger_event);
209
210static ssize_t enable_event_show(struct device *dev,
211 struct device_attribute *attr, char *buf)
212{
213 unsigned long val;
214 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
215 struct etm_config *config = &drvdata->config;
216
217 val = config->enable_event;
218 return sprintf(buf, "%#lx\n", val);
219}
220
221static ssize_t enable_event_store(struct device *dev,
222 struct device_attribute *attr,
223 const char *buf, size_t size)
224{
225 int ret;
226 unsigned long val;
227 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
228 struct etm_config *config = &drvdata->config;
229
230 ret = kstrtoul(buf, 16, &val);
231 if (ret)
232 return ret;
233
234 config->enable_event = val & ETM_EVENT_MASK;
235
236 return size;
237}
238static DEVICE_ATTR_RW(enable_event);
239
240static ssize_t fifofull_level_show(struct device *dev,
241 struct device_attribute *attr, char *buf)
242{
243 unsigned long val;
244 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
245 struct etm_config *config = &drvdata->config;
246
247 val = config->fifofull_level;
248 return sprintf(buf, "%#lx\n", val);
249}
250
251static ssize_t fifofull_level_store(struct device *dev,
252 struct device_attribute *attr,
253 const char *buf, size_t size)
254{
255 int ret;
256 unsigned long val;
257 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
258 struct etm_config *config = &drvdata->config;
259
260 ret = kstrtoul(buf, 16, &val);
261 if (ret)
262 return ret;
263
264 config->fifofull_level = val;
265
266 return size;
267}
268static DEVICE_ATTR_RW(fifofull_level);
269
270static ssize_t addr_idx_show(struct device *dev,
271 struct device_attribute *attr, char *buf)
272{
273 unsigned long val;
274 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
275 struct etm_config *config = &drvdata->config;
276
277 val = config->addr_idx;
278 return sprintf(buf, "%#lx\n", val);
279}
280
281static ssize_t addr_idx_store(struct device *dev,
282 struct device_attribute *attr,
283 const char *buf, size_t size)
284{
285 int ret;
286 unsigned long val;
287 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
288 struct etm_config *config = &drvdata->config;
289
290 ret = kstrtoul(buf, 16, &val);
291 if (ret)
292 return ret;
293
294 if (val >= drvdata->nr_addr_cmp)
295 return -EINVAL;
296
297 /*
298 * Use spinlock to ensure index doesn't change while it gets
299 * dereferenced multiple times within a spinlock block elsewhere.
300 */
301 spin_lock(&drvdata->spinlock);
302 config->addr_idx = val;
303 spin_unlock(&drvdata->spinlock);
304
305 return size;
306}
307static DEVICE_ATTR_RW(addr_idx);
308
309static ssize_t addr_single_show(struct device *dev,
310 struct device_attribute *attr, char *buf)
311{
312 u8 idx;
313 unsigned long val;
314 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
315 struct etm_config *config = &drvdata->config;
316
317 spin_lock(&drvdata->spinlock);
318 idx = config->addr_idx;
319 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
320 config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
321 spin_unlock(&drvdata->spinlock);
322 return -EINVAL;
323 }
324
325 val = config->addr_val[idx];
326 spin_unlock(&drvdata->spinlock);
327
328 return sprintf(buf, "%#lx\n", val);
329}
330
331static ssize_t addr_single_store(struct device *dev,
332 struct device_attribute *attr,
333 const char *buf, size_t size)
334{
335 u8 idx;
336 int ret;
337 unsigned long val;
338 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
339 struct etm_config *config = &drvdata->config;
340
341 ret = kstrtoul(buf, 16, &val);
342 if (ret)
343 return ret;
344
345 spin_lock(&drvdata->spinlock);
346 idx = config->addr_idx;
347 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
348 config->addr_type[idx] == ETM_ADDR_TYPE_SINGLE)) {
349 spin_unlock(&drvdata->spinlock);
350 return -EINVAL;
351 }
352
353 config->addr_val[idx] = val;
354 config->addr_type[idx] = ETM_ADDR_TYPE_SINGLE;
355 spin_unlock(&drvdata->spinlock);
356
357 return size;
358}
359static DEVICE_ATTR_RW(addr_single);
360
361static ssize_t addr_range_show(struct device *dev,
362 struct device_attribute *attr, char *buf)
363{
364 u8 idx;
365 unsigned long val1, val2;
366 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
367 struct etm_config *config = &drvdata->config;
368
369 spin_lock(&drvdata->spinlock);
370 idx = config->addr_idx;
371 if (idx % 2 != 0) {
372 spin_unlock(&drvdata->spinlock);
373 return -EPERM;
374 }
375 if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
376 config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
377 (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
378 config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
379 spin_unlock(&drvdata->spinlock);
380 return -EPERM;
381 }
382
383 val1 = config->addr_val[idx];
384 val2 = config->addr_val[idx + 1];
385 spin_unlock(&drvdata->spinlock);
386
387 return sprintf(buf, "%#lx %#lx\n", val1, val2);
388}
389
390static ssize_t addr_range_store(struct device *dev,
391 struct device_attribute *attr,
392 const char *buf, size_t size)
393{
394 u8 idx;
395 unsigned long val1, val2;
396 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
397 struct etm_config *config = &drvdata->config;
398
399 if (sscanf(buf, "%lx %lx", &val1, &val2) != 2)
400 return -EINVAL;
401 /* Lower address comparator cannot have a higher address value */
402 if (val1 > val2)
403 return -EINVAL;
404
405 spin_lock(&drvdata->spinlock);
406 idx = config->addr_idx;
407 if (idx % 2 != 0) {
408 spin_unlock(&drvdata->spinlock);
409 return -EPERM;
410 }
411 if (!((config->addr_type[idx] == ETM_ADDR_TYPE_NONE &&
412 config->addr_type[idx + 1] == ETM_ADDR_TYPE_NONE) ||
413 (config->addr_type[idx] == ETM_ADDR_TYPE_RANGE &&
414 config->addr_type[idx + 1] == ETM_ADDR_TYPE_RANGE))) {
415 spin_unlock(&drvdata->spinlock);
416 return -EPERM;
417 }
418
419 config->addr_val[idx] = val1;
420 config->addr_type[idx] = ETM_ADDR_TYPE_RANGE;
421 config->addr_val[idx + 1] = val2;
422 config->addr_type[idx + 1] = ETM_ADDR_TYPE_RANGE;
423 config->enable_ctrl1 |= (1 << (idx/2));
424 spin_unlock(&drvdata->spinlock);
425
426 return size;
427}
428static DEVICE_ATTR_RW(addr_range);
429
430static ssize_t addr_start_show(struct device *dev,
431 struct device_attribute *attr, char *buf)
432{
433 u8 idx;
434 unsigned long val;
435 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
436 struct etm_config *config = &drvdata->config;
437
438 spin_lock(&drvdata->spinlock);
439 idx = config->addr_idx;
440 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
441 config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
442 spin_unlock(&drvdata->spinlock);
443 return -EPERM;
444 }
445
446 val = config->addr_val[idx];
447 spin_unlock(&drvdata->spinlock);
448
449 return sprintf(buf, "%#lx\n", val);
450}
451
452static ssize_t addr_start_store(struct device *dev,
453 struct device_attribute *attr,
454 const char *buf, size_t size)
455{
456 u8 idx;
457 int ret;
458 unsigned long val;
459 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
460 struct etm_config *config = &drvdata->config;
461
462 ret = kstrtoul(buf, 16, &val);
463 if (ret)
464 return ret;
465
466 spin_lock(&drvdata->spinlock);
467 idx = config->addr_idx;
468 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
469 config->addr_type[idx] == ETM_ADDR_TYPE_START)) {
470 spin_unlock(&drvdata->spinlock);
471 return -EPERM;
472 }
473
474 config->addr_val[idx] = val;
475 config->addr_type[idx] = ETM_ADDR_TYPE_START;
476 config->startstop_ctrl |= (1 << idx);
477 config->enable_ctrl1 |= BIT(25);
478 spin_unlock(&drvdata->spinlock);
479
480 return size;
481}
482static DEVICE_ATTR_RW(addr_start);
483
484static ssize_t addr_stop_show(struct device *dev,
485 struct device_attribute *attr, char *buf)
486{
487 u8 idx;
488 unsigned long val;
489 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
490 struct etm_config *config = &drvdata->config;
491
492 spin_lock(&drvdata->spinlock);
493 idx = config->addr_idx;
494 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
495 config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
496 spin_unlock(&drvdata->spinlock);
497 return -EPERM;
498 }
499
500 val = config->addr_val[idx];
501 spin_unlock(&drvdata->spinlock);
502
503 return sprintf(buf, "%#lx\n", val);
504}
505
506static ssize_t addr_stop_store(struct device *dev,
507 struct device_attribute *attr,
508 const char *buf, size_t size)
509{
510 u8 idx;
511 int ret;
512 unsigned long val;
513 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
514 struct etm_config *config = &drvdata->config;
515
516 ret = kstrtoul(buf, 16, &val);
517 if (ret)
518 return ret;
519
520 spin_lock(&drvdata->spinlock);
521 idx = config->addr_idx;
522 if (!(config->addr_type[idx] == ETM_ADDR_TYPE_NONE ||
523 config->addr_type[idx] == ETM_ADDR_TYPE_STOP)) {
524 spin_unlock(&drvdata->spinlock);
525 return -EPERM;
526 }
527
528 config->addr_val[idx] = val;
529 config->addr_type[idx] = ETM_ADDR_TYPE_STOP;
530 config->startstop_ctrl |= (1 << (idx + 16));
531 config->enable_ctrl1 |= ETMTECR1_START_STOP;
532 spin_unlock(&drvdata->spinlock);
533
534 return size;
535}
536static DEVICE_ATTR_RW(addr_stop);
537
538static ssize_t addr_acctype_show(struct device *dev,
539 struct device_attribute *attr, char *buf)
540{
541 unsigned long val;
542 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
543 struct etm_config *config = &drvdata->config;
544
545 spin_lock(&drvdata->spinlock);
546 val = config->addr_acctype[config->addr_idx];
547 spin_unlock(&drvdata->spinlock);
548
549 return sprintf(buf, "%#lx\n", val);
550}
551
552static ssize_t addr_acctype_store(struct device *dev,
553 struct device_attribute *attr,
554 const char *buf, size_t size)
555{
556 int ret;
557 unsigned long val;
558 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
559 struct etm_config *config = &drvdata->config;
560
561 ret = kstrtoul(buf, 16, &val);
562 if (ret)
563 return ret;
564
565 spin_lock(&drvdata->spinlock);
566 config->addr_acctype[config->addr_idx] = val;
567 spin_unlock(&drvdata->spinlock);
568
569 return size;
570}
571static DEVICE_ATTR_RW(addr_acctype);
572
573static ssize_t cntr_idx_show(struct device *dev,
574 struct device_attribute *attr, char *buf)
575{
576 unsigned long val;
577 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
578 struct etm_config *config = &drvdata->config;
579
580 val = config->cntr_idx;
581 return sprintf(buf, "%#lx\n", val);
582}
583
584static ssize_t cntr_idx_store(struct device *dev,
585 struct device_attribute *attr,
586 const char *buf, size_t size)
587{
588 int ret;
589 unsigned long val;
590 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
591 struct etm_config *config = &drvdata->config;
592
593 ret = kstrtoul(buf, 16, &val);
594 if (ret)
595 return ret;
596
597 if (val >= drvdata->nr_cntr)
598 return -EINVAL;
599 /*
600 * Use spinlock to ensure index doesn't change while it gets
601 * dereferenced multiple times within a spinlock block elsewhere.
602 */
603 spin_lock(&drvdata->spinlock);
604 config->cntr_idx = val;
605 spin_unlock(&drvdata->spinlock);
606
607 return size;
608}
609static DEVICE_ATTR_RW(cntr_idx);
610
611static ssize_t cntr_rld_val_show(struct device *dev,
612 struct device_attribute *attr, char *buf)
613{
614 unsigned long val;
615 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
616 struct etm_config *config = &drvdata->config;
617
618 spin_lock(&drvdata->spinlock);
619 val = config->cntr_rld_val[config->cntr_idx];
620 spin_unlock(&drvdata->spinlock);
621
622 return sprintf(buf, "%#lx\n", val);
623}
624
625static ssize_t cntr_rld_val_store(struct device *dev,
626 struct device_attribute *attr,
627 const char *buf, size_t size)
628{
629 int ret;
630 unsigned long val;
631 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
632 struct etm_config *config = &drvdata->config;
633
634 ret = kstrtoul(buf, 16, &val);
635 if (ret)
636 return ret;
637
638 spin_lock(&drvdata->spinlock);
639 config->cntr_rld_val[config->cntr_idx] = val;
640 spin_unlock(&drvdata->spinlock);
641
642 return size;
643}
644static DEVICE_ATTR_RW(cntr_rld_val);
645
646static ssize_t cntr_event_show(struct device *dev,
647 struct device_attribute *attr, char *buf)
648{
649 unsigned long val;
650 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
651 struct etm_config *config = &drvdata->config;
652
653 spin_lock(&drvdata->spinlock);
654 val = config->cntr_event[config->cntr_idx];
655 spin_unlock(&drvdata->spinlock);
656
657 return sprintf(buf, "%#lx\n", val);
658}
659
660static ssize_t cntr_event_store(struct device *dev,
661 struct device_attribute *attr,
662 const char *buf, size_t size)
663{
664 int ret;
665 unsigned long val;
666 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
667 struct etm_config *config = &drvdata->config;
668
669 ret = kstrtoul(buf, 16, &val);
670 if (ret)
671 return ret;
672
673 spin_lock(&drvdata->spinlock);
674 config->cntr_event[config->cntr_idx] = val & ETM_EVENT_MASK;
675 spin_unlock(&drvdata->spinlock);
676
677 return size;
678}
679static DEVICE_ATTR_RW(cntr_event);
680
681static ssize_t cntr_rld_event_show(struct device *dev,
682 struct device_attribute *attr, char *buf)
683{
684 unsigned long val;
685 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
686 struct etm_config *config = &drvdata->config;
687
688 spin_lock(&drvdata->spinlock);
689 val = config->cntr_rld_event[config->cntr_idx];
690 spin_unlock(&drvdata->spinlock);
691
692 return sprintf(buf, "%#lx\n", val);
693}
694
695static ssize_t cntr_rld_event_store(struct device *dev,
696 struct device_attribute *attr,
697 const char *buf, size_t size)
698{
699 int ret;
700 unsigned long val;
701 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
702 struct etm_config *config = &drvdata->config;
703
704 ret = kstrtoul(buf, 16, &val);
705 if (ret)
706 return ret;
707
708 spin_lock(&drvdata->spinlock);
709 config->cntr_rld_event[config->cntr_idx] = val & ETM_EVENT_MASK;
710 spin_unlock(&drvdata->spinlock);
711
712 return size;
713}
714static DEVICE_ATTR_RW(cntr_rld_event);
715
716static ssize_t cntr_val_show(struct device *dev,
717 struct device_attribute *attr, char *buf)
718{
719 int i, ret = 0;
720 u32 val;
721 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
722 struct etm_config *config = &drvdata->config;
723
724 if (!local_read(&drvdata->mode)) {
725 spin_lock(&drvdata->spinlock);
726 for (i = 0; i < drvdata->nr_cntr; i++)
727 ret += sprintf(buf, "counter %d: %x\n",
728 i, config->cntr_val[i]);
729 spin_unlock(&drvdata->spinlock);
730 return ret;
731 }
732
733 for (i = 0; i < drvdata->nr_cntr; i++) {
734 val = etm_readl(drvdata, ETMCNTVRn(i));
735 ret += sprintf(buf, "counter %d: %x\n", i, val);
736 }
737
738 return ret;
739}
740
741static ssize_t cntr_val_store(struct device *dev,
742 struct device_attribute *attr,
743 const char *buf, size_t size)
744{
745 int ret;
746 unsigned long val;
747 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
748 struct etm_config *config = &drvdata->config;
749
750 ret = kstrtoul(buf, 16, &val);
751 if (ret)
752 return ret;
753
754 spin_lock(&drvdata->spinlock);
755 config->cntr_val[config->cntr_idx] = val;
756 spin_unlock(&drvdata->spinlock);
757
758 return size;
759}
760static DEVICE_ATTR_RW(cntr_val);
761
762static ssize_t seq_12_event_show(struct device *dev,
763 struct device_attribute *attr, char *buf)
764{
765 unsigned long val;
766 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
767 struct etm_config *config = &drvdata->config;
768
769 val = config->seq_12_event;
770 return sprintf(buf, "%#lx\n", val);
771}
772
773static ssize_t seq_12_event_store(struct device *dev,
774 struct device_attribute *attr,
775 const char *buf, size_t size)
776{
777 int ret;
778 unsigned long val;
779 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
780 struct etm_config *config = &drvdata->config;
781
782 ret = kstrtoul(buf, 16, &val);
783 if (ret)
784 return ret;
785
786 config->seq_12_event = val & ETM_EVENT_MASK;
787 return size;
788}
789static DEVICE_ATTR_RW(seq_12_event);
790
791static ssize_t seq_21_event_show(struct device *dev,
792 struct device_attribute *attr, char *buf)
793{
794 unsigned long val;
795 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
796 struct etm_config *config = &drvdata->config;
797
798 val = config->seq_21_event;
799 return sprintf(buf, "%#lx\n", val);
800}
801
802static ssize_t seq_21_event_store(struct device *dev,
803 struct device_attribute *attr,
804 const char *buf, size_t size)
805{
806 int ret;
807 unsigned long val;
808 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
809 struct etm_config *config = &drvdata->config;
810
811 ret = kstrtoul(buf, 16, &val);
812 if (ret)
813 return ret;
814
815 config->seq_21_event = val & ETM_EVENT_MASK;
816 return size;
817}
818static DEVICE_ATTR_RW(seq_21_event);
819
820static ssize_t seq_23_event_show(struct device *dev,
821 struct device_attribute *attr, char *buf)
822{
823 unsigned long val;
824 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
825 struct etm_config *config = &drvdata->config;
826
827 val = config->seq_23_event;
828 return sprintf(buf, "%#lx\n", val);
829}
830
831static ssize_t seq_23_event_store(struct device *dev,
832 struct device_attribute *attr,
833 const char *buf, size_t size)
834{
835 int ret;
836 unsigned long val;
837 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
838 struct etm_config *config = &drvdata->config;
839
840 ret = kstrtoul(buf, 16, &val);
841 if (ret)
842 return ret;
843
844 config->seq_23_event = val & ETM_EVENT_MASK;
845 return size;
846}
847static DEVICE_ATTR_RW(seq_23_event);
848
849static ssize_t seq_31_event_show(struct device *dev,
850 struct device_attribute *attr, char *buf)
851{
852 unsigned long val;
853 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
854 struct etm_config *config = &drvdata->config;
855
856 val = config->seq_31_event;
857 return sprintf(buf, "%#lx\n", val);
858}
859
860static ssize_t seq_31_event_store(struct device *dev,
861 struct device_attribute *attr,
862 const char *buf, size_t size)
863{
864 int ret;
865 unsigned long val;
866 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
867 struct etm_config *config = &drvdata->config;
868
869 ret = kstrtoul(buf, 16, &val);
870 if (ret)
871 return ret;
872
873 config->seq_31_event = val & ETM_EVENT_MASK;
874 return size;
875}
876static DEVICE_ATTR_RW(seq_31_event);
877
878static ssize_t seq_32_event_show(struct device *dev,
879 struct device_attribute *attr, char *buf)
880{
881 unsigned long val;
882 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
883 struct etm_config *config = &drvdata->config;
884
885 val = config->seq_32_event;
886 return sprintf(buf, "%#lx\n", val);
887}
888
889static ssize_t seq_32_event_store(struct device *dev,
890 struct device_attribute *attr,
891 const char *buf, size_t size)
892{
893 int ret;
894 unsigned long val;
895 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
896 struct etm_config *config = &drvdata->config;
897
898 ret = kstrtoul(buf, 16, &val);
899 if (ret)
900 return ret;
901
902 config->seq_32_event = val & ETM_EVENT_MASK;
903 return size;
904}
905static DEVICE_ATTR_RW(seq_32_event);
906
907static ssize_t seq_13_event_show(struct device *dev,
908 struct device_attribute *attr, char *buf)
909{
910 unsigned long val;
911 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
912 struct etm_config *config = &drvdata->config;
913
914 val = config->seq_13_event;
915 return sprintf(buf, "%#lx\n", val);
916}
917
918static ssize_t seq_13_event_store(struct device *dev,
919 struct device_attribute *attr,
920 const char *buf, size_t size)
921{
922 int ret;
923 unsigned long val;
924 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
925 struct etm_config *config = &drvdata->config;
926
927 ret = kstrtoul(buf, 16, &val);
928 if (ret)
929 return ret;
930
931 config->seq_13_event = val & ETM_EVENT_MASK;
932 return size;
933}
934static DEVICE_ATTR_RW(seq_13_event);
935
936static ssize_t seq_curr_state_show(struct device *dev,
937 struct device_attribute *attr, char *buf)
938{
939 unsigned long val, flags;
940 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
941 struct etm_config *config = &drvdata->config;
942
943 if (!local_read(&drvdata->mode)) {
944 val = config->seq_curr_state;
945 goto out;
946 }
947
948 pm_runtime_get_sync(dev->parent);
949 spin_lock_irqsave(&drvdata->spinlock, flags);
950
951 CS_UNLOCK(drvdata->base);
952 val = (etm_readl(drvdata, ETMSQR) & ETM_SQR_MASK);
953 CS_LOCK(drvdata->base);
954
955 spin_unlock_irqrestore(&drvdata->spinlock, flags);
956 pm_runtime_put(dev->parent);
957out:
958 return sprintf(buf, "%#lx\n", val);
959}
960
961static ssize_t seq_curr_state_store(struct device *dev,
962 struct device_attribute *attr,
963 const char *buf, size_t size)
964{
965 int ret;
966 unsigned long val;
967 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
968 struct etm_config *config = &drvdata->config;
969
970 ret = kstrtoul(buf, 16, &val);
971 if (ret)
972 return ret;
973
974 if (val > ETM_SEQ_STATE_MAX_VAL)
975 return -EINVAL;
976
977 config->seq_curr_state = val;
978
979 return size;
980}
981static DEVICE_ATTR_RW(seq_curr_state);
982
983static ssize_t ctxid_idx_show(struct device *dev,
984 struct device_attribute *attr, char *buf)
985{
986 unsigned long val;
987 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
988 struct etm_config *config = &drvdata->config;
989
990 val = config->ctxid_idx;
991 return sprintf(buf, "%#lx\n", val);
992}
993
994static ssize_t ctxid_idx_store(struct device *dev,
995 struct device_attribute *attr,
996 const char *buf, size_t size)
997{
998 int ret;
999 unsigned long val;
1000 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1001 struct etm_config *config = &drvdata->config;
1002
1003 ret = kstrtoul(buf, 16, &val);
1004 if (ret)
1005 return ret;
1006
1007 if (val >= drvdata->nr_ctxid_cmp)
1008 return -EINVAL;
1009
1010 /*
1011 * Use spinlock to ensure index doesn't change while it gets
1012 * dereferenced multiple times within a spinlock block elsewhere.
1013 */
1014 spin_lock(&drvdata->spinlock);
1015 config->ctxid_idx = val;
1016 spin_unlock(&drvdata->spinlock);
1017
1018 return size;
1019}
1020static DEVICE_ATTR_RW(ctxid_idx);
1021
1022static ssize_t ctxid_pid_show(struct device *dev,
1023 struct device_attribute *attr, char *buf)
1024{
1025 unsigned long val;
1026 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1027 struct etm_config *config = &drvdata->config;
1028
1029 /*
1030 * Don't use contextID tracing if coming from a PID namespace. See
1031 * comment in ctxid_pid_store().
1032 */
1033 if (task_active_pid_ns(current) != &init_pid_ns)
1034 return -EINVAL;
1035
1036 spin_lock(&drvdata->spinlock);
1037 val = config->ctxid_pid[config->ctxid_idx];
1038 spin_unlock(&drvdata->spinlock);
1039
1040 return sprintf(buf, "%#lx\n", val);
1041}
1042
1043static ssize_t ctxid_pid_store(struct device *dev,
1044 struct device_attribute *attr,
1045 const char *buf, size_t size)
1046{
1047 int ret;
1048 unsigned long pid;
1049 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1050 struct etm_config *config = &drvdata->config;
1051
1052 /*
1053 * When contextID tracing is enabled the tracers will insert the
1054 * value found in the contextID register in the trace stream. But if
1055 * a process is in a namespace the PID of that process as seen from the
1056 * namespace won't be what the kernel sees, something that makes the
1057 * feature confusing and can potentially leak kernel only information.
1058 * As such refuse to use the feature if @current is not in the initial
1059 * PID namespace.
1060 */
1061 if (task_active_pid_ns(current) != &init_pid_ns)
1062 return -EINVAL;
1063
1064 ret = kstrtoul(buf, 16, &pid);
1065 if (ret)
1066 return ret;
1067
1068 spin_lock(&drvdata->spinlock);
1069 config->ctxid_pid[config->ctxid_idx] = pid;
1070 spin_unlock(&drvdata->spinlock);
1071
1072 return size;
1073}
1074static DEVICE_ATTR_RW(ctxid_pid);
1075
1076static ssize_t ctxid_mask_show(struct device *dev,
1077 struct device_attribute *attr, char *buf)
1078{
1079 unsigned long val;
1080 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1081 struct etm_config *config = &drvdata->config;
1082
1083 /*
1084 * Don't use contextID tracing if coming from a PID namespace. See
1085 * comment in ctxid_pid_store().
1086 */
1087 if (task_active_pid_ns(current) != &init_pid_ns)
1088 return -EINVAL;
1089
1090 val = config->ctxid_mask;
1091 return sprintf(buf, "%#lx\n", val);
1092}
1093
1094static ssize_t ctxid_mask_store(struct device *dev,
1095 struct device_attribute *attr,
1096 const char *buf, size_t size)
1097{
1098 int ret;
1099 unsigned long val;
1100 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1101 struct etm_config *config = &drvdata->config;
1102
1103 /*
1104 * Don't use contextID tracing if coming from a PID namespace. See
1105 * comment in ctxid_pid_store().
1106 */
1107 if (task_active_pid_ns(current) != &init_pid_ns)
1108 return -EINVAL;
1109
1110 ret = kstrtoul(buf, 16, &val);
1111 if (ret)
1112 return ret;
1113
1114 config->ctxid_mask = val;
1115 return size;
1116}
1117static DEVICE_ATTR_RW(ctxid_mask);
1118
1119static ssize_t sync_freq_show(struct device *dev,
1120 struct device_attribute *attr, char *buf)
1121{
1122 unsigned long val;
1123 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1124 struct etm_config *config = &drvdata->config;
1125
1126 val = config->sync_freq;
1127 return sprintf(buf, "%#lx\n", val);
1128}
1129
1130static ssize_t sync_freq_store(struct device *dev,
1131 struct device_attribute *attr,
1132 const char *buf, size_t size)
1133{
1134 int ret;
1135 unsigned long val;
1136 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1137 struct etm_config *config = &drvdata->config;
1138
1139 ret = kstrtoul(buf, 16, &val);
1140 if (ret)
1141 return ret;
1142
1143 config->sync_freq = val & ETM_SYNC_MASK;
1144 return size;
1145}
1146static DEVICE_ATTR_RW(sync_freq);
1147
1148static ssize_t timestamp_event_show(struct device *dev,
1149 struct device_attribute *attr, char *buf)
1150{
1151 unsigned long val;
1152 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1153 struct etm_config *config = &drvdata->config;
1154
1155 val = config->timestamp_event;
1156 return sprintf(buf, "%#lx\n", val);
1157}
1158
1159static ssize_t timestamp_event_store(struct device *dev,
1160 struct device_attribute *attr,
1161 const char *buf, size_t size)
1162{
1163 int ret;
1164 unsigned long val;
1165 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1166 struct etm_config *config = &drvdata->config;
1167
1168 ret = kstrtoul(buf, 16, &val);
1169 if (ret)
1170 return ret;
1171
1172 config->timestamp_event = val & ETM_EVENT_MASK;
1173 return size;
1174}
1175static DEVICE_ATTR_RW(timestamp_event);
1176
1177static ssize_t cpu_show(struct device *dev,
1178 struct device_attribute *attr, char *buf)
1179{
1180 int val;
1181 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1182
1183 val = drvdata->cpu;
1184 return scnprintf(buf, PAGE_SIZE, "%d\n", val);
1185
1186}
1187static DEVICE_ATTR_RO(cpu);
1188
1189static ssize_t traceid_show(struct device *dev,
1190 struct device_attribute *attr, char *buf)
1191{
1192 unsigned long val;
1193 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1194
1195 val = etm_get_trace_id(drvdata);
1196
1197 return sprintf(buf, "%#lx\n", val);
1198}
1199
1200static ssize_t traceid_store(struct device *dev,
1201 struct device_attribute *attr,
1202 const char *buf, size_t size)
1203{
1204 int ret;
1205 unsigned long val;
1206 struct etm_drvdata *drvdata = dev_get_drvdata(dev->parent);
1207
1208 ret = kstrtoul(buf, 16, &val);
1209 if (ret)
1210 return ret;
1211
1212 drvdata->traceid = val & ETM_TRACEID_MASK;
1213 return size;
1214}
1215static DEVICE_ATTR_RW(traceid);
1216
1217static struct attribute *coresight_etm_attrs[] = {
1218 &dev_attr_nr_addr_cmp.attr,
1219 &dev_attr_nr_cntr.attr,
1220 &dev_attr_nr_ctxid_cmp.attr,
1221 &dev_attr_etmsr.attr,
1222 &dev_attr_reset.attr,
1223 &dev_attr_mode.attr,
1224 &dev_attr_trigger_event.attr,
1225 &dev_attr_enable_event.attr,
1226 &dev_attr_fifofull_level.attr,
1227 &dev_attr_addr_idx.attr,
1228 &dev_attr_addr_single.attr,
1229 &dev_attr_addr_range.attr,
1230 &dev_attr_addr_start.attr,
1231 &dev_attr_addr_stop.attr,
1232 &dev_attr_addr_acctype.attr,
1233 &dev_attr_cntr_idx.attr,
1234 &dev_attr_cntr_rld_val.attr,
1235 &dev_attr_cntr_event.attr,
1236 &dev_attr_cntr_rld_event.attr,
1237 &dev_attr_cntr_val.attr,
1238 &dev_attr_seq_12_event.attr,
1239 &dev_attr_seq_21_event.attr,
1240 &dev_attr_seq_23_event.attr,
1241 &dev_attr_seq_31_event.attr,
1242 &dev_attr_seq_32_event.attr,
1243 &dev_attr_seq_13_event.attr,
1244 &dev_attr_seq_curr_state.attr,
1245 &dev_attr_ctxid_idx.attr,
1246 &dev_attr_ctxid_pid.attr,
1247 &dev_attr_ctxid_mask.attr,
1248 &dev_attr_sync_freq.attr,
1249 &dev_attr_timestamp_event.attr,
1250 &dev_attr_traceid.attr,
1251 &dev_attr_cpu.attr,
1252 NULL,
1253};
1254
1255#define coresight_etm3x_reg(name, offset) \
1256 coresight_simple_reg32(struct etm_drvdata, name, offset)
1257
1258coresight_etm3x_reg(etmccr, ETMCCR);
1259coresight_etm3x_reg(etmccer, ETMCCER);
1260coresight_etm3x_reg(etmscr, ETMSCR);
1261coresight_etm3x_reg(etmidr, ETMIDR);
1262coresight_etm3x_reg(etmcr, ETMCR);
1263coresight_etm3x_reg(etmtraceidr, ETMTRACEIDR);
1264coresight_etm3x_reg(etmteevr, ETMTEEVR);
1265coresight_etm3x_reg(etmtssvr, ETMTSSCR);
1266coresight_etm3x_reg(etmtecr1, ETMTECR1);
1267coresight_etm3x_reg(etmtecr2, ETMTECR2);
1268
1269static struct attribute *coresight_etm_mgmt_attrs[] = {
1270 &dev_attr_etmccr.attr,
1271 &dev_attr_etmccer.attr,
1272 &dev_attr_etmscr.attr,
1273 &dev_attr_etmidr.attr,
1274 &dev_attr_etmcr.attr,
1275 &dev_attr_etmtraceidr.attr,
1276 &dev_attr_etmteevr.attr,
1277 &dev_attr_etmtssvr.attr,
1278 &dev_attr_etmtecr1.attr,
1279 &dev_attr_etmtecr2.attr,
1280 NULL,
1281};
1282
1283static const struct attribute_group coresight_etm_group = {
1284 .attrs = coresight_etm_attrs,
1285};
1286
1287static const struct attribute_group coresight_etm_mgmt_group = {
1288 .attrs = coresight_etm_mgmt_attrs,
1289 .name = "mgmt",
1290};
1291
1292const struct attribute_group *coresight_etm_groups[] = {
1293 &coresight_etm_group,
1294 &coresight_etm_mgmt_group,
1295 NULL,
1296};