mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-23 23:21:46 +00:00
drm/amdgpu: Rearm IRQ in Vega10 SR-IOV if IRQ lost
In Multi-VFs stress test, sometimes we see IRQ lost when running benchmark, just rearm it. Signed-off-by: Trigger Huang <Trigger.Huang@amd.com> Acked-by: Christian König <christian.koenig@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
bdb1ccb080
commit
74dcfe74b4
1 changed files with 36 additions and 1 deletions
|
@ -31,7 +31,7 @@
|
||||||
#include "soc15_common.h"
|
#include "soc15_common.h"
|
||||||
#include "vega10_ih.h"
|
#include "vega10_ih.h"
|
||||||
|
|
||||||
|
#define MAX_REARM_RETRY 10
|
||||||
|
|
||||||
static void vega10_ih_set_interrupt_funcs(struct amdgpu_device *adev);
|
static void vega10_ih_set_interrupt_funcs(struct amdgpu_device *adev);
|
||||||
|
|
||||||
|
@ -381,6 +381,38 @@ static void vega10_ih_decode_iv(struct amdgpu_device *adev,
|
||||||
ih->rptr += 32;
|
ih->rptr += 32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
* vega10_ih_set_rptr - set the IH ring buffer rptr
|
||||||
*
|
*
|
||||||
|
@ -395,6 +427,9 @@ static void vega10_ih_set_rptr(struct amdgpu_device *adev,
|
||||||
/* XXX check if swapping is necessary on BE */
|
/* XXX check if swapping is necessary on BE */
|
||||||
*ih->rptr_cpu = ih->rptr;
|
*ih->rptr_cpu = ih->rptr;
|
||||||
WDOORBELL32(ih->doorbell_index, 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) {
|
} else if (ih == &adev->irq.ih) {
|
||||||
WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, ih->rptr);
|
WREG32_SOC15(OSSSYS, 0, mmIH_RB_RPTR, ih->rptr);
|
||||||
} else if (ih == &adev->irq.ih1) {
|
} else if (ih == &adev->irq.ih1) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue