RE: [PATCH] drm/amdgpu: Fix sdma 4.4.2 doorbell rptr/wptr init

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



[AMD Official Use Only - General]

Reviewed-by: Le Ma <le.ma@xxxxxxx>

> -----Original Message-----
> From: Lazar, Lijo <Lijo.Lazar@xxxxxxx>
> Sent: Monday, November 6, 2023 12:21 PM
> To: amd-gfx@xxxxxxxxxxxxxxxxxxxxx
> Cc: Zhang, Hawking <Hawking.Zhang@xxxxxxx>; Deucher, Alexander
> <Alexander.Deucher@xxxxxxx>; Kamal, Asad <Asad.Kamal@xxxxxxx>; Ma,
> Le <Le.Ma@xxxxxxx>
> Subject: [PATCH] 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@xxxxxxx>
> ---
>  drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c | 25 ++++++++++++++++++------
>  1 file changed, 19 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> index c46bc6aa4f48..bd65a62f8903 100644
> --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_4_2.c
> @@ -427,6 +427,7 @@ static void sdma_v4_4_2_inst_gfx_stop(struct
> amdgpu_device *adev,
>                                     uint32_t inst_mask)
>  {
>       struct amdgpu_ring *sdma[AMDGPU_MAX_SDMA_INSTANCES];
> +     u32 doorbell_offset, doorbell;
>       u32 rb_cntl, ib_cntl;
>       int i, unset = 0;
>
> @@ -444,6 +445,18 @@ static void sdma_v4_4_2_inst_gfx_stop(struct
> amdgpu_device *adev,
>               ib_cntl = RREG32_SDMA(i, regSDMA_GFX_IB_CNTL);
>               ib_cntl = REG_SET_FIELD(ib_cntl, SDMA_GFX_IB_CNTL,
> IB_ENABLE, 0);
>               WREG32_SDMA(i, regSDMA_GFX_IB_CNTL, ib_cntl);
> +
> +             if (sdma[i]->use_doorbell) {
> +                     doorbell = RREG32_SDMA(i, regSDMA_GFX_DOORBELL);
> +                     doorbell_offset = RREG32_SDMA(i,
> regSDMA_GFX_DOORBELL_OFFSET);
> +
> +                     doorbell = REG_SET_FIELD(doorbell,
> SDMA_GFX_DOORBELL, ENABLE, 0);
> +                     doorbell_offset = REG_SET_FIELD(doorbell_offset,
> +                                     SDMA_GFX_DOORBELL_OFFSET,
> +                                     OFFSET, 0);
> +                     WREG32_SDMA(i, regSDMA_GFX_DOORBELL, doorbell);
> +                     WREG32_SDMA(i, regSDMA_GFX_DOORBELL_OFFSET,
> doorbell_offset);
> +             }
>       }
>  }
>
> @@ -631,12 +644,6 @@ static void sdma_v4_4_2_gfx_resume(struct
> amdgpu_device *adev, unsigned int i)
>       rb_cntl = sdma_v4_4_2_rb_cntl(ring, rb_cntl);
>       WREG32_SDMA(i, regSDMA_GFX_RB_CNTL, rb_cntl);
>
> -     /* Initialize the ring buffer's read and write pointers */
> -     WREG32_SDMA(i, regSDMA_GFX_RB_RPTR, 0);
> -     WREG32_SDMA(i, regSDMA_GFX_RB_RPTR_HI, 0);
> -     WREG32_SDMA(i, regSDMA_GFX_RB_WPTR, 0);
> -     WREG32_SDMA(i, regSDMA_GFX_RB_WPTR_HI, 0);
> -
>       /* set the wb address whether it's enabled or not */
>       WREG32_SDMA(i, regSDMA_GFX_RB_RPTR_ADDR_HI,
>              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)
>       /* before programing wptr to a less value, need set minor_ptr_update
> first */
>       WREG32_SDMA(i, regSDMA_GFX_MINOR_PTR_UPDATE, 1);
>
> +     /* Initialize the ring buffer's read and write pointers */
> +     WREG32_SDMA(i, regSDMA_GFX_RB_RPTR, 0);
> +     WREG32_SDMA(i, regSDMA_GFX_RB_RPTR_HI, 0);
> +     WREG32_SDMA(i, regSDMA_GFX_RB_WPTR, 0);
> +     WREG32_SDMA(i, regSDMA_GFX_RB_WPTR_HI, 0);
> +
>       doorbell = RREG32_SDMA(i, regSDMA_GFX_DOORBELL);
>       doorbell_offset = RREG32_SDMA(i, regSDMA_GFX_DOORBELL_OFFSET);
>
> --
> 2.25.1





[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux