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 
22 static 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 }
31 static DEVICE_ATTR_RO(nr_addr_cmp);
32 
33 static 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 }
41 static DEVICE_ATTR_RO(nr_cntr);
42 
43 static 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 }
52 static DEVICE_ATTR_RO(nr_ctxid_cmp);
53 
54 static 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 }
72 static DEVICE_ATTR_RO(etmsr);
73 
74 static 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 }
102 static DEVICE_ATTR_WO(reset);
103 
104 static 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 
115 static 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 
173 err_unlock:
174 	spin_unlock(&drvdata->spinlock);
175 	return ret;
176 }
177 static DEVICE_ATTR_RW(mode);
178 
179 static 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 
190 static 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 }
207 static DEVICE_ATTR_RW(trigger_event);
208 
209 static 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 
220 static 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 }
237 static DEVICE_ATTR_RW(enable_event);
238 
239 static 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 
250 static 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 }
267 static DEVICE_ATTR_RW(fifofull_level);
268 
269 static 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 
280 static 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 }
306 static DEVICE_ATTR_RW(addr_idx);
307 
308 static 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 
330 static 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 }
358 static DEVICE_ATTR_RW(addr_single);
359 
360 static 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 
389 static 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 }
427 static DEVICE_ATTR_RW(addr_range);
428 
429 static 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 
451 static 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 }
481 static DEVICE_ATTR_RW(addr_start);
482 
483 static 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 
505 static 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 }
535 static DEVICE_ATTR_RW(addr_stop);
536 
537 static 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 
551 static 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 }
570 static DEVICE_ATTR_RW(addr_acctype);
571 
572 static 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 
583 static 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 }
608 static DEVICE_ATTR_RW(cntr_idx);
609 
610 static 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 
624 static 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 }
643 static DEVICE_ATTR_RW(cntr_rld_val);
644 
645 static 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 
659 static 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 }
678 static DEVICE_ATTR_RW(cntr_event);
679 
680 static 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 
694 static 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 }
713 static DEVICE_ATTR_RW(cntr_rld_event);
714 
715 static 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 
740 static 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 }
759 static DEVICE_ATTR_RW(cntr_val);
760 
761 static 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 
772 static 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 }
788 static DEVICE_ATTR_RW(seq_12_event);
789 
790 static 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 
801 static 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 }
817 static DEVICE_ATTR_RW(seq_21_event);
818 
819 static 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 
830 static 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 }
846 static DEVICE_ATTR_RW(seq_23_event);
847 
848 static 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 
859 static 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 }
875 static DEVICE_ATTR_RW(seq_31_event);
876 
877 static 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 
888 static 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 }
904 static DEVICE_ATTR_RW(seq_32_event);
905 
906 static 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 
917 static 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 }
933 static DEVICE_ATTR_RW(seq_13_event);
934 
935 static 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);
956 out:
957 	return sprintf(buf, "%#lx\n", val);
958 }
959 
960 static 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 }
980 static DEVICE_ATTR_RW(seq_curr_state);
981 
982 static 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 
993 static 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 }
1019 static DEVICE_ATTR_RW(ctxid_idx);
1020 
1021 static 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 
1035 static 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 }
1057 static DEVICE_ATTR_RW(ctxid_pid);
1058 
1059 static 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 
1070 static 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 }
1086 static DEVICE_ATTR_RW(ctxid_mask);
1087 
1088 static 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 
1099 static 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 }
1115 static DEVICE_ATTR_RW(sync_freq);
1116 
1117 static 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 
1128 static 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 }
1144 static DEVICE_ATTR_RW(timestamp_event);
1145 
1146 static 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 }
1156 static DEVICE_ATTR_RO(cpu);
1157 
1158 static 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 
1169 static 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 }
1184 static DEVICE_ATTR_RW(traceid);
1185 
1186 static 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_etm3x_simple_func(name, offset)			\
1225 	coresight_simple_func(struct etm_drvdata, name, offset)
1226 
1227 coresight_etm3x_simple_func(etmccr, ETMCCR);
1228 coresight_etm3x_simple_func(etmccer, ETMCCER);
1229 coresight_etm3x_simple_func(etmscr, ETMSCR);
1230 coresight_etm3x_simple_func(etmidr, ETMIDR);
1231 coresight_etm3x_simple_func(etmcr, ETMCR);
1232 coresight_etm3x_simple_func(etmtraceidr, ETMTRACEIDR);
1233 coresight_etm3x_simple_func(etmteevr, ETMTEEVR);
1234 coresight_etm3x_simple_func(etmtssvr, ETMTSSCR);
1235 coresight_etm3x_simple_func(etmtecr1, ETMTECR1);
1236 coresight_etm3x_simple_func(etmtecr2, ETMTECR2);
1237 
1238 static struct attribute *coresight_etm_mgmt_attrs[] = {
1239 	&dev_attr_etmccr.attr,
1240 	&dev_attr_etmccer.attr,
1241 	&dev_attr_etmscr.attr,
1242 	&dev_attr_etmidr.attr,
1243 	&dev_attr_etmcr.attr,
1244 	&dev_attr_etmtraceidr.attr,
1245 	&dev_attr_etmteevr.attr,
1246 	&dev_attr_etmtssvr.attr,
1247 	&dev_attr_etmtecr1.attr,
1248 	&dev_attr_etmtecr2.attr,
1249 	NULL,
1250 };
1251 
1252 static const struct attribute_group coresight_etm_group = {
1253 	.attrs = coresight_etm_attrs,
1254 };
1255 
1256 static const struct attribute_group coresight_etm_mgmt_group = {
1257 	.attrs = coresight_etm_mgmt_attrs,
1258 	.name = "mgmt",
1259 };
1260 
1261 const struct attribute_group *coresight_etm_groups[] = {
1262 	&coresight_etm_group,
1263 	&coresight_etm_mgmt_group,
1264 	NULL,
1265 };
1266