2 * linux/arch/arm/kernel/etm.c
4 * Driver for ARM's Embedded Trace Macrocell and Embedded Trace Buffer.
6 * Copyright (C) 2009 Nokia Corporation.
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License version 2 as
11 * published by the Free Software Foundation.
14 #include <linux/kernel.h>
15 #include <linux/init.h>
16 #include <linux/types.h>
18 #include <linux/sysrq.h>
19 #include <linux/device.h>
20 #include <linux/clk.h>
21 #include <linux/amba/bus.h>
23 #include <linux/uaccess.h>
24 #include <linux/miscdevice.h>
25 #include <linux/vmalloc.h>
26 #include <linux/mutex.h>
27 #include <linux/module.h>
28 #include <asm/hardware/coresight.h>
29 #include <asm/sections.h>
31 MODULE_LICENSE("GPL");
32 MODULE_AUTHOR("Alexander Shishkin");
38 unsigned int etb_bufsz
;
39 void __iomem
*etb_regs
;
40 void __iomem
*etm_regs
;
49 static struct tracectx tracer
;
51 static inline bool trace_isrunning(struct tracectx
*t
)
53 return !!(t
->flags
& TRACER_RUNNING
);
56 static int etm_setup_address_range(struct tracectx
*t
, int n
,
57 unsigned long start
, unsigned long end
, int exclude
, int data
)
59 u32 flags
= ETMAAT_ARM
| ETMAAT_IGNCONTEXTID
| ETMAAT_NSONLY
| \
62 if (n
< 1 || n
> t
->ncmppairs
)
65 /* comparators and ranges are numbered starting with 1 as opposed
66 * to bits in a word */
70 flags
|= ETMAAT_DLOADSTORE
;
72 flags
|= ETMAAT_IEXEC
;
74 /* first comparator for the range */
75 etm_writel(t
, flags
, ETMR_COMP_ACC_TYPE(n
* 2));
76 etm_writel(t
, start
, ETMR_COMP_VAL(n
* 2));
78 /* second comparator is right next to it */
79 etm_writel(t
, flags
, ETMR_COMP_ACC_TYPE(n
* 2 + 1));
80 etm_writel(t
, end
, ETMR_COMP_VAL(n
* 2 + 1));
82 flags
= exclude
? ETMTE_INCLEXCL
: 0;
83 etm_writel(t
, flags
| (1 << n
), ETMR_TRACEENCTRL
);
88 static int trace_start(struct tracectx
*t
)
91 unsigned long timeout
= TRACER_TIMEOUT
;
95 etb_writel(t
, 0, ETBR_FORMATTERCTRL
);
96 etb_writel(t
, 1, ETBR_CTRL
);
101 v
= ETMCTRL_OPTS
| ETMCTRL_PROGRAM
| ETMCTRL_PORTSIZE(t
->etm_portsz
);
103 if (t
->flags
& TRACER_CYCLE_ACC
)
104 v
|= ETMCTRL_CYCLEACCURATE
;
108 etm_writel(t
, v
, ETMR_CTRL
);
110 while (!(etm_readl(t
, ETMR_CTRL
) & ETMCTRL_PROGRAM
) && --timeout
)
113 dev_dbg(t
->dev
, "Waiting for progbit to assert timed out\n");
118 etm_setup_address_range(t
, 1, (unsigned long)_stext
,
119 (unsigned long)_etext
, 0, 0);
120 etm_writel(t
, 0, ETMR_TRACEENCTRL2
);
121 etm_writel(t
, 0, ETMR_TRACESSCTRL
);
122 etm_writel(t
, 0x6f, ETMR_TRACEENEVT
);
124 v
&= ~ETMCTRL_PROGRAM
;
125 v
|= ETMCTRL_PORTSEL
;
127 etm_writel(t
, v
, ETMR_CTRL
);
129 timeout
= TRACER_TIMEOUT
;
130 while (etm_readl(t
, ETMR_CTRL
) & ETMCTRL_PROGRAM
&& --timeout
)
133 dev_dbg(t
->dev
, "Waiting for progbit to deassert timed out\n");
140 t
->flags
|= TRACER_RUNNING
;
145 static int trace_stop(struct tracectx
*t
)
147 unsigned long timeout
= TRACER_TIMEOUT
;
151 etm_writel(t
, 0x440, ETMR_CTRL
);
152 while (!(etm_readl(t
, ETMR_CTRL
) & ETMCTRL_PROGRAM
) && --timeout
)
155 dev_dbg(t
->dev
, "Waiting for progbit to assert timed out\n");
163 etb_writel(t
, ETBFF_MANUAL_FLUSH
, ETBR_FORMATTERCTRL
);
165 timeout
= TRACER_TIMEOUT
;
166 while (etb_readl(t
, ETBR_FORMATTERCTRL
) &
167 ETBFF_MANUAL_FLUSH
&& --timeout
)
170 dev_dbg(t
->dev
, "Waiting for formatter flush to commence "
176 etb_writel(t
, 0, ETBR_CTRL
);
180 t
->flags
&= ~TRACER_RUNNING
;
185 static int etb_getdatalen(struct tracectx
*t
)
190 v
= etb_readl(t
, ETBR_STATUS
);
195 rp
= etb_readl(t
, ETBR_READADDR
);
196 wp
= etb_readl(t
, ETBR_WRITEADDR
);
199 etb_writel(t
, 0, ETBR_READADDR
);
200 etb_writel(t
, 0, ETBR_WRITEADDR
);
208 /* sysrq+v will always stop the running trace and leave it at that */
209 static void etm_dump(void)
211 struct tracectx
*t
= &tracer
;
216 printk(KERN_INFO
"No tracing hardware found\n");
220 if (trace_isrunning(t
))
225 length
= etb_getdatalen(t
);
227 if (length
== t
->etb_bufsz
)
228 first
= etb_readl(t
, ETBR_WRITEADDR
);
230 etb_writel(t
, first
, ETBR_READADDR
);
232 printk(KERN_INFO
"Trace buffer contents length: %d\n", length
);
233 printk(KERN_INFO
"--- ETB buffer begin ---\n");
234 for (; length
; length
--)
235 printk("%08x", cpu_to_be32(etb_readl(t
, ETBR_READMEM
)));
236 printk(KERN_INFO
"\n--- ETB buffer end ---\n");
238 /* deassert the overflow bit */
239 etb_writel(t
, 1, ETBR_CTRL
);
240 etb_writel(t
, 0, ETBR_CTRL
);
242 etb_writel(t
, 0, ETBR_TRIGGERCOUNT
);
243 etb_writel(t
, 0, ETBR_READADDR
);
244 etb_writel(t
, 0, ETBR_WRITEADDR
);
249 static void sysrq_etm_dump(int key
)
251 dev_dbg(tracer
.dev
, "Dumping ETB buffer\n");
255 static struct sysrq_key_op sysrq_etm_op
= {
256 .handler
= sysrq_etm_dump
,
257 .help_msg
= "etm-buffer-dump(v)",
261 static int etb_open(struct inode
*inode
, struct file
*file
)
263 if (!tracer
.etb_regs
)
266 file
->private_data
= &tracer
;
268 return nonseekable_open(inode
, file
);
271 static ssize_t
etb_read(struct file
*file
, char __user
*data
,
272 size_t len
, loff_t
*ppos
)
276 struct tracectx
*t
= file
->private_data
;
280 mutex_lock(&t
->mutex
);
282 if (trace_isrunning(t
)) {
289 total
= etb_getdatalen(t
);
290 if (total
== t
->etb_bufsz
)
291 first
= etb_readl(t
, ETBR_WRITEADDR
);
293 etb_writel(t
, first
, ETBR_READADDR
);
295 length
= min(total
* 4, (int)len
);
296 buf
= vmalloc(length
);
298 dev_dbg(t
->dev
, "ETB buffer length: %d\n", total
);
299 dev_dbg(t
->dev
, "ETB status reg: %x\n", etb_readl(t
, ETBR_STATUS
));
300 for (i
= 0; i
< length
/ 4; i
++)
301 buf
[i
] = etb_readl(t
, ETBR_READMEM
);
303 /* the only way to deassert overflow bit in ETB status is this */
304 etb_writel(t
, 1, ETBR_CTRL
);
305 etb_writel(t
, 0, ETBR_CTRL
);
307 etb_writel(t
, 0, ETBR_WRITEADDR
);
308 etb_writel(t
, 0, ETBR_READADDR
);
309 etb_writel(t
, 0, ETBR_TRIGGERCOUNT
);
313 length
-= copy_to_user(data
, buf
, length
);
317 mutex_unlock(&t
->mutex
);
322 static int etb_release(struct inode
*inode
, struct file
*file
)
324 /* there's nothing to do here, actually */
328 static const struct file_operations etb_fops
= {
329 .owner
= THIS_MODULE
,
332 .release
= etb_release
,
336 static struct miscdevice etb_miscdev
= {
342 static int etb_probe(struct amba_device
*dev
, const struct amba_id
*id
)
344 struct tracectx
*t
= &tracer
;
347 ret
= amba_request_regions(dev
, NULL
);
351 t
->etb_regs
= ioremap_nocache(dev
->res
.start
, resource_size(&dev
->res
));
357 amba_set_drvdata(dev
, t
);
359 etb_miscdev
.parent
= &dev
->dev
;
361 ret
= misc_register(&etb_miscdev
);
365 t
->emu_clk
= clk_get(&dev
->dev
, "emu_src_ck");
366 if (IS_ERR(t
->emu_clk
)) {
367 dev_dbg(&dev
->dev
, "Failed to obtain emu_src_ck.\n");
371 clk_enable(t
->emu_clk
);
374 t
->etb_bufsz
= etb_readl(t
, ETBR_DEPTH
);
375 dev_dbg(&dev
->dev
, "Size: %x\n", t
->etb_bufsz
);
377 /* make sure trace capture is disabled */
378 etb_writel(t
, 0, ETBR_CTRL
);
379 etb_writel(t
, 0x1000, ETBR_FORMATTERCTRL
);
382 dev_dbg(&dev
->dev
, "ETB AMBA driver initialized.\n");
388 amba_set_drvdata(dev
, NULL
);
389 iounmap(t
->etb_regs
);
392 amba_release_regions(dev
);
397 static int etb_remove(struct amba_device
*dev
)
399 struct tracectx
*t
= amba_get_drvdata(dev
);
401 amba_set_drvdata(dev
, NULL
);
403 iounmap(t
->etb_regs
);
406 clk_disable(t
->emu_clk
);
409 amba_release_regions(dev
);
414 static struct amba_id etb_ids
[] = {
422 static struct amba_driver etb_driver
= {
425 .owner
= THIS_MODULE
,
428 .remove
= etb_remove
,
432 /* use a sysfs file "trace_running" to start/stop tracing */
433 static ssize_t
trace_running_show(struct kobject
*kobj
,
434 struct kobj_attribute
*attr
,
437 return sprintf(buf
, "%x\n", trace_isrunning(&tracer
));
440 static ssize_t
trace_running_store(struct kobject
*kobj
,
441 struct kobj_attribute
*attr
,
442 const char *buf
, size_t n
)
447 if (sscanf(buf
, "%u", &value
) != 1)
450 mutex_lock(&tracer
.mutex
);
451 ret
= value
? trace_start(&tracer
) : trace_stop(&tracer
);
452 mutex_unlock(&tracer
.mutex
);
457 static struct kobj_attribute trace_running_attr
=
458 __ATTR(trace_running
, 0644, trace_running_show
, trace_running_store
);
460 static ssize_t
trace_info_show(struct kobject
*kobj
,
461 struct kobj_attribute
*attr
,
464 u32 etb_wa
, etb_ra
, etb_st
, etb_fc
, etm_ctrl
, etm_st
;
468 datalen
= etb_getdatalen(&tracer
);
469 etb_wa
= etb_readl(&tracer
, ETBR_WRITEADDR
);
470 etb_ra
= etb_readl(&tracer
, ETBR_READADDR
);
471 etb_st
= etb_readl(&tracer
, ETBR_STATUS
);
472 etb_fc
= etb_readl(&tracer
, ETBR_FORMATTERCTRL
);
476 etm_ctrl
= etm_readl(&tracer
, ETMR_CTRL
);
477 etm_st
= etm_readl(&tracer
, ETMR_STATUS
);
480 return sprintf(buf
, "Trace buffer len: %d\nComparator pairs: %d\n"
481 "ETBR_WRITEADDR:\t%08x\n"
482 "ETBR_READADDR:\t%08x\n"
483 "ETBR_STATUS:\t%08x\n"
484 "ETBR_FORMATTERCTRL:\t%08x\n"
486 "ETMR_STATUS:\t%08x\n",
498 static struct kobj_attribute trace_info_attr
=
499 __ATTR(trace_info
, 0444, trace_info_show
, NULL
);
501 static ssize_t
trace_mode_show(struct kobject
*kobj
,
502 struct kobj_attribute
*attr
,
505 return sprintf(buf
, "%d %d\n",
506 !!(tracer
.flags
& TRACER_CYCLE_ACC
),
510 static ssize_t
trace_mode_store(struct kobject
*kobj
,
511 struct kobj_attribute
*attr
,
512 const char *buf
, size_t n
)
514 unsigned int cycacc
, portsz
;
516 if (sscanf(buf
, "%u %u", &cycacc
, &portsz
) != 2)
519 mutex_lock(&tracer
.mutex
);
521 tracer
.flags
|= TRACER_CYCLE_ACC
;
523 tracer
.flags
&= ~TRACER_CYCLE_ACC
;
525 tracer
.etm_portsz
= portsz
& 0x0f;
526 mutex_unlock(&tracer
.mutex
);
531 static struct kobj_attribute trace_mode_attr
=
532 __ATTR(trace_mode
, 0644, trace_mode_show
, trace_mode_store
);
534 static int etm_probe(struct amba_device
*dev
, const struct amba_id
*id
)
536 struct tracectx
*t
= &tracer
;
540 dev_dbg(&dev
->dev
, "ETM already initialized\n");
545 ret
= amba_request_regions(dev
, NULL
);
549 t
->etm_regs
= ioremap_nocache(dev
->res
.start
, resource_size(&dev
->res
));
555 amba_set_drvdata(dev
, t
);
557 mutex_init(&t
->mutex
);
559 t
->flags
= TRACER_CYCLE_ACC
;
563 (void)etm_readl(t
, ETMMR_PDSR
);
564 /* dummy first read */
565 (void)etm_readl(&tracer
, ETMMR_OSSRR
);
567 t
->ncmppairs
= etm_readl(t
, ETMR_CONFCODE
) & 0xf;
568 etm_writel(t
, 0x440, ETMR_CTRL
);
571 ret
= sysfs_create_file(&dev
->dev
.kobj
,
572 &trace_running_attr
.attr
);
576 /* failing to create any of these two is not fatal */
577 ret
= sysfs_create_file(&dev
->dev
.kobj
, &trace_info_attr
.attr
);
579 dev_dbg(&dev
->dev
, "Failed to create trace_info in sysfs\n");
581 ret
= sysfs_create_file(&dev
->dev
.kobj
, &trace_mode_attr
.attr
);
583 dev_dbg(&dev
->dev
, "Failed to create trace_mode in sysfs\n");
585 dev_dbg(t
->dev
, "ETM AMBA driver initialized.\n");
591 amba_set_drvdata(dev
, NULL
);
592 iounmap(t
->etm_regs
);
595 amba_release_regions(dev
);
600 static int etm_remove(struct amba_device
*dev
)
602 struct tracectx
*t
= amba_get_drvdata(dev
);
604 amba_set_drvdata(dev
, NULL
);
606 iounmap(t
->etm_regs
);
609 amba_release_regions(dev
);
611 sysfs_remove_file(&dev
->dev
.kobj
, &trace_running_attr
.attr
);
612 sysfs_remove_file(&dev
->dev
.kobj
, &trace_info_attr
.attr
);
613 sysfs_remove_file(&dev
->dev
.kobj
, &trace_mode_attr
.attr
);
618 static struct amba_id etm_ids
[] = {
626 static struct amba_driver etm_driver
= {
629 .owner
= THIS_MODULE
,
632 .remove
= etm_remove
,
636 static int __init
etm_init(void)
640 retval
= amba_driver_register(&etb_driver
);
642 printk(KERN_ERR
"Failed to register etb\n");
646 retval
= amba_driver_register(&etm_driver
);
648 amba_driver_unregister(&etb_driver
);
649 printk(KERN_ERR
"Failed to probe etm\n");
653 /* not being able to install this handler is not fatal */
654 (void)register_sysrq_key('v', &sysrq_etm_op
);
659 device_initcall(etm_init
);