diff options
| author | Hawking Zhang <Hawking.Zhang@amd.com> | 2020-12-01 22:54:47 +0800 | 
|---|---|---|
| committer | Alex Deucher <alexander.deucher@amd.com> | 2020-12-23 15:03:50 -0500 | 
| commit | c73750322aafa1003a7c67f77d74d154469cb1d6 (patch) | |
| tree | 4a3bbb2b45ffbbb282e9a08b4522bc2f792acf14 /drivers/gpu | |
| parent | ffa02126e0ef88f9f9e5fb4009504fc471d5fb1a (diff) | |
drm/amdgpu: add helper to toggle ih ring interrupts for vega10
vega10_ih_toggle_ring_interrupts will be used to
enable/disable an ih ring interrupts for vega10/12,
RAVEN series and RENOIR APUs
Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
Reviewed-by: Christian König <christian.koenig@amd.com>
Acked-by: Felix Kuehling <Felix.Kuehling@amd.com>
Reviewed-by: Dennis Li <Dennis.Li@amd.com>
Reviewed-by: Feifei Xu <Feifei.Xu@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
Diffstat (limited to 'drivers/gpu')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/vega10_ih.c | 45 | 
1 files changed, 45 insertions, 0 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c index 42e7897f2bbc..fa4c490229a4 100644 --- a/drivers/gpu/drm/amd/amdgpu/vega10_ih.c +++ b/drivers/gpu/drm/amd/amdgpu/vega10_ih.c @@ -213,6 +213,51 @@ static void vega10_ih_disable_interrupts(struct amdgpu_device *adev)  	}  } +/** + * vega10_ih_toggle_ring_interrupts - toggle the interrupt ring buffer + * + * @adev: amdgpu_device pointer + * @ih: amdgpu_ih_ring pointet + * @enable: true - enable the interrupts, false - disable the interrupts + * + * Toggle the interrupt ring buffer (VEGA10) + */ +static int vega10_ih_toggle_ring_interrupts(struct amdgpu_device *adev, +					    struct amdgpu_ih_ring *ih, +					    bool enable) +{ +	struct amdgpu_ih_regs *ih_regs; +	uint32_t tmp; + +	ih_regs = &ih->ih_regs; + +	tmp = RREG32(ih_regs->ih_rb_cntl); +	tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RB_ENABLE, (enable ? 1 : 0)); +	/* enable_intr field is only valid in ring0 */ +	if (ih == &adev->irq.ih) +		tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, ENABLE_INTR, (enable ? 1 : 0)); +	if (amdgpu_sriov_vf(adev)) { +		if (psp_reg_program(&adev->psp, ih_regs->psp_reg_id, tmp)) { +			dev_err(adev->dev, "PSP program IH_RB_CNTL failed!\n"); +			return -ETIMEDOUT; +		} +	} else { +		WREG32(ih_regs->ih_rb_cntl, tmp); +	} + +	if (enable) { +		ih->enabled = true; +	} else { +		/* set rptr, wptr to 0 */ +		WREG32(ih_regs->ih_rb_rptr, 0); +		WREG32(ih_regs->ih_rb_wptr, 0); +		ih->enabled = false; +		ih->rptr = 0; +	} + +	return 0; +} +  static uint32_t vega10_ih_rb_cntl(struct amdgpu_ih_ring *ih, uint32_t ih_rb_cntl)  {  	int rb_bufsz = order_base_2(ih->ring_size / 4); | 
