[PATCH 1/8] drm/amdgpu: Correct SDMA load/unload sequence on HWS disabled mode
Oded Gabbay
oded.gabbay at gmail.com
Thu Nov 2 14:40:57 UTC 2017
On Thu, Nov 2, 2017 at 1:21 AM, Felix Kuehling <Felix.Kuehling at amd.com> wrote:
> Fix the SDMA load and unload sequence as suggested by HW document.
>
> Signed-off-by: shaoyun liu <shaoyun.liu at amd.com>
> Signed-off-by: Felix Kuehling <Felix.Kuehling at amd.com>
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c | 47 ++++++++++++++++-------
> 1 file changed, 34 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> index 47d1c13..1e3e9be 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_amdkfd_gfx_v7.c
> @@ -379,29 +379,50 @@ static int kgd_hqd_sdma_load(struct kgd_dev *kgd, void *mqd)
> {
> struct amdgpu_device *adev = get_amdgpu_device(kgd);
> struct cik_sdma_rlc_registers *m;
> + unsigned long end_jiffies;
> uint32_t sdma_base_addr;
> + uint32_t data;
>
> m = get_sdma_mqd(mqd);
> sdma_base_addr = get_sdma_base_addr(m);
>
> - WREG32(sdma_base_addr + mmSDMA0_RLC0_VIRTUAL_ADDR,
> - m->sdma_rlc_virtual_addr);
> + WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_CNTL,
> + m->sdma_rlc_rb_cntl & (~SDMA0_RLC0_RB_CNTL__RB_ENABLE_MASK));
>
> - WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_BASE,
> - m->sdma_rlc_rb_base);
> + end_jiffies = msecs_to_jiffies(2000) + jiffies;
> + while (true) {
> + data = RREG32(sdma_base_addr + mmSDMA0_RLC0_CONTEXT_STATUS);
> + if (data & SDMA0_RLC0_CONTEXT_STATUS__IDLE_MASK)
> + break;
> + if (time_after(jiffies, end_jiffies))
> + return -ETIME;
> + usleep_range(500, 1000);
> + }
> + if (m->sdma_engine_id) {
> + data = RREG32(mmSDMA1_GFX_CONTEXT_CNTL);
> + data = REG_SET_FIELD(data, SDMA1_GFX_CONTEXT_CNTL,
> + RESUME_CTX, 0);
> + WREG32(mmSDMA1_GFX_CONTEXT_CNTL, data);
> + } else {
> + data = RREG32(mmSDMA0_GFX_CONTEXT_CNTL);
> + data = REG_SET_FIELD(data, SDMA0_GFX_CONTEXT_CNTL,
> + RESUME_CTX, 0);
> + WREG32(mmSDMA0_GFX_CONTEXT_CNTL, data);
> + }
>
> + WREG32(sdma_base_addr + mmSDMA0_RLC0_DOORBELL,
> + m->sdma_rlc_doorbell);
> + WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_RPTR, 0);
> + WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_WPTR, 0);
> + WREG32(sdma_base_addr + mmSDMA0_RLC0_VIRTUAL_ADDR,
> + m->sdma_rlc_virtual_addr);
> + WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_BASE, m->sdma_rlc_rb_base);
> WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_BASE_HI,
> m->sdma_rlc_rb_base_hi);
> -
> WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_RPTR_ADDR_LO,
> m->sdma_rlc_rb_rptr_addr_lo);
> -
> WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_RPTR_ADDR_HI,
> m->sdma_rlc_rb_rptr_addr_hi);
> -
> - WREG32(sdma_base_addr + mmSDMA0_RLC0_DOORBELL,
> - m->sdma_rlc_doorbell);
> -
> WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_CNTL,
> m->sdma_rlc_rb_cntl);
>
> @@ -574,9 +595,9 @@ static int kgd_hqd_sdma_destroy(struct kgd_dev *kgd, void *mqd,
> }
>
> WREG32(sdma_base_addr + mmSDMA0_RLC0_DOORBELL, 0);
> - WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_RPTR, 0);
> - WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_WPTR, 0);
> - WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_BASE, 0);
> + WREG32(sdma_base_addr + mmSDMA0_RLC0_RB_CNTL,
> + RREG32(sdma_base_addr + mmSDMA0_RLC0_RB_CNTL) |
> + SDMA0_RLC0_RB_CNTL__RB_ENABLE_MASK);
>
> return 0;
> }
> --
> 2.7.4
>
This patch is:
Acked-by: Oded Gabbay <oded.gabbay at gmail.com>
More information about the amd-gfx
mailing list