From patchwork Wed Jun 13 02:01:23 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: John Stultz X-Patchwork-Id: 9252 Return-Path: X-Original-To: patchwork@peony.canonical.com Delivered-To: patchwork@peony.canonical.com Received: from fiordland.canonical.com (fiordland.canonical.com [91.189.94.145]) by peony.canonical.com (Postfix) with ESMTP id 37B9323E37 for ; Wed, 13 Jun 2012 02:01:59 +0000 (UTC) Received: from mail-gh0-f180.google.com (mail-gh0-f180.google.com [209.85.160.180]) by fiordland.canonical.com (Postfix) with ESMTP id E6AA1A18221 for ; Wed, 13 Jun 2012 02:01:58 +0000 (UTC) Received: by mail-gh0-f180.google.com with SMTP id z12so33764ghb.11 for ; Tue, 12 Jun 2012 19:01:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-forwarded-to:x-forwarded-for:delivered-to:received-spf:from:to:cc :subject:date:message-id:x-mailer:in-reply-to:references :mime-version:content-type:content-transfer-encoding :x-content-scanned:x-cbid:x-gm-message-state; bh=ojQDNeZkSMZ29PdYhU4LSiqdFb5zX+inKNuQZVZ/JOY=; b=XmvBTFxbXGC8yxEtRMko9aPjRUvifv6wBdXM5j98WiQaA4tQzIQvgj7gIevw7yIp/J AZ4GR2vCSmTptmn0uSSU6QH+fs6lkfGRBbWQJtK9irBkoJeVnVJqPPJi/YxYeYLd40QK lavJhEuxMmtCKxtlChcj/682siNAvv/KWqx92ua8KzoOW6qJjso2HWCAOWTBJa5dyLLM huBSbJ+VDIprFBG2d7XlR4XMVBtXp2IWj5OsDuIYyc8Y3CZrzURu4ku9y9HH+G5W63fB 7uiv6N1tOWjXiYoQo/yO/c71v06H7QHKq/lceWdHj9qWMfG6Q5ffwBpH7uuzYcdsv9Rw Q6/Q== Received: by 10.50.203.39 with SMTP id kn7mr9588715igc.53.1339552918261; Tue, 12 Jun 2012 19:01:58 -0700 (PDT) X-Forwarded-To: linaro-patchwork@canonical.com X-Forwarded-For: patch@linaro.org linaro-patchwork@canonical.com Delivered-To: patches@linaro.org Received: by 10.231.24.148 with SMTP id v20csp200433ibb; Tue, 12 Jun 2012 19:01:57 -0700 (PDT) Received: by 10.68.237.166 with SMTP id vd6mr44658754pbc.139.1339552917582; Tue, 12 Jun 2012 19:01:57 -0700 (PDT) Received: from e3.ny.us.ibm.com (e3.ny.us.ibm.com. [32.97.182.143]) by mx.google.com with ESMTPS id pk6si4900399pbc.270.2012.06.12.19.01.56 (version=TLSv1/SSLv3 cipher=OTHER); Tue, 12 Jun 2012 19:01:57 -0700 (PDT) Received-SPF: pass (google.com: domain of jstultz@us.ibm.com designates 32.97.182.143 as permitted sender) client-ip=32.97.182.143; Authentication-Results: mx.google.com; spf=pass (google.com: domain of jstultz@us.ibm.com designates 32.97.182.143 as permitted sender) smtp.mail=jstultz@us.ibm.com Received: from /spool/local by e3.ny.us.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Tue, 12 Jun 2012 22:01:56 -0400 Received: from d01dlp02.pok.ibm.com (9.56.224.85) by e3.ny.us.ibm.com (192.168.1.103) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Tue, 12 Jun 2012 22:01:54 -0400 Received: from d01relay04.pok.ibm.com (d01relay04.pok.ibm.com [9.56.227.236]) by d01dlp02.pok.ibm.com (Postfix) with ESMTP id 0D8E56E804C; Tue, 12 Jun 2012 22:01:54 -0400 (EDT) Received: from d03av04.boulder.ibm.com (d03av04.boulder.ibm.com [9.17.195.170]) by d01relay04.pok.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id q5D21qsb177512; Tue, 12 Jun 2012 22:01:53 -0400 Received: from d03av04.boulder.ibm.com (loopback [127.0.0.1]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id q5D21oBJ020497; Tue, 12 Jun 2012 20:01:50 -0600 Received: from kernel.beaverton.ibm.com (kernel.beaverton.ibm.com [9.47.67.96]) by d03av04.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVin) with ESMTP id q5D21o1u020463; Tue, 12 Jun 2012 20:01:50 -0600 Received: by kernel.beaverton.ibm.com (Postfix, from userid 1056) id F3F35C0626; Tue, 12 Jun 2012 19:01:40 -0700 (PDT) From: John Stultz To: LKML Cc: =?UTF-8?q?Arve=20Hj=C3=B8nnev=C3=A5g?= , Russell King , Paul Gortmaker , Alexander Shishkin , Mathieu Poirier , John Stultz Subject: [PATCH 05/15] ARM: etm: Configure data tracing Date: Tue, 12 Jun 2012 19:01:23 -0700 Message-Id: <1339552887-17204-6-git-send-email-john.stultz@linaro.org> X-Mailer: git-send-email 1.7.3.2.146.gca209 In-Reply-To: <1339552887-17204-1-git-send-email-john.stultz@linaro.org> References: <1339552887-17204-1-git-send-email-john.stultz@linaro.org> MIME-Version: 1.0 X-Content-Scanned: Fidelis XPS MAILER x-cbid: 12061302-8974-0000-0000-00000A06045C X-Gm-Message-State: ALoCoQnQncX48YmpnMIJq8pfT24Zz+8tL+XRPwPp3ib1DfpRkIJArLNTaECJl8CrzvmivuXNvGPs From: Arve Hjønnevåg The old code enabled data tracing, but did not configure the range. We now configure it to trace all data addresses by default, and add a trace_data_range attribute to change the range or disable data tracing. CC: Russell King CC: Paul Gortmaker CC: Alexander Shishkin CC: Mathieu Poirier Acked-by: Alexander Shishkin Signed-off-by: Arve Hjønnevåg Signed-off-by: John Stultz --- arch/arm/include/asm/hardware/coresight.h | 10 +++- arch/arm/kernel/etm.c | 77 +++++++++++++++++++++++++++- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/arch/arm/include/asm/hardware/coresight.h b/arch/arm/include/asm/hardware/coresight.h index 7ecd793..6ea507f 100644 --- a/arch/arm/include/asm/hardware/coresight.h +++ b/arch/arm/include/asm/hardware/coresight.h @@ -17,9 +17,11 @@ #define TRACER_ACCESSED_BIT 0 #define TRACER_RUNNING_BIT 1 #define TRACER_CYCLE_ACC_BIT 2 +#define TRACER_TRACE_DATA_BIT 3 #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_TIMEOUT 10000 @@ -113,8 +115,14 @@ #define ETMR_TRACEENCTRL 0x24 #define ETMTE_INCLEXCL BIT(24) #define ETMR_TRACEENEVT 0x20 + +#define ETMR_VIEWDATAEVT 0x30 +#define ETMR_VIEWDATACTRL1 0x34 +#define ETMR_VIEWDATACTRL2 0x38 +#define ETMR_VIEWDATACTRL3 0x3c +#define ETMVDC3_EXCLONLY BIT(16) + #define ETMCTRL_OPTS (ETMCTRL_DO_CPRT | \ - ETMCTRL_DATA_DO_ADDR | \ ETMCTRL_BRANCH_OUTPUT | \ ETMCTRL_DO_CONTEXTID) diff --git a/arch/arm/kernel/etm.c b/arch/arm/kernel/etm.c index bf34d34..c651cf9 100644 --- a/arch/arm/kernel/etm.c +++ b/arch/arm/kernel/etm.c @@ -43,6 +43,8 @@ struct tracectx { int etm_portsz; unsigned long range_start; unsigned long range_end; + unsigned long data_range_start; + unsigned long data_range_end; struct device *dev; struct clk *emu_clk; struct mutex mutex; @@ -84,8 +86,15 @@ static int etm_setup_address_range(struct tracectx *t, int n, etm_writel(t, flags, ETMR_COMP_ACC_TYPE(n * 2 + 1)); etm_writel(t, end, ETMR_COMP_VAL(n * 2 + 1)); - flags = exclude ? ETMTE_INCLEXCL : 0; - etm_writel(t, flags | (1 << n), ETMR_TRACEENCTRL); + if (data) { + flags = exclude ? ETMVDC3_EXCLONLY : 0; + if (exclude) + n += 8; + etm_writel(t, flags | BIT(n), ETMR_VIEWDATACTRL3); + } else { + flags = exclude ? ETMTE_INCLEXCL : 0; + etm_writel(t, flags | (1 << n), ETMR_TRACEENCTRL); + } return 0; } @@ -109,6 +118,9 @@ static int trace_start(struct tracectx *t) if (t->flags & TRACER_CYCLE_ACC) v |= ETMCTRL_CYCLEACCURATE; + if (t->flags & TRACER_TRACE_DATA) + v |= ETMCTRL_DATA_DO_ADDR; + etm_unlock(t); etm_writel(t, v, ETMR_CTRL); @@ -131,6 +143,17 @@ static int trace_start(struct tracectx *t) etm_writel(t, 0, ETMR_TRACESSCTRL); etm_writel(t, 0x6f, ETMR_TRACEENEVT); + etm_writel(t, 0, ETMR_VIEWDATACTRL1); + etm_writel(t, 0, ETMR_VIEWDATACTRL2); + + if (t->data_range_start || t->data_range_end) + etm_setup_address_range(t, 2, t->data_range_start, + t->data_range_end, 0, 1); + else + etm_writel(t, ETMVDC3_EXCLONLY, ETMR_VIEWDATACTRL3); + + etm_writel(t, 0x6f, ETMR_VIEWDATAEVT); + v &= ~ETMCTRL_PROGRAM; v |= ETMCTRL_PORTSEL; @@ -564,6 +587,48 @@ static ssize_t trace_range_store(struct kobject *kobj, static struct kobj_attribute trace_range_attr = __ATTR(trace_range, 0644, trace_range_show, trace_range_store); +static ssize_t trace_data_range_show(struct kobject *kobj, + struct kobj_attribute *attr, + char *buf) +{ + unsigned long range_start; + u64 range_end; + mutex_lock(&tracer.mutex); + range_start = tracer.data_range_start; + range_end = tracer.data_range_end; + if (!range_end && (tracer.flags & TRACER_TRACE_DATA)) + range_end = 0x100000000ULL; + mutex_unlock(&tracer.mutex); + return sprintf(buf, "%08lx %08llx\n", range_start, range_end); +} + +static ssize_t trace_data_range_store(struct kobject *kobj, + struct kobj_attribute *attr, + const char *buf, size_t n) +{ + unsigned long range_start; + u64 range_end; + + if (sscanf(buf, "%lx %llx", &range_start, &range_end) != 2) + return -EINVAL; + + mutex_lock(&tracer.mutex); + tracer.data_range_start = range_start; + tracer.data_range_end = (unsigned long)range_end; + if (range_end) + tracer.flags |= TRACER_TRACE_DATA; + else + tracer.flags &= ~TRACER_TRACE_DATA; + mutex_unlock(&tracer.mutex); + + return n; +} + + +static struct kobj_attribute trace_data_range_attr = + __ATTR(trace_data_range, 0644, + trace_data_range_show, trace_data_range_store); + static int __devinit etm_probe(struct amba_device *dev, const struct amba_id *id) { struct tracectx *t = &tracer; @@ -589,7 +654,7 @@ static int __devinit etm_probe(struct amba_device *dev, const struct amba_id *id mutex_init(&t->mutex); t->dev = &dev->dev; - t->flags = TRACER_CYCLE_ACC; + t->flags = TRACER_CYCLE_ACC | TRACER_TRACE_DATA; t->etm_portsz = 1; etm_unlock(t); @@ -619,6 +684,11 @@ static int __devinit etm_probe(struct amba_device *dev, const struct amba_id *id if (ret) dev_dbg(&dev->dev, "Failed to create trace_range in sysfs\n"); + ret = sysfs_create_file(&dev->dev.kobj, &trace_data_range_attr.attr); + if (ret) + dev_dbg(&dev->dev, + "Failed to create trace_data_range in sysfs\n"); + dev_dbg(t->dev, "ETM AMBA driver initialized.\n"); out: @@ -649,6 +719,7 @@ static int etm_remove(struct amba_device *dev) sysfs_remove_file(&dev->dev.kobj, &trace_info_attr.attr); sysfs_remove_file(&dev->dev.kobj, &trace_mode_attr.attr); sysfs_remove_file(&dev->dev.kobj, &trace_range_attr.attr); + sysfs_remove_file(&dev->dev.kobj, &trace_data_range_attr.attr); return 0; }