Skip to content

Commit 0553eb9

Browse files
Lijo Lazaralexdeucher
authored andcommitted
drm/amdgpu: Fix sdma 4.4.2 doorbell rptr/wptr init
Doorbell rptr/wptr can be set through multiple ways including direct register initialization. Disable doorbell during hw_fini once the ring is disabled so that during next module reload direct initialization takes effect. Also, move the direct initialization after minor update is set to 1 since rptr/wptr are reinitialized back to 0 which could be lower than the previous doorbell value (ex: cases like module reload). Signed-off-by: Lijo Lazar <lijo.lazar@amd.com> Reviewed-by: Le Ma <le.ma@amd.com> Reviewed-by: Asad Kamal <asad.kamal@amd.com> Tested-by: Asad Kamal <asad.kamal@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
1 parent 9c561ca commit 0553eb9

1 file changed

Lines changed: 19 additions & 6 deletions

File tree

drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,7 @@ static void sdma_v4_4_2_inst_gfx_stop(struct amdgpu_device *adev,
427427
uint32_t inst_mask)
428428
{
429429
struct amdgpu_ring *sdma[AMDGPU_MAX_SDMA_INSTANCES];
430+
u32 doorbell_offset, doorbell;
430431
u32 rb_cntl, ib_cntl;
431432
int i, unset = 0;
432433

@@ -444,6 +445,18 @@ static void sdma_v4_4_2_inst_gfx_stop(struct amdgpu_device *adev,
444445
ib_cntl = RREG32_SDMA(i, regSDMA_GFX_IB_CNTL);
445446
ib_cntl = REG_SET_FIELD(ib_cntl, SDMA_GFX_IB_CNTL, IB_ENABLE, 0);
446447
WREG32_SDMA(i, regSDMA_GFX_IB_CNTL, ib_cntl);
448+
449+
if (sdma[i]->use_doorbell) {
450+
doorbell = RREG32_SDMA(i, regSDMA_GFX_DOORBELL);
451+
doorbell_offset = RREG32_SDMA(i, regSDMA_GFX_DOORBELL_OFFSET);
452+
453+
doorbell = REG_SET_FIELD(doorbell, SDMA_GFX_DOORBELL, ENABLE, 0);
454+
doorbell_offset = REG_SET_FIELD(doorbell_offset,
455+
SDMA_GFX_DOORBELL_OFFSET,
456+
OFFSET, 0);
457+
WREG32_SDMA(i, regSDMA_GFX_DOORBELL, doorbell);
458+
WREG32_SDMA(i, regSDMA_GFX_DOORBELL_OFFSET, doorbell_offset);
459+
}
447460
}
448461
}
449462

@@ -631,12 +644,6 @@ static void sdma_v4_4_2_gfx_resume(struct amdgpu_device *adev, unsigned int i)
631644
rb_cntl = sdma_v4_4_2_rb_cntl(ring, rb_cntl);
632645
WREG32_SDMA(i, regSDMA_GFX_RB_CNTL, rb_cntl);
633646

634-
/* Initialize the ring buffer's read and write pointers */
635-
WREG32_SDMA(i, regSDMA_GFX_RB_RPTR, 0);
636-
WREG32_SDMA(i, regSDMA_GFX_RB_RPTR_HI, 0);
637-
WREG32_SDMA(i, regSDMA_GFX_RB_WPTR, 0);
638-
WREG32_SDMA(i, regSDMA_GFX_RB_WPTR_HI, 0);
639-
640647
/* set the wb address whether it's enabled or not */
641648
WREG32_SDMA(i, regSDMA_GFX_RB_RPTR_ADDR_HI,
642649
upper_32_bits(adev->wb.gpu_addr + wb_offset) & 0xFFFFFFFF);
@@ -654,6 +661,12 @@ static void sdma_v4_4_2_gfx_resume(struct amdgpu_device *adev, unsigned int i)
654661
/* before programing wptr to a less value, need set minor_ptr_update first */
655662
WREG32_SDMA(i, regSDMA_GFX_MINOR_PTR_UPDATE, 1);
656663

664+
/* Initialize the ring buffer's read and write pointers */
665+
WREG32_SDMA(i, regSDMA_GFX_RB_RPTR, 0);
666+
WREG32_SDMA(i, regSDMA_GFX_RB_RPTR_HI, 0);
667+
WREG32_SDMA(i, regSDMA_GFX_RB_WPTR, 0);
668+
WREG32_SDMA(i, regSDMA_GFX_RB_WPTR_HI, 0);
669+
657670
doorbell = RREG32_SDMA(i, regSDMA_GFX_DOORBELL);
658671
doorbell_offset = RREG32_SDMA(i, regSDMA_GFX_DOORBELL_OFFSET);
659672

0 commit comments

Comments
 (0)