2 * Copyright 2011 Advanced Micro Devices, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included in
12 * all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
22 * Authors: Alex Deucher
27 #include "radeon_asic.h"
28 #include "evergreend.h"
30 #include "cypress_dpm.h"
33 #define SMC_RAM_END 0x8000
35 #define MC_CG_ARB_FREQ_F0 0x0a
36 #define MC_CG_ARB_FREQ_F1 0x0b
37 #define MC_CG_ARB_FREQ_F2 0x0c
38 #define MC_CG_ARB_FREQ_F3 0x0d
40 #define MC_CG_SEQ_DRAMCONF_S0 0x05
41 #define MC_CG_SEQ_DRAMCONF_S1 0x06
42 #define MC_CG_SEQ_YCLK_SUSPEND 0x04
43 #define MC_CG_SEQ_YCLK_RESUME 0x0a
45 struct rv7xx_ps
*rv770_get_ps(struct radeon_ps
*rps
);
46 struct rv7xx_power_info
*rv770_get_pi(struct radeon_device
*rdev
);
47 struct evergreen_power_info
*evergreen_get_pi(struct radeon_device
*rdev
);
49 static void cypress_enable_bif_dynamic_pcie_gen2(struct radeon_device
*rdev
,
52 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
55 tmp
= RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
);
57 if ((tmp
& LC_OTHER_SIDE_EVER_SENT_GEN2
) &&
58 (tmp
& LC_OTHER_SIDE_SUPPORTS_GEN2
)) {
59 if (!pi
->boot_in_gen2
) {
60 bif
= RREG32(CG_BIF_REQ_AND_RSP
) & ~CG_CLIENT_REQ_MASK
;
61 bif
|= CG_CLIENT_REQ(0xd);
62 WREG32(CG_BIF_REQ_AND_RSP
, bif
);
64 tmp
&= ~LC_HW_VOLTAGE_IF_CONTROL_MASK
;
65 tmp
|= LC_HW_VOLTAGE_IF_CONTROL(1);
66 tmp
|= LC_GEN2_EN_STRAP
;
68 tmp
|= LC_CLR_FAILED_SPD_CHANGE_CNT
;
69 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
, tmp
);
71 tmp
&= ~LC_CLR_FAILED_SPD_CHANGE_CNT
;
72 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
, tmp
);
76 if (!pi
->boot_in_gen2
) {
77 tmp
&= ~LC_HW_VOLTAGE_IF_CONTROL_MASK
;
78 tmp
&= ~LC_GEN2_EN_STRAP
;
80 if ((tmp
& LC_OTHER_SIDE_EVER_SENT_GEN2
) ||
81 (tmp
& LC_OTHER_SIDE_SUPPORTS_GEN2
))
82 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
, tmp
);
86 static void cypress_enable_dynamic_pcie_gen2(struct radeon_device
*rdev
,
89 cypress_enable_bif_dynamic_pcie_gen2(rdev
, enable
);
92 WREG32_P(GENERAL_PWRMGT
, ENABLE_GEN2PCIE
, ~ENABLE_GEN2PCIE
);
94 WREG32_P(GENERAL_PWRMGT
, 0, ~ENABLE_GEN2PCIE
);
98 static int cypress_enter_ulp_state(struct radeon_device
*rdev
)
100 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
102 if (pi
->gfx_clock_gating
) {
103 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~DYN_GFX_CLK_OFF_EN
);
104 WREG32_P(SCLK_PWRMGT_CNTL
, GFX_CLK_FORCE_ON
, ~GFX_CLK_FORCE_ON
);
105 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~GFX_CLK_FORCE_ON
);
107 RREG32(GB_ADDR_CONFIG
);
110 WREG32_P(SMC_MSG
, HOST_SMC_MSG(PPSMC_MSG_SwitchToMinimumPower
),
119 static void cypress_gfx_clock_gating_enable(struct radeon_device
*rdev
,
122 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
125 if (eg_pi
->light_sleep
) {
126 WREG32(GRBM_GFX_INDEX
, 0xC0000000);
128 WREG32_CG(CG_CGLS_TILE_0
, 0xFFFFFFFF);
129 WREG32_CG(CG_CGLS_TILE_1
, 0xFFFFFFFF);
130 WREG32_CG(CG_CGLS_TILE_2
, 0xFFFFFFFF);
131 WREG32_CG(CG_CGLS_TILE_3
, 0xFFFFFFFF);
132 WREG32_CG(CG_CGLS_TILE_4
, 0xFFFFFFFF);
133 WREG32_CG(CG_CGLS_TILE_5
, 0xFFFFFFFF);
134 WREG32_CG(CG_CGLS_TILE_6
, 0xFFFFFFFF);
135 WREG32_CG(CG_CGLS_TILE_7
, 0xFFFFFFFF);
136 WREG32_CG(CG_CGLS_TILE_8
, 0xFFFFFFFF);
137 WREG32_CG(CG_CGLS_TILE_9
, 0xFFFFFFFF);
138 WREG32_CG(CG_CGLS_TILE_10
, 0xFFFFFFFF);
139 WREG32_CG(CG_CGLS_TILE_11
, 0xFFFFFFFF);
141 WREG32_P(SCLK_PWRMGT_CNTL
, DYN_LIGHT_SLEEP_EN
, ~DYN_LIGHT_SLEEP_EN
);
143 WREG32_P(SCLK_PWRMGT_CNTL
, DYN_GFX_CLK_OFF_EN
, ~DYN_GFX_CLK_OFF_EN
);
145 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~DYN_GFX_CLK_OFF_EN
);
146 WREG32_P(SCLK_PWRMGT_CNTL
, GFX_CLK_FORCE_ON
, ~GFX_CLK_FORCE_ON
);
147 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~GFX_CLK_FORCE_ON
);
148 RREG32(GB_ADDR_CONFIG
);
150 if (eg_pi
->light_sleep
) {
151 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~DYN_LIGHT_SLEEP_EN
);
153 WREG32(GRBM_GFX_INDEX
, 0xC0000000);
155 WREG32_CG(CG_CGLS_TILE_0
, 0);
156 WREG32_CG(CG_CGLS_TILE_1
, 0);
157 WREG32_CG(CG_CGLS_TILE_2
, 0);
158 WREG32_CG(CG_CGLS_TILE_3
, 0);
159 WREG32_CG(CG_CGLS_TILE_4
, 0);
160 WREG32_CG(CG_CGLS_TILE_5
, 0);
161 WREG32_CG(CG_CGLS_TILE_6
, 0);
162 WREG32_CG(CG_CGLS_TILE_7
, 0);
163 WREG32_CG(CG_CGLS_TILE_8
, 0);
164 WREG32_CG(CG_CGLS_TILE_9
, 0);
165 WREG32_CG(CG_CGLS_TILE_10
, 0);
166 WREG32_CG(CG_CGLS_TILE_11
, 0);
171 static void cypress_mg_clock_gating_enable(struct radeon_device
*rdev
,
174 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
175 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
178 u32 cgts_sm_ctrl_reg
;
180 if (rdev
->family
== CHIP_CEDAR
)
181 cgts_sm_ctrl_reg
= CEDAR_MGCGCGTSSMCTRL_DFLT
;
182 else if (rdev
->family
== CHIP_REDWOOD
)
183 cgts_sm_ctrl_reg
= REDWOOD_MGCGCGTSSMCTRL_DFLT
;
185 cgts_sm_ctrl_reg
= CYPRESS_MGCGCGTSSMCTRL_DFLT
;
187 WREG32(GRBM_GFX_INDEX
, 0xC0000000);
189 WREG32_CG(CG_CGTT_LOCAL_0
, CYPRESS_MGCGTTLOCAL0_DFLT
);
190 WREG32_CG(CG_CGTT_LOCAL_1
, CYPRESS_MGCGTTLOCAL1_DFLT
& 0xFFFFCFFF);
191 WREG32_CG(CG_CGTT_LOCAL_2
, CYPRESS_MGCGTTLOCAL2_DFLT
);
192 WREG32_CG(CG_CGTT_LOCAL_3
, CYPRESS_MGCGTTLOCAL3_DFLT
);
195 WREG32(CGTS_SM_CTRL_REG
, cgts_sm_ctrl_reg
);
198 WREG32_P(MC_CITF_MISC_RD_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
199 WREG32_P(MC_CITF_MISC_WR_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
200 WREG32_P(MC_CITF_MISC_VM_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
201 WREG32_P(MC_HUB_MISC_HUB_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
202 WREG32_P(MC_HUB_MISC_VM_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
203 WREG32_P(MC_HUB_MISC_SIP_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
204 WREG32_P(MC_XPB_CLK_GAT
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
205 WREG32_P(VM_L2_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
208 WREG32(GRBM_GFX_INDEX
, 0xC0000000);
210 WREG32_CG(CG_CGTT_LOCAL_0
, 0xFFFFFFFF);
211 WREG32_CG(CG_CGTT_LOCAL_1
, 0xFFFFFFFF);
212 WREG32_CG(CG_CGTT_LOCAL_2
, 0xFFFFFFFF);
213 WREG32_CG(CG_CGTT_LOCAL_3
, 0xFFFFFFFF);
216 WREG32(CGTS_SM_CTRL_REG
, 0x81f44bc0);
220 void cypress_enable_spread_spectrum(struct radeon_device
*rdev
,
223 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
227 WREG32_P(GENERAL_PWRMGT
, DYN_SPREAD_SPECTRUM_EN
, ~DYN_SPREAD_SPECTRUM_EN
);
230 WREG32_P(MPLL_CNTL_MODE
, SS_SSEN
, ~SS_SSEN
);
232 WREG32_P(CG_SPLL_SPREAD_SPECTRUM
, 0, ~SSEN
);
233 WREG32_P(GENERAL_PWRMGT
, 0, ~DYN_SPREAD_SPECTRUM_EN
);
234 WREG32_P(MPLL_CNTL_MODE
, 0, ~SS_SSEN
);
235 WREG32_P(MPLL_CNTL_MODE
, 0, ~SS_DSMODE_EN
);
239 void cypress_start_dpm(struct radeon_device
*rdev
)
241 WREG32_P(GENERAL_PWRMGT
, GLOBAL_PWRMGT_EN
, ~GLOBAL_PWRMGT_EN
);
244 void cypress_enable_sclk_control(struct radeon_device
*rdev
,
248 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~SCLK_PWRMGT_OFF
);
250 WREG32_P(SCLK_PWRMGT_CNTL
, SCLK_PWRMGT_OFF
, ~SCLK_PWRMGT_OFF
);
253 void cypress_enable_mclk_control(struct radeon_device
*rdev
,
257 WREG32_P(MCLK_PWRMGT_CNTL
, 0, ~MPLL_PWRMGT_OFF
);
259 WREG32_P(MCLK_PWRMGT_CNTL
, MPLL_PWRMGT_OFF
, ~MPLL_PWRMGT_OFF
);
262 int cypress_notify_smc_display_change(struct radeon_device
*rdev
,
265 PPSMC_Msg msg
= has_display
?
266 (PPSMC_Msg
)PPSMC_MSG_HasDisplay
: (PPSMC_Msg
)PPSMC_MSG_NoDisplay
;
268 if (rv770_send_msg_to_smc(rdev
, msg
) != PPSMC_Result_OK
)
274 void cypress_program_response_times(struct radeon_device
*rdev
)
277 u32 mclk_switch_limit
;
279 reference_clock
= radeon_get_xclk(rdev
);
280 mclk_switch_limit
= (460 * reference_clock
) / 100;
282 rv770_write_smc_soft_register(rdev
,
283 RV770_SMC_SOFT_REGISTER_mclk_switch_lim
,
286 rv770_write_smc_soft_register(rdev
,
287 RV770_SMC_SOFT_REGISTER_mvdd_chg_time
, 1);
289 rv770_write_smc_soft_register(rdev
,
290 RV770_SMC_SOFT_REGISTER_mc_block_delay
, 0xAA);
292 rv770_program_response_times(rdev
);
294 if (ASIC_IS_LOMBOK(rdev
))
295 rv770_write_smc_soft_register(rdev
,
296 RV770_SMC_SOFT_REGISTER_is_asic_lombok
, 1);
300 static int cypress_pcie_performance_request(struct radeon_device
*rdev
,
301 u8 perf_req
, bool advertise
)
303 #if defined(CONFIG_ACPI)
304 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
309 tmp
= RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
);
310 if ((perf_req
== PCIE_PERF_REQ_PECI_GEN1
) && (tmp
& LC_CURRENT_DATA_RATE
))
313 #if defined(CONFIG_ACPI)
314 if ((perf_req
== PCIE_PERF_REQ_PECI_GEN1
) ||
315 (perf_req
== PCIE_PERF_REQ_PECI_GEN2
)) {
316 eg_pi
->pcie_performance_request_registered
= true;
317 return radeon_acpi_pcie_performance_request(rdev
, perf_req
, advertise
);
318 } else if ((perf_req
== PCIE_PERF_REQ_REMOVE_REGISTRY
) &&
319 eg_pi
->pcie_performance_request_registered
) {
320 eg_pi
->pcie_performance_request_registered
= false;
321 return radeon_acpi_pcie_performance_request(rdev
, perf_req
, advertise
);
328 void cypress_advertise_gen2_capability(struct radeon_device
*rdev
)
330 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
333 #if defined(CONFIG_ACPI)
334 radeon_acpi_pcie_notify_device_ready(rdev
);
337 tmp
= RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
);
339 if ((tmp
& LC_OTHER_SIDE_EVER_SENT_GEN2
) &&
340 (tmp
& LC_OTHER_SIDE_SUPPORTS_GEN2
))
341 pi
->pcie_gen2
= true;
343 pi
->pcie_gen2
= false;
346 cypress_pcie_performance_request(rdev
, PCIE_PERF_REQ_PECI_GEN2
, true);
350 static enum radeon_pcie_gen
cypress_get_maximum_link_speed(struct radeon_ps
*radeon_state
)
352 struct rv7xx_ps
*state
= rv770_get_ps(radeon_state
);
354 if (state
->high
.flags
& ATOM_PPLIB_R600_FLAGS_PCIEGEN2
)
359 void cypress_notify_link_speed_change_after_state_change(struct radeon_device
*rdev
,
360 struct radeon_ps
*radeon_new_state
,
361 struct radeon_ps
*radeon_current_state
)
363 enum radeon_pcie_gen pcie_link_speed_target
=
364 cypress_get_maximum_link_speed(radeon_new_state
);
365 enum radeon_pcie_gen pcie_link_speed_current
=
366 cypress_get_maximum_link_speed(radeon_current_state
);
369 if (pcie_link_speed_target
< pcie_link_speed_current
) {
370 if (pcie_link_speed_target
== RADEON_PCIE_GEN1
)
371 request
= PCIE_PERF_REQ_PECI_GEN1
;
372 else if (pcie_link_speed_target
== RADEON_PCIE_GEN2
)
373 request
= PCIE_PERF_REQ_PECI_GEN2
;
375 request
= PCIE_PERF_REQ_PECI_GEN3
;
377 cypress_pcie_performance_request(rdev
, request
, false);
381 void cypress_notify_link_speed_change_before_state_change(struct radeon_device
*rdev
,
382 struct radeon_ps
*radeon_new_state
,
383 struct radeon_ps
*radeon_current_state
)
385 enum radeon_pcie_gen pcie_link_speed_target
=
386 cypress_get_maximum_link_speed(radeon_new_state
);
387 enum radeon_pcie_gen pcie_link_speed_current
=
388 cypress_get_maximum_link_speed(radeon_current_state
);
391 if (pcie_link_speed_target
> pcie_link_speed_current
) {
392 if (pcie_link_speed_target
== RADEON_PCIE_GEN1
)
393 request
= PCIE_PERF_REQ_PECI_GEN1
;
394 else if (pcie_link_speed_target
== RADEON_PCIE_GEN2
)
395 request
= PCIE_PERF_REQ_PECI_GEN2
;
397 request
= PCIE_PERF_REQ_PECI_GEN3
;
399 cypress_pcie_performance_request(rdev
, request
, false);
403 static int cypress_populate_voltage_value(struct radeon_device
*rdev
,
404 struct atom_voltage_table
*table
,
405 u16 value
, RV770_SMC_VOLTAGE_VALUE
*voltage
)
409 for (i
= 0; i
< table
->count
; i
++) {
410 if (value
<= table
->entries
[i
].value
) {
411 voltage
->index
= (u8
)i
;
412 voltage
->value
= cpu_to_be16(table
->entries
[i
].value
);
417 if (i
== table
->count
)
423 u8
cypress_get_strobe_mode_settings(struct radeon_device
*rdev
, u32 mclk
)
425 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
427 bool strobe_mode
= false;
430 if (mclk
<= pi
->mclk_strobe_mode_threshold
)
432 result
= cypress_get_mclk_frequency_ratio(rdev
, mclk
, strobe_mode
);
435 result
|= SMC_STROBE_ENABLE
;
441 u32
cypress_map_clkf_to_ibias(struct radeon_device
*rdev
, u32 clkf
)
443 u32 ref_clk
= rdev
->clock
.mpll
.reference_freq
;
444 u32 vco
= clkf
* ref_clk
;
446 /* 100 Mhz ref clk */
447 if (ref_clk
== 10000) {
473 static int cypress_populate_mclk_value(struct radeon_device
*rdev
,
474 u32 engine_clock
, u32 memory_clock
,
475 RV7XX_SMC_MCLK_VALUE
*mclk
,
476 bool strobe_mode
, bool dll_state_on
)
478 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
480 u32 mpll_ad_func_cntl
=
481 pi
->clk_regs
.rv770
.mpll_ad_func_cntl
;
482 u32 mpll_ad_func_cntl_2
=
483 pi
->clk_regs
.rv770
.mpll_ad_func_cntl_2
;
484 u32 mpll_dq_func_cntl
=
485 pi
->clk_regs
.rv770
.mpll_dq_func_cntl
;
486 u32 mpll_dq_func_cntl_2
=
487 pi
->clk_regs
.rv770
.mpll_dq_func_cntl_2
;
488 u32 mclk_pwrmgt_cntl
=
489 pi
->clk_regs
.rv770
.mclk_pwrmgt_cntl
;
491 pi
->clk_regs
.rv770
.dll_cntl
;
492 u32 mpll_ss1
= pi
->clk_regs
.rv770
.mpll_ss1
;
493 u32 mpll_ss2
= pi
->clk_regs
.rv770
.mpll_ss2
;
494 struct atom_clock_dividers dividers
;
500 ret
= radeon_atom_get_clock_dividers(rdev
, COMPUTE_MEMORY_PLL_PARAM
,
501 memory_clock
, strobe_mode
, ÷rs
);
506 mc_seq_misc7
= RREG32(MC_SEQ_MISC7
);
508 if(mc_seq_misc7
& 0x8000000)
509 dividers
.post_div
= 1;
512 ibias
= cypress_map_clkf_to_ibias(rdev
, dividers
.whole_fb_div
);
514 mpll_ad_func_cntl
&= ~(CLKR_MASK
|
519 mpll_ad_func_cntl
|= CLKR(dividers
.ref_div
);
520 mpll_ad_func_cntl
|= YCLK_POST_DIV(dividers
.post_div
);
521 mpll_ad_func_cntl
|= CLKF(dividers
.whole_fb_div
);
522 mpll_ad_func_cntl
|= CLKFRAC(dividers
.frac_fb_div
);
523 mpll_ad_func_cntl
|= IBIAS(ibias
);
525 if (dividers
.vco_mode
)
526 mpll_ad_func_cntl_2
|= VCO_MODE
;
528 mpll_ad_func_cntl_2
&= ~VCO_MODE
;
531 mpll_dq_func_cntl
&= ~(CLKR_MASK
|
536 mpll_dq_func_cntl
|= CLKR(dividers
.ref_div
);
537 mpll_dq_func_cntl
|= YCLK_POST_DIV(dividers
.post_div
);
538 mpll_dq_func_cntl
|= CLKF(dividers
.whole_fb_div
);
539 mpll_dq_func_cntl
|= CLKFRAC(dividers
.frac_fb_div
);
540 mpll_dq_func_cntl
|= IBIAS(ibias
);
543 mpll_dq_func_cntl
&= ~PDNB
;
545 mpll_dq_func_cntl
|= PDNB
;
547 if (dividers
.vco_mode
)
548 mpll_dq_func_cntl_2
|= VCO_MODE
;
550 mpll_dq_func_cntl_2
&= ~VCO_MODE
;
554 struct radeon_atom_ss ss
;
555 u32 vco_freq
= memory_clock
* dividers
.post_div
;
557 if (radeon_atombios_get_asic_ss_info(rdev
, &ss
,
558 ASIC_INTERNAL_MEMORY_SS
, vco_freq
)) {
559 u32 reference_clock
= rdev
->clock
.mpll
.reference_freq
;
560 u32 decoded_ref
= rv740_get_decoded_reference_divider(dividers
.ref_div
);
561 u32 clk_s
= reference_clock
* 5 / (decoded_ref
* ss
.rate
);
562 u32 clk_v
= ss
.percentage
*
563 (0x4000 * dividers
.whole_fb_div
+ 0x800 * dividers
.frac_fb_div
) / (clk_s
* 625);
565 mpll_ss1
&= ~CLKV_MASK
;
566 mpll_ss1
|= CLKV(clk_v
);
568 mpll_ss2
&= ~CLKS_MASK
;
569 mpll_ss2
|= CLKS(clk_s
);
573 dll_speed
= rv740_get_dll_speed(pi
->mem_gddr5
,
576 mclk_pwrmgt_cntl
&= ~DLL_SPEED_MASK
;
577 mclk_pwrmgt_cntl
|= DLL_SPEED(dll_speed
);
579 mclk_pwrmgt_cntl
|= (MRDCKA0_PDNB
|
588 mclk_pwrmgt_cntl
&= ~(MRDCKA0_PDNB
|
597 mclk
->mclk770
.mclk_value
= cpu_to_be32(memory_clock
);
598 mclk
->mclk770
.vMPLL_AD_FUNC_CNTL
= cpu_to_be32(mpll_ad_func_cntl
);
599 mclk
->mclk770
.vMPLL_AD_FUNC_CNTL_2
= cpu_to_be32(mpll_ad_func_cntl_2
);
600 mclk
->mclk770
.vMPLL_DQ_FUNC_CNTL
= cpu_to_be32(mpll_dq_func_cntl
);
601 mclk
->mclk770
.vMPLL_DQ_FUNC_CNTL_2
= cpu_to_be32(mpll_dq_func_cntl_2
);
602 mclk
->mclk770
.vMCLK_PWRMGT_CNTL
= cpu_to_be32(mclk_pwrmgt_cntl
);
603 mclk
->mclk770
.vDLL_CNTL
= cpu_to_be32(dll_cntl
);
604 mclk
->mclk770
.vMPLL_SS
= cpu_to_be32(mpll_ss1
);
605 mclk
->mclk770
.vMPLL_SS2
= cpu_to_be32(mpll_ss2
);
610 u8
cypress_get_mclk_frequency_ratio(struct radeon_device
*rdev
,
611 u32 memory_clock
, bool strobe_mode
)
615 if (rdev
->family
>= CHIP_BARTS
) {
617 if (memory_clock
< 10000)
618 mc_para_index
= 0x00;
619 else if (memory_clock
> 47500)
620 mc_para_index
= 0x0f;
622 mc_para_index
= (u8
)((memory_clock
- 10000) / 2500);
624 if (memory_clock
< 65000)
625 mc_para_index
= 0x00;
626 else if (memory_clock
> 135000)
627 mc_para_index
= 0x0f;
629 mc_para_index
= (u8
)((memory_clock
- 60000) / 5000);
633 if (memory_clock
< 10000)
634 mc_para_index
= 0x00;
635 else if (memory_clock
> 47500)
636 mc_para_index
= 0x0f;
638 mc_para_index
= (u8
)((memory_clock
- 10000) / 2500);
640 if (memory_clock
< 40000)
641 mc_para_index
= 0x00;
642 else if (memory_clock
> 115000)
643 mc_para_index
= 0x0f;
645 mc_para_index
= (u8
)((memory_clock
- 40000) / 5000);
648 return mc_para_index
;
651 static int cypress_populate_mvdd_value(struct radeon_device
*rdev
,
653 RV770_SMC_VOLTAGE_VALUE
*voltage
)
655 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
656 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
658 if (!pi
->mvdd_control
) {
659 voltage
->index
= eg_pi
->mvdd_high_index
;
660 voltage
->value
= cpu_to_be16(MVDD_HIGH_VALUE
);
664 if (mclk
<= pi
->mvdd_split_frequency
) {
665 voltage
->index
= eg_pi
->mvdd_low_index
;
666 voltage
->value
= cpu_to_be16(MVDD_LOW_VALUE
);
668 voltage
->index
= eg_pi
->mvdd_high_index
;
669 voltage
->value
= cpu_to_be16(MVDD_HIGH_VALUE
);
675 int cypress_convert_power_level_to_smc(struct radeon_device
*rdev
,
677 RV770_SMC_HW_PERFORMANCE_LEVEL
*level
,
680 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
681 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
685 level
->gen2PCIE
= pi
->pcie_gen2
?
686 ((pl
->flags
& ATOM_PPLIB_R600_FLAGS_PCIEGEN2
) ? 1 : 0) : 0;
687 level
->gen2XSP
= (pl
->flags
& ATOM_PPLIB_R600_FLAGS_PCIEGEN2
) ? 1 : 0;
688 level
->backbias
= (pl
->flags
& ATOM_PPLIB_R600_FLAGS_BACKBIASENABLE
) ? 1 : 0;
689 level
->displayWatermark
= watermark_level
;
691 ret
= rv740_populate_sclk_value(rdev
, pl
->sclk
, &level
->sclk
);
696 if (pi
->mclk_stutter_mode_threshold
&&
697 (pl
->mclk
<= pi
->mclk_stutter_mode_threshold
) &&
698 !eg_pi
->uvd_enabled
) {
699 level
->mcFlags
|= SMC_MC_STUTTER_EN
;
700 if (eg_pi
->sclk_deep_sleep
)
701 level
->stateFlags
|= PPSMC_STATEFLAG_AUTO_PULSE_SKIP
;
703 level
->stateFlags
&= ~PPSMC_STATEFLAG_AUTO_PULSE_SKIP
;
707 if (pl
->mclk
> pi
->mclk_edc_enable_threshold
)
708 level
->mcFlags
|= SMC_MC_EDC_RD_FLAG
;
710 if (pl
->mclk
> eg_pi
->mclk_edc_wr_enable_threshold
)
711 level
->mcFlags
|= SMC_MC_EDC_WR_FLAG
;
713 level
->strobeMode
= cypress_get_strobe_mode_settings(rdev
, pl
->mclk
);
715 if (level
->strobeMode
& SMC_STROBE_ENABLE
) {
716 if (cypress_get_mclk_frequency_ratio(rdev
, pl
->mclk
, true) >=
717 ((RREG32(MC_SEQ_MISC7
) >> 16) & 0xf))
718 dll_state_on
= ((RREG32(MC_SEQ_MISC5
) >> 1) & 0x1) ? true : false;
720 dll_state_on
= ((RREG32(MC_SEQ_MISC6
) >> 1) & 0x1) ? true : false;
722 dll_state_on
= eg_pi
->dll_default_on
;
724 ret
= cypress_populate_mclk_value(rdev
,
728 (level
->strobeMode
& SMC_STROBE_ENABLE
) != 0,
731 ret
= cypress_populate_mclk_value(rdev
,
741 ret
= cypress_populate_voltage_value(rdev
,
742 &eg_pi
->vddc_voltage_table
,
748 if (eg_pi
->vddci_control
) {
749 ret
= cypress_populate_voltage_value(rdev
,
750 &eg_pi
->vddci_voltage_table
,
757 ret
= cypress_populate_mvdd_value(rdev
, pl
->mclk
, &level
->mvdd
);
762 static int cypress_convert_power_state_to_smc(struct radeon_device
*rdev
,
763 struct radeon_ps
*radeon_state
,
764 RV770_SMC_SWSTATE
*smc_state
)
766 struct rv7xx_ps
*state
= rv770_get_ps(radeon_state
);
767 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
770 if (!(radeon_state
->caps
& ATOM_PPLIB_DISALLOW_ON_DC
))
771 smc_state
->flags
|= PPSMC_SWSTATE_FLAG_DC
;
773 ret
= cypress_convert_power_level_to_smc(rdev
,
775 &smc_state
->levels
[0],
776 PPSMC_DISPLAY_WATERMARK_LOW
);
780 ret
= cypress_convert_power_level_to_smc(rdev
,
782 &smc_state
->levels
[1],
783 PPSMC_DISPLAY_WATERMARK_LOW
);
787 ret
= cypress_convert_power_level_to_smc(rdev
,
789 &smc_state
->levels
[2],
790 PPSMC_DISPLAY_WATERMARK_HIGH
);
794 smc_state
->levels
[0].arbValue
= MC_CG_ARB_FREQ_F1
;
795 smc_state
->levels
[1].arbValue
= MC_CG_ARB_FREQ_F2
;
796 smc_state
->levels
[2].arbValue
= MC_CG_ARB_FREQ_F3
;
798 if (eg_pi
->dynamic_ac_timing
) {
799 smc_state
->levels
[0].ACIndex
= 2;
800 smc_state
->levels
[1].ACIndex
= 3;
801 smc_state
->levels
[2].ACIndex
= 4;
803 smc_state
->levels
[0].ACIndex
= 0;
804 smc_state
->levels
[1].ACIndex
= 0;
805 smc_state
->levels
[2].ACIndex
= 0;
808 rv770_populate_smc_sp(rdev
, radeon_state
, smc_state
);
810 return rv770_populate_smc_t(rdev
, radeon_state
, smc_state
);
813 static void cypress_convert_mc_registers(struct evergreen_mc_reg_entry
*entry
,
814 SMC_Evergreen_MCRegisterSet
*data
,
815 u32 num_entries
, u32 valid_flag
)
819 for (i
= 0, j
= 0; j
< num_entries
; j
++) {
820 if (valid_flag
& (1 << j
)) {
821 data
->value
[i
] = cpu_to_be32(entry
->mc_data
[j
]);
827 static void cypress_convert_mc_reg_table_entry_to_smc(struct radeon_device
*rdev
,
829 SMC_Evergreen_MCRegisterSet
*mc_reg_table_data
)
831 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
834 for (i
= 0; i
< eg_pi
->mc_reg_table
.num_entries
; i
++) {
836 eg_pi
->mc_reg_table
.mc_reg_table_entry
[i
].mclk_max
)
840 if ((i
== eg_pi
->mc_reg_table
.num_entries
) && (i
> 0))
843 cypress_convert_mc_registers(&eg_pi
->mc_reg_table
.mc_reg_table_entry
[i
],
845 eg_pi
->mc_reg_table
.last
,
846 eg_pi
->mc_reg_table
.valid_flag
);
849 static void cypress_convert_mc_reg_table_to_smc(struct radeon_device
*rdev
,
850 struct radeon_ps
*radeon_state
,
851 SMC_Evergreen_MCRegisters
*mc_reg_table
)
853 struct rv7xx_ps
*state
= rv770_get_ps(radeon_state
);
855 cypress_convert_mc_reg_table_entry_to_smc(rdev
,
857 &mc_reg_table
->data
[2]);
858 cypress_convert_mc_reg_table_entry_to_smc(rdev
,
860 &mc_reg_table
->data
[3]);
861 cypress_convert_mc_reg_table_entry_to_smc(rdev
,
863 &mc_reg_table
->data
[4]);
866 int cypress_upload_sw_state(struct radeon_device
*rdev
,
867 struct radeon_ps
*radeon_new_state
)
869 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
870 u16 address
= pi
->state_table_start
+
871 offsetof(RV770_SMC_STATETABLE
, driverState
);
872 RV770_SMC_SWSTATE state
= { 0 };
875 ret
= cypress_convert_power_state_to_smc(rdev
, radeon_new_state
, &state
);
879 return rv770_copy_bytes_to_smc(rdev
, address
, (u8
*)&state
,
880 sizeof(RV770_SMC_SWSTATE
),
884 int cypress_upload_mc_reg_table(struct radeon_device
*rdev
,
885 struct radeon_ps
*radeon_new_state
)
887 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
888 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
889 SMC_Evergreen_MCRegisters mc_reg_table
= { 0 };
892 cypress_convert_mc_reg_table_to_smc(rdev
, radeon_new_state
, &mc_reg_table
);
894 address
= eg_pi
->mc_reg_table_start
+
895 (u16
)offsetof(SMC_Evergreen_MCRegisters
, data
[2]);
897 return rv770_copy_bytes_to_smc(rdev
, address
,
898 (u8
*)&mc_reg_table
.data
[2],
899 sizeof(SMC_Evergreen_MCRegisterSet
) * 3,
903 u32
cypress_calculate_burst_time(struct radeon_device
*rdev
,
904 u32 engine_clock
, u32 memory_clock
)
906 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
907 u32 multiplier
= pi
->mem_gddr5
? 1 : 2;
908 u32 result
= (4 * multiplier
* engine_clock
) / (memory_clock
/ 2);
914 burst_time
= result
- 4;
916 burst_time
= result
/ 2 ;
924 void cypress_program_memory_timing_parameters(struct radeon_device
*rdev
,
925 struct radeon_ps
*radeon_new_state
)
927 struct rv7xx_ps
*new_state
= rv770_get_ps(radeon_new_state
);
928 u32 mc_arb_burst_time
= RREG32(MC_ARB_BURST_TIME
);
930 mc_arb_burst_time
&= ~(STATE1_MASK
| STATE2_MASK
| STATE3_MASK
);
932 mc_arb_burst_time
|= STATE1(cypress_calculate_burst_time(rdev
,
934 new_state
->low
.mclk
));
935 mc_arb_burst_time
|= STATE2(cypress_calculate_burst_time(rdev
,
936 new_state
->medium
.sclk
,
937 new_state
->medium
.mclk
));
938 mc_arb_burst_time
|= STATE3(cypress_calculate_burst_time(rdev
,
939 new_state
->high
.sclk
,
940 new_state
->high
.mclk
));
942 rv730_program_memory_timing_parameters(rdev
, radeon_new_state
);
944 WREG32(MC_ARB_BURST_TIME
, mc_arb_burst_time
);
947 static void cypress_populate_mc_reg_addresses(struct radeon_device
*rdev
,
948 SMC_Evergreen_MCRegisters
*mc_reg_table
)
950 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
953 for (i
= 0, j
= 0; j
< eg_pi
->mc_reg_table
.last
; j
++) {
954 if (eg_pi
->mc_reg_table
.valid_flag
& (1 << j
)) {
955 mc_reg_table
->address
[i
].s0
=
956 cpu_to_be16(eg_pi
->mc_reg_table
.mc_reg_address
[j
].s0
);
957 mc_reg_table
->address
[i
].s1
=
958 cpu_to_be16(eg_pi
->mc_reg_table
.mc_reg_address
[j
].s1
);
963 mc_reg_table
->last
= (u8
)i
;
966 static void cypress_set_mc_reg_address_table(struct radeon_device
*rdev
)
968 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
971 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_RAS_TIMING_LP
>> 2;
972 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_RAS_TIMING
>> 2;
975 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_CAS_TIMING_LP
>> 2;
976 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_CAS_TIMING
>> 2;
979 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_MISC_TIMING_LP
>> 2;
980 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_MISC_TIMING
>> 2;
983 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_MISC_TIMING2_LP
>> 2;
984 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_MISC_TIMING2
>> 2;
987 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_RD_CTL_D0_LP
>> 2;
988 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_RD_CTL_D0
>> 2;
991 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_RD_CTL_D1_LP
>> 2;
992 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_RD_CTL_D1
>> 2;
995 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_WR_CTL_D0_LP
>> 2;
996 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_WR_CTL_D0
>> 2;
999 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_WR_CTL_D1_LP
>> 2;
1000 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_WR_CTL_D1
>> 2;
1003 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_PMG_CMD_EMRS_LP
>> 2;
1004 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_PMG_CMD_EMRS
>> 2;
1007 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_PMG_CMD_MRS_LP
>> 2;
1008 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_PMG_CMD_MRS
>> 2;
1011 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_PMG_CMD_MRS1_LP
>> 2;
1012 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_PMG_CMD_MRS1
>> 2;
1015 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_MISC1
>> 2;
1016 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_MISC1
>> 2;
1019 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_RESERVE_M
>> 2;
1020 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_RESERVE_M
>> 2;
1023 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_MISC3
>> 2;
1024 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_MISC3
>> 2;
1027 eg_pi
->mc_reg_table
.last
= (u8
)i
;
1030 static void cypress_retrieve_ac_timing_for_one_entry(struct radeon_device
*rdev
,
1031 struct evergreen_mc_reg_entry
*entry
)
1033 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1036 for (i
= 0; i
< eg_pi
->mc_reg_table
.last
; i
++)
1038 RREG32(eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
<< 2);
1042 static void cypress_retrieve_ac_timing_for_all_ranges(struct radeon_device
*rdev
,
1043 struct atom_memory_clock_range_table
*range_table
)
1045 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1048 for (i
= 0; i
< range_table
->num_entries
; i
++) {
1049 eg_pi
->mc_reg_table
.mc_reg_table_entry
[i
].mclk_max
=
1050 range_table
->mclk
[i
];
1051 radeon_atom_set_ac_timing(rdev
, range_table
->mclk
[i
]);
1052 cypress_retrieve_ac_timing_for_one_entry(rdev
,
1053 &eg_pi
->mc_reg_table
.mc_reg_table_entry
[i
]);
1056 eg_pi
->mc_reg_table
.num_entries
= range_table
->num_entries
;
1057 eg_pi
->mc_reg_table
.valid_flag
= 0;
1059 for (i
= 0; i
< eg_pi
->mc_reg_table
.last
; i
++) {
1060 for (j
= 1; j
< range_table
->num_entries
; j
++) {
1061 if (eg_pi
->mc_reg_table
.mc_reg_table_entry
[j
-1].mc_data
[i
] !=
1062 eg_pi
->mc_reg_table
.mc_reg_table_entry
[j
].mc_data
[i
]) {
1063 eg_pi
->mc_reg_table
.valid_flag
|= (1 << i
);
1070 static int cypress_initialize_mc_reg_table(struct radeon_device
*rdev
)
1072 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1073 u8 module_index
= rv770_get_memory_module_index(rdev
);
1074 struct atom_memory_clock_range_table range_table
= { 0 };
1077 ret
= radeon_atom_get_mclk_range_table(rdev
,
1079 module_index
, &range_table
);
1083 cypress_retrieve_ac_timing_for_all_ranges(rdev
, &range_table
);
1088 static void cypress_wait_for_mc_sequencer(struct radeon_device
*rdev
, u8 value
)
1093 if ((rdev
->family
== CHIP_CYPRESS
) ||
1094 (rdev
->family
== CHIP_HEMLOCK
))
1096 else if (rdev
->family
== CHIP_CEDAR
)
1099 for (i
= 0; i
< channels
; i
++) {
1100 if ((rdev
->family
== CHIP_CYPRESS
) ||
1101 (rdev
->family
== CHIP_HEMLOCK
)) {
1102 WREG32_P(MC_CONFIG_MCD
, MC_RD_ENABLE_MCD(i
), ~MC_RD_ENABLE_MCD_MASK
);
1103 WREG32_P(MC_CG_CONFIG_MCD
, MC_RD_ENABLE_MCD(i
), ~MC_RD_ENABLE_MCD_MASK
);
1105 WREG32_P(MC_CONFIG
, MC_RD_ENABLE(i
), ~MC_RD_ENABLE_MASK
);
1106 WREG32_P(MC_CG_CONFIG
, MC_RD_ENABLE(i
), ~MC_RD_ENABLE_MASK
);
1108 for (j
= 0; j
< rdev
->usec_timeout
; j
++) {
1109 if (((RREG32(MC_SEQ_CG
) & CG_SEQ_RESP_MASK
) >> CG_SEQ_RESP_SHIFT
) == value
)
1116 static void cypress_force_mc_use_s1(struct radeon_device
*rdev
,
1117 struct radeon_ps
*radeon_boot_state
)
1119 struct rv7xx_ps
*boot_state
= rv770_get_ps(radeon_boot_state
);
1124 if (RREG32(MC_SEQ_STATUS_M
) & PMG_PWRSTATE
)
1127 radeon_atom_set_ac_timing(rdev
, boot_state
->low
.mclk
);
1128 radeon_mc_wait_for_idle(rdev
);
1130 if ((rdev
->family
== CHIP_CYPRESS
) ||
1131 (rdev
->family
== CHIP_HEMLOCK
)) {
1132 WREG32(MC_CONFIG_MCD
, 0xf);
1133 WREG32(MC_CG_CONFIG_MCD
, 0xf);
1135 WREG32(MC_CONFIG
, 0xf);
1136 WREG32(MC_CG_CONFIG
, 0xf);
1139 for (i
= 0; i
< rdev
->num_crtc
; i
++)
1140 radeon_wait_for_vblank(rdev
, i
);
1142 WREG32(MC_SEQ_CG
, MC_CG_SEQ_YCLK_SUSPEND
);
1143 cypress_wait_for_mc_sequencer(rdev
, MC_CG_SEQ_YCLK_SUSPEND
);
1145 strobe_mode
= cypress_get_strobe_mode_settings(rdev
,
1146 boot_state
->low
.mclk
);
1148 mc_seq_cg
= CG_SEQ_REQ(MC_CG_SEQ_DRAMCONF_S1
);
1149 mc_seq_cg
|= SEQ_CG_RESP(strobe_mode
);
1150 WREG32(MC_SEQ_CG
, mc_seq_cg
);
1152 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
1153 if (RREG32(MC_SEQ_STATUS_M
) & PMG_PWRSTATE
)
1158 mc_seq_cg
&= ~CG_SEQ_REQ_MASK
;
1159 mc_seq_cg
|= CG_SEQ_REQ(MC_CG_SEQ_YCLK_RESUME
);
1160 WREG32(MC_SEQ_CG
, mc_seq_cg
);
1162 cypress_wait_for_mc_sequencer(rdev
, MC_CG_SEQ_YCLK_RESUME
);
1165 static void cypress_copy_ac_timing_from_s1_to_s0(struct radeon_device
*rdev
)
1167 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1171 for (i
= 0; i
< eg_pi
->mc_reg_table
.last
; i
++) {
1172 value
= RREG32(eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
<< 2);
1173 WREG32(eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
<< 2, value
);
1177 static void cypress_force_mc_use_s0(struct radeon_device
*rdev
,
1178 struct radeon_ps
*radeon_boot_state
)
1180 struct rv7xx_ps
*boot_state
= rv770_get_ps(radeon_boot_state
);
1185 cypress_copy_ac_timing_from_s1_to_s0(rdev
);
1186 radeon_mc_wait_for_idle(rdev
);
1188 if ((rdev
->family
== CHIP_CYPRESS
) ||
1189 (rdev
->family
== CHIP_HEMLOCK
)) {
1190 WREG32(MC_CONFIG_MCD
, 0xf);
1191 WREG32(MC_CG_CONFIG_MCD
, 0xf);
1193 WREG32(MC_CONFIG
, 0xf);
1194 WREG32(MC_CG_CONFIG
, 0xf);
1197 for (i
= 0; i
< rdev
->num_crtc
; i
++)
1198 radeon_wait_for_vblank(rdev
, i
);
1200 WREG32(MC_SEQ_CG
, MC_CG_SEQ_YCLK_SUSPEND
);
1201 cypress_wait_for_mc_sequencer(rdev
, MC_CG_SEQ_YCLK_SUSPEND
);
1203 strobe_mode
= cypress_get_strobe_mode_settings(rdev
,
1204 boot_state
->low
.mclk
);
1206 mc_seq_cg
= CG_SEQ_REQ(MC_CG_SEQ_DRAMCONF_S0
);
1207 mc_seq_cg
|= SEQ_CG_RESP(strobe_mode
);
1208 WREG32(MC_SEQ_CG
, mc_seq_cg
);
1210 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
1211 if (!(RREG32(MC_SEQ_STATUS_M
) & PMG_PWRSTATE
))
1216 mc_seq_cg
&= ~CG_SEQ_REQ_MASK
;
1217 mc_seq_cg
|= CG_SEQ_REQ(MC_CG_SEQ_YCLK_RESUME
);
1218 WREG32(MC_SEQ_CG
, mc_seq_cg
);
1220 cypress_wait_for_mc_sequencer(rdev
, MC_CG_SEQ_YCLK_RESUME
);
1223 static int cypress_populate_initial_mvdd_value(struct radeon_device
*rdev
,
1224 RV770_SMC_VOLTAGE_VALUE
*voltage
)
1226 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1228 voltage
->index
= eg_pi
->mvdd_high_index
;
1229 voltage
->value
= cpu_to_be16(MVDD_HIGH_VALUE
);
1234 int cypress_populate_smc_initial_state(struct radeon_device
*rdev
,
1235 struct radeon_ps
*radeon_initial_state
,
1236 RV770_SMC_STATETABLE
*table
)
1238 struct rv7xx_ps
*initial_state
= rv770_get_ps(radeon_initial_state
);
1239 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1240 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1243 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_AD_FUNC_CNTL
=
1244 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_ad_func_cntl
);
1245 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_AD_FUNC_CNTL_2
=
1246 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_ad_func_cntl_2
);
1247 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_DQ_FUNC_CNTL
=
1248 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_dq_func_cntl
);
1249 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_DQ_FUNC_CNTL_2
=
1250 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_dq_func_cntl_2
);
1251 table
->initialState
.levels
[0].mclk
.mclk770
.vMCLK_PWRMGT_CNTL
=
1252 cpu_to_be32(pi
->clk_regs
.rv770
.mclk_pwrmgt_cntl
);
1253 table
->initialState
.levels
[0].mclk
.mclk770
.vDLL_CNTL
=
1254 cpu_to_be32(pi
->clk_regs
.rv770
.dll_cntl
);
1256 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_SS
=
1257 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_ss1
);
1258 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_SS2
=
1259 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_ss2
);
1261 table
->initialState
.levels
[0].mclk
.mclk770
.mclk_value
=
1262 cpu_to_be32(initial_state
->low
.mclk
);
1264 table
->initialState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL
=
1265 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_func_cntl
);
1266 table
->initialState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL_2
=
1267 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_func_cntl_2
);
1268 table
->initialState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL_3
=
1269 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_func_cntl_3
);
1270 table
->initialState
.levels
[0].sclk
.vCG_SPLL_SPREAD_SPECTRUM
=
1271 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_spread_spectrum
);
1272 table
->initialState
.levels
[0].sclk
.vCG_SPLL_SPREAD_SPECTRUM_2
=
1273 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_spread_spectrum_2
);
1275 table
->initialState
.levels
[0].sclk
.sclk_value
=
1276 cpu_to_be32(initial_state
->low
.sclk
);
1278 table
->initialState
.levels
[0].arbValue
= MC_CG_ARB_FREQ_F0
;
1280 table
->initialState
.levels
[0].ACIndex
= 0;
1282 cypress_populate_voltage_value(rdev
,
1283 &eg_pi
->vddc_voltage_table
,
1284 initial_state
->low
.vddc
,
1285 &table
->initialState
.levels
[0].vddc
);
1287 if (eg_pi
->vddci_control
)
1288 cypress_populate_voltage_value(rdev
,
1289 &eg_pi
->vddci_voltage_table
,
1290 initial_state
->low
.vddci
,
1291 &table
->initialState
.levels
[0].vddci
);
1293 cypress_populate_initial_mvdd_value(rdev
,
1294 &table
->initialState
.levels
[0].mvdd
);
1296 a_t
= CG_R(0xffff) | CG_L(0);
1297 table
->initialState
.levels
[0].aT
= cpu_to_be32(a_t
);
1299 table
->initialState
.levels
[0].bSP
= cpu_to_be32(pi
->dsp
);
1302 if (pi
->boot_in_gen2
)
1303 table
->initialState
.levels
[0].gen2PCIE
= 1;
1305 table
->initialState
.levels
[0].gen2PCIE
= 0;
1306 if (initial_state
->low
.flags
& ATOM_PPLIB_R600_FLAGS_PCIEGEN2
)
1307 table
->initialState
.levels
[0].gen2XSP
= 1;
1309 table
->initialState
.levels
[0].gen2XSP
= 0;
1311 if (pi
->mem_gddr5
) {
1312 table
->initialState
.levels
[0].strobeMode
=
1313 cypress_get_strobe_mode_settings(rdev
,
1314 initial_state
->low
.mclk
);
1316 if (initial_state
->low
.mclk
> pi
->mclk_edc_enable_threshold
)
1317 table
->initialState
.levels
[0].mcFlags
= SMC_MC_EDC_RD_FLAG
| SMC_MC_EDC_WR_FLAG
;
1319 table
->initialState
.levels
[0].mcFlags
= 0;
1322 table
->initialState
.levels
[1] = table
->initialState
.levels
[0];
1323 table
->initialState
.levels
[2] = table
->initialState
.levels
[0];
1325 table
->initialState
.flags
|= PPSMC_SWSTATE_FLAG_DC
;
1330 int cypress_populate_smc_acpi_state(struct radeon_device
*rdev
,
1331 RV770_SMC_STATETABLE
*table
)
1333 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1334 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1335 u32 mpll_ad_func_cntl
=
1336 pi
->clk_regs
.rv770
.mpll_ad_func_cntl
;
1337 u32 mpll_ad_func_cntl_2
=
1338 pi
->clk_regs
.rv770
.mpll_ad_func_cntl_2
;
1339 u32 mpll_dq_func_cntl
=
1340 pi
->clk_regs
.rv770
.mpll_dq_func_cntl
;
1341 u32 mpll_dq_func_cntl_2
=
1342 pi
->clk_regs
.rv770
.mpll_dq_func_cntl_2
;
1343 u32 spll_func_cntl
=
1344 pi
->clk_regs
.rv770
.cg_spll_func_cntl
;
1345 u32 spll_func_cntl_2
=
1346 pi
->clk_regs
.rv770
.cg_spll_func_cntl_2
;
1347 u32 spll_func_cntl_3
=
1348 pi
->clk_regs
.rv770
.cg_spll_func_cntl_3
;
1349 u32 mclk_pwrmgt_cntl
=
1350 pi
->clk_regs
.rv770
.mclk_pwrmgt_cntl
;
1352 pi
->clk_regs
.rv770
.dll_cntl
;
1354 table
->ACPIState
= table
->initialState
;
1356 table
->ACPIState
.flags
&= ~PPSMC_SWSTATE_FLAG_DC
;
1358 if (pi
->acpi_vddc
) {
1359 cypress_populate_voltage_value(rdev
,
1360 &eg_pi
->vddc_voltage_table
,
1362 &table
->ACPIState
.levels
[0].vddc
);
1363 if (pi
->pcie_gen2
) {
1364 if (pi
->acpi_pcie_gen2
)
1365 table
->ACPIState
.levels
[0].gen2PCIE
= 1;
1367 table
->ACPIState
.levels
[0].gen2PCIE
= 0;
1369 table
->ACPIState
.levels
[0].gen2PCIE
= 0;
1370 if (pi
->acpi_pcie_gen2
)
1371 table
->ACPIState
.levels
[0].gen2XSP
= 1;
1373 table
->ACPIState
.levels
[0].gen2XSP
= 0;
1375 cypress_populate_voltage_value(rdev
,
1376 &eg_pi
->vddc_voltage_table
,
1377 pi
->min_vddc_in_table
,
1378 &table
->ACPIState
.levels
[0].vddc
);
1379 table
->ACPIState
.levels
[0].gen2PCIE
= 0;
1382 if (eg_pi
->acpi_vddci
) {
1383 if (eg_pi
->vddci_control
) {
1384 cypress_populate_voltage_value(rdev
,
1385 &eg_pi
->vddci_voltage_table
,
1387 &table
->ACPIState
.levels
[0].vddci
);
1391 mpll_ad_func_cntl
&= ~PDNB
;
1393 mpll_ad_func_cntl_2
|= BIAS_GEN_PDNB
| RESET_EN
;
1396 mpll_dq_func_cntl
&= ~PDNB
;
1397 mpll_dq_func_cntl_2
|= BIAS_GEN_PDNB
| RESET_EN
| BYPASS
;
1399 mclk_pwrmgt_cntl
|= (MRDCKA0_RESET
|
1408 mclk_pwrmgt_cntl
&= ~(MRDCKA0_PDNB
|
1417 dll_cntl
|= (MRDCKA0_BYPASS
|
1426 /* evergreen only */
1427 if (rdev
->family
<= CHIP_HEMLOCK
)
1428 spll_func_cntl
|= SPLL_RESET
| SPLL_SLEEP
| SPLL_BYPASS_EN
;
1430 spll_func_cntl_2
&= ~SCLK_MUX_SEL_MASK
;
1431 spll_func_cntl_2
|= SCLK_MUX_SEL(4);
1433 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMPLL_AD_FUNC_CNTL
=
1434 cpu_to_be32(mpll_ad_func_cntl
);
1435 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMPLL_AD_FUNC_CNTL_2
=
1436 cpu_to_be32(mpll_ad_func_cntl_2
);
1437 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMPLL_DQ_FUNC_CNTL
=
1438 cpu_to_be32(mpll_dq_func_cntl
);
1439 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMPLL_DQ_FUNC_CNTL_2
=
1440 cpu_to_be32(mpll_dq_func_cntl_2
);
1441 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMCLK_PWRMGT_CNTL
=
1442 cpu_to_be32(mclk_pwrmgt_cntl
);
1443 table
->ACPIState
.levels
[0].mclk
.mclk770
.vDLL_CNTL
= cpu_to_be32(dll_cntl
);
1445 table
->ACPIState
.levels
[0].mclk
.mclk770
.mclk_value
= 0;
1447 table
->ACPIState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL
=
1448 cpu_to_be32(spll_func_cntl
);
1449 table
->ACPIState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL_2
=
1450 cpu_to_be32(spll_func_cntl_2
);
1451 table
->ACPIState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL_3
=
1452 cpu_to_be32(spll_func_cntl_3
);
1454 table
->ACPIState
.levels
[0].sclk
.sclk_value
= 0;
1456 cypress_populate_mvdd_value(rdev
, 0, &table
->ACPIState
.levels
[0].mvdd
);
1458 if (eg_pi
->dynamic_ac_timing
)
1459 table
->ACPIState
.levels
[0].ACIndex
= 1;
1461 table
->ACPIState
.levels
[1] = table
->ACPIState
.levels
[0];
1462 table
->ACPIState
.levels
[2] = table
->ACPIState
.levels
[0];
1467 static void cypress_trim_voltage_table_to_fit_state_table(struct radeon_device
*rdev
,
1468 struct atom_voltage_table
*voltage_table
)
1470 unsigned int i
, diff
;
1472 if (voltage_table
->count
<= MAX_NO_VREG_STEPS
)
1475 diff
= voltage_table
->count
- MAX_NO_VREG_STEPS
;
1477 for (i
= 0; i
< MAX_NO_VREG_STEPS
; i
++)
1478 voltage_table
->entries
[i
] = voltage_table
->entries
[i
+ diff
];
1480 voltage_table
->count
= MAX_NO_VREG_STEPS
;
1483 int cypress_construct_voltage_tables(struct radeon_device
*rdev
)
1485 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1488 ret
= radeon_atom_get_voltage_table(rdev
, SET_VOLTAGE_TYPE_ASIC_VDDC
, 0,
1489 &eg_pi
->vddc_voltage_table
);
1493 if (eg_pi
->vddc_voltage_table
.count
> MAX_NO_VREG_STEPS
)
1494 cypress_trim_voltage_table_to_fit_state_table(rdev
,
1495 &eg_pi
->vddc_voltage_table
);
1497 if (eg_pi
->vddci_control
) {
1498 ret
= radeon_atom_get_voltage_table(rdev
, SET_VOLTAGE_TYPE_ASIC_VDDCI
, 0,
1499 &eg_pi
->vddci_voltage_table
);
1503 if (eg_pi
->vddci_voltage_table
.count
> MAX_NO_VREG_STEPS
)
1504 cypress_trim_voltage_table_to_fit_state_table(rdev
,
1505 &eg_pi
->vddci_voltage_table
);
1511 static void cypress_populate_smc_voltage_table(struct radeon_device
*rdev
,
1512 struct atom_voltage_table
*voltage_table
,
1513 RV770_SMC_STATETABLE
*table
)
1517 for (i
= 0; i
< voltage_table
->count
; i
++) {
1518 table
->highSMIO
[i
] = 0;
1519 table
->lowSMIO
[i
] |= cpu_to_be32(voltage_table
->entries
[i
].smio_low
);
1523 int cypress_populate_smc_voltage_tables(struct radeon_device
*rdev
,
1524 RV770_SMC_STATETABLE
*table
)
1526 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1527 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1530 if (eg_pi
->vddc_voltage_table
.count
) {
1531 cypress_populate_smc_voltage_table(rdev
,
1532 &eg_pi
->vddc_voltage_table
,
1535 table
->voltageMaskTable
.highMask
[RV770_SMC_VOLTAGEMASK_VDDC
] = 0;
1536 table
->voltageMaskTable
.lowMask
[RV770_SMC_VOLTAGEMASK_VDDC
] =
1537 cpu_to_be32(eg_pi
->vddc_voltage_table
.mask_low
);
1539 for (i
= 0; i
< eg_pi
->vddc_voltage_table
.count
; i
++) {
1540 if (pi
->max_vddc_in_table
<=
1541 eg_pi
->vddc_voltage_table
.entries
[i
].value
) {
1542 table
->maxVDDCIndexInPPTable
= i
;
1548 if (eg_pi
->vddci_voltage_table
.count
) {
1549 cypress_populate_smc_voltage_table(rdev
,
1550 &eg_pi
->vddci_voltage_table
,
1553 table
->voltageMaskTable
.highMask
[RV770_SMC_VOLTAGEMASK_VDDCI
] = 0;
1554 table
->voltageMaskTable
.lowMask
[RV770_SMC_VOLTAGEMASK_VDDCI
] =
1555 cpu_to_be32(eg_pi
->vddci_voltage_table
.mask_low
);
1561 static u32
cypress_get_mclk_split_point(struct atom_memory_info
*memory_info
)
1563 if ((memory_info
->mem_type
== MEM_TYPE_GDDR3
) ||
1564 (memory_info
->mem_type
== MEM_TYPE_DDR3
))
1570 int cypress_get_mvdd_configuration(struct radeon_device
*rdev
)
1572 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1573 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1575 struct atom_memory_info memory_info
;
1576 u32 tmp
= RREG32(GENERAL_PWRMGT
);
1578 if (!(tmp
& BACKBIAS_PAD_EN
)) {
1579 eg_pi
->mvdd_high_index
= 0;
1580 eg_pi
->mvdd_low_index
= 1;
1581 pi
->mvdd_control
= false;
1585 if (tmp
& BACKBIAS_VALUE
)
1586 eg_pi
->mvdd_high_index
= 1;
1588 eg_pi
->mvdd_high_index
= 0;
1590 eg_pi
->mvdd_low_index
=
1591 (eg_pi
->mvdd_high_index
== 0) ? 1 : 0;
1593 module_index
= rv770_get_memory_module_index(rdev
);
1595 if (radeon_atom_get_memory_info(rdev
, module_index
, &memory_info
)) {
1596 pi
->mvdd_control
= false;
1600 pi
->mvdd_split_frequency
=
1601 cypress_get_mclk_split_point(&memory_info
);
1603 if (pi
->mvdd_split_frequency
== 0) {
1604 pi
->mvdd_control
= false;
1611 static int cypress_init_smc_table(struct radeon_device
*rdev
,
1612 struct radeon_ps
*radeon_boot_state
)
1614 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1615 RV770_SMC_STATETABLE
*table
= &pi
->smc_statetable
;
1618 memset(table
, 0, sizeof(RV770_SMC_STATETABLE
));
1620 cypress_populate_smc_voltage_tables(rdev
, table
);
1622 switch (rdev
->pm
.int_thermal_type
) {
1623 case THERMAL_TYPE_EVERGREEN
:
1624 case THERMAL_TYPE_EMC2103_WITH_INTERNAL
:
1625 table
->thermalProtectType
= PPSMC_THERMAL_PROTECT_TYPE_INTERNAL
;
1627 case THERMAL_TYPE_NONE
:
1628 table
->thermalProtectType
= PPSMC_THERMAL_PROTECT_TYPE_NONE
;
1631 table
->thermalProtectType
= PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL
;
1635 if (rdev
->pm
.dpm
.platform_caps
& ATOM_PP_PLATFORM_CAP_HARDWAREDC
)
1636 table
->systemFlags
|= PPSMC_SYSTEMFLAG_GPIO_DC
;
1638 if (rdev
->pm
.dpm
.platform_caps
& ATOM_PP_PLATFORM_CAP_REGULATOR_HOT
)
1639 table
->systemFlags
|= PPSMC_SYSTEMFLAG_REGULATOR_HOT
;
1641 if (rdev
->pm
.dpm
.platform_caps
& ATOM_PP_PLATFORM_CAP_STEPVDDC
)
1642 table
->systemFlags
|= PPSMC_SYSTEMFLAG_STEPVDDC
;
1645 table
->systemFlags
|= PPSMC_SYSTEMFLAG_GDDR5
;
1647 ret
= cypress_populate_smc_initial_state(rdev
, radeon_boot_state
, table
);
1651 ret
= cypress_populate_smc_acpi_state(rdev
, table
);
1655 table
->driverState
= table
->initialState
;
1657 return rv770_copy_bytes_to_smc(rdev
,
1658 pi
->state_table_start
,
1659 (u8
*)table
, sizeof(RV770_SMC_STATETABLE
),
1663 int cypress_populate_mc_reg_table(struct radeon_device
*rdev
,
1664 struct radeon_ps
*radeon_boot_state
)
1666 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1667 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1668 struct rv7xx_ps
*boot_state
= rv770_get_ps(radeon_boot_state
);
1669 SMC_Evergreen_MCRegisters mc_reg_table
= { 0 };
1671 rv770_write_smc_soft_register(rdev
,
1672 RV770_SMC_SOFT_REGISTER_seq_index
, 1);
1674 cypress_populate_mc_reg_addresses(rdev
, &mc_reg_table
);
1676 cypress_convert_mc_reg_table_entry_to_smc(rdev
,
1678 &mc_reg_table
.data
[0]);
1680 cypress_convert_mc_registers(&eg_pi
->mc_reg_table
.mc_reg_table_entry
[0],
1681 &mc_reg_table
.data
[1], eg_pi
->mc_reg_table
.last
,
1682 eg_pi
->mc_reg_table
.valid_flag
);
1684 cypress_convert_mc_reg_table_to_smc(rdev
, radeon_boot_state
, &mc_reg_table
);
1686 return rv770_copy_bytes_to_smc(rdev
, eg_pi
->mc_reg_table_start
,
1687 (u8
*)&mc_reg_table
, sizeof(SMC_Evergreen_MCRegisters
),
1691 int cypress_get_table_locations(struct radeon_device
*rdev
)
1693 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1694 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1698 ret
= rv770_read_smc_sram_dword(rdev
,
1699 EVERGREEN_SMC_FIRMWARE_HEADER_LOCATION
+
1700 EVERGREEN_SMC_FIRMWARE_HEADER_stateTable
,
1701 &tmp
, pi
->sram_end
);
1705 pi
->state_table_start
= (u16
)tmp
;
1707 ret
= rv770_read_smc_sram_dword(rdev
,
1708 EVERGREEN_SMC_FIRMWARE_HEADER_LOCATION
+
1709 EVERGREEN_SMC_FIRMWARE_HEADER_softRegisters
,
1710 &tmp
, pi
->sram_end
);
1714 pi
->soft_regs_start
= (u16
)tmp
;
1716 ret
= rv770_read_smc_sram_dword(rdev
,
1717 EVERGREEN_SMC_FIRMWARE_HEADER_LOCATION
+
1718 EVERGREEN_SMC_FIRMWARE_HEADER_mcRegisterTable
,
1719 &tmp
, pi
->sram_end
);
1723 eg_pi
->mc_reg_table_start
= (u16
)tmp
;
1728 void cypress_enable_display_gap(struct radeon_device
*rdev
)
1730 u32 tmp
= RREG32(CG_DISPLAY_GAP_CNTL
);
1732 tmp
&= ~(DISP1_GAP_MASK
| DISP2_GAP_MASK
);
1733 tmp
|= (DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE
) |
1734 DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE
));
1736 tmp
&= ~(DISP1_GAP_MCHG_MASK
| DISP2_GAP_MCHG_MASK
);
1737 tmp
|= (DISP1_GAP_MCHG(R600_PM_DISPLAY_GAP_VBLANK
) |
1738 DISP2_GAP_MCHG(R600_PM_DISPLAY_GAP_IGNORE
));
1739 WREG32(CG_DISPLAY_GAP_CNTL
, tmp
);
1742 static void cypress_program_display_gap(struct radeon_device
*rdev
)
1747 tmp
= RREG32(CG_DISPLAY_GAP_CNTL
) & ~(DISP1_GAP_MASK
| DISP2_GAP_MASK
);
1748 if (rdev
->pm
.dpm
.new_active_crtc_count
> 0)
1749 tmp
|= DISP1_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM
);
1751 tmp
|= DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE
);
1753 if (rdev
->pm
.dpm
.new_active_crtc_count
> 1)
1754 tmp
|= DISP2_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM
);
1756 tmp
|= DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE
);
1758 WREG32(CG_DISPLAY_GAP_CNTL
, tmp
);
1760 tmp
= RREG32(DCCG_DISP_SLOW_SELECT_REG
);
1761 pipe
= (tmp
& DCCG_DISP1_SLOW_SELECT_MASK
) >> DCCG_DISP1_SLOW_SELECT_SHIFT
;
1763 if ((rdev
->pm
.dpm
.new_active_crtc_count
> 0) &&
1764 (!(rdev
->pm
.dpm
.new_active_crtcs
& (1 << pipe
)))) {
1765 /* find the first active crtc */
1766 for (i
= 0; i
< rdev
->num_crtc
; i
++) {
1767 if (rdev
->pm
.dpm
.new_active_crtcs
& (1 << i
))
1770 if (i
== rdev
->num_crtc
)
1775 tmp
&= ~DCCG_DISP1_SLOW_SELECT_MASK
;
1776 tmp
|= DCCG_DISP1_SLOW_SELECT(pipe
);
1777 WREG32(DCCG_DISP_SLOW_SELECT_REG
, tmp
);
1780 cypress_notify_smc_display_change(rdev
, rdev
->pm
.dpm
.new_active_crtc_count
> 0);
1783 void cypress_dpm_setup_asic(struct radeon_device
*rdev
)
1785 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1787 rv740_read_clock_registers(rdev
);
1788 rv770_read_voltage_smio_registers(rdev
);
1789 rv770_get_max_vddc(rdev
);
1790 rv770_get_memory_type(rdev
);
1792 if (eg_pi
->pcie_performance_request
)
1793 eg_pi
->pcie_performance_request_registered
= false;
1795 if (eg_pi
->pcie_performance_request
)
1796 cypress_advertise_gen2_capability(rdev
);
1798 rv770_get_pcie_gen2_status(rdev
);
1800 rv770_enable_acpi_pm(rdev
);
1803 int cypress_dpm_enable(struct radeon_device
*rdev
)
1805 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1806 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1807 struct radeon_ps
*boot_ps
= rdev
->pm
.dpm
.boot_ps
;
1810 if (pi
->gfx_clock_gating
)
1811 rv770_restore_cgcg(rdev
);
1813 if (rv770_dpm_enabled(rdev
))
1816 if (pi
->voltage_control
) {
1817 rv770_enable_voltage_control(rdev
, true);
1818 ret
= cypress_construct_voltage_tables(rdev
);
1820 DRM_ERROR("cypress_construct_voltage_tables failed\n");
1825 if (pi
->mvdd_control
) {
1826 ret
= cypress_get_mvdd_configuration(rdev
);
1828 DRM_ERROR("cypress_get_mvdd_configuration failed\n");
1833 if (eg_pi
->dynamic_ac_timing
) {
1834 cypress_set_mc_reg_address_table(rdev
);
1835 cypress_force_mc_use_s0(rdev
, boot_ps
);
1836 ret
= cypress_initialize_mc_reg_table(rdev
);
1838 eg_pi
->dynamic_ac_timing
= false;
1839 cypress_force_mc_use_s1(rdev
, boot_ps
);
1842 if (rdev
->pm
.dpm
.platform_caps
& ATOM_PP_PLATFORM_CAP_BACKBIAS
)
1843 rv770_enable_backbias(rdev
, true);
1846 cypress_enable_spread_spectrum(rdev
, true);
1848 if (pi
->thermal_protection
)
1849 rv770_enable_thermal_protection(rdev
, true);
1851 rv770_setup_bsp(rdev
);
1852 rv770_program_git(rdev
);
1853 rv770_program_tp(rdev
);
1854 rv770_program_tpp(rdev
);
1855 rv770_program_sstp(rdev
);
1856 rv770_program_engine_speed_parameters(rdev
);
1857 cypress_enable_display_gap(rdev
);
1858 rv770_program_vc(rdev
);
1860 if (pi
->dynamic_pcie_gen2
)
1861 cypress_enable_dynamic_pcie_gen2(rdev
, true);
1863 ret
= rv770_upload_firmware(rdev
);
1865 DRM_ERROR("rv770_upload_firmware failed\n");
1869 ret
= cypress_get_table_locations(rdev
);
1871 DRM_ERROR("cypress_get_table_locations failed\n");
1874 ret
= cypress_init_smc_table(rdev
, boot_ps
);
1876 DRM_ERROR("cypress_init_smc_table failed\n");
1879 if (eg_pi
->dynamic_ac_timing
) {
1880 ret
= cypress_populate_mc_reg_table(rdev
, boot_ps
);
1882 DRM_ERROR("cypress_populate_mc_reg_table failed\n");
1887 cypress_program_response_times(rdev
);
1889 r7xx_start_smc(rdev
);
1891 ret
= cypress_notify_smc_display_change(rdev
, false);
1893 DRM_ERROR("cypress_notify_smc_display_change failed\n");
1896 cypress_enable_sclk_control(rdev
, true);
1898 if (eg_pi
->memory_transition
)
1899 cypress_enable_mclk_control(rdev
, true);
1901 cypress_start_dpm(rdev
);
1903 if (pi
->gfx_clock_gating
)
1904 cypress_gfx_clock_gating_enable(rdev
, true);
1906 if (pi
->mg_clock_gating
)
1907 cypress_mg_clock_gating_enable(rdev
, true);
1909 rv770_enable_auto_throttle_source(rdev
, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL
, true);
1914 void cypress_dpm_disable(struct radeon_device
*rdev
)
1916 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1917 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1918 struct radeon_ps
*boot_ps
= rdev
->pm
.dpm
.boot_ps
;
1920 if (!rv770_dpm_enabled(rdev
))
1923 rv770_clear_vc(rdev
);
1925 if (pi
->thermal_protection
)
1926 rv770_enable_thermal_protection(rdev
, false);
1928 if (pi
->dynamic_pcie_gen2
)
1929 cypress_enable_dynamic_pcie_gen2(rdev
, false);
1931 if (rdev
->irq
.installed
&&
1932 r600_is_internal_thermal_sensor(rdev
->pm
.int_thermal_type
)) {
1933 rdev
->irq
.dpm_thermal
= false;
1934 radeon_irq_set(rdev
);
1937 if (pi
->gfx_clock_gating
)
1938 cypress_gfx_clock_gating_enable(rdev
, false);
1940 if (pi
->mg_clock_gating
)
1941 cypress_mg_clock_gating_enable(rdev
, false);
1943 rv770_stop_dpm(rdev
);
1944 r7xx_stop_smc(rdev
);
1946 cypress_enable_spread_spectrum(rdev
, false);
1948 if (eg_pi
->dynamic_ac_timing
)
1949 cypress_force_mc_use_s1(rdev
, boot_ps
);
1951 rv770_reset_smio_status(rdev
);
1954 int cypress_dpm_set_power_state(struct radeon_device
*rdev
)
1956 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1957 struct radeon_ps
*new_ps
= rdev
->pm
.dpm
.requested_ps
;
1958 struct radeon_ps
*old_ps
= rdev
->pm
.dpm
.current_ps
;
1961 ret
= rv770_restrict_performance_levels_before_switch(rdev
);
1963 DRM_ERROR("rv770_restrict_performance_levels_before_switch failed\n");
1966 if (eg_pi
->pcie_performance_request
)
1967 cypress_notify_link_speed_change_before_state_change(rdev
, new_ps
, old_ps
);
1969 rv770_set_uvd_clock_before_set_eng_clock(rdev
, new_ps
, old_ps
);
1970 ret
= rv770_halt_smc(rdev
);
1972 DRM_ERROR("rv770_halt_smc failed\n");
1975 ret
= cypress_upload_sw_state(rdev
, new_ps
);
1977 DRM_ERROR("cypress_upload_sw_state failed\n");
1980 if (eg_pi
->dynamic_ac_timing
) {
1981 ret
= cypress_upload_mc_reg_table(rdev
, new_ps
);
1983 DRM_ERROR("cypress_upload_mc_reg_table failed\n");
1988 cypress_program_memory_timing_parameters(rdev
, new_ps
);
1990 ret
= rv770_resume_smc(rdev
);
1992 DRM_ERROR("rv770_resume_smc failed\n");
1995 ret
= rv770_set_sw_state(rdev
);
1997 DRM_ERROR("rv770_set_sw_state failed\n");
2000 rv770_set_uvd_clock_after_set_eng_clock(rdev
, new_ps
, old_ps
);
2002 if (eg_pi
->pcie_performance_request
)
2003 cypress_notify_link_speed_change_after_state_change(rdev
, new_ps
, old_ps
);
2009 void cypress_dpm_reset_asic(struct radeon_device
*rdev
)
2011 rv770_restrict_performance_levels_before_switch(rdev
);
2012 rv770_set_boot_state(rdev
);
2016 void cypress_dpm_display_configuration_changed(struct radeon_device
*rdev
)
2018 cypress_program_display_gap(rdev
);
2021 int cypress_dpm_init(struct radeon_device
*rdev
)
2023 struct rv7xx_power_info
*pi
;
2024 struct evergreen_power_info
*eg_pi
;
2025 struct atom_clock_dividers dividers
;
2028 eg_pi
= kzalloc(sizeof(struct evergreen_power_info
), GFP_KERNEL
);
2031 rdev
->pm
.dpm
.priv
= eg_pi
;
2034 rv770_get_max_vddc(rdev
);
2036 eg_pi
->ulv
.supported
= false;
2038 eg_pi
->acpi_vddci
= 0;
2039 pi
->min_vddc_in_table
= 0;
2040 pi
->max_vddc_in_table
= 0;
2042 ret
= r600_get_platform_caps(rdev
);
2046 ret
= rv7xx_parse_power_table(rdev
);
2050 if (rdev
->pm
.dpm
.voltage_response_time
== 0)
2051 rdev
->pm
.dpm
.voltage_response_time
= R600_VOLTAGERESPONSETIME_DFLT
;
2052 if (rdev
->pm
.dpm
.backbias_response_time
== 0)
2053 rdev
->pm
.dpm
.backbias_response_time
= R600_BACKBIASRESPONSETIME_DFLT
;
2055 ret
= radeon_atom_get_clock_dividers(rdev
, COMPUTE_ENGINE_PLL_PARAM
,
2056 0, false, ÷rs
);
2058 pi
->ref_div
= dividers
.ref_div
+ 1;
2060 pi
->ref_div
= R600_REFERENCEDIVIDER_DFLT
;
2062 pi
->mclk_strobe_mode_threshold
= 40000;
2063 pi
->mclk_edc_enable_threshold
= 40000;
2064 eg_pi
->mclk_edc_wr_enable_threshold
= 40000;
2066 pi
->rlp
= RV770_RLP_DFLT
;
2067 pi
->rmp
= RV770_RMP_DFLT
;
2068 pi
->lhp
= RV770_LHP_DFLT
;
2069 pi
->lmp
= RV770_LMP_DFLT
;
2071 pi
->voltage_control
=
2072 radeon_atom_is_voltage_gpio(rdev
, SET_VOLTAGE_TYPE_ASIC_VDDC
, 0);
2075 radeon_atom_is_voltage_gpio(rdev
, SET_VOLTAGE_TYPE_ASIC_MVDDC
, 0);
2077 eg_pi
->vddci_control
=
2078 radeon_atom_is_voltage_gpio(rdev
, SET_VOLTAGE_TYPE_ASIC_VDDCI
, 0);
2080 rv770_get_engine_memory_ss(rdev
);
2082 pi
->asi
= RV770_ASI_DFLT
;
2083 pi
->pasi
= CYPRESS_HASI_DFLT
;
2084 pi
->vrc
= CYPRESS_VRC_DFLT
;
2086 pi
->power_gating
= false;
2088 if ((rdev
->family
== CHIP_CYPRESS
) ||
2089 (rdev
->family
== CHIP_HEMLOCK
))
2090 pi
->gfx_clock_gating
= false;
2092 pi
->gfx_clock_gating
= true;
2094 pi
->mg_clock_gating
= true;
2095 pi
->mgcgtssm
= true;
2096 eg_pi
->ls_clock_gating
= false;
2097 eg_pi
->sclk_deep_sleep
= false;
2099 pi
->dynamic_pcie_gen2
= true;
2101 if (rdev
->pm
.int_thermal_type
!= THERMAL_TYPE_NONE
)
2102 pi
->thermal_protection
= true;
2104 pi
->thermal_protection
= false;
2106 pi
->display_gap
= true;
2108 if (rdev
->flags
& RADEON_IS_MOBILITY
)
2115 eg_pi
->dynamic_ac_timing
= true;
2118 eg_pi
->light_sleep
= true;
2119 eg_pi
->memory_transition
= true;
2120 #if defined(CONFIG_ACPI)
2121 eg_pi
->pcie_performance_request
=
2122 radeon_acpi_is_pcie_performance_request_supported(rdev
);
2124 eg_pi
->pcie_performance_request
= false;
2127 if ((rdev
->family
== CHIP_CYPRESS
) ||
2128 (rdev
->family
== CHIP_HEMLOCK
) ||
2129 (rdev
->family
== CHIP_JUNIPER
))
2130 eg_pi
->dll_default_on
= true;
2132 eg_pi
->dll_default_on
= false;
2134 eg_pi
->sclk_deep_sleep
= false;
2135 pi
->mclk_stutter_mode_threshold
= 0;
2137 pi
->sram_end
= SMC_RAM_END
;
2142 void cypress_dpm_fini(struct radeon_device
*rdev
)
2146 for (i
= 0; i
< rdev
->pm
.dpm
.num_ps
; i
++) {
2147 kfree(rdev
->pm
.dpm
.ps
[i
].ps_priv
);
2149 kfree(rdev
->pm
.dpm
.ps
);
2150 kfree(rdev
->pm
.dpm
.priv
);
2153 bool cypress_dpm_vblank_too_short(struct radeon_device
*rdev
)
2155 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
2156 u32 vblank_time
= r600_dpm_get_vblank_time(rdev
);
2157 /* we never hit the non-gddr5 limit so disable it */
2158 u32 switch_limit
= pi
->mem_gddr5
? 450 : 0;
2160 if (vblank_time
< switch_limit
)