mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-08 03:40:35 +09:00
ARM: etm: Add sysfs entry to disable branch_output flag
Change-Id: Ib91208a2c33621aa2d7bd9aa72bfbc670d9d5f1d Signed-off-by: Arve Hjønnevåg <arve@android.com>
This commit is contained in:
@@ -19,11 +19,13 @@
|
||||
#define TRACER_CYCLE_ACC_BIT 2
|
||||
#define TRACER_TRACE_DATA_BIT 3
|
||||
#define TRACER_TIMESTAMP_BIT 4
|
||||
#define TRACER_BRANCHOUTPUT_BIT 5
|
||||
#define TRACER_ACCESSED BIT(TRACER_ACCESSED_BIT)
|
||||
#define TRACER_RUNNING BIT(TRACER_RUNNING_BIT)
|
||||
#define TRACER_CYCLE_ACC BIT(TRACER_CYCLE_ACC_BIT)
|
||||
#define TRACER_TRACE_DATA BIT(TRACER_TRACE_DATA_BIT)
|
||||
#define TRACER_TIMESTAMP BIT(TRACER_TIMESTAMP_BIT)
|
||||
#define TRACER_BRANCHOUTPUT BIT(TRACER_BRANCHOUTPUT_BIT)
|
||||
|
||||
#define TRACER_TIMEOUT 10000
|
||||
|
||||
@@ -126,8 +128,7 @@
|
||||
#define ETMR_VIEWDATACTRL3 0x3c
|
||||
#define ETMVDC3_EXCLONLY BIT(16)
|
||||
|
||||
#define ETMCTRL_OPTS (ETMCTRL_DO_CPRT | \
|
||||
ETMCTRL_BRANCH_OUTPUT)
|
||||
#define ETMCTRL_OPTS (ETMCTRL_DO_CPRT)
|
||||
|
||||
#define ETMR_ID 0x1e4
|
||||
#define ETMIDR_VERSION(x) (((x) >> 4) & 0xff)
|
||||
|
||||
@@ -115,6 +115,9 @@ static int trace_start_etm(struct tracectx *t, int id)
|
||||
if (t->flags & TRACER_CYCLE_ACC)
|
||||
v |= ETMCTRL_CYCLEACCURATE;
|
||||
|
||||
if (t->flags & TRACER_BRANCHOUTPUT)
|
||||
v |= ETMCTRL_BRANCH_OUTPUT;
|
||||
|
||||
if (t->flags & TRACER_TRACE_DATA)
|
||||
v |= ETMCTRL_DATA_DO_ADDR;
|
||||
|
||||
@@ -683,6 +686,36 @@ static struct kobj_attribute trace_contextid_size_attr =
|
||||
__ATTR(trace_contextid_size, 0644,
|
||||
trace_contextid_size_show, trace_contextid_size_store);
|
||||
|
||||
static ssize_t trace_branch_output_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
char *buf)
|
||||
{
|
||||
return sprintf(buf, "%d\n", !!(tracer.flags & TRACER_BRANCHOUTPUT));
|
||||
}
|
||||
|
||||
static ssize_t trace_branch_output_store(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
const char *buf, size_t n)
|
||||
{
|
||||
unsigned int branch_output;
|
||||
|
||||
if (sscanf(buf, "%u", &branch_output) != 1)
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&tracer.mutex);
|
||||
if (branch_output)
|
||||
tracer.flags |= TRACER_BRANCHOUTPUT;
|
||||
else
|
||||
tracer.flags &= ~TRACER_BRANCHOUTPUT;
|
||||
mutex_unlock(&tracer.mutex);
|
||||
|
||||
return n;
|
||||
}
|
||||
|
||||
static struct kobj_attribute trace_branch_output_attr =
|
||||
__ATTR(trace_branch_output, 0644,
|
||||
trace_branch_output_show, trace_branch_output_store);
|
||||
|
||||
static ssize_t trace_timestamp_show(struct kobject *kobj,
|
||||
struct kobj_attribute *attr,
|
||||
char *buf)
|
||||
@@ -820,7 +853,7 @@ static int etm_probe(struct amba_device *dev, const struct amba_id *id)
|
||||
|
||||
amba_set_drvdata(dev, t->etm_regs[t->etm_regs_count]);
|
||||
|
||||
t->flags = TRACER_CYCLE_ACC | TRACER_TRACE_DATA;
|
||||
t->flags = TRACER_CYCLE_ACC | TRACER_TRACE_DATA | TRACER_BRANCHOUTPUT;
|
||||
t->etm_portsz = 1;
|
||||
t->etm_contextid_size = 3;
|
||||
|
||||
@@ -861,6 +894,12 @@ static int etm_probe(struct amba_device *dev, const struct amba_id *id)
|
||||
dev_dbg(&dev->dev,
|
||||
"Failed to create trace_contextid_size in sysfs\n");
|
||||
|
||||
ret = sysfs_create_file(&dev->dev.kobj,
|
||||
&trace_branch_output_attr.attr);
|
||||
if (ret)
|
||||
dev_dbg(&dev->dev,
|
||||
"Failed to create trace_branch_output in sysfs\n");
|
||||
|
||||
if (etmccer & ETMCCER_TIMESTAMPING_IMPLEMENTED) {
|
||||
ret = sysfs_create_file(&dev->dev.kobj,
|
||||
&trace_timestamp_attr.attr);
|
||||
|
||||
Reference in New Issue
Block a user