diff mbox series

drm/v3d: Fix Indirect Dispatch configuration for V3D 7.1.6 and later

Message ID 20250409205051.9639-1-mcanal@igalia.com (mailing list archive)
State New, archived
Headers show
Series drm/v3d: Fix Indirect Dispatch configuration for V3D 7.1.6 and later | expand

Commit Message

Maíra Canal April 9, 2025, 8:50 p.m. UTC
This commit is a resubmission of commit 1fe1c66274fb ("drm/v3d: Fix
Indirect Dispatch configuration for V3D 7.1.6 and later"), which was
accidentally reverted by commit 91dae758bdb8 ("Merge tag
'drm-misc-next-2024-08-01' of https://gitlab.freedesktop.org/drm/misc/kernel
into drm-next"), likely due to an unfortunate conflict resolution.

From the original commit message:

```
`args->cfg[4]` is configured in Indirect Dispatch using the number of
batches. Currently, for all V3D tech versions, `args->cfg[4]` equals the
number of batches subtracted by 1. But, for V3D 7.1.6 and later, we must not
subtract 1 from the number of batches.

Implement the fix by checking the V3D tech version and revision.

Fixes several `dEQP-VK.synchronization*` CTS tests related to Indirect Dispatch.
```

Fixes: 91dae758bdb8 ("Merge tag 'drm-misc-next-2024-08-01' of https://gitlab.freedesktop.org/drm/misc/kernel into drm-next")
Signed-off-by: Maíra Canal <mcanal@igalia.com>
---
 drivers/gpu/drm/v3d/v3d_sched.c | 16 +++++++++++++---
 1 file changed, 13 insertions(+), 3 deletions(-)

Comments

Iago Toral April 10, 2025, 6:02 a.m. UTC | #1
Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>

El mié, 09-04-2025 a las 17:50 -0300, Maíra Canal escribió:
> This commit is a resubmission of commit 1fe1c66274fb ("drm/v3d: Fix
> Indirect Dispatch configuration for V3D 7.1.6 and later"), which was
> accidentally reverted by commit 91dae758bdb8 ("Merge tag
> 'drm-misc-next-2024-08-01' of
> https://gitlab.freedesktop.org/drm/misc/kernel
> into drm-next"), likely due to an unfortunate conflict resolution.
> 
> From the original commit message:
> 
> ```
> `args->cfg[4]` is configured in Indirect Dispatch using the number of
> batches. Currently, for all V3D tech versions, `args->cfg[4]` equals
> the
> number of batches subtracted by 1. But, for V3D 7.1.6 and later, we
> must not
> subtract 1 from the number of batches.
> 
> Implement the fix by checking the V3D tech version and revision.
> 
> Fixes several `dEQP-VK.synchronization*` CTS tests related to
> Indirect Dispatch.
> ```
> 
> Fixes: 91dae758bdb8 ("Merge tag 'drm-misc-next-2024-08-01' of
> https://gitlab.freedesktop.org/drm/misc/kernel into drm-next")
> Signed-off-by: Maíra Canal <mcanal@igalia.com>
> ---
>  drivers/gpu/drm/v3d/v3d_sched.c | 16 +++++++++++++---
>  1 file changed, 13 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/v3d/v3d_sched.c
> b/drivers/gpu/drm/v3d/v3d_sched.c
> index b3be08b0ca91..466d28ceee28 100644
> --- a/drivers/gpu/drm/v3d/v3d_sched.c
> +++ b/drivers/gpu/drm/v3d/v3d_sched.c
> @@ -428,7 +428,8 @@
> v3d_rewrite_csd_job_wg_counts_from_indirect(struct v3d_cpu_job *job)
>  	struct v3d_bo *bo = to_v3d_bo(job->base.bo[0]);
>  	struct v3d_bo *indirect = to_v3d_bo(indirect_csd->indirect);
>  	struct drm_v3d_submit_csd *args = &indirect_csd->job->args;
> -	u32 *wg_counts;
> +	struct v3d_dev *v3d = job->base.v3d;
> +	u32 num_batches, *wg_counts;
>  
>  	v3d_get_bo_vaddr(bo);
>  	v3d_get_bo_vaddr(indirect);
> @@ -441,8 +442,17 @@
> v3d_rewrite_csd_job_wg_counts_from_indirect(struct v3d_cpu_job *job)
>  	args->cfg[0] = wg_counts[0] <<
> V3D_CSD_CFG012_WG_COUNT_SHIFT;
>  	args->cfg[1] = wg_counts[1] <<
> V3D_CSD_CFG012_WG_COUNT_SHIFT;
>  	args->cfg[2] = wg_counts[2] <<
> V3D_CSD_CFG012_WG_COUNT_SHIFT;
> -	args->cfg[4] = DIV_ROUND_UP(indirect_csd->wg_size, 16) *
> -		       (wg_counts[0] * wg_counts[1] * wg_counts[2])
> - 1;
> +
> +	num_batches = DIV_ROUND_UP(indirect_csd->wg_size, 16) *
> +		      (wg_counts[0] * wg_counts[1] * wg_counts[2]);
> +
> +	/* V3D 7.1.6 and later don't subtract 1 from the number of
> batches */
> +	if (v3d->ver < 71 || (v3d->ver == 71 && v3d->rev < 6))
> +		args->cfg[4] = num_batches - 1;
> +	else
> +		args->cfg[4] = num_batches;
> +
> +	WARN_ON(args->cfg[4] == ~0);
>  
>  	for (int i = 0; i < 3; i++) {
>  		/* 0xffffffff indicates that the uniform rewrite is
> not needed */
Maíra Canal April 10, 2025, 11:30 p.m. UTC | #2
Hi Iago,

On 10/04/25 03:02, Iago Toral wrote:
> Reviewed-by: Iago Toral Quiroga <itoral@igalia.com>

Applied to misc/kernel.git (drm-misc-fixes).

Best Regards,
- Maíra

> 
> El mié, 09-04-2025 a las 17:50 -0300, Maíra Canal escribió:
>> This commit is a resubmission of commit 1fe1c66274fb ("drm/v3d: Fix
>> Indirect Dispatch configuration for V3D 7.1.6 and later"), which was
>> accidentally reverted by commit 91dae758bdb8 ("Merge tag
>> 'drm-misc-next-2024-08-01' of
>> https://gitlab.freedesktop.org/drm/misc/kernel
>> into drm-next"), likely due to an unfortunate conflict resolution.
>>
>>  From the original commit message:
>>
>> ```
>> `args->cfg[4]` is configured in Indirect Dispatch using the number of
>> batches. Currently, for all V3D tech versions, `args->cfg[4]` equals
>> the
>> number of batches subtracted by 1. But, for V3D 7.1.6 and later, we
>> must not
>> subtract 1 from the number of batches.
>>
>> Implement the fix by checking the V3D tech version and revision.
>>
>> Fixes several `dEQP-VK.synchronization*` CTS tests related to
>> Indirect Dispatch.
>> ```
>>
>> Fixes: 91dae758bdb8 ("Merge tag 'drm-misc-next-2024-08-01' of
>> https://gitlab.freedesktop.org/drm/misc/kernel into drm-next")
>> Signed-off-by: Maíra Canal <mcanal@igalia.com>
>> ---
>>   drivers/gpu/drm/v3d/v3d_sched.c | 16 +++++++++++++---
>>   1 file changed, 13 insertions(+), 3 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/v3d/v3d_sched.c
>> b/drivers/gpu/drm/v3d/v3d_sched.c
>> index b3be08b0ca91..466d28ceee28 100644
>> --- a/drivers/gpu/drm/v3d/v3d_sched.c
>> +++ b/drivers/gpu/drm/v3d/v3d_sched.c
>> @@ -428,7 +428,8 @@
>> v3d_rewrite_csd_job_wg_counts_from_indirect(struct v3d_cpu_job *job)
>>   	struct v3d_bo *bo = to_v3d_bo(job->base.bo[0]);
>>   	struct v3d_bo *indirect = to_v3d_bo(indirect_csd->indirect);
>>   	struct drm_v3d_submit_csd *args = &indirect_csd->job->args;
>> -	u32 *wg_counts;
>> +	struct v3d_dev *v3d = job->base.v3d;
>> +	u32 num_batches, *wg_counts;
>>   
>>   	v3d_get_bo_vaddr(bo);
>>   	v3d_get_bo_vaddr(indirect);
>> @@ -441,8 +442,17 @@
>> v3d_rewrite_csd_job_wg_counts_from_indirect(struct v3d_cpu_job *job)
>>   	args->cfg[0] = wg_counts[0] <<
>> V3D_CSD_CFG012_WG_COUNT_SHIFT;
>>   	args->cfg[1] = wg_counts[1] <<
>> V3D_CSD_CFG012_WG_COUNT_SHIFT;
>>   	args->cfg[2] = wg_counts[2] <<
>> V3D_CSD_CFG012_WG_COUNT_SHIFT;
>> -	args->cfg[4] = DIV_ROUND_UP(indirect_csd->wg_size, 16) *
>> -		       (wg_counts[0] * wg_counts[1] * wg_counts[2])
>> - 1;
>> +
>> +	num_batches = DIV_ROUND_UP(indirect_csd->wg_size, 16) *
>> +		      (wg_counts[0] * wg_counts[1] * wg_counts[2]);
>> +
>> +	/* V3D 7.1.6 and later don't subtract 1 from the number of
>> batches */
>> +	if (v3d->ver < 71 || (v3d->ver == 71 && v3d->rev < 6))
>> +		args->cfg[4] = num_batches - 1;
>> +	else
>> +		args->cfg[4] = num_batches;
>> +
>> +	WARN_ON(args->cfg[4] == ~0);
>>   
>>   	for (int i = 0; i < 3; i++) {
>>   		/* 0xffffffff indicates that the uniform rewrite is
>> not needed */
>
diff mbox series

Patch

diff --git a/drivers/gpu/drm/v3d/v3d_sched.c b/drivers/gpu/drm/v3d/v3d_sched.c
index b3be08b0ca91..466d28ceee28 100644
--- a/drivers/gpu/drm/v3d/v3d_sched.c
+++ b/drivers/gpu/drm/v3d/v3d_sched.c
@@ -428,7 +428,8 @@  v3d_rewrite_csd_job_wg_counts_from_indirect(struct v3d_cpu_job *job)
 	struct v3d_bo *bo = to_v3d_bo(job->base.bo[0]);
 	struct v3d_bo *indirect = to_v3d_bo(indirect_csd->indirect);
 	struct drm_v3d_submit_csd *args = &indirect_csd->job->args;
-	u32 *wg_counts;
+	struct v3d_dev *v3d = job->base.v3d;
+	u32 num_batches, *wg_counts;
 
 	v3d_get_bo_vaddr(bo);
 	v3d_get_bo_vaddr(indirect);
@@ -441,8 +442,17 @@  v3d_rewrite_csd_job_wg_counts_from_indirect(struct v3d_cpu_job *job)
 	args->cfg[0] = wg_counts[0] << V3D_CSD_CFG012_WG_COUNT_SHIFT;
 	args->cfg[1] = wg_counts[1] << V3D_CSD_CFG012_WG_COUNT_SHIFT;
 	args->cfg[2] = wg_counts[2] << V3D_CSD_CFG012_WG_COUNT_SHIFT;
-	args->cfg[4] = DIV_ROUND_UP(indirect_csd->wg_size, 16) *
-		       (wg_counts[0] * wg_counts[1] * wg_counts[2]) - 1;
+
+	num_batches = DIV_ROUND_UP(indirect_csd->wg_size, 16) *
+		      (wg_counts[0] * wg_counts[1] * wg_counts[2]);
+
+	/* V3D 7.1.6 and later don't subtract 1 from the number of batches */
+	if (v3d->ver < 71 || (v3d->ver == 71 && v3d->rev < 6))
+		args->cfg[4] = num_batches - 1;
+	else
+		args->cfg[4] = num_batches;
+
+	WARN_ON(args->cfg[4] == ~0);
 
 	for (int i = 0; i < 3; i++) {
 		/* 0xffffffff indicates that the uniform rewrite is not needed */