From patchwork Mon Nov 30 02:14:35 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mathieu Poirier X-Patchwork-Id: 57423 Delivered-To: patch@linaro.org Received: by 10.112.155.196 with SMTP id vy4csp1180995lbb; Sun, 29 Nov 2015 18:21:30 -0800 (PST) X-Received: by 10.98.75.204 with SMTP id d73mr66308602pfj.90.1448850090550; Sun, 29 Nov 2015 18:21:30 -0800 (PST) Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id bw10si6682164pac.157.2015.11.29.18.21.30; Sun, 29 Nov 2015 18:21:30 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dkim=neutral (body hash did not verify) header.i=@linaro-org.20150623.gappssmtp.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753457AbbK3CV2 (ORCPT + 28 others); Sun, 29 Nov 2015 21:21:28 -0500 Received: from mail-pa0-f44.google.com ([209.85.220.44]:32819 "EHLO mail-pa0-f44.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753147AbbK3CRE (ORCPT ); Sun, 29 Nov 2015 21:17:04 -0500 Received: by pabfh17 with SMTP id fh17so173112257pab.0 for ; Sun, 29 Nov 2015 18:17:01 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro-org.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=ypRc3hb3+dU5+F5B/qwIX16MeX2ilaQsAZF17xQAgfk=; b=WCEAUSSl2Uy+Vm97nPCObmJpgnP8nKeM9QeJXJDA7RCHmu7IFQPcB2UYw/XkKm67nM 75UblRG86YdQBaHwxKgoLPVErjtzxfm365EghjTKqdQuLxH8PjAR5VtUTA3lwrEMBinA q3vKS5nAtOmyk2ciGEnIr2GidJegzEGq6y6NH6LRyV2/e+e+DFrsr9QDj/sEIKR8dZPt ARuAvX1GRW8U4iWshWcyVvBpIQ/N4WQ7kdECjvanZIeuVsPImsig6zqBH6nIt1C80/Hd MUIH1Pwf2KtVYW7+slz+QARBdBcqHzf3xWyr+OJYiP9VC2MJz2HMHIIVaZFRvK1cdXsS P5fg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=ypRc3hb3+dU5+F5B/qwIX16MeX2ilaQsAZF17xQAgfk=; b=Of8aXh7n4WgYWCcc08a/AUjWFLtAj9JoYnJxBmjzLRHkSNeDTRaV+CXATjzsxM+0wt SH5iRtJR+/g+EaYh0mS3VjSB7qemurKTlFu9SiT/le71AjEiy90IjVLnntK0PKTF6Ttw wlNLWoDTA4aTFxlZhCUlm+ZlcNcTjTyEAH9hV6NGBWCgrvT5NLL2nlBFsy5vo1pSgLcn wzRnR6FBKovu3uY28C6PG8DnuTsGNSbGjgqzyjZSsqhGi4xUsuurkHafDwEBpZi3N5RF k4dfUsZG3noFPtw6zOnRpVdGdnfZd84XGHQEAWtR4AFhdhV1pfZp2aG/Mx30iZaUtP1M 1r3A== X-Gm-Message-State: ALoCoQnkr87jOezNbD35OJP6T6t9uOFHzXU9vbe1dmYxsgGtnsvZ1BrGoRu6uEyu4WwEUnkRQwL/ X-Received: by 10.66.159.38 with SMTP id wz6mr87410570pab.12.1448849820933; Sun, 29 Nov 2015 18:17:00 -0800 (PST) Received: from t430.cg.shawcable.net ([184.64.168.246]) by smtp.gmail.com with ESMTPSA id n16sm47168818pfa.53.2015.11.29.18.16.59 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 29 Nov 2015 18:17:00 -0800 (PST) From: Mathieu Poirier To: gregkh@linuxfoundation.org, alexander.shishkin@linux.intel.com Cc: zhang.chunyan@linaro.org, mike.leach@arm.com, tor@ti.com, al.grant@arm.com, pawel.moll@arm.com, fainelli@broadcom.com, linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, Mathieu Poirier Subject: [PATCH V5 14/26] coresight: etm3x: adding perf_get/set_config() API Date: Sun, 29 Nov 2015 19:14:35 -0700 Message-Id: <1448849687-5724-15-git-send-email-mathieu.poirier@linaro.org> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1448849687-5724-1-git-send-email-mathieu.poirier@linaro.org> References: <1448849687-5724-1-git-send-email-mathieu.poirier@linaro.org> Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Adding a source operation to build a tracer's configuration from a perf_event. That way possibly complex parsing of the information conveyed by the event doesn't have to be carried out every time the configuration is needed. Since event configuration can change between concurrent sessions, the possibility of associating a tracer with a configuration is also provided. As such Perf can assign session configuration to tracers as it see fit. Signed-off-by: Mathieu Poirier --- drivers/hwtracing/coresight/Kconfig | 1 + drivers/hwtracing/coresight/coresight-etm3x.c | 70 +++++++++++++++++++++++++++ include/linux/coresight.h | 9 +++- 3 files changed, 79 insertions(+), 1 deletion(-) -- 2.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ diff --git a/drivers/hwtracing/coresight/Kconfig b/drivers/hwtracing/coresight/Kconfig index 6c8921140f02..e252dd1522e5 100644 --- a/drivers/hwtracing/coresight/Kconfig +++ b/drivers/hwtracing/coresight/Kconfig @@ -4,6 +4,7 @@ menuconfig CORESIGHT bool "CoreSight Tracing Support" select ARM_AMBA + select PERF_EVENTS help This framework provides a kernel interface for the CoreSight debug and trace drivers to register themselves with. It's intended to build diff --git a/drivers/hwtracing/coresight/coresight-etm3x.c b/drivers/hwtracing/coresight/coresight-etm3x.c index d0b77be51980..cda28e0211f5 100644 --- a/drivers/hwtracing/coresight/coresight-etm3x.c +++ b/drivers/hwtracing/coresight/coresight-etm3x.c @@ -31,6 +31,7 @@ #include #include #include +#include #include #include "coresight-etm.h" @@ -315,6 +316,40 @@ void etm_config_trace_mode(struct etm_drvdata *drvdata, config->addr_type[1] = ETM_ADDR_TYPE_RANGE; } +#define ETM3X_SUPPORTED_OPTIONS (ETMCR_CYC_ACC | ETMCR_TIMESTAMP_EN) + +static int etm_parse_event_config(struct etm_drvdata *drvdata, + struct etm_config *config, + struct perf_event *event) +{ + u32 mode = 0; + u64 event_config = event->attr.config; + + if (event->attr.exclude_kernel) + mode = ETM_MODE_EXCL_KERN; + + if (event->attr.exclude_user) + mode = ETM_MODE_EXCL_USER; + + /* + * By default the tracers are configured to trace the whole address + * range. Narrow the field only if requested by user space. + */ + if (mode) + etm_config_trace_mode(drvdata, config, mode); + + /* + * At this time only cycle accurate and timestamp options are + * available. + */ + if (event_config & ~ETM3X_SUPPORTED_OPTIONS) + return -EINVAL; + + config->ctrl = event_config; + + return 0; +} + static void etm_enable_hw(void *info) { int i; @@ -428,6 +463,38 @@ static int etm_trace_id(struct coresight_device *csdev) return etm_get_trace_id(drvdata); } +static void *etm_get_config(struct coresight_device *csdev, + struct perf_event *event) +{ + struct etm_config *config = NULL; + struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); + + config = kzalloc(sizeof(struct etm_config), GFP_KERNEL); + if (!config) + return config; + + etm_set_default(config); + + if (etm_parse_event_config(drvdata, config, event)) + return ERR_PTR(-EINVAL); + + return config; +} + +static void etm_put_config(void *config) +{ + struct etm_config *cfg = config; + + kfree(cfg); +} + +static void etm_set_config(struct coresight_device *csdev, void *config) +{ + struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); + + drvdata->config = config; +} + static int etm_enable_sysfs(struct coresight_device *csdev) { struct etm_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); @@ -569,6 +636,9 @@ static void etm_disable(struct coresight_device *csdev) static const struct coresight_ops_source etm_source_ops = { .cpu_id = etm_cpu_id, .trace_id = etm_trace_id, + .get_config = etm_get_config, + .put_config = etm_put_config, + .set_config = etm_set_config, .enable = etm_enable, .disable = etm_disable, }; diff --git a/include/linux/coresight.h b/include/linux/coresight.h index 61dfb8d511ea..da242dfebdbd 100644 --- a/include/linux/coresight.h +++ b/include/linux/coresight.h @@ -206,13 +206,20 @@ struct coresight_ops_link { * @cpu_id: returns the value of the CPU number this component * is associated to. * @trace_id: returns the value of the component's trace ID as known - to the HW. + * to the HW. + * @get_config: builds the ETM configuration after events' specifics. + * @put_config: release memory allocated in @get_config. + * @set_config: associate a tracer with a configuration. * @enable: enables tracing for a source. * @disable: disables tracing for a source. */ struct coresight_ops_source { int (*cpu_id)(struct coresight_device *csdev); int (*trace_id)(struct coresight_device *csdev); + void *(*get_config)(struct coresight_device *csdev, + struct perf_event *event); + void (*put_config)(void *config); + void (*set_config)(struct coresight_device *csdev, void *config); int (*enable)(struct coresight_device *csdev, u32 mode); void (*disable)(struct coresight_device *csdev); };