[PATCH v4 10/15] coresight: Add 'in_idle' argument to enable/disable path functions
James Clark
james.clark at linaro.org
Mon Nov 10 03:48:45 PST 2025
On 10/11/2025 11:25 am, James Clark wrote:
>
>
> On 04/11/2025 3:21 pm, Leo Yan wrote:
>> Introduce an 'in_idle' argument to the path enable and disable
>> functions. 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.
>>
>> Signed-off-by: Leo Yan <leo.yan at arm.com>
>> ---
>> drivers/hwtracing/coresight/coresight-core.c | 35 ++++++++++++++++++
>> +++-------
>> 1 file changed, 26 insertions(+), 9 deletions(-)
>>
>> diff --git a/drivers/hwtracing/coresight/coresight-core.c b/drivers/
>> hwtracing/coresight/coresight-core.c
>> index
>> 3ea31ed121f7b59d7822fba4df4c43efb1c76fe7..6c12692efb51c63f3aa9da6f65a349eae1926f4d 100644
>> --- a/drivers/hwtracing/coresight/coresight-core.c
>> +++ b/drivers/hwtracing/coresight/coresight-core.c
>> @@ -475,7 +475,8 @@ EXPORT_SYMBOL_GPL(coresight_resume_source);
>> * disabled.
>> */
>> static void coresight_disable_path_from(struct coresight_path *path,
>> - struct coresight_node *nd)
>> + struct coresight_node *nd,
>> + bool in_idle)
>> {
>> u32 type;
>> struct coresight_device *csdev, *parent, *child;
>> @@ -498,6 +499,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 (in_idle && type == CORESIGHT_DEV_TYPE_SINK)
>> + continue;
>> +
>> switch (type) {
>> case CORESIGHT_DEV_TYPE_SINK:
>> coresight_disable_sink(csdev);
>> @@ -527,7 +532,7 @@ static void coresight_disable_path_from(struct
>> coresight_path *path,
>> void coresight_disable_path(struct coresight_path *path)
>> {
>> - coresight_disable_path_from(path, NULL);
>> + coresight_disable_path_from(path, NULL, false);
>
> Something like a 'reason' enum would be more readable than a boolean. We
> might have more than two options in the future anyway.
>
>> }
>> EXPORT_SYMBOL_GPL(coresight_disable_path);
>> @@ -550,8 +555,9 @@ static int coresight_enable_helpers(struct
>> coresight_device *csdev,
>> return 0;
>> }
>> -int coresight_enable_path(struct coresight_path *path, enum cs_mode
>> mode,
>> - void *sink_data)
>> +static int coresight_enable_path_internal(struct coresight_path *path,
>> + enum cs_mode mode, void *sink_data,
>> + bool in_idle)
>> {
>> int ret = 0;
>> u32 type;
>> @@ -564,10 +570,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
>> @@ -579,6 +581,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 (in_idle && type == CORESIGHT_DEV_TYPE_SINK)
>> + continue;
>
> I can imagine that not being wanted for all sink types in the future, so
> we could let the sink decide this. But it's probably fine to leave in
> the core for now and it would be easy to change later.
I got to patch 12 and it adds a special condition in the core to do
something different for TRBE. We already have pm_is_needed() so
shouldn't the sinks be deciding this for themselves?
>
>> +
>> + /* 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, sink_data);
>> @@ -614,10 +625,16 @@ int coresight_enable_path(struct coresight_path
>> *path, enum cs_mode mode,
>> err_disable_helpers:
>> coresight_disable_helpers(csdev, path);
>> err_disable_path:
>> - coresight_disable_path_from(path, nd);
>> + coresight_disable_path_from(path, nd, in_idle);
>> goto out;
>> }
>> +int coresight_enable_path(struct coresight_path *path, enum cs_mode
>> mode,
>> + void *sink_data)
>> +{
>> + return coresight_enable_path_internal(path, mode, sink_data, false);
>> +}
>> +
>> struct coresight_device *coresight_get_sink(struct coresight_path
>> *path)
>> {
>> struct coresight_device *csdev;
>>
>
More information about the linux-arm-kernel
mailing list