diff options
author | Tom St Denis <tom.stdenis@amd.com> | 2016-09-06 11:56:42 -0400 |
---|---|---|
committer | Alex Deucher <alexander.deucher@amd.com> | 2016-09-14 09:43:39 -0400 |
commit | f80c738c614e4410c3c343141c0edabfea421862 (patch) | |
tree | d6fba65f976988a694a09f1ab2a7b5b69f24c673 | |
parent | 6e9057a8f90f3a9d662d8c0a347850e1fa331a30 (diff) |
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>
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/si_dpm.c | 6 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/si_smc.c | 25 | ||||
-rw-r--r-- | drivers/gpu/drm/amd/amdgpu/sislands_smc.h | 3 |
3 files changed, 12 insertions, 22 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/si_dpm.c b/drivers/gpu/drm/amd/amdgpu/si_dpm.c index 8e6bbaf380d0..7b9debefd64a 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) | |||
3944 | { | 3944 | { |
3945 | si_program_jump_on_start(adev); | 3945 | si_program_jump_on_start(adev); |
3946 | si_start_smc(adev); | 3946 | si_start_smc(adev); |
3947 | si_start_smc_clock(adev); | 3947 | si_smc_clock(adev, true); |
3948 | } | 3948 | } |
3949 | 3949 | ||
3950 | static void si_dpm_stop_smc(struct amdgpu_device *adev) | 3950 | static void si_dpm_stop_smc(struct amdgpu_device *adev) |
3951 | { | 3951 | { |
3952 | si_reset_smc(adev); | 3952 | si_reset_smc(adev); |
3953 | si_stop_smc_clock(adev); | 3953 | si_smc_clock(adev, false); |
3954 | } | 3954 | } |
3955 | 3955 | ||
3956 | static int si_process_firmware_header(struct amdgpu_device *adev) | 3956 | static int si_process_firmware_header(struct amdgpu_device *adev) |
@@ -4366,7 +4366,7 @@ static int si_upload_firmware(struct amdgpu_device *adev) | |||
4366 | struct si_power_info *si_pi = si_get_pi(adev); | 4366 | struct si_power_info *si_pi = si_get_pi(adev); |
4367 | 4367 | ||
4368 | si_reset_smc(adev); | 4368 | si_reset_smc(adev); |
4369 | si_stop_smc_clock(adev); | 4369 | si_smc_clock(adev, false); |
4370 | 4370 | ||
4371 | return si_load_smc_ucode(adev, si_pi->sram_end); | 4371 | return si_load_smc_ucode(adev, si_pi->sram_end); |
4372 | } | 4372 | } |
diff --git a/drivers/gpu/drm/amd/amdgpu/si_smc.c b/drivers/gpu/drm/amd/amdgpu/si_smc.c index c1c259464ae7..47bbb40e7014 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, | |||
84 | goto done; | 84 | goto done; |
85 | 85 | ||
86 | original_data = RREG32(SMC_IND_DATA_0); | 86 | original_data = RREG32(SMC_IND_DATA_0); |
87 | |||
88 | extra_shift = 8 * (4 - byte_count); | 87 | extra_shift = 8 * (4 - byte_count); |
89 | 88 | ||
90 | while (byte_count > 0) { | 89 | while (byte_count > 0) { |
@@ -94,7 +93,6 @@ int si_copy_bytes_to_smc(struct amdgpu_device *adev, | |||
94 | } | 93 | } |
95 | 94 | ||
96 | data <<= extra_shift; | 95 | data <<= extra_shift; |
97 | |||
98 | data |= (original_data & ~((~0UL) << extra_shift)); | 96 | data |= (original_data & ~((~0UL) << extra_shift)); |
99 | 97 | ||
100 | ret = si_set_smc_sram_address(adev, addr, limit); | 98 | ret = si_set_smc_sram_address(adev, addr, limit); |
@@ -128,8 +126,8 @@ void si_reset_smc(struct amdgpu_device *adev) | |||
128 | RREG32(CB_CGTT_SCLK_CTRL); | 126 | RREG32(CB_CGTT_SCLK_CTRL); |
129 | RREG32(CB_CGTT_SCLK_CTRL); | 127 | RREG32(CB_CGTT_SCLK_CTRL); |
130 | 128 | ||
131 | tmp = RREG32_SMC(SMC_SYSCON_RESET_CNTL); | 129 | tmp = RREG32_SMC(SMC_SYSCON_RESET_CNTL) | |
132 | tmp |= RST_REG; | 130 | RST_REG; |
133 | WREG32_SMC(SMC_SYSCON_RESET_CNTL, tmp); | 131 | WREG32_SMC(SMC_SYSCON_RESET_CNTL, tmp); |
134 | } | 132 | } |
135 | 133 | ||
@@ -140,20 +138,14 @@ int si_program_jump_on_start(struct amdgpu_device *adev) | |||
140 | return si_copy_bytes_to_smc(adev, 0x0, data, 4, sizeof(data)+1); | 138 | return si_copy_bytes_to_smc(adev, 0x0, data, 4, sizeof(data)+1); |
141 | } | 139 | } |
142 | 140 | ||
143 | void si_stop_smc_clock(struct amdgpu_device *adev) | 141 | void si_smc_clock(struct amdgpu_device *adev, bool enable) |
144 | { | ||
145 | u32 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0); | ||
146 | |||
147 | tmp |= CK_DISABLE; | ||
148 | |||
149 | WREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0, tmp); | ||
150 | } | ||
151 | |||
152 | void si_start_smc_clock(struct amdgpu_device *adev) | ||
153 | { | 142 | { |
154 | u32 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0); | 143 | u32 tmp = RREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0); |
155 | 144 | ||
156 | tmp &= ~CK_DISABLE; | 145 | if (enable) |
146 | tmp &= ~CK_DISABLE; | ||
147 | else | ||
148 | tmp |= CK_DISABLE; | ||
157 | 149 | ||
158 | WREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0, tmp); | 150 | WREG32_SMC(SMC_SYSCON_CLOCK_CNTL_0, tmp); |
159 | } | 151 | } |
@@ -185,9 +177,8 @@ PPSMC_Result si_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg) | |||
185 | break; | 177 | break; |
186 | udelay(1); | 178 | udelay(1); |
187 | } | 179 | } |
188 | tmp = RREG32(SMC_RESP_0); | ||
189 | 180 | ||
190 | return (PPSMC_Result)tmp; | 181 | return (PPSMC_Result)RREG32(SMC_RESP_0); |
191 | } | 182 | } |
192 | 183 | ||
193 | PPSMC_Result si_wait_for_smc_inactive(struct amdgpu_device *adev) | 184 | 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 542ab46aeb40..c5b3377df2da 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, | |||
408 | void si_start_smc(struct amdgpu_device *adev); | 408 | void si_start_smc(struct amdgpu_device *adev); |
409 | void si_reset_smc(struct amdgpu_device *adev); | 409 | void si_reset_smc(struct amdgpu_device *adev); |
410 | int si_program_jump_on_start(struct amdgpu_device *adev); | 410 | int si_program_jump_on_start(struct amdgpu_device *adev); |
411 | void si_stop_smc_clock(struct amdgpu_device *adev); | 411 | void si_smc_clock(struct amdgpu_device *adev, bool enable); |
412 | void si_start_smc_clock(struct amdgpu_device *adev); | ||
413 | bool si_is_smc_running(struct amdgpu_device *adev); | 412 | bool si_is_smc_running(struct amdgpu_device *adev); |
414 | PPSMC_Result si_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg); | 413 | PPSMC_Result si_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg); |
415 | PPSMC_Result si_wait_for_smc_inactive(struct amdgpu_device *adev); | 414 | PPSMC_Result si_wait_for_smc_inactive(struct amdgpu_device *adev); |