[PATCH 09/12] drm/v3d: Move perfmon init completely into own unit

Tvrtko Ursulin tvrtko.ursulin at igalia.com
Thu Jul 11 08:57:47 UTC 2024


On 10/07/2024 18:38, Maíra Canal wrote:
> On 7/10/24 10:41, Tvrtko Ursulin wrote:
>> From: Tvrtko Ursulin <tvrtko.ursulin at igalia.com>
>>
>> Now that the build time dependencies on various array sizes have been
>> removed, we can move the perfmon init completely into its own compilation
>> unit and remove the hardcoded defines.
>>
>> This improves on the temporary fix quickly delivered in
>> 792d16b5375d ("drm/v3d: Move perfmon init completely into own unit").
> 
> I believe you mean:
> 
> 9c3951ec27b9 ("drm/v3d: Fix perfmon build error/warning")
> 
> Currently, it is reference the current patch.

Well that was a hillarious mistake, well spotted!

Regards,

Tvrtko

> Apart from this fix, this is
> 
> Reviewed-by: Maíra Canal <mcanal at igalia.com>
> 
> Best Regards,
> - Maíra
> 
>>
>> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin at igalia.com>
>> References: 792d16b5375d ("drm/v3d: Move perfmon init completely into 
>> own unit")
>> ---
>>   drivers/gpu/drm/v3d/v3d_drv.c                 |  9 +---
>>   drivers/gpu/drm/v3d/v3d_drv.h                 |  6 +--
>>   drivers/gpu/drm/v3d/v3d_perfmon.c             | 44 +++++++++++--------
>>   .../gpu/drm/v3d/v3d_performance_counters.h    | 16 ++++---
>>   4 files changed, 40 insertions(+), 35 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/v3d/v3d_drv.c 
>> b/drivers/gpu/drm/v3d/v3d_drv.c
>> index a47f00b443d3..491c638a4d74 100644
>> --- a/drivers/gpu/drm/v3d/v3d_drv.c
>> +++ b/drivers/gpu/drm/v3d/v3d_drv.c
>> @@ -95,7 +95,7 @@ static int v3d_get_param_ioctl(struct drm_device 
>> *dev, void *data,
>>           args->value = 1;
>>           return 0;
>>       case DRM_V3D_PARAM_MAX_PERF_COUNTERS:
>> -        args->value = v3d->max_counters;
>> +        args->value = v3d->perfmon_info.max_counters;
>>           return 0;
>>       default:
>>           DRM_DEBUG("Unknown parameter %d\n", args->param);
>> @@ -298,12 +298,7 @@ static int v3d_platform_drm_probe(struct 
>> platform_device *pdev)
>>       v3d->cores = V3D_GET_FIELD(ident1, V3D_HUB_IDENT1_NCORES);
>>       WARN_ON(v3d->cores > 1); /* multicore not yet implemented */
>> -    if (v3d->ver >= 71)
>> -        v3d->max_counters = V3D_V71_NUM_PERFCOUNTERS;
>> -    else if (v3d->ver >= 42)
>> -        v3d->max_counters = V3D_V42_NUM_PERFCOUNTERS;
>> -    else
>> -        v3d->max_counters = 0;
>> +    v3d_perfmon_init(v3d);
>>       v3d->reset = devm_reset_control_get_exclusive(dev, NULL);
>>       if (IS_ERR(v3d->reset)) {
>> diff --git a/drivers/gpu/drm/v3d/v3d_drv.h 
>> b/drivers/gpu/drm/v3d/v3d_drv.h
>> index 00fe5d993175..6d2d34cd135c 100644
>> --- a/drivers/gpu/drm/v3d/v3d_drv.h
>> +++ b/drivers/gpu/drm/v3d/v3d_drv.h
>> @@ -104,10 +104,7 @@ struct v3d_dev {
>>       int ver;
>>       bool single_irq_line;
>> -    /* Different revisions of V3D have different total number of 
>> performance
>> -     * counters
>> -     */
>> -    unsigned int max_counters;
>> +    struct v3d_perfmon_info perfmon_info;
>>       void __iomem *hub_regs;
>>       void __iomem *core_regs[3];
>> @@ -568,6 +565,7 @@ int v3d_sched_init(struct v3d_dev *v3d);
>>   void v3d_sched_fini(struct v3d_dev *v3d);
>>   /* v3d_perfmon.c */
>> +void v3d_perfmon_init(struct v3d_dev *v3d);
>>   void v3d_perfmon_get(struct v3d_perfmon *perfmon);
>>   void v3d_perfmon_put(struct v3d_perfmon *perfmon);
>>   void v3d_perfmon_start(struct v3d_dev *v3d, struct v3d_perfmon 
>> *perfmon);
>> diff --git a/drivers/gpu/drm/v3d/v3d_perfmon.c 
>> b/drivers/gpu/drm/v3d/v3d_perfmon.c
>> index b7d0b02e1a95..cd7f1eedf17f 100644
>> --- a/drivers/gpu/drm/v3d/v3d_perfmon.c
>> +++ b/drivers/gpu/drm/v3d/v3d_perfmon.c
>> @@ -195,6 +195,23 @@ static const struct v3d_perf_counter_desc 
>> v3d_v71_performance_counters[] = {
>>       {"QPU", "QPU-stalls-other", "[QPU] Stalled qcycles waiting for 
>> any other reason (vary/W/Z)"},
>>   };
>> +void v3d_perfmon_init(struct v3d_dev *v3d)
>> +{
>> +    const struct v3d_perf_counter_desc *counters = NULL;
>> +    unsigned int max = 0;
>> +
>> +    if (v3d->ver >= 71) {
>> +        counters = v3d_v71_performance_counters;
>> +        max = ARRAY_SIZE(v3d_v71_performance_counters);
>> +    } else if (v3d->ver >= 42) {
>> +        counters = v3d_v42_performance_counters;
>> +        max = ARRAY_SIZE(v3d_v42_performance_counters);
>> +    }
>> +
>> +    v3d->perfmon_info.max_counters = max;
>> +    v3d->perfmon_info.counters = counters;
>> +}
>> +
>>   void v3d_perfmon_get(struct v3d_perfmon *perfmon)
>>   {
>>       if (perfmon)
>> @@ -321,7 +338,7 @@ int v3d_perfmon_create_ioctl(struct drm_device 
>> *dev, void *data,
>>       /* Make sure all counters are valid. */
>>       for (i = 0; i < req->ncounters; i++) {
>> -        if (req->counters[i] >= v3d->max_counters)
>> +        if (req->counters[i] >= v3d->perfmon_info.max_counters)
>>               return -EINVAL;
>>       }
>> @@ -416,26 +433,15 @@ int v3d_perfmon_get_counter_ioctl(struct 
>> drm_device *dev, void *data,
>>               return -EINVAL;
>>       }
>> -    /* Make sure that the counter ID is valid */
>> -    if (req->counter >= v3d->max_counters)
>> -        return -EINVAL;
>> -
>> -    BUILD_BUG_ON(ARRAY_SIZE(v3d_v42_performance_counters) !=
>> -             V3D_V42_NUM_PERFCOUNTERS);
>> -    BUILD_BUG_ON(ARRAY_SIZE(v3d_v71_performance_counters) !=
>> -             V3D_V71_NUM_PERFCOUNTERS);
>> -    BUILD_BUG_ON(V3D_MAX_COUNTERS < V3D_V42_NUM_PERFCOUNTERS);
>> -    BUILD_BUG_ON(V3D_MAX_COUNTERS < V3D_V71_NUM_PERFCOUNTERS);
>> -    BUILD_BUG_ON((V3D_MAX_COUNTERS != V3D_V42_NUM_PERFCOUNTERS) &&
>> -             (V3D_MAX_COUNTERS != V3D_V71_NUM_PERFCOUNTERS));
>> -
>> -    if (v3d->ver >= 71)
>> -        counter = &v3d_v71_performance_counters[req->counter];
>> -    else if (v3d->ver >= 42)
>> -        counter = &v3d_v42_performance_counters[req->counter];
>> -    else
>> +    if (!v3d->perfmon_info.max_counters)
>>           return -EOPNOTSUPP;
>> +    /* Make sure that the counter ID is valid */
>> +    if (req->counter >= v3d->perfmon_info.max_counters)
>> +        return -EINVAL;
>> +
>> +    counter = &v3d->perfmon_info.counters[req->counter];
>> +
>>       strscpy(req->name, counter->name, sizeof(req->name));
>>       strscpy(req->category, counter->category, sizeof(req->category));
>>       strscpy(req->description, counter->description, 
>> sizeof(req->description));
>> diff --git a/drivers/gpu/drm/v3d/v3d_performance_counters.h 
>> b/drivers/gpu/drm/v3d/v3d_performance_counters.h
>> index 131b2909522a..d919a2fc9449 100644
>> --- a/drivers/gpu/drm/v3d/v3d_performance_counters.h
>> +++ b/drivers/gpu/drm/v3d/v3d_performance_counters.h
>> @@ -19,11 +19,17 @@ struct v3d_perf_counter_desc {
>>       char description[256];
>>   };
>> +struct v3d_perfmon_info {
>> +    /*
>> +     * Different revisions of V3D have different total number of
>> +     * performance counters.
>> +     */
>> +    unsigned int max_counters;
>> -#define V3D_V42_NUM_PERFCOUNTERS (87)
>> -#define V3D_V71_NUM_PERFCOUNTERS (93)
>> -
>> -/* Maximum number of performance counters supported by any version of 
>> V3D */
>> -#define V3D_MAX_COUNTERS (93)
>> +    /*
>> +     * Array of counters valid for the platform.
>> +     */
>> +    const struct v3d_perf_counter_desc *counters;
>> +};
>>   #endif


More information about the dri-devel mailing list