[PATCH] drm/amdgpu: Rearm IRQ in Vega10 SR-IOV if IRQ lost

Christian König ckoenig.leichtzumerken at gmail.com
Tue Apr 30 17:10:17 UTC 2019


Am 30.04.19 um 17:14 schrieb Trigger Huang:
> In Multi-VFs stress test, sometimes we see IRQ lost when running
> benchmark, just rearm it.

Well I think I have seen that on bare metal as well, it would certainly 
explain some very odd behavior I've got from the IH block.

Have you pinged the hw guys about that already?

> Signed-off-by: Trigger Huang <Trigger.Huang at amd.com>

Acked-by: Christian König <christian.koenig at amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/vega10_ih.c | 37 +++++++++++++++++++++++++++++++++-
>   1 file changed, 36 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
> index 1b2f69a..8d89ab7 100644
> --- a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
> +++ b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c
> @@ -31,7 +31,7 @@
>   #include "soc15_common.h"
>   #include "vega10_ih.h"
>   
> -
> +#define MAX_REARM_RETRY 10
>   
>   static void vega10_ih_set_interrupt_funcs(struct amdgpu_device *adev);
>   
> @@ -382,6 +382,38 @@ static void vega10_ih_decode_iv(struct amdgpu_device *adev,
>   }
>   
>   /**
> + * vega10_ih_irq_rearm - rearm IRQ if lost
> + *
> + * @adev: amdgpu_device pointer
> + *
> + */
> +static void vega10_ih_irq_rearm(struct amdgpu_device *adev,
> +			       struct amdgpu_ih_ring *ih)
> +{
> +	uint32_t reg_rptr = 0;
> +	uint32_t v = 0;
> +	uint32_t i = 0;
> +
> +	if (ih == &adev->irq.ih)
> +		reg_rptr = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_RPTR);
> +	else if (ih == &adev->irq.ih1)
> +		reg_rptr = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_RPTR_RING1);
> +	else if (ih == &adev->irq.ih2)
> +		reg_rptr = SOC15_REG_OFFSET(OSSSYS, 0, mmIH_RB_RPTR_RING2);
> +	else
> +		return;
> +
> +	/* Rearm IRQ / re-wwrite doorbell if doorbell write is lost */
> +	for (i = 0; i < MAX_REARM_RETRY; i++) {
> +		v = RREG32_NO_KIQ(reg_rptr);
> +		if ((v < ih->ring_size) && (v != ih->rptr))
> +			WDOORBELL32(ih->doorbell_index, ih->rptr);
> +		else
> +			break;
> +	}
> +}
> +
> +/**
>    * vega10_ih_set_rptr - set the IH ring buffer rptr
>    *
>    * @adev: amdgpu_device pointer
> @@ -395,6 +427,9 @@ static void vega10_ih_set_rptr(struct amdgpu_device *adev,
>   		/* XXX check if swapping is necessary on BE */
>   		*ih->rptr_cpu = ih->rptr;
>   		WDOORBELL32(ih->doorbell_index, ih->rptr);
> +
> +		if (amdgpu_sriov_vf(adev))
> +			vega10_ih_irq_rearm(adev, ih);
>   	} else if (ih == &adev->irq.ih) {
>   		WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, ih->rptr);
>   	} else if (ih == &adev->irq.ih1) {



More information about the amd-gfx mailing list