On Tue, Apr 30, 2019 at 1:10 PM Christian König <ckoenig.leichtzumerken@xxxxxxxxx> wrote: > > 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. Maybe we should enable this for bare metal too in a follow up patch. Alex > > Have you pinged the hw guys about that already? > > > Signed-off-by: Trigger Huang <Trigger.Huang@xxxxxxx> > > Acked-by: Christian König <christian.koenig@xxxxxxx> > > > --- > > 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) { > > _______________________________________________ > amd-gfx mailing list > amd-gfx@xxxxxxxxxxxxxxxxxxxxx > https://lists.freedesktop.org/mailman/listinfo/amd-gfx _______________________________________________ amd-gfx mailing list amd-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/amd-gfx