[PATCH 4/4] drm/sdma7: properly reference trap interrupts for userqs

Khatri, Sunil sukhatri at amd.com
Mon Apr 14 17:35:54 UTC 2025


Reviewed-by: Sunil Khatri <sunil.khatri at amd.com>

On 4/13/2025 9:36 PM, Alex Deucher wrote:
> We need to take a reference to the interrupts to make
> sure they stay enabled even if the kernel queues have
> disabled them.
>
> Signed-off-by: Alex Deucher <alexander.deucher at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c | 31 +++++++++++++++++++++++++-
>   1 file changed, 30 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> index 1f3045323c929..669d1ef3fab22 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v7_0.c
> @@ -1352,11 +1352,39 @@ static int sdma_v7_0_sw_fini(struct amdgpu_ip_block *ip_block)
>   	return 0;
>   }
>   
> +static int sdma_v7_0_set_userq_trap_interrupts(struct amdgpu_device *adev,
> +					       bool enable)
> +{
> +	unsigned int irq_type;
> +	int i, r;
> +
> +	if (adev->userq_funcs[AMDGPU_HW_IP_DMA]) {
> +		for (i = 0; i < adev->sdma.num_instances; i++) {
> +			irq_type = AMDGPU_SDMA_IRQ_INSTANCE0 + i;
> +			if (enable)
> +				r = amdgpu_irq_get(adev, &adev->sdma.trap_irq,
> +						   irq_type);
> +			else
> +				r = amdgpu_irq_put(adev, &adev->sdma.trap_irq,
> +						   irq_type);
> +			if (r)
> +				return r;
> +		}
> +	}
> +
> +	return 0;
> +}
> +
>   static int sdma_v7_0_hw_init(struct amdgpu_ip_block *ip_block)
>   {
>   	struct amdgpu_device *adev = ip_block->adev;
> +	int r;
>   
> -	return sdma_v7_0_start(adev);
> +	r = sdma_v7_0_start(adev);
> +	if (r)
> +		return r;
> +
> +	return sdma_v7_0_set_userq_trap_interrupts(adev, true);
>   }
>   
>   static int sdma_v7_0_hw_fini(struct amdgpu_ip_block *ip_block)
> @@ -1368,6 +1396,7 @@ static int sdma_v7_0_hw_fini(struct amdgpu_ip_block *ip_block)
>   
>   	sdma_v7_0_ctx_switch_enable(adev, false);
>   	sdma_v7_0_enable(adev, false);
> +	sdma_v7_0_set_userq_trap_interrupts(adev, false);
>   
>   	return 0;
>   }


More information about the amd-gfx mailing list