Received: by 2002:a05:6a10:f347:0:0:0:0 with SMTP id d7csp5661014pxu; Wed, 23 Dec 2020 02:07:52 -0800 (PST) X-Google-Smtp-Source: ABdhPJzwzp8d4xxLGrXxD7y3DfRYA4MpUsMFtxb1aLxmL+YDD6g3ecaZungROafM4slrQ1eSJzME X-Received: by 2002:a17:906:65a:: with SMTP id t26mr17281895ejb.394.1608718072248; Wed, 23 Dec 2020 02:07:52 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1608718072; cv=none; d=google.com; s=arc-20160816; b=xyrezTzNG2yRxA37v86Jwkuso/nOjeyXZEYVdLx+jq3+Xr9adbkpJVTf4oSXbNjBa0 hx5z5ex0t/T1rO0Ho2A3+GTNovZdKWdGZXjL3i+AqAJ7k9tVk21q0ZOtWlou5w7QoLli iaxZQq6Jk3gCWzfkRG15mO7K8iYfuN2eJmQLKZO5guTQWIX3D0DJnCKFa04y+rHjzaAA LhKg0Y6/Ja1FN3vFONbFh7bgVfQJL5YyiRNqdVoC96xvGVjxHvVuijRp4AP1alaRpAOr UIo0TzLcBqfk/8lI0/suPMehAyZaQr8wSCrETn5YTvHj7lUeXjD9rr41Ks0D7C3hhmE3 8aaA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from; bh=uG5oINts6fTOSUBYVxUK0T8Kt82icyARjAqOJn1bzvg=; b=FwpIFE663jyOMCGnxjrSPz3Z7Nfi1xTCWFV2iQtZCpoaZcZaLvZkXjfSvqZ/Ql5yIi KxGmxxS1LtMLFLqJpsfSgtYxpIbklpzddf3/WPr/Q0+ZKQzLXHKrUco2ausPNX7lUfvf aQQIR5jgPkQsM386+I/izbrmi3ix/IlUL4nWIJi7qfVslcCq5hyDCZ5DpL3mdzQZevnQ wJZFiZsc1MMBccmr9sKLylQlrRi1QXnCUc6+jvQYhIdVV2OdjkY0LjhmCwA2/MSBUpP8 0WzEPJK6MaNgx/k/A1G2FiswO/lVafEDYy6qc2XsJ12TIYOU/ZTYn/3a9n4wkOCErgrr M2IA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id jg16si11488826ejc.580.2020.12.23.02.07.28; Wed, 23 Dec 2020 02:07:52 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=arm.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728448AbgLWKFQ (ORCPT + 99 others); Wed, 23 Dec 2020 05:05:16 -0500 Received: from foss.arm.com ([217.140.110.172]:48056 "EHLO foss.arm.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728388AbgLWKFP (ORCPT ); Wed, 23 Dec 2020 05:05:15 -0500 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id AB6B41478; Wed, 23 Dec 2020 02:04:07 -0800 (PST) Received: from p8cg001049571a15.blr.arm.com (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPA id E85483F718; Wed, 23 Dec 2020 02:04:04 -0800 (PST) From: Anshuman Khandual To: linux-arm-kernel@lists.infradead.org, coresight@lists.linaro.org Cc: linux-kernel@vger.kernel.org, Anshuman Khandual , Mathieu Poirier , Suzuki K Poulose , Mike Leach , Linu Cherian Subject: [PATCH 08/11] coresight: core: Add support for dedicated percpu sinks Date: Wed, 23 Dec 2020 15:33:40 +0530 Message-Id: <1608717823-18387-9-git-send-email-anshuman.khandual@arm.com> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1608717823-18387-1-git-send-email-anshuman.khandual@arm.com> References: <1608717823-18387-1-git-send-email-anshuman.khandual@arm.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Add support for dedicated sinks that are bound to individual CPUs. (e.g, TRBE). To allow quicker access to the sink for a given CPU bound source, keep a percpu array of the sink devices. Also, add support for building a path to the CPU local sink from the ETM. This adds a new percpu sink type CORESIGHT_DEV_SUBTYPE_SINK_PERCPU_SYSMEM. This new sink type is exclusively available and can only work with percpu source type device CORESIGHT_DEV_SUBTYPE_SOURCE_PERCPU_PROC. This defines a percpu structure that accommodates a single coresight_device which can be used to store an initialized instance from a sink driver. As these sinks are exclusively linked and dependent on corresponding percpu sources devices, they should also be the default sink device during a perf session. Outwards device connections are scanned while establishing paths between a source and a sink device. But such connections are not present for certain percpu source and sink devices which are exclusively linked and dependent. Build the path directly and skip connection scanning for such devices. Cc: Mathieu Poirier Cc: Mike Leach Cc: Suzuki K Poulose Signed-off-by: Anshuman Khandual --- Changes in V1: - Replaced post init ETE-TRBE link configuration with dynamic path creation drivers/hwtracing/coresight/coresight-core.c | 14 ++++++++++++++ include/linux/coresight.h | 12 ++++++++++++ 2 files changed, 26 insertions(+) diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c index 0062c89..b300606 100644 --- a/drivers/hwtracing/coresight/coresight-core.c +++ b/drivers/hwtracing/coresight/coresight-core.c @@ -23,6 +23,7 @@ #include "coresight-priv.h" static DEFINE_MUTEX(coresight_mutex); +DEFINE_PER_CPU(struct coresight_device *, csdev_sink); /** * struct coresight_node - elements of a path, from source to sink @@ -784,6 +785,13 @@ static int _coresight_build_path(struct coresight_device *csdev, if (csdev == sink) goto out; + if (coresight_is_percpu_source(csdev) && coresight_is_percpu_sink(sink) && + sink == per_cpu(csdev_sink, source_ops(csdev)->cpu_id(csdev))) { + _coresight_build_path(sink, sink, path); + found = true; + goto out; + } + /* Not a sink - recursively explore each port found on this element */ for (i = 0; i < csdev->pdata->nr_outport; i++) { struct coresight_device *child_dev; @@ -998,6 +1006,12 @@ coresight_find_default_sink(struct coresight_device *csdev) { int depth = 0; + if (coresight_is_percpu_source(csdev)) { + csdev->def_sink = per_cpu(csdev_sink, source_ops(csdev)->cpu_id(csdev)); + if (csdev->def_sink) + return csdev->def_sink; + } + /* look for a default sink if we have not found for this device */ if (!csdev->def_sink) csdev->def_sink = coresight_find_sink(csdev, &depth); diff --git a/include/linux/coresight.h b/include/linux/coresight.h index 951ba88..2aee12e 100644 --- a/include/linux/coresight.h +++ b/include/linux/coresight.h @@ -50,6 +50,7 @@ enum coresight_dev_subtype_sink { CORESIGHT_DEV_SUBTYPE_SINK_PORT, CORESIGHT_DEV_SUBTYPE_SINK_BUFFER, CORESIGHT_DEV_SUBTYPE_SINK_SYSMEM, + CORESIGHT_DEV_SUBTYPE_SINK_PERCPU_SYSMEM, }; enum coresight_dev_subtype_link { @@ -432,6 +433,17 @@ static inline void csdev_access_write64(struct csdev_access *csa, u64 val, u32 o csa->write(val, offset, false, true); } +static inline bool coresight_is_percpu_source(struct coresight_device *csdev) +{ + return csdev && (csdev->type == CORESIGHT_DEV_TYPE_SOURCE) && + csdev->subtype.source_subtype == CORESIGHT_DEV_SUBTYPE_SOURCE_PROC; +} + +static inline bool coresight_is_percpu_sink(struct coresight_device *csdev) +{ + return csdev && (csdev->type == CORESIGHT_DEV_TYPE_SINK) && + csdev->subtype.sink_subtype == CORESIGHT_DEV_SUBTYPE_SINK_PERCPU_SYSMEM; +} #else /* !CONFIG_64BIT */ static inline u64 csdev_access_relaxed_read64(struct csdev_access *csa, -- 2.7.4