14 #include <linux/kernel.h>
16 #include <linux/types.h>
19 #include <linux/device.h>
27 #include <linux/module.h>
29 #include <asm/sections.h>
51 static inline bool trace_isrunning(
struct tracectx *
t)
56 static int etm_setup_address_range(
struct tracectx *
t,
int n,
57 unsigned long start,
unsigned long end,
int exclude,
int data)
88 static int trace_start(
struct tracectx *t)
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);
124 v &= ~ETMCTRL_PROGRAM;
133 dev_dbg(t->
dev,
"Waiting for progbit to deassert timed out\n");
145 static int trace_stop(
struct tracectx *t)
155 dev_dbg(t->
dev,
"Waiting for progbit to assert timed out\n");
170 dev_dbg(t->
dev,
"Waiting for formatter flush to commence "
185 static int etb_getdatalen(
struct tracectx *t)
209 static void etm_dump(
void)
220 if (trace_isrunning(t))
225 length = etb_getdatalen(t);
249 static void sysrq_etm_dump(
int key)
256 .handler = sysrq_etm_dump,
257 .help_msg =
"ETM buffer dump",
271 static ssize_t etb_read(
struct file *file,
char __user *data,
272 size_t len, loff_t *ppos)
282 if (trace_isrunning(t)) {
289 total = etb_getdatalen(t);
295 length =
min(total * 4, (
int)len);
298 dev_dbg(t->
dev,
"ETB buffer length: %d\n", total);
300 for (i = 0; i < length / 4; i++)
322 static int etb_release(
struct inode *inode,
struct file *file)
332 .release = etb_release,
367 dev_dbg(&dev->
dev,
"Failed to obtain emu_src_ck.\n");
382 dev_dbg(&dev->
dev,
"ETB AMBA driver initialized.\n");
414 static struct amba_id etb_ids[] = {
428 .remove = etb_remove,
442 const char *buf,
size_t n)
447 if (
sscanf(buf,
"%u", &value) != 1)
451 ret = value ? trace_start(&
tracer) : trace_stop(&
tracer);
458 __ATTR(trace_running, 0644, trace_running_show, trace_running_store);
464 u32 etb_wa, etb_ra, etb_st, etb_fc, etm_ctrl, etm_st;
468 datalen = etb_getdatalen(&
tracer);
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",
499 __ATTR(trace_info, 0444, trace_info_show,
NULL);
512 const char *buf,
size_t n)
514 unsigned int cycacc, portsz;
516 if (
sscanf(buf,
"%u %u", &cycacc, &portsz) != 2)
525 tracer.etm_portsz = portsz & 0x0f;
532 __ATTR(trace_mode, 0644, trace_mode_show, trace_mode_store);
540 dev_dbg(&dev->
dev,
"ETM already initialized\n");
572 &trace_running_attr.
attr);
579 dev_dbg(&dev->
dev,
"Failed to create trace_info in sysfs\n");
583 dev_dbg(&dev->
dev,
"Failed to create trace_mode in sysfs\n");
585 dev_dbg(t->
dev,
"ETM AMBA driver initialized.\n");
618 static struct amba_id etm_ids[] = {
632 .remove = etm_remove,
636 static int __init etm_init(
void)