[PATCH v5 13/19] coresight: Add 'in_idle' argument to path

Leo Yan leo.yan at arm.com
Wed Nov 19 07:49:11 PST 2025


Introduce an 'in_idle' argument to the path.  When set to true for idle
flow, it skips to touch the sink device to avoid long latency caused by
the sink operations.

This is a preparation for managing the path during CPU idle.

Tested-by: James Clark <james.clark at linaro.org>
Signed-off-by: Leo Yan <leo.yan at arm.com>
---
 drivers/hwtracing/coresight/coresight-core.c | 17 +++++++++++++----
 include/linux/coresight.h                    |  2 ++
 2 files changed, 15 insertions(+), 4 deletions(-)

diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/hwtracing/coresight/coresight-core.c
index e8efb09dd8fc5d94d7a07ddd86f3270bab424f54..e3efa7c9ef9fa1bf7b2f727205abe577bfc493e3 100644
--- a/drivers/hwtracing/coresight/coresight-core.c
+++ b/drivers/hwtracing/coresight/coresight-core.c
@@ -494,6 +494,10 @@ static void coresight_disable_path_from(struct coresight_path *path,
 						CORESIGHT_DEV_TYPE_SINK :
 						CORESIGHT_DEV_TYPE_LINK;
 
+		/* To reduce latency, CPU idle does not touch the sink */
+		if (path->in_idle && type == CORESIGHT_DEV_TYPE_SINK)
+			continue;
+
 		switch (type) {
 		case CORESIGHT_DEV_TYPE_SINK:
 			coresight_disable_sink(csdev);
@@ -560,10 +564,6 @@ int coresight_enable_path(struct coresight_path *path, enum cs_mode mode)
 		csdev = nd->csdev;
 		type = csdev->type;
 
-		/* Enable all helpers adjacent to the path first */
-		ret = coresight_enable_helpers(csdev, mode, path);
-		if (ret)
-			goto err_disable_path;
 		/*
 		 * ETF devices are tricky... They can be a link or a sink,
 		 * depending on how they are configured.  If an ETF has been
@@ -575,6 +575,15 @@ int coresight_enable_path(struct coresight_path *path, enum cs_mode mode)
 						CORESIGHT_DEV_TYPE_SINK :
 						CORESIGHT_DEV_TYPE_LINK;
 
+		/* To reduce latency, CPU idle does not touch the sink */
+		if (path->in_idle && type == CORESIGHT_DEV_TYPE_SINK)
+			continue;
+
+		/* Enable all helpers adjacent to the path first */
+		ret = coresight_enable_helpers(csdev, mode, path);
+		if (ret)
+			goto err_disable_path;
+
 		switch (type) {
 		case CORESIGHT_DEV_TYPE_SINK:
 			ret = coresight_enable_sink(csdev, mode, path);
diff --git a/include/linux/coresight.h b/include/linux/coresight.h
index 9e1edff3ace951146f1801a732105d8560fa2356..ba1bd6479230d660eaaf3cf76ab531f6dc2a6f4a 100644
--- a/include/linux/coresight.h
+++ b/include/linux/coresight.h
@@ -337,11 +337,13 @@ static struct coresight_dev_list (var) = {				\
  * @path_list:		path from source to sink.
  * @trace_id:		trace_id of the whole path.
  * @handle:		handle of the aux_event.
+ * @in_idle:		A flag to indicate if it is in CPU idle.
  */
 struct coresight_path {
 	struct list_head		path_list;
 	u8				trace_id;
 	struct perf_output_handle	*handle;
+	bool				in_idle;
 };
 
 enum cs_mode {

-- 
2.34.1




More information about the linux-arm-kernel mailing list