diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c index 8e6bbaf380d06d1cb8c83c4946fefabfacdd3186..7b9debefd64af6d75fdee283f582da92c814c093 100644 --- a/drivers/gpu/drm/amd/amdgpu/si_dpm.c +++ b/drivers/gpu/drm/amd/amdgpu/si_dpm.c @@ -3944,13 +3944,13 @@ static void si_dpm_start_smc(struct amdgpu_device *adev) { si_program_jump_on_start(adev); si_start_smc(adev); - si_start_smc_clock(adev); + si_smc_clock(adev, true); } static void si_dpm_stop_smc(struct amdgpu_device *adev) { si_reset_smc(adev); - si_stop_smc_clock(adev); + si_smc_clock(adev, false); } static int si_process_firmware_header(struct amdgpu_device *adev) @@ -4366,7 +4366,7 @@ static int si_upload_firmware(struct amdgpu_device *adev) struct si_power_info *si_pi = si_get_pi(adev); si_reset_smc(adev); - si_stop_smc_clock(adev); + si_smc_clock(adev, false); return si_load_smc_ucode(adev, si_pi->sram_end); } diff --git a/drivers/gpu/drm/amd/amdgpu/si_smc.c b/drivers/gpu/drm/amd/amdgpu/si_smc.c index c1c259464ae7daa295ee1faf7bcdc01c971db7ed..47bbb40e70142ab024b82f5ef3b0b80558b84d2d 100644 --- a/drivers/gpu/drm/amd/amdgpu/si_smc.c +++ b/drivers/gpu/drm/amd/amdgpu/si_smc.c @@ -84,7 +84,6 @@ int si_copy_bytes_to_smc(struct amdgpu_device *adev, goto done; original_data = RREG32(SMC_IND_DATA_0); - extra_shift = 8 * (4 - byte_count); while (byte_count > 0) { @@ -94,7 +93,6 @@ int si_copy_bytes_to_smc(struct amdgpu_device *adev, } data <<= extra_shift; - data |= (original_data & ~((~0UL) << extra_shift)); ret = si_set_smc_sram_address(adev, addr, limit); @@ -128,8 +126,8 @@ void si_reset_smc(struct amdgpu_device *adev) RREG32(CB_CGTT_SCLK_CTRL); RREG32(CB_CGTT_SCLK_CTRL); - tmp = RREG32_SMC(SMC_SYSCON_RESET_CNTL); - tmp |= RST_REG; + tmp = RREG32_SMC(SMC_SYSCON_RESET_CNTL) | + RST_REG; WREG32_SMC(SMC_SYSCON_RESET_CNTL, tmp); } @@ -140,20 +138,14 @@ int si_program_jump_on_start(struct amdgpu_device *adev) return si_copy_bytes_to_smc(adev, 0x0, data, 4, sizeof(data)+1); } -void si_stop_smc_clock(struct amdgpu_device *adev) -{ - u32 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0); - - tmp |= CK_DISABLE; - - WREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0, tmp); -} - -void si_start_smc_clock(struct amdgpu_device *adev) +void si_smc_clock(struct amdgpu_device *adev, bool enable) { u32 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0); - tmp &= ~CK_DISABLE; + if (enable) + tmp &= ~CK_DISABLE; + else + tmp |= CK_DISABLE; WREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0, tmp); } @@ -185,9 +177,8 @@ PPSMC_Result si_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg) break; udelay(1); } - tmp = RREG32(SMC_RESP_0); - return (PPSMC_Result)tmp; + return (PPSMC_Result)RREG32(SMC_RESP_0); } PPSMC_Result si_wait_for_smc_inactive(struct amdgpu_device *adev) diff --git a/drivers/gpu/drm/amd/amdgpu/sislands_smc.h b/drivers/gpu/drm/amd/amdgpu/sislands_smc.h index 542ab46aeb400d28286a9fbf2fef40c276910af8..c5b3377df2da8a922ef1fbbdde7e1ab382c40a94 100644 --- a/drivers/gpu/drm/amd/amdgpu/sislands_smc.h +++ b/drivers/gpu/drm/amd/amdgpu/sislands_smc.h @@ -408,8 +408,7 @@ int si_copy_bytes_to_smc(struct amdgpu_device *adev, void si_start_smc(struct amdgpu_device *adev); void si_reset_smc(struct amdgpu_device *adev); int si_program_jump_on_start(struct amdgpu_device *adev); -void si_stop_smc_clock(struct amdgpu_device *adev); -void si_start_smc_clock(struct amdgpu_device *adev); +void si_smc_clock(struct amdgpu_device *adev, bool enable); bool si_is_smc_running(struct amdgpu_device *adev); PPSMC_Result si_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg); PPSMC_Result si_wait_for_smc_inactive(struct amdgpu_device *adev);