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

Huang, Trigger Trigger.Huang at amd.com
Wed May 1 14:32:46 UTC 2019


Hi Christian,

Yes, it is the HW guys who suggested to rearm it.

Thanks & Best Wishes,
Trigger Huang

-----Original Message-----
From: Christian König <ckoenig.leichtzumerken at gmail.com> 
Sent: Wednesday, May 01, 2019 1:10 AM
To: Huang, Trigger <Trigger.Huang at amd.com>; amd-gfx at lists.freedesktop.org
Subject: Re: [PATCH] drm/amdgpu: Rearm IRQ in Vega10 SR-IOV if IRQ lost

[CAUTION: External Email]

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