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

Maíra Canal mcanal at igalia.com
Wed Jul 10 17:38:44 UTC 2024


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.

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