lkml.org 
[lkml]   [2022]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.17 096/772] drm/amdgpu/sdma: Fix incorrect calculations of the wptr of the doorbells
    Date
    From: Haohui Mai <ricetons@gmail.com>

    [ Upstream commit 7dba6e838e741caadcf27ef717b6dcb561e77f89 ]

    This patch fixes the issue where the driver miscomputes the 64-bit
    values of the wptr of the SDMA doorbell when initializing the
    hardware. SDMA engines v4 and later on have full 64-bit registers for
    wptr thus they should be set properly.

    Older generation hardwares like CIK / SI have only 16 / 20 / 24bits
    for the WPTR, where the calls of lower_32_bits() will be removed in a
    following patch.

    Reviewed-by: Christian König <christian.koenig@amd.com>
    Signed-off-by: Haohui Mai <ricetons@gmail.com>
    Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c | 4 ++--
    drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c | 8 ++++----
    drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c | 8 ++++----
    3 files changed, 10 insertions(+), 10 deletions(-)

    diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
    index f0638db57111..66b6b175ae90 100644
    --- a/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v4_0.c
    @@ -772,8 +772,8 @@ static void sdma_v4_0_ring_set_wptr(struct amdgpu_ring *ring)

    DRM_DEBUG("Using doorbell -- "
    "wptr_offs == 0x%08x "
    - "lower_32_bits(ring->wptr) << 2 == 0x%08x "
    - "upper_32_bits(ring->wptr) << 2 == 0x%08x\n",
    + "lower_32_bits(ring->wptr << 2) == 0x%08x "
    + "upper_32_bits(ring->wptr << 2) == 0x%08x\n",
    ring->wptr_offs,
    lower_32_bits(ring->wptr << 2),
    upper_32_bits(ring->wptr << 2));
    diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
    index 81e033549dda..6982735e88ba 100644
    --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
    +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_0.c
    @@ -400,8 +400,8 @@ static void sdma_v5_0_ring_set_wptr(struct amdgpu_ring *ring)
    if (ring->use_doorbell) {
    DRM_DEBUG("Using doorbell -- "
    "wptr_offs == 0x%08x "
    - "lower_32_bits(ring->wptr) << 2 == 0x%08x "
    - "upper_32_bits(ring->wptr) << 2 == 0x%08x\n",
    + "lower_32_bits(ring->wptr << 2) == 0x%08x "
    + "upper_32_bits(ring->wptr << 2) == 0x%08x\n",
    ring->wptr_offs,
    lower_32_bits(ring->wptr << 2),
    upper_32_bits(ring->wptr << 2));
    @@ -780,9 +780,9 @@ static int sdma_v5_0_gfx_resume(struct amdgpu_device *adev)

    if (!amdgpu_sriov_vf(adev)) { /* only bare-metal use register write for wptr */
    WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR),
    - lower_32_bits(ring->wptr) << 2);
    + lower_32_bits(ring->wptr << 2));
    WREG32(sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_HI),
    - upper_32_bits(ring->wptr) << 2);
    + upper_32_bits(ring->wptr << 2));
    }

    doorbell = RREG32_SOC15_IP(GC, sdma_v5_0_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL));
    diff --git a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
    index d3d6d5b045b8..ce3a3d1bdaa8 100644
    --- a/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
    +++ b/drivers/gpu/drm/amd/amdgpu/sdma_v5_2.c
    @@ -287,8 +287,8 @@ static void sdma_v5_2_ring_set_wptr(struct amdgpu_ring *ring)
    if (ring->use_doorbell) {
    DRM_DEBUG("Using doorbell -- "
    "wptr_offs == 0x%08x "
    - "lower_32_bits(ring->wptr) << 2 == 0x%08x "
    - "upper_32_bits(ring->wptr) << 2 == 0x%08x\n",
    + "lower_32_bits(ring->wptr << 2) == 0x%08x "
    + "upper_32_bits(ring->wptr << 2) == 0x%08x\n",
    ring->wptr_offs,
    lower_32_bits(ring->wptr << 2),
    upper_32_bits(ring->wptr << 2));
    @@ -664,8 +664,8 @@ static int sdma_v5_2_gfx_resume(struct amdgpu_device *adev)
    WREG32_SOC15_IP(GC, sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_GFX_MINOR_PTR_UPDATE), 1);

    if (!amdgpu_sriov_vf(adev)) { /* only bare-metal use register write for wptr */
    - WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr) << 2);
    - WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr) << 2);
    + WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR), lower_32_bits(ring->wptr << 2));
    + WREG32(sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_GFX_RB_WPTR_HI), upper_32_bits(ring->wptr << 2));
    }

    doorbell = RREG32_SOC15_IP(GC, sdma_v5_2_get_reg_offset(adev, i, mmSDMA0_GFX_DOORBELL));
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-06-07 22:36    [W:2.107 / U:0.240 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site