Message ID | 20230208111630.20132-1-quic_jinlmao@quicinc.com |
---|---|
State | New |
Headers |
Return-Path: <linux-kernel-owner@vger.kernel.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp3408696wrn; Wed, 8 Feb 2023 03:53:03 -0800 (PST) X-Google-Smtp-Source: AK7set+CgRQFFtHpcEeX0RRS4u/Y3In3DUQBNThT08n6MOdTvveISY9w9VZH/OmqQUcz7ponadKg X-Received: by 2002:a05:6402:51d2:b0:4a2:64d7:16bc with SMTP id r18-20020a05640251d200b004a264d716bcmr7985041edd.4.1675857183063; Wed, 08 Feb 2023 03:53:03 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675857183; cv=none; d=google.com; s=arc-20160816; b=mFsKWr2bkt4TlbJejKHfU82x7/a7yPrFl1EoE9KnAN3vcrd2/D490xvpVRhCOFzhmN Bxr/0HNeOluiqt1/lET7PX5XuJxFDp5S/baGVmx6JWK+3JWtl2FSZztR4vffvvBuDEds 1epa0MKVdx/fyJAV0gYFTYVoYUVVqOroUfxohpUyfgJ1IkTdYe/9G5Vc8yGfTMbPRLWo /GjPluQ6WvOIXYS1OFod7Y9MrWeOzR+XCnA/TUWUgDHNEOuHka1LN3NqCpKXQIKtDLby vv2ivG2mmQKzIPTCKhQ245xaGQ0Kq08L9F0UfRtkA3Y8dX5FdhydZAfb5KEAsChpapwK FyMw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :message-id:date:subject:cc:to:from:dkim-signature; bh=KPGYDqcDrr8XsolksFSl7StuBWFEXS8GKvS6LELY/So=; b=CcFuhgALXZuDLMwan8DR/jw3u2ZdoW+H2ml6O7Q11ljvuKgwQOBkxoys+Lfa44FQFJ t17UnjM4Gyv+/hszZZ6INctbeX++w5UujegQhdJK+mr0YZsXiklgB7w+VtcTXzek1pdR 1Uk69r+CDX3MNcXF5R/n5B+j1BHK7T/R8eCOLuKS40waOfA66d/+lOCF21rz5YXCJkoK kdS3yMNkDdKZBHGTSXosBf5MR8+SMg+4w2Jlj4X00R4s5KFae9dG3RHWWC+dLYfQxF5j wfVQGU5qGtCZb4QdCPzaxs86xR9lD2S7a33hMomLRSG9lev8kXguQatzfHeG1tetYJoj L+8w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=LVMepOWr; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id we13-20020a170907234d00b00888c8008f3asi16769751ejb.1006.2023.02.08.03.52.40; Wed, 08 Feb 2023 03:53:03 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@quicinc.com header.s=qcppdkim1 header.b=LVMepOWr; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=quicinc.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230347AbjBHLqE (ORCPT <rfc822;ivan.orlov0322@gmail.com> + 99 others); Wed, 8 Feb 2023 06:46:04 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:38996 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230445AbjBHLqB (ORCPT <rfc822;linux-kernel@vger.kernel.org>); Wed, 8 Feb 2023 06:46:01 -0500 Received: from mx0a-0031df01.pphosted.com (mx0a-0031df01.pphosted.com [205.220.168.131]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 568B249024; Wed, 8 Feb 2023 03:46:00 -0800 (PST) Received: from pps.filterd (m0279862.ppops.net [127.0.0.1]) by mx0a-0031df01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 318BENio005774; Wed, 8 Feb 2023 11:16:46 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=quicinc.com; h=from : to : cc : subject : date : message-id : mime-version : content-transfer-encoding : content-type; s=qcppdkim1; bh=KPGYDqcDrr8XsolksFSl7StuBWFEXS8GKvS6LELY/So=; b=LVMepOWrh5gj12B/KwX7q1fzF4f9vQV84RDZVWyNOaO4wRxraDqgpM8A6vqxW3ZyNNH4 iLJWfBVgR4syHwJpjIkUOFO+ptozKEy4KkEWdt6o6OGQt0bVXfFhhnsgpVsYECBNTKHl H5T4cMLXZu+b/+FSbTyv2SdxcWbxXm8zLfFMSWVMnaPCBK0tF4YPZukQiWumtNDG8qvm 3lbHdWQOFYh4kfjhSVWsxrDiHygObWO6+U7elMvbfMQA12G97QViNvzTU7iZGKYWEbWp 6virG01MN5UQ7FyIaiKRqh7VXUErzrMn8F+L4l/FoJ97siMKektis22pb0OMAhMsNRVu 1Q== Received: from nalasppmta02.qualcomm.com (Global_NAT1.qualcomm.com [129.46.96.20]) by mx0a-0031df01.pphosted.com (PPS) with ESMTPS id 3nkk0dkch7-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 08 Feb 2023 11:16:46 +0000 Received: from nalasex01a.na.qualcomm.com (nalasex01a.na.qualcomm.com [10.47.209.196]) by NALASPPMTA02.qualcomm.com (8.17.1.5/8.17.1.5) with ESMTPS id 318BGjjp025145 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 8 Feb 2023 11:16:45 GMT Received: from hu-jinlmao-lv.qualcomm.com (10.49.16.6) by nalasex01a.na.qualcomm.com (10.47.209.196) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.986.36; Wed, 8 Feb 2023 03:16:44 -0800 From: Mao Jinlong <quic_jinlmao@quicinc.com> To: Mathieu Poirier <mathieu.poirier@linaro.org>, Suzuki K Poulose <suzuki.poulose@arm.com>, Mike Leach <mike.leach@linaro.org>, Leo Yan <leo.yan@linaro.org>, Alexander Shishkin <alexander.shishkin@linux.intel.com> CC: Mao Jinlong <quic_jinlmao@quicinc.com>, <coresight@lists.linaro.org>, <linux-arm-kernel@lists.infradead.org>, <linux-kernel@vger.kernel.org>, <linux-arm-msm@vger.kernel.org>, Tingwei Zhang <quic_tingweiz@quicinc.com>, Yuanfang Zhang <quic_yuanfang@quicinc.com>, Tao Zhang <quic_taozha@quicinc.com>, Hao Zhang <quic_hazha@quicinc.com> Subject: [PATCH] coresight: core: Add sysfs node to reset all sources and sinks Date: Wed, 8 Feb 2023 03:16:30 -0800 Message-ID: <20230208111630.20132-1-quic_jinlmao@quicinc.com> X-Mailer: git-send-email 2.39.0 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Type: text/plain X-Originating-IP: [10.49.16.6] X-ClientProxiedBy: nalasex01a.na.qualcomm.com (10.47.209.196) To nalasex01a.na.qualcomm.com (10.47.209.196) X-QCInternal: smtphost X-Proofpoint-Virus-Version: vendor=nai engine=6200 definitions=5800 signatures=585085 X-Proofpoint-GUID: 8JFFtk4EW_OHV7RssK6N495__mAiXY9t X-Proofpoint-ORIG-GUID: 8JFFtk4EW_OHV7RssK6N495__mAiXY9t X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.219,Aquarius:18.0.930,Hydra:6.0.562,FMLib:17.11.122.1 definitions=2023-02-08_04,2023-02-08_01,2022-06-22_01 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 bulkscore=0 clxscore=1015 suspectscore=0 phishscore=0 priorityscore=1501 mlxlogscore=999 adultscore=0 impostorscore=0 mlxscore=0 spamscore=0 lowpriorityscore=0 malwarescore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2212070000 definitions=main-2302080102 X-Spam-Status: No, score=-2.8 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_LOW,SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: <linux-kernel.vger.kernel.org> X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1757263621352411185?= X-GMAIL-MSGID: =?utf-8?q?1757263621352411185?= |
Series |
coresight: core: Add sysfs node to reset all sources and sinks
|
|
Commit Message
Mao Jinlong
Feb. 8, 2023, 11:16 a.m. UTC
Add sysfs node to reset all the sources and sinks. When mltiple
sources are enabled, write 1 to reset_source_sink node to disable
all sources and sinks.
Signed-off-by: Mao Jinlong <quic_jinlmao@quicinc.com>
---
drivers/hwtracing/coresight/coresight-core.c | 106 +++++++++++++++++--
1 file changed, 99 insertions(+), 7 deletions(-)
Comments
Hi As this is a sysfs only update - would it not be easier to simply use a shell script to iterate through coresight/devices/ looking for disable_source / disable_sink files and setting those accordingly? See tools/perf/tests/shell/test_arm_coresight.sh for an example of a script that does similar iteration to test coresight in perf Regards Mike On Wed, 8 Feb 2023 at 11:16, Mao Jinlong <quic_jinlmao@quicinc.com> wrote: > > Add sysfs node to reset all the sources and sinks. When mltiple > sources are enabled, write 1 to reset_source_sink node to disable > all sources and sinks. > > Signed-off-by: Mao Jinlong <quic_jinlmao@quicinc.com> > --- > drivers/hwtracing/coresight/coresight-core.c | 106 +++++++++++++++++-- > 1 file changed, 99 insertions(+), 7 deletions(-) > > diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c > index d3bf82c0de1d..06741ed2dee7 100644 > --- a/drivers/hwtracing/coresight/coresight-core.c > +++ b/drivers/hwtracing/coresight/coresight-core.c > @@ -458,6 +458,28 @@ static bool coresight_disable_source(struct coresight_device *csdev) > return !csdev->enable; > } > > +/** > + * coresight_get_source - Get the source from the path > + * > + * @path: The list of devices. > + * > + * Returns the soruce csdev. > + * > + */ > +static struct coresight_device *coresight_get_source(struct list_head *path) > +{ > + struct coresight_device *csdev; > + > + if (!path) > + return NULL; > + > + csdev = list_first_entry(path, struct coresight_node, link)->csdev; > + if (csdev->type != CORESIGHT_DEV_TYPE_SOURCE) > + return NULL; > + > + return csdev; > +} > + > /* > * coresight_disable_path_from : Disable components in the given path beyond > * @nd in the list. If @nd is NULL, all the components, except the SOURCE are > @@ -1159,20 +1181,18 @@ int coresight_enable(struct coresight_device *csdev) > } > EXPORT_SYMBOL_GPL(coresight_enable); > > -void coresight_disable(struct coresight_device *csdev) > +static void _coresight_disable(struct coresight_device *csdev) > { > int cpu, ret; > struct list_head *path = NULL; > u32 hash; > > - mutex_lock(&coresight_mutex); > - > ret = coresight_validate_source(csdev, __func__); > if (ret) > - goto out; > + return; > > if (!csdev->enable || !coresight_disable_source(csdev)) > - goto out; > + return; > > switch (csdev->subtype.source_subtype) { > case CORESIGHT_DEV_SUBTYPE_SOURCE_PROC: > @@ -1187,7 +1207,7 @@ void coresight_disable(struct coresight_device *csdev) > path = idr_find(&path_idr, hash); > if (path == NULL) { > pr_err("Path is not found for %s\n", dev_name(&csdev->dev)); > - goto out; > + return; > } > idr_remove(&path_idr, hash); > break; > @@ -1198,8 +1218,12 @@ void coresight_disable(struct coresight_device *csdev) > > coresight_disable_path(path); > coresight_release_path(path); > +} > > -out: > +void coresight_disable(struct coresight_device *csdev) > +{ > + mutex_lock(&coresight_mutex); > + _coresight_disable(csdev); > mutex_unlock(&coresight_mutex); > } > EXPORT_SYMBOL_GPL(coresight_disable); > @@ -1761,8 +1785,76 @@ char *coresight_alloc_device_name(struct coresight_dev_list *dict, > } > EXPORT_SYMBOL_GPL(coresight_alloc_device_name); > > +/* > + * Set the sink active status to false. > + */ > +static int coresight_reset_sink(struct device *dev, void *data) > +{ > + struct coresight_device *csdev = to_coresight_device(dev); > + > + if ((csdev->type == CORESIGHT_DEV_TYPE_SINK || > + csdev->type == CORESIGHT_DEV_TYPE_LINKSINK) && > + csdev->activated) > + csdev->activated = false; > + > + return 0; > +} > + > +static void coresight_reset_all_sink(void) > +{ > + bus_for_each_dev(&coresight_bustype, NULL, NULL, coresight_reset_sink); > +} > + > +static ssize_t reset_source_sink_store(struct bus_type *bus, > + const char *buf, size_t size) > +{ > + int id, cpu, ret = 0; > + unsigned long val; > + struct coresight_device *csdev; > + struct list_head *path = NULL; > + > + ret = kstrtoul(buf, 10, &val); > + if (ret) > + return ret; > + > + mutex_lock(&coresight_mutex); > + > + /* Disable all per cpu sources */ > + for_each_present_cpu(cpu) { > + path = per_cpu(tracer_path, cpu); > + if (path) { > + csdev = coresight_get_source(path); > + if (!csdev) > + continue; > + } > + _coresight_disable(csdev); > + } > + > + /* Disable all sources which aren't associated with CPU */ > + idr_for_each_entry (&path_idr, path, id) { > + csdev = coresight_get_source(path); > + if (!csdev) > + continue; > + > + _coresight_disable(csdev); > + } > + /* Reset all activated sinks */ > + coresight_reset_all_sink(); > + > + mutex_unlock(&coresight_mutex); > + return size; > +} > +static BUS_ATTR_WO(reset_source_sink); > + > +static struct attribute *coresight_reset_source_sink_attrs[] = { > + &bus_attr_reset_source_sink.attr, > + NULL, > +}; > +ATTRIBUTE_GROUPS(coresight_reset_source_sink); > + > struct bus_type coresight_bustype = { > .name = "coresight", > + .bus_groups = coresight_reset_source_sink_groups, > }; > > static int __init coresight_init(void) > -- > 2.39.0 >
Quick correction - you need to look for enable_source / enable_sink files and disable those that are currently '1' Mike On Wed, 8 Feb 2023 at 16:16, Mike Leach <mike.leach@linaro.org> wrote: > > Hi > > As this is a sysfs only update - would it not be easier to simply use > a shell script to iterate through coresight/devices/ looking for > disable_source / disable_sink files and setting those accordingly? > > See tools/perf/tests/shell/test_arm_coresight.sh for an example of a > script that does similar iteration to test coresight in perf > > Regards > > Mike > > On Wed, 8 Feb 2023 at 11:16, Mao Jinlong <quic_jinlmao@quicinc.com> wrote: > > > > Add sysfs node to reset all the sources and sinks. When mltiple > > sources are enabled, write 1 to reset_source_sink node to disable > > all sources and sinks. > > > > Signed-off-by: Mao Jinlong <quic_jinlmao@quicinc.com> > > --- > > drivers/hwtracing/coresight/coresight-core.c | 106 +++++++++++++++++-- > > 1 file changed, 99 insertions(+), 7 deletions(-) > > > > diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c > > index d3bf82c0de1d..06741ed2dee7 100644 > > --- a/drivers/hwtracing/coresight/coresight-core.c > > +++ b/drivers/hwtracing/coresight/coresight-core.c > > @@ -458,6 +458,28 @@ static bool coresight_disable_source(struct coresight_device *csdev) > > return !csdev->enable; > > } > > > > +/** > > + * coresight_get_source - Get the source from the path > > + * > > + * @path: The list of devices. > > + * > > + * Returns the soruce csdev. > > + * > > + */ > > +static struct coresight_device *coresight_get_source(struct list_head *path) > > +{ > > + struct coresight_device *csdev; > > + > > + if (!path) > > + return NULL; > > + > > + csdev = list_first_entry(path, struct coresight_node, link)->csdev; > > + if (csdev->type != CORESIGHT_DEV_TYPE_SOURCE) > > + return NULL; > > + > > + return csdev; > > +} > > + > > /* > > * coresight_disable_path_from : Disable components in the given path beyond > > * @nd in the list. If @nd is NULL, all the components, except the SOURCE are > > @@ -1159,20 +1181,18 @@ int coresight_enable(struct coresight_device *csdev) > > } > > EXPORT_SYMBOL_GPL(coresight_enable); > > > > -void coresight_disable(struct coresight_device *csdev) > > +static void _coresight_disable(struct coresight_device *csdev) > > { > > int cpu, ret; > > struct list_head *path = NULL; > > u32 hash; > > > > - mutex_lock(&coresight_mutex); > > - > > ret = coresight_validate_source(csdev, __func__); > > if (ret) > > - goto out; > > + return; > > > > if (!csdev->enable || !coresight_disable_source(csdev)) > > - goto out; > > + return; > > > > switch (csdev->subtype.source_subtype) { > > case CORESIGHT_DEV_SUBTYPE_SOURCE_PROC: > > @@ -1187,7 +1207,7 @@ void coresight_disable(struct coresight_device *csdev) > > path = idr_find(&path_idr, hash); > > if (path == NULL) { > > pr_err("Path is not found for %s\n", dev_name(&csdev->dev)); > > - goto out; > > + return; > > } > > idr_remove(&path_idr, hash); > > break; > > @@ -1198,8 +1218,12 @@ void coresight_disable(struct coresight_device *csdev) > > > > coresight_disable_path(path); > > coresight_release_path(path); > > +} > > > > -out: > > +void coresight_disable(struct coresight_device *csdev) > > +{ > > + mutex_lock(&coresight_mutex); > > + _coresight_disable(csdev); > > mutex_unlock(&coresight_mutex); > > } > > EXPORT_SYMBOL_GPL(coresight_disable); > > @@ -1761,8 +1785,76 @@ char *coresight_alloc_device_name(struct coresight_dev_list *dict, > > } > > EXPORT_SYMBOL_GPL(coresight_alloc_device_name); > > > > +/* > > + * Set the sink active status to false. > > + */ > > +static int coresight_reset_sink(struct device *dev, void *data) > > +{ > > + struct coresight_device *csdev = to_coresight_device(dev); > > + > > + if ((csdev->type == CORESIGHT_DEV_TYPE_SINK || > > + csdev->type == CORESIGHT_DEV_TYPE_LINKSINK) && > > + csdev->activated) > > + csdev->activated = false; > > + > > + return 0; > > +} > > + > > +static void coresight_reset_all_sink(void) > > +{ > > + bus_for_each_dev(&coresight_bustype, NULL, NULL, coresight_reset_sink); > > +} > > + > > +static ssize_t reset_source_sink_store(struct bus_type *bus, > > + const char *buf, size_t size) > > +{ > > + int id, cpu, ret = 0; > > + unsigned long val; > > + struct coresight_device *csdev; > > + struct list_head *path = NULL; > > + > > + ret = kstrtoul(buf, 10, &val); > > + if (ret) > > + return ret; > > + > > + mutex_lock(&coresight_mutex); > > + > > + /* Disable all per cpu sources */ > > + for_each_present_cpu(cpu) { > > + path = per_cpu(tracer_path, cpu); > > + if (path) { > > + csdev = coresight_get_source(path); > > + if (!csdev) > > + continue; > > + } > > + _coresight_disable(csdev); > > + } > > + > > + /* Disable all sources which aren't associated with CPU */ > > + idr_for_each_entry (&path_idr, path, id) { > > + csdev = coresight_get_source(path); > > + if (!csdev) > > + continue; > > + > > + _coresight_disable(csdev); > > + } > > + /* Reset all activated sinks */ > > + coresight_reset_all_sink(); > > + > > + mutex_unlock(&coresight_mutex); > > + return size; > > +} > > +static BUS_ATTR_WO(reset_source_sink); > > + > > +static struct attribute *coresight_reset_source_sink_attrs[] = { > > + &bus_attr_reset_source_sink.attr, > > + NULL, > > +}; > > +ATTRIBUTE_GROUPS(coresight_reset_source_sink); > > + > > struct bus_type coresight_bustype = { > > .name = "coresight", > > + .bus_groups = coresight_reset_source_sink_groups, > > }; > > > > static int __init coresight_init(void) > > -- > > 2.39.0 > > > > > -- > Mike Leach > Principal Engineer, ARM Ltd. > Manchester Design Centre. UK
On 08/02/2023 16:20, Mike Leach wrote: > Quick correction - you need to look for enable_source / enable_sink > files and disable those that are currently '1' > > Mike > > On Wed, 8 Feb 2023 at 16:16, Mike Leach <mike.leach@linaro.org> wrote: >> >> Hi >> >> As this is a sysfs only update - would it not be easier to simply use >> a shell script to iterate through coresight/devices/ looking for >> disable_source / disable_sink files and setting those accordingly? >> >> See tools/perf/tests/shell/test_arm_coresight.sh for an example of a >> script that does similar iteration to test coresight in perf >> +1 Suzuki
On 2/9/2023 12:36 AM, Suzuki K Poulose wrote: > On 08/02/2023 16:20, Mike Leach wrote: >> Quick correction - you need to look for enable_source / enable_sink >> files and disable those that are currently '1' >> >> Mike >> >> On Wed, 8 Feb 2023 at 16:16, Mike Leach <mike.leach@linaro.org> wrote: >>> >>> Hi >>> >>> As this is a sysfs only update - would it not be easier to simply use >>> a shell script to iterate through coresight/devices/ looking for >>> disable_source / disable_sink files and setting those accordingly? >>> >>> See tools/perf/tests/shell/test_arm_coresight.sh for an example of a >>> script that does similar iteration to test coresight in perf >>> > > +1 > > Suzuki Hi Mike & Suzuki, Sometimes user just want to have some quick test from PC with adb commands. It is very easy to reset all sources and sinks' status by command below. echo 1 > /sys/bus/coresight/reset_source_sink Preparing the script for test is not easy for users who are not familiar with the coresight framework. Thanks Jinlong Mao > >
Hi, On Thu, 9 Feb 2023 at 03:02, Jinlong Mao <quic_jinlmao@quicinc.com> wrote: > > > On 2/9/2023 12:36 AM, Suzuki K Poulose wrote: > > On 08/02/2023 16:20, Mike Leach wrote: > >> Quick correction - you need to look for enable_source / enable_sink > >> files and disable those that are currently '1' > >> > >> Mike > >> > >> On Wed, 8 Feb 2023 at 16:16, Mike Leach <mike.leach@linaro.org> wrote: > >>> > >>> Hi > >>> > >>> As this is a sysfs only update - would it not be easier to simply use > >>> a shell script to iterate through coresight/devices/ looking for > >>> disable_source / disable_sink files and setting those accordingly? > >>> > >>> See tools/perf/tests/shell/test_arm_coresight.sh for an example of a > >>> script that does similar iteration to test coresight in perf > >>> > > > > +1 > > > > Suzuki > > Hi Mike & Suzuki, > > Sometimes user just want to have some quick test from PC with adb commands. > It is very easy to reset all sources and sinks' status by command below. > echo 1 > /sys/bus/coresight/reset_source_sink > Users of coresight via sysfs will have to know how to use the coresight infrastructure in order to enable the sources and sinks in the first place - e.g echo 1 > /sys/bus/coresight/devices/tmc_etr0/enable_sink echo 1 > /sys/bus/coresight/devices/etm0/enable_source Given that they are aware of which sources and sinks they enabled - disabling them should be simple. > Preparing the script for test is not easy for users who are not familiar > with the coresight framework. > If there is a genuine use case were a user has opened so many sources on the command line that they need a simpler way of closing them than repeating the enabled commands with an echo 0 > ... then any script could be shipped as part of kernel/tools/coresight or kernel/samples/coresight - they would not have to write it themselves, and just run it from the command line - for example :- ./kernel/tools/coresight/scripts/sysfs_disable_sources_and_sinks.sh Realistically users will only try out a couple of devices as the usefulness of the sysfs interface is really limited to testing or board bring up. Any complex use with sysfs - as in the coresight tests I mentioned earlier is really going to be done by scripting. Regards Mike > Thanks > Jinlong Mao > > > > >
Hi Mike & Suzuki, On 2/9/2023 10:56 PM, Mike Leach wrote: > Hi, > > On Thu, 9 Feb 2023 at 03:02, Jinlong Mao <quic_jinlmao@quicinc.com> wrote: >> >> On 2/9/2023 12:36 AM, Suzuki K Poulose wrote: >>> On 08/02/2023 16:20, Mike Leach wrote: >>>> Quick correction - you need to look for enable_source / enable_sink >>>> files and disable those that are currently '1' >>>> >>>> Mike >>>> >>>> On Wed, 8 Feb 2023 at 16:16, Mike Leach <mike.leach@linaro.org> wrote: >>>>> Hi >>>>> >>>>> As this is a sysfs only update - would it not be easier to simply use >>>>> a shell script to iterate through coresight/devices/ looking for >>>>> disable_source / disable_sink files and setting those accordingly? >>>>> >>>>> See tools/perf/tests/shell/test_arm_coresight.sh for an example of a >>>>> script that does similar iteration to test coresight in perf >>>>> >>> +1 >>> >>> Suzuki >> Hi Mike & Suzuki, >> >> Sometimes user just want to have some quick test from PC with adb commands. >> It is very easy to reset all sources and sinks' status by command below. >> echo 1 > /sys/bus/coresight/reset_source_sink >> > Users of coresight via sysfs will have to know how to use the > coresight infrastructure in order to enable the sources and sinks in > the first place - > e.g > echo 1 > /sys/bus/coresight/devices/tmc_etr0/enable_sink > echo 1 > /sys/bus/coresight/devices/etm0/enable_source > > Given that they are aware of which sources and sinks they enabled - > disabling them should be simple. > > >> Preparing the script for test is not easy for users who are not familiar >> with the coresight framework. >> > If there is a genuine use case were a user has opened so many sources > on the command line that they need a simpler way of closing them than > repeating the enabled commands with an > echo 0 > ... > then any script could be shipped as part of kernel/tools/coresight or > kernel/samples/coresight - they would not have to write it themselves, > and just run it from the command line - for example :- > ./kernel/tools/coresight/scripts/sysfs_disable_sources_and_sinks.sh > > Realistically users will only try out a couple of devices as the > usefulness of the sysfs interface is really limited to testing or > board bring up. > Any complex use with sysfs - as in the coresight tests I mentioned > earlier is really going to be done by scripting. > > > Regards > > Mike There is also requirement that reset all the sources and sinks in an user space daemon. For such requirement, I think it is better to use only once sysfs node instead of iterating through coresight/device folder in an user space daemon. Thanks Jinlong Mao >> Thanks >> Jinlong Mao >> >>> > >
On 3/1/2023 11:04 PM, Jinlong Mao wrote: > Hi Mike & Suzuki, > > On 2/9/2023 10:56 PM, Mike Leach wrote: >> Hi, >> >> On Thu, 9 Feb 2023 at 03:02, Jinlong Mao <quic_jinlmao@quicinc.com> >> wrote: >>> >>> On 2/9/2023 12:36 AM, Suzuki K Poulose wrote: >>>> On 08/02/2023 16:20, Mike Leach wrote: >>>>> Quick correction - you need to look for enable_source / enable_sink >>>>> files and disable those that are currently '1' >>>>> >>>>> Mike >>>>> >>>>> On Wed, 8 Feb 2023 at 16:16, Mike Leach <mike.leach@linaro.org> >>>>> wrote: >>>>>> Hi >>>>>> >>>>>> As this is a sysfs only update - would it not be easier to simply >>>>>> use >>>>>> a shell script to iterate through coresight/devices/ looking for >>>>>> disable_source / disable_sink files and setting those accordingly? >>>>>> >>>>>> See tools/perf/tests/shell/test_arm_coresight.sh for an example of a >>>>>> script that does similar iteration to test coresight in perf >>>>>> >>>> +1 >>>> >>>> Suzuki >>> Hi Mike & Suzuki, >>> >>> Sometimes user just want to have some quick test from PC with adb >>> commands. >>> It is very easy to reset all sources and sinks' status by command >>> below. >>> echo 1 > /sys/bus/coresight/reset_source_sink >>> >> Users of coresight via sysfs will have to know how to use the >> coresight infrastructure in order to enable the sources and sinks in >> the first place - >> e.g >> echo 1 > /sys/bus/coresight/devices/tmc_etr0/enable_sink >> echo 1 > /sys/bus/coresight/devices/etm0/enable_source >> >> Given that they are aware of which sources and sinks they enabled - >> disabling them should be simple. >> >> >>> Preparing the script for test is not easy for users who are not >>> familiar >>> with the coresight framework. >>> >> If there is a genuine use case were a user has opened so many sources >> on the command line that they need a simpler way of closing them than >> repeating the enabled commands with an >> echo 0 > ... >> then any script could be shipped as part of kernel/tools/coresight or >> kernel/samples/coresight - they would not have to write it themselves, >> and just run it from the command line - for example :- >> ./kernel/tools/coresight/scripts/sysfs_disable_sources_and_sinks.sh >> >> Realistically users will only try out a couple of devices as the >> usefulness of the sysfs interface is really limited to testing or >> board bring up. >> Any complex use with sysfs - as in the coresight tests I mentioned >> earlier is really going to be done by scripting. >> >> >> Regards >> >> Mike > > There is also requirement that reset all the sources and sinks in an > user space daemon. > For such requirement, I think it is better to use only once sysfs node > instead of iterating through coresight/device folder in an user space > daemon. Hi Mike & Suzuki, In our internal build, there is binary executable which can configure coresight source/sink. Before running the case, it will disable all the sources and sinks by writing reset_source_sink node to avoid any other source packet's impact. Thanks Jinlong Mao > > Thanks > Jinlong Mao > >>> Thanks >>> Jinlong Mao >>> >>>> >> >> > _______________________________________________ > CoreSight mailing list -- coresight@lists.linaro.org > To unsubscribe send an email to coresight-leave@lists.linaro.org
On 17/03/2023 06:18, Jinlong Mao wrote: > > On 3/1/2023 11:04 PM, Jinlong Mao wrote: >> Hi Mike & Suzuki, >> >> On 2/9/2023 10:56 PM, Mike Leach wrote: >>> Hi, >>> >>> On Thu, 9 Feb 2023 at 03:02, Jinlong Mao <quic_jinlmao@quicinc.com> >>> wrote: >>>> >>>> On 2/9/2023 12:36 AM, Suzuki K Poulose wrote: >>>>> On 08/02/2023 16:20, Mike Leach wrote: >>>>>> Quick correction - you need to look for enable_source / enable_sink >>>>>> files and disable those that are currently '1' >>>>>> >>>>>> Mike >>>>>> >>>>>> On Wed, 8 Feb 2023 at 16:16, Mike Leach <mike.leach@linaro.org> >>>>>> wrote: >>>>>>> Hi >>>>>>> >>>>>>> As this is a sysfs only update - would it not be easier to simply >>>>>>> use >>>>>>> a shell script to iterate through coresight/devices/ looking for >>>>>>> disable_source / disable_sink files and setting those accordingly? >>>>>>> >>>>>>> See tools/perf/tests/shell/test_arm_coresight.sh for an example of a >>>>>>> script that does similar iteration to test coresight in perf >>>>>>> >>>>> +1 >>>>> >>>>> Suzuki >>>> Hi Mike & Suzuki, >>>> >>>> Sometimes user just want to have some quick test from PC with adb >>>> commands. >>>> It is very easy to reset all sources and sinks' status by command >>>> below. >>>> echo 1 > /sys/bus/coresight/reset_source_sink >>>> >>> Users of coresight via sysfs will have to know how to use the >>> coresight infrastructure in order to enable the sources and sinks in >>> the first place - >>> e.g >>> echo 1 > /sys/bus/coresight/devices/tmc_etr0/enable_sink >>> echo 1 > /sys/bus/coresight/devices/etm0/enable_source >>> >>> Given that they are aware of which sources and sinks they enabled - >>> disabling them should be simple. >>> >>> >>>> Preparing the script for test is not easy for users who are not >>>> familiar >>>> with the coresight framework. >>>> >>> If there is a genuine use case were a user has opened so many sources >>> on the command line that they need a simpler way of closing them than >>> repeating the enabled commands with an >>> echo 0 > ... >>> then any script could be shipped as part of kernel/tools/coresight or >>> kernel/samples/coresight - they would not have to write it themselves, >>> and just run it from the command line - for example :- >>> ./kernel/tools/coresight/scripts/sysfs_disable_sources_and_sinks.sh >>> >>> Realistically users will only try out a couple of devices as the >>> usefulness of the sysfs interface is really limited to testing or >>> board bring up. >>> Any complex use with sysfs - as in the coresight tests I mentioned >>> earlier is really going to be done by scripting. >>> >>> >>> Regards >>> >>> Mike >> >> There is also requirement that reset all the sources and sinks in an >> user space daemon. >> For such requirement, I think it is better to use only once sysfs node >> instead of iterating through coresight/device folder in an user space >> daemon. > > Hi Mike & Suzuki, > > In our internal build, there is binary executable which can configure > coresight source/sink. > Before running the case, it will disable all the sources and sinks by > writing reset_source_sink node to > avoid any other source packet's impact. How does that justify this patch ? Your internal build depending on something is your code. It looks like there is more to these patches than what you are disclosing. e.g., with the dummy device series. Please could you paint a complete picture and call out the dependencies / requirements for what you are trying to achieve ? Kind regards Suzuki > > > Thanks > Jinlong Mao > >> >> Thanks >> Jinlong Mao >> >>>> Thanks >>>> Jinlong Mao >>>> >>>>> >>> >>> >> _______________________________________________ >> CoreSight mailing list -- coresight@lists.linaro.org >> To unsubscribe send an email to coresight-leave@lists.linaro.org
diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c index d3bf82c0de1d..06741ed2dee7 100644 --- a/drivers/hwtracing/coresight/coresight-core.c +++ b/drivers/hwtracing/coresight/coresight-core.c @@ -458,6 +458,28 @@ static bool coresight_disable_source(struct coresight_device *csdev) return !csdev->enable; } +/** + * coresight_get_source - Get the source from the path + * + * @path: The list of devices. + * + * Returns the soruce csdev. + * + */ +static struct coresight_device *coresight_get_source(struct list_head *path) +{ + struct coresight_device *csdev; + + if (!path) + return NULL; + + csdev = list_first_entry(path, struct coresight_node, link)->csdev; + if (csdev->type != CORESIGHT_DEV_TYPE_SOURCE) + return NULL; + + return csdev; +} + /* * coresight_disable_path_from : Disable components in the given path beyond * @nd in the list. If @nd is NULL, all the components, except the SOURCE are @@ -1159,20 +1181,18 @@ int coresight_enable(struct coresight_device *csdev) } EXPORT_SYMBOL_GPL(coresight_enable); -void coresight_disable(struct coresight_device *csdev) +static void _coresight_disable(struct coresight_device *csdev) { int cpu, ret; struct list_head *path = NULL; u32 hash; - mutex_lock(&coresight_mutex); - ret = coresight_validate_source(csdev, __func__); if (ret) - goto out; + return; if (!csdev->enable || !coresight_disable_source(csdev)) - goto out; + return; switch (csdev->subtype.source_subtype) { case CORESIGHT_DEV_SUBTYPE_SOURCE_PROC: @@ -1187,7 +1207,7 @@ void coresight_disable(struct coresight_device *csdev) path = idr_find(&path_idr, hash); if (path == NULL) { pr_err("Path is not found for %s\n", dev_name(&csdev->dev)); - goto out; + return; } idr_remove(&path_idr, hash); break; @@ -1198,8 +1218,12 @@ void coresight_disable(struct coresight_device *csdev) coresight_disable_path(path); coresight_release_path(path); +} -out: +void coresight_disable(struct coresight_device *csdev) +{ + mutex_lock(&coresight_mutex); + _coresight_disable(csdev); mutex_unlock(&coresight_mutex); } EXPORT_SYMBOL_GPL(coresight_disable); @@ -1761,8 +1785,76 @@ char *coresight_alloc_device_name(struct coresight_dev_list *dict, } EXPORT_SYMBOL_GPL(coresight_alloc_device_name); +/* + * Set the sink active status to false. + */ +static int coresight_reset_sink(struct device *dev, void *data) +{ + struct coresight_device *csdev = to_coresight_device(dev); + + if ((csdev->type == CORESIGHT_DEV_TYPE_SINK || + csdev->type == CORESIGHT_DEV_TYPE_LINKSINK) && + csdev->activated) + csdev->activated = false; + + return 0; +} + +static void coresight_reset_all_sink(void) +{ + bus_for_each_dev(&coresight_bustype, NULL, NULL, coresight_reset_sink); +} + +static ssize_t reset_source_sink_store(struct bus_type *bus, + const char *buf, size_t size) +{ + int id, cpu, ret = 0; + unsigned long val; + struct coresight_device *csdev; + struct list_head *path = NULL; + + ret = kstrtoul(buf, 10, &val); + if (ret) + return ret; + + mutex_lock(&coresight_mutex); + + /* Disable all per cpu sources */ + for_each_present_cpu(cpu) { + path = per_cpu(tracer_path, cpu); + if (path) { + csdev = coresight_get_source(path); + if (!csdev) + continue; + } + _coresight_disable(csdev); + } + + /* Disable all sources which aren't associated with CPU */ + idr_for_each_entry (&path_idr, path, id) { + csdev = coresight_get_source(path); + if (!csdev) + continue; + + _coresight_disable(csdev); + } + /* Reset all activated sinks */ + coresight_reset_all_sink(); + + mutex_unlock(&coresight_mutex); + return size; +} +static BUS_ATTR_WO(reset_source_sink); + +static struct attribute *coresight_reset_source_sink_attrs[] = { + &bus_attr_reset_source_sink.attr, + NULL, +}; +ATTRIBUTE_GROUPS(coresight_reset_source_sink); + struct bus_type coresight_bustype = { .name = "coresight", + .bus_groups = coresight_reset_source_sink_groups, }; static int __init coresight_init(void)