Adjust gfx_v6_0_setup_tcc() to keep it working after
a GFX IP block soft reset. On a soft reset, the
TCP_CHAN_STEER_LO/HI registers are not cleared so
the function needs a slight adjustment to how the
number of active TCCs are calculated.

Additionally, let's expose the disabled TCC mask
in the tcc_disabled_mask field, like on other GPUs.

Signed-off-by: Timur Kristóf <[email protected]>
---
 drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c | 11 +++++++++--
 1 file changed, 9 insertions(+), 2 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c 
b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
index 1c7cd265fbca..3e0cd46cd091 100644
--- a/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
+++ b/drivers/gpu/drm/amd/amdgpu/gfx_v6_0.c
@@ -1596,7 +1596,7 @@ static void gfx_v6_0_setup_spi(struct amdgpu_device *adev)
  */
 static void gfx_v6_0_setup_tcc(struct amdgpu_device *adev)
 {
-       u32 i, tcc, tcp_addr_config, num_active_tcc = 0;
+       u32 i, tcc, tcp_addr_config, num_active_tcc = 0, num_max_active_tcc;
        u64 chan_steer, patched_chan_steer = 0;
        const u32 num_max_tcc = adev->gfx.config.max_texture_channel_caches;
        const u32 dis_tcc_mask =
@@ -1610,6 +1610,8 @@ static void gfx_v6_0_setup_tcc(struct amdgpu_device *adev)
        if (!dis_tcc_mask)
                return;
 
+       num_max_active_tcc = num_max_tcc - hweight32(dis_tcc_mask);
+
        /* Each 4-bit nibble contains the index of a TCC used by all TCPs */
        chan_steer = RREG32(mmTCP_CHAN_STEER_LO) | 
((u64)RREG32(mmTCP_CHAN_STEER_HI) << 32ull);
 
@@ -1622,9 +1624,12 @@ static void gfx_v6_0_setup_tcc(struct amdgpu_device 
*adev)
                        patched_chan_steer |= (u64)tcc << (u64)(4 * 
num_active_tcc);
                        ++num_active_tcc;
                }
+
+               if (num_active_tcc == num_max_active_tcc)
+                       break;
        }
 
-       WARN_ON(num_active_tcc != num_max_tcc - hweight32(dis_tcc_mask));
+       WARN_ON(num_active_tcc != num_max_active_tcc);
 
        /* Patch number of TCCs used by TCPs */
        tcp_addr_config = REG_SET_FIELD(RREG32(mmTCP_ADDR_CONFIG),
@@ -1634,6 +1639,8 @@ static void gfx_v6_0_setup_tcc(struct amdgpu_device *adev)
        WREG32(mmTCP_ADDR_CONFIG, tcp_addr_config);
        WREG32(mmTCP_CHAN_STEER_HI, upper_32_bits(patched_chan_steer));
        WREG32(mmTCP_CHAN_STEER_LO, lower_32_bits(patched_chan_steer));
+
+       adev->gfx.config.tcc_disabled_mask = dis_tcc_mask;
 }
 
 static void gfx_v6_0_config_init(struct amdgpu_device *adev)
-- 
2.55.0

Reply via email to