aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom St Denis <tom.stdenis@amd.com>2016-09-06 11:56:42 -0400
committerAlex Deucher <alexander.deucher@amd.com>2016-09-14 09:43:39 -0400
commitf80c738c614e4410c3c343141c0edabfea421862 (patch)
treed6fba65f976988a694a09f1ab2a7b5b69f24c673
parent6e9057a8f90f3a9d662d8c0a347850e1fa331a30 (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.c6
-rw-r--r--drivers/gpu/drm/amd/amdgpu/si_smc.c25
-rw-r--r--drivers/gpu/drm/amd/amdgpu/sislands_smc.h3
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
3950static void si_dpm_stop_smc(struct amdgpu_device *adev) 3950static 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
3956static int si_process_firmware_header(struct amdgpu_device *adev) 3956static 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
143void si_stop_smc_clock(struct amdgpu_device *adev) 141void 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
152void 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
193PPSMC_Result si_wait_for_smc_inactive(struct amdgpu_device *adev) 184PPSMC_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,
408void si_start_smc(struct amdgpu_device *adev); 408void si_start_smc(struct amdgpu_device *adev);
409void si_reset_smc(struct amdgpu_device *adev); 409void si_reset_smc(struct amdgpu_device *adev);
410int si_program_jump_on_start(struct amdgpu_device *adev); 410int si_program_jump_on_start(struct amdgpu_device *adev);
411void si_stop_smc_clock(struct amdgpu_device *adev); 411void si_smc_clock(struct amdgpu_device *adev, bool enable);
412void si_start_smc_clock(struct amdgpu_device *adev);
413bool si_is_smc_running(struct amdgpu_device *adev); 412bool si_is_smc_running(struct amdgpu_device *adev);
414PPSMC_Result si_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg); 413PPSMC_Result si_send_msg_to_smc(struct amdgpu_device *adev, PPSMC_Msg msg);
415PPSMC_Result si_wait_for_smc_inactive(struct amdgpu_device *adev); 414PPSMC_Result si_wait_for_smc_inactive(struct amdgpu_device *adev);