[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