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