The code implementation in gfx_get_csb_buffer is very similar to the gfx_v9_0_get_csb_buffer; the main difference is the fact that GFX9 does not have some of the specific operations for GFX11 and GFX10. This commit adds a check in the particular part of gfx_get_csb_buffer that should be skipped in the GFX9 code path. Finally, this commit eliminates the unnecessary gfx_v9_0_get_csb_buffer function in favor of gfx_get_csb_buffer.
Signed-off-by: Rodrigo Siqueira <sique...@igalia.com> --- drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c | 13 +++++--- drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c | 43 ++----------------------- 2 files changed, 11 insertions(+), 45 deletions(-) diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c index 24acb229367c..b26f9f053670 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_gfx.c @@ -2254,10 +2254,15 @@ void gfx_get_csb_buffer(struct amdgpu_device *adev, volatile u32 *buffer) } } - ctx_reg_offset = SOC15_REG_OFFSET(GC, 0, mmPA_SC_TILE_STEERING_OVERRIDE) - PACKET3_SET_CONTEXT_REG_START; - buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 1)); - buffer[count++] = cpu_to_le32(ctx_reg_offset); - buffer[count++] = cpu_to_le32(adev->gfx.config.pa_sc_tile_steering_override); + // GFX10 and GFX11 requires the below operation, but GFX9 should skip + // it. + if (amdgpu_ip_version(adev, GC_HWIP, 0) >= IP_VERSION(10, 0, 0) && + amdgpu_ip_version(adev, GC_HWIP, 0) < IP_VERSION(12, 0, 0)) { + ctx_reg_offset = SOC15_REG_OFFSET(GC, 0, mmPA_SC_TILE_STEERING_OVERRIDE) - PACKET3_SET_CONTEXT_REG_START; + buffer[count++] = cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, 1)); + buffer[count++] = cpu_to_le32(ctx_reg_offset); + buffer[count++] = cpu_to_le32(adev->gfx.config.pa_sc_tile_steering_override); + } buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0)); buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE); diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c index 99f541207980..1fa13f3d098a 100644 --- a/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c +++ b/drivers/gpu/drm/amd/amdgpu/gfx_v9_0.c @@ -1621,45 +1621,6 @@ static u32 gfx_v9_0_get_csb_size(struct amdgpu_device *adev) return count; } -static void gfx_v9_0_get_csb_buffer(struct amdgpu_device *adev, - volatile u32 *buffer) -{ - u32 count = 0, i; - const struct cs_section_def *sect = NULL; - const struct cs_extent_def *ext = NULL; - - if (adev->gfx.rlc.cs_data == NULL) - return; - if (buffer == NULL) - return; - - buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0)); - buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_BEGIN_CLEAR_STATE); - - buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CONTEXT_CONTROL, 1)); - buffer[count++] = cpu_to_le32(0x80000000); - buffer[count++] = cpu_to_le32(0x80000000); - - for (sect = adev->gfx.rlc.cs_data; sect->section != NULL; ++sect) { - for (ext = sect->section; ext->extent != NULL; ++ext) { - if (sect->id == SECT_CONTEXT) { - buffer[count++] = - cpu_to_le32(PACKET3(PACKET3_SET_CONTEXT_REG, ext->reg_count)); - buffer[count++] = cpu_to_le32(ext->reg_index - - PACKET3_SET_CONTEXT_REG_START); - for (i = 0; i < ext->reg_count; i++) - buffer[count++] = cpu_to_le32(ext->extent[i]); - } - } - } - - buffer[count++] = cpu_to_le32(PACKET3(PACKET3_PREAMBLE_CNTL, 0)); - buffer[count++] = cpu_to_le32(PACKET3_PREAMBLE_END_CLEAR_STATE); - - buffer[count++] = cpu_to_le32(PACKET3(PACKET3_CLEAR_STATE, 0)); - buffer[count++] = cpu_to_le32(0); -} - static void gfx_v9_0_init_always_on_cu_mask(struct amdgpu_device *adev) { struct amdgpu_cu_info *cu_info = &adev->gfx.cu_info; @@ -2741,7 +2702,8 @@ static void gfx_v9_0_enable_gui_idle_interrupt(struct amdgpu_device *adev, static void gfx_v9_0_init_csb(struct amdgpu_device *adev) { - adev->gfx.rlc.funcs->get_csb_buffer(adev, adev->gfx.rlc.cs_ptr); + gfx_get_csb_buffer(adev, adev->gfx.rlc.cs_ptr); + /* csib */ WREG32_RLC(SOC15_REG_OFFSET(GC, 0, mmRLC_CSIB_ADDR_HI), adev->gfx.rlc.clear_state_gpu_addr >> 32); @@ -5191,7 +5153,6 @@ static const struct amdgpu_rlc_funcs gfx_v9_0_rlc_funcs = { .unset_safe_mode = gfx_v9_0_unset_safe_mode, .init = gfx_v9_0_rlc_init, .get_csb_size = gfx_v9_0_get_csb_size, - .get_csb_buffer = gfx_v9_0_get_csb_buffer, .get_cp_table_num = gfx_v9_0_cp_jump_table_num, .resume = gfx_v9_0_rlc_resume, .stop = gfx_v9_0_rlc_stop, -- 2.49.0