drm/amd/amdgpu: Tidy up SI SMC code (v2)
As well as merge SMC clock functions into one to reduce LOC. v2: Fix swapped ck enable bit bug: https://bugs.freedesktop.org/show_bug.cgi?id=97801 Signed-off-by: Tom St Denis <tom.stdenis@amd.com> Reviewed-by: Edward O'Callaghan <funfunctor@folklore1984.net> Reviewed-by: Huang Rui <ray.huang@amd.com> Reviewed-by: Alex Deucher <alexander.deucher@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
6e9057a8f9
commit
f80c738c61
|
@ -3944,13 +3944,13 @@ static void si_dpm_start_smc(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
si_program_jump_on_start(adev);
|
si_program_jump_on_start(adev);
|
||||||
si_start_smc(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)
|
static void si_dpm_stop_smc(struct amdgpu_device *adev)
|
||||||
{
|
{
|
||||||
si_reset_smc(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)
|
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);
|
struct si_power_info *si_pi = si_get_pi(adev);
|
||||||
|
|
||||||
si_reset_smc(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);
|
return si_load_smc_ucode(adev, si_pi->sram_end);
|
||||||
}
|
}
|
||||||
|
|
|
@ -84,7 +84,6 @@ int si_copy_bytes_to_smc(struct amdgpu_device *adev,
|
||||||
goto done;
|
goto done;
|
||||||
|
|
||||||
original_data = RREG32(SMC_IND_DATA_0);
|
original_data = RREG32(SMC_IND_DATA_0);
|
||||||
|
|
||||||
extra_shift = 8 * (4 - byte_count);
|
extra_shift = 8 * (4 - byte_count);
|
||||||
|
|
||||||
while (byte_count > 0) {
|
while (byte_count > 0) {
|
||||||
|
@ -94,7 +93,6 @@ int si_copy_bytes_to_smc(struct amdgpu_device *adev,
|
||||||
}
|
}
|
||||||
|
|
||||||
data <<= extra_shift;
|
data <<= extra_shift;
|
||||||
|
|
||||||
data |= (original_data & ~((~0UL) << extra_shift));
|
data |= (original_data & ~((~0UL) << extra_shift));
|
||||||
|
|
||||||
ret = si_set_smc_sram_address(adev, addr, limit);
|
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);
|
||||||
RREG32(CB_CGTT_SCLK_CTRL);
|
RREG32(CB_CGTT_SCLK_CTRL);
|
||||||
|
|
||||||
tmp = RREG32_SMC(SMC_SYSCON_RESET_CNTL);
|
tmp = RREG32_SMC(SMC_SYSCON_RESET_CNTL) |
|
||||||
tmp |= RST_REG;
|
RST_REG;
|
||||||
WREG32_SMC(SMC_SYSCON_RESET_CNTL, tmp);
|
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);
|
return si_copy_bytes_to_smc(adev, 0x0, data, 4, sizeof(data)+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void si_stop_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);
|
u32 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0);
|
||||||
|
|
||||||
tmp |= CK_DISABLE;
|
if (enable)
|
||||||
|
tmp &= ~CK_DISABLE;
|
||||||
WREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0, tmp);
|
else
|
||||||
}
|
tmp |= CK_DISABLE;
|
||||||
|
|
||||||
void si_start_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);
|
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;
|
break;
|
||||||
udelay(1);
|
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)
|
PPSMC_Result si_wait_for_smc_inactive(struct amdgpu_device *adev)
|
||||||
|
|
|
@ -408,8 +408,7 @@ int si_copy_bytes_to_smc(struct amdgpu_device *adev,
|
||||||
void si_start_smc(struct amdgpu_device *adev);
|
void si_start_smc(struct amdgpu_device *adev);
|
||||||
void si_reset_smc(struct amdgpu_device *adev);
|
void si_reset_smc(struct amdgpu_device *adev);
|
||||||
int si_program_jump_on_start(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_smc_clock(struct amdgpu_device *adev, bool enable);
|
||||||
void si_start_smc_clock(struct amdgpu_device *adev);
|
|
||||||
bool si_is_smc_running(struct amdgpu_device *adev);
|
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_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg);
|
||||||
PPSMC_Result si_wait_for_smc_inactive(struct amdgpu_device *adev);
|
PPSMC_Result si_wait_for_smc_inactive(struct amdgpu_device *adev);
|
||||||
|
|
Loading…
Reference in New Issue