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 "evergreend.h"
29 #include "cypress_dpm.h"
32 #define SMC_RAM_END 0x8000
34 #define MC_CG_ARB_FREQ_F0 0x0a
35 #define MC_CG_ARB_FREQ_F1 0x0b
36 #define MC_CG_ARB_FREQ_F2 0x0c
37 #define MC_CG_ARB_FREQ_F3 0x0d
39 #define MC_CG_SEQ_DRAMCONF_S0 0x05
40 #define MC_CG_SEQ_DRAMCONF_S1 0x06
41 #define MC_CG_SEQ_YCLK_SUSPEND 0x04
42 #define MC_CG_SEQ_YCLK_RESUME 0x0a
44 struct rv7xx_ps
*rv770_get_ps(struct radeon_ps
*rps
);
45 struct rv7xx_power_info
*rv770_get_pi(struct radeon_device
*rdev
);
46 struct evergreen_power_info
*evergreen_get_pi(struct radeon_device
*rdev
);
48 static void cypress_enable_bif_dynamic_pcie_gen2(struct radeon_device
*rdev
,
51 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
54 tmp
= RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
);
56 if ((tmp
& LC_OTHER_SIDE_EVER_SENT_GEN2
) &&
57 (tmp
& LC_OTHER_SIDE_SUPPORTS_GEN2
)) {
58 if (!pi
->boot_in_gen2
) {
59 bif
= RREG32(CG_BIF_REQ_AND_RSP
) & ~CG_CLIENT_REQ_MASK
;
60 bif
|= CG_CLIENT_REQ(0xd);
61 WREG32(CG_BIF_REQ_AND_RSP
, bif
);
63 tmp
&= ~LC_HW_VOLTAGE_IF_CONTROL_MASK
;
64 tmp
|= LC_HW_VOLTAGE_IF_CONTROL(1);
65 tmp
|= LC_GEN2_EN_STRAP
;
67 tmp
|= LC_CLR_FAILED_SPD_CHANGE_CNT
;
68 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
, tmp
);
70 tmp
&= ~LC_CLR_FAILED_SPD_CHANGE_CNT
;
71 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
, tmp
);
75 if (!pi
->boot_in_gen2
) {
76 tmp
&= ~LC_HW_VOLTAGE_IF_CONTROL_MASK
;
77 tmp
&= ~LC_GEN2_EN_STRAP
;
79 if ((tmp
& LC_OTHER_SIDE_EVER_SENT_GEN2
) ||
80 (tmp
& LC_OTHER_SIDE_SUPPORTS_GEN2
))
81 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
, tmp
);
85 static void cypress_enable_dynamic_pcie_gen2(struct radeon_device
*rdev
,
88 cypress_enable_bif_dynamic_pcie_gen2(rdev
, enable
);
91 WREG32_P(GENERAL_PWRMGT
, ENABLE_GEN2PCIE
, ~ENABLE_GEN2PCIE
);
93 WREG32_P(GENERAL_PWRMGT
, 0, ~ENABLE_GEN2PCIE
);
97 static int cypress_enter_ulp_state(struct radeon_device
*rdev
)
99 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
101 if (pi
->gfx_clock_gating
) {
102 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~DYN_GFX_CLK_OFF_EN
);
103 WREG32_P(SCLK_PWRMGT_CNTL
, GFX_CLK_FORCE_ON
, ~GFX_CLK_FORCE_ON
);
104 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~GFX_CLK_FORCE_ON
);
106 RREG32(GB_ADDR_CONFIG
);
109 WREG32_P(SMC_MSG
, HOST_SMC_MSG(PPSMC_MSG_SwitchToMinimumPower
),
118 static void cypress_gfx_clock_gating_enable(struct radeon_device
*rdev
,
121 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
124 if (eg_pi
->light_sleep
) {
125 WREG32(GRBM_GFX_INDEX
, 0xC0000000);
127 WREG32_CG(CG_CGLS_TILE_0
, 0xFFFFFFFF);
128 WREG32_CG(CG_CGLS_TILE_1
, 0xFFFFFFFF);
129 WREG32_CG(CG_CGLS_TILE_2
, 0xFFFFFFFF);
130 WREG32_CG(CG_CGLS_TILE_3
, 0xFFFFFFFF);
131 WREG32_CG(CG_CGLS_TILE_4
, 0xFFFFFFFF);
132 WREG32_CG(CG_CGLS_TILE_5
, 0xFFFFFFFF);
133 WREG32_CG(CG_CGLS_TILE_6
, 0xFFFFFFFF);
134 WREG32_CG(CG_CGLS_TILE_7
, 0xFFFFFFFF);
135 WREG32_CG(CG_CGLS_TILE_8
, 0xFFFFFFFF);
136 WREG32_CG(CG_CGLS_TILE_9
, 0xFFFFFFFF);
137 WREG32_CG(CG_CGLS_TILE_10
, 0xFFFFFFFF);
138 WREG32_CG(CG_CGLS_TILE_11
, 0xFFFFFFFF);
140 WREG32_P(SCLK_PWRMGT_CNTL
, DYN_LIGHT_SLEEP_EN
, ~DYN_LIGHT_SLEEP_EN
);
142 WREG32_P(SCLK_PWRMGT_CNTL
, DYN_GFX_CLK_OFF_EN
, ~DYN_GFX_CLK_OFF_EN
);
144 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~DYN_GFX_CLK_OFF_EN
);
145 WREG32_P(SCLK_PWRMGT_CNTL
, GFX_CLK_FORCE_ON
, ~GFX_CLK_FORCE_ON
);
146 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~GFX_CLK_FORCE_ON
);
147 RREG32(GB_ADDR_CONFIG
);
149 if (eg_pi
->light_sleep
) {
150 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~DYN_LIGHT_SLEEP_EN
);
152 WREG32(GRBM_GFX_INDEX
, 0xC0000000);
154 WREG32_CG(CG_CGLS_TILE_0
, 0);
155 WREG32_CG(CG_CGLS_TILE_1
, 0);
156 WREG32_CG(CG_CGLS_TILE_2
, 0);
157 WREG32_CG(CG_CGLS_TILE_3
, 0);
158 WREG32_CG(CG_CGLS_TILE_4
, 0);
159 WREG32_CG(CG_CGLS_TILE_5
, 0);
160 WREG32_CG(CG_CGLS_TILE_6
, 0);
161 WREG32_CG(CG_CGLS_TILE_7
, 0);
162 WREG32_CG(CG_CGLS_TILE_8
, 0);
163 WREG32_CG(CG_CGLS_TILE_9
, 0);
164 WREG32_CG(CG_CGLS_TILE_10
, 0);
165 WREG32_CG(CG_CGLS_TILE_11
, 0);
170 static void cypress_mg_clock_gating_enable(struct radeon_device
*rdev
,
173 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
174 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
177 u32 cgts_sm_ctrl_reg
;
179 if (rdev
->family
== CHIP_CEDAR
)
180 cgts_sm_ctrl_reg
= CEDAR_MGCGCGTSSMCTRL_DFLT
;
181 else if (rdev
->family
== CHIP_REDWOOD
)
182 cgts_sm_ctrl_reg
= REDWOOD_MGCGCGTSSMCTRL_DFLT
;
184 cgts_sm_ctrl_reg
= CYPRESS_MGCGCGTSSMCTRL_DFLT
;
186 WREG32(GRBM_GFX_INDEX
, 0xC0000000);
188 WREG32_CG(CG_CGTT_LOCAL_0
, CYPRESS_MGCGTTLOCAL0_DFLT
);
189 WREG32_CG(CG_CGTT_LOCAL_1
, CYPRESS_MGCGTTLOCAL1_DFLT
& 0xFFFFCFFF);
190 WREG32_CG(CG_CGTT_LOCAL_2
, CYPRESS_MGCGTTLOCAL2_DFLT
);
191 WREG32_CG(CG_CGTT_LOCAL_3
, CYPRESS_MGCGTTLOCAL3_DFLT
);
194 WREG32(CGTS_SM_CTRL_REG
, cgts_sm_ctrl_reg
);
197 WREG32_P(MC_CITF_MISC_RD_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
198 WREG32_P(MC_CITF_MISC_WR_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
199 WREG32_P(MC_CITF_MISC_VM_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
200 WREG32_P(MC_HUB_MISC_HUB_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
201 WREG32_P(MC_HUB_MISC_VM_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
202 WREG32_P(MC_HUB_MISC_SIP_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
203 WREG32_P(MC_XPB_CLK_GAT
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
204 WREG32_P(VM_L2_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
207 WREG32(GRBM_GFX_INDEX
, 0xC0000000);
209 WREG32_CG(CG_CGTT_LOCAL_0
, 0xFFFFFFFF);
210 WREG32_CG(CG_CGTT_LOCAL_1
, 0xFFFFFFFF);
211 WREG32_CG(CG_CGTT_LOCAL_2
, 0xFFFFFFFF);
212 WREG32_CG(CG_CGTT_LOCAL_3
, 0xFFFFFFFF);
215 WREG32(CGTS_SM_CTRL_REG
, 0x81f44bc0);
219 void cypress_enable_spread_spectrum(struct radeon_device
*rdev
,
222 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
226 WREG32_P(GENERAL_PWRMGT
, DYN_SPREAD_SPECTRUM_EN
, ~DYN_SPREAD_SPECTRUM_EN
);
229 WREG32_P(MPLL_CNTL_MODE
, SS_SSEN
, ~SS_SSEN
);
231 WREG32_P(CG_SPLL_SPREAD_SPECTRUM
, 0, ~SSEN
);
232 WREG32_P(GENERAL_PWRMGT
, 0, ~DYN_SPREAD_SPECTRUM_EN
);
233 WREG32_P(MPLL_CNTL_MODE
, 0, ~SS_SSEN
);
234 WREG32_P(MPLL_CNTL_MODE
, 0, ~SS_DSMODE_EN
);
238 void cypress_start_dpm(struct radeon_device
*rdev
)
240 WREG32_P(GENERAL_PWRMGT
, GLOBAL_PWRMGT_EN
, ~GLOBAL_PWRMGT_EN
);
243 void cypress_enable_sclk_control(struct radeon_device
*rdev
,
247 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~SCLK_PWRMGT_OFF
);
249 WREG32_P(SCLK_PWRMGT_CNTL
, SCLK_PWRMGT_OFF
, ~SCLK_PWRMGT_OFF
);
252 void cypress_enable_mclk_control(struct radeon_device
*rdev
,
256 WREG32_P(MCLK_PWRMGT_CNTL
, 0, ~MPLL_PWRMGT_OFF
);
258 WREG32_P(MCLK_PWRMGT_CNTL
, MPLL_PWRMGT_OFF
, ~MPLL_PWRMGT_OFF
);
261 int cypress_notify_smc_display_change(struct radeon_device
*rdev
,
264 PPSMC_Msg msg
= has_display
?
265 (PPSMC_Msg
)PPSMC_MSG_HasDisplay
: (PPSMC_Msg
)PPSMC_MSG_NoDisplay
;
267 if (rv770_send_msg_to_smc(rdev
, msg
) != PPSMC_Result_OK
)
273 void cypress_program_response_times(struct radeon_device
*rdev
)
276 u32 mclk_switch_limit
;
278 reference_clock
= radeon_get_xclk(rdev
);
279 mclk_switch_limit
= (460 * reference_clock
) / 100;
281 rv770_write_smc_soft_register(rdev
,
282 RV770_SMC_SOFT_REGISTER_mclk_switch_lim
,
285 rv770_write_smc_soft_register(rdev
,
286 RV770_SMC_SOFT_REGISTER_mvdd_chg_time
, 1);
288 rv770_write_smc_soft_register(rdev
,
289 RV770_SMC_SOFT_REGISTER_mc_block_delay
, 0xAA);
291 rv770_program_response_times(rdev
);
293 if (ASIC_IS_LOMBOK(rdev
))
294 rv770_write_smc_soft_register(rdev
,
295 RV770_SMC_SOFT_REGISTER_is_asic_lombok
, 1);
299 static int cypress_pcie_performance_request(struct radeon_device
*rdev
,
300 u8 perf_req
, bool advertise
)
302 #if defined(CONFIG_ACPI)
303 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
308 tmp
= RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
);
309 if ((perf_req
== PCIE_PERF_REQ_PECI_GEN1
) && (tmp
& LC_CURRENT_DATA_RATE
))
312 #if defined(CONFIG_ACPI)
313 if ((perf_req
== PCIE_PERF_REQ_PECI_GEN1
) ||
314 (perf_req
== PCIE_PERF_REQ_PECI_GEN2
)) {
315 eg_pi
->pcie_performance_request_registered
= true;
316 return radeon_acpi_pcie_performance_request(rdev
, perf_req
, advertise
);
317 } else if ((perf_req
== PCIE_PERF_REQ_REMOVE_REGISTRY
) &&
318 eg_pi
->pcie_performance_request_registered
) {
319 eg_pi
->pcie_performance_request_registered
= false;
320 return radeon_acpi_pcie_performance_request(rdev
, perf_req
, advertise
);
327 void cypress_advertise_gen2_capability(struct radeon_device
*rdev
)
329 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
332 #if defined(CONFIG_ACPI)
333 radeon_acpi_pcie_notify_device_ready(rdev
);
336 tmp
= RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
);
338 if ((tmp
& LC_OTHER_SIDE_EVER_SENT_GEN2
) &&
339 (tmp
& LC_OTHER_SIDE_SUPPORTS_GEN2
))
340 pi
->pcie_gen2
= true;
342 pi
->pcie_gen2
= false;
345 cypress_pcie_performance_request(rdev
, PCIE_PERF_REQ_PECI_GEN2
, true);
349 static enum radeon_pcie_gen
cypress_get_maximum_link_speed(struct radeon_ps
*radeon_state
)
351 struct rv7xx_ps
*state
= rv770_get_ps(radeon_state
);
353 if (state
->high
.flags
& ATOM_PPLIB_R600_FLAGS_PCIEGEN2
)
358 void cypress_notify_link_speed_change_after_state_change(struct radeon_device
*rdev
,
359 struct radeon_ps
*radeon_new_state
,
360 struct radeon_ps
*radeon_current_state
)
362 enum radeon_pcie_gen pcie_link_speed_target
=
363 cypress_get_maximum_link_speed(radeon_new_state
);
364 enum radeon_pcie_gen pcie_link_speed_current
=
365 cypress_get_maximum_link_speed(radeon_current_state
);
368 if (pcie_link_speed_target
< pcie_link_speed_current
) {
369 if (pcie_link_speed_target
== RADEON_PCIE_GEN1
)
370 request
= PCIE_PERF_REQ_PECI_GEN1
;
371 else if (pcie_link_speed_target
== RADEON_PCIE_GEN2
)
372 request
= PCIE_PERF_REQ_PECI_GEN2
;
374 request
= PCIE_PERF_REQ_PECI_GEN3
;
376 cypress_pcie_performance_request(rdev
, request
, false);
380 void cypress_notify_link_speed_change_before_state_change(struct radeon_device
*rdev
,
381 struct radeon_ps
*radeon_new_state
,
382 struct radeon_ps
*radeon_current_state
)
384 enum radeon_pcie_gen pcie_link_speed_target
=
385 cypress_get_maximum_link_speed(radeon_new_state
);
386 enum radeon_pcie_gen pcie_link_speed_current
=
387 cypress_get_maximum_link_speed(radeon_current_state
);
390 if (pcie_link_speed_target
> pcie_link_speed_current
) {
391 if (pcie_link_speed_target
== RADEON_PCIE_GEN1
)
392 request
= PCIE_PERF_REQ_PECI_GEN1
;
393 else if (pcie_link_speed_target
== RADEON_PCIE_GEN2
)
394 request
= PCIE_PERF_REQ_PECI_GEN2
;
396 request
= PCIE_PERF_REQ_PECI_GEN3
;
398 cypress_pcie_performance_request(rdev
, request
, false);
402 static int cypress_populate_voltage_value(struct radeon_device
*rdev
,
403 struct atom_voltage_table
*table
,
404 u16 value
, RV770_SMC_VOLTAGE_VALUE
*voltage
)
408 for (i
= 0; i
< table
->count
; i
++) {
409 if (value
<= table
->entries
[i
].value
) {
410 voltage
->index
= (u8
)i
;
411 voltage
->value
= cpu_to_be16(table
->entries
[i
].value
);
416 if (i
== table
->count
)
422 u8
cypress_get_strobe_mode_settings(struct radeon_device
*rdev
, u32 mclk
)
424 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
426 bool strobe_mode
= false;
429 if (mclk
<= pi
->mclk_strobe_mode_threshold
)
431 result
= cypress_get_mclk_frequency_ratio(rdev
, mclk
, strobe_mode
);
434 result
|= SMC_STROBE_ENABLE
;
440 u32
cypress_map_clkf_to_ibias(struct radeon_device
*rdev
, u32 clkf
)
442 u32 ref_clk
= rdev
->clock
.mpll
.reference_freq
;
443 u32 vco
= clkf
* ref_clk
;
445 /* 100 Mhz ref clk */
446 if (ref_clk
== 10000) {
472 static int cypress_populate_mclk_value(struct radeon_device
*rdev
,
473 u32 engine_clock
, u32 memory_clock
,
474 RV7XX_SMC_MCLK_VALUE
*mclk
,
475 bool strobe_mode
, bool dll_state_on
)
477 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
479 u32 mpll_ad_func_cntl
=
480 pi
->clk_regs
.rv770
.mpll_ad_func_cntl
;
481 u32 mpll_ad_func_cntl_2
=
482 pi
->clk_regs
.rv770
.mpll_ad_func_cntl_2
;
483 u32 mpll_dq_func_cntl
=
484 pi
->clk_regs
.rv770
.mpll_dq_func_cntl
;
485 u32 mpll_dq_func_cntl_2
=
486 pi
->clk_regs
.rv770
.mpll_dq_func_cntl_2
;
487 u32 mclk_pwrmgt_cntl
=
488 pi
->clk_regs
.rv770
.mclk_pwrmgt_cntl
;
490 pi
->clk_regs
.rv770
.dll_cntl
;
491 u32 mpll_ss1
= pi
->clk_regs
.rv770
.mpll_ss1
;
492 u32 mpll_ss2
= pi
->clk_regs
.rv770
.mpll_ss2
;
493 struct atom_clock_dividers dividers
;
499 ret
= radeon_atom_get_clock_dividers(rdev
, COMPUTE_MEMORY_PLL_PARAM
,
500 memory_clock
, strobe_mode
, ÷rs
);
505 mc_seq_misc7
= RREG32(MC_SEQ_MISC7
);
507 if(mc_seq_misc7
& 0x8000000)
508 dividers
.post_div
= 1;
511 ibias
= cypress_map_clkf_to_ibias(rdev
, dividers
.whole_fb_div
);
513 mpll_ad_func_cntl
&= ~(CLKR_MASK
|
518 mpll_ad_func_cntl
|= CLKR(dividers
.ref_div
);
519 mpll_ad_func_cntl
|= YCLK_POST_DIV(dividers
.post_div
);
520 mpll_ad_func_cntl
|= CLKF(dividers
.whole_fb_div
);
521 mpll_ad_func_cntl
|= CLKFRAC(dividers
.frac_fb_div
);
522 mpll_ad_func_cntl
|= IBIAS(ibias
);
524 if (dividers
.vco_mode
)
525 mpll_ad_func_cntl_2
|= VCO_MODE
;
527 mpll_ad_func_cntl_2
&= ~VCO_MODE
;
530 mpll_dq_func_cntl
&= ~(CLKR_MASK
|
535 mpll_dq_func_cntl
|= CLKR(dividers
.ref_div
);
536 mpll_dq_func_cntl
|= YCLK_POST_DIV(dividers
.post_div
);
537 mpll_dq_func_cntl
|= CLKF(dividers
.whole_fb_div
);
538 mpll_dq_func_cntl
|= CLKFRAC(dividers
.frac_fb_div
);
539 mpll_dq_func_cntl
|= IBIAS(ibias
);
542 mpll_dq_func_cntl
&= ~PDNB
;
544 mpll_dq_func_cntl
|= PDNB
;
546 if (dividers
.vco_mode
)
547 mpll_dq_func_cntl_2
|= VCO_MODE
;
549 mpll_dq_func_cntl_2
&= ~VCO_MODE
;
553 struct radeon_atom_ss ss
;
554 u32 vco_freq
= memory_clock
* dividers
.post_div
;
556 if (radeon_atombios_get_asic_ss_info(rdev
, &ss
,
557 ASIC_INTERNAL_MEMORY_SS
, vco_freq
)) {
558 u32 reference_clock
= rdev
->clock
.mpll
.reference_freq
;
559 u32 decoded_ref
= rv740_get_decoded_reference_divider(dividers
.ref_div
);
560 u32 clk_s
= reference_clock
* 5 / (decoded_ref
* ss
.rate
);
561 u32 clk_v
= ss
.percentage
*
562 (0x4000 * dividers
.whole_fb_div
+ 0x800 * dividers
.frac_fb_div
) / (clk_s
* 625);
564 mpll_ss1
&= ~CLKV_MASK
;
565 mpll_ss1
|= CLKV(clk_v
);
567 mpll_ss2
&= ~CLKS_MASK
;
568 mpll_ss2
|= CLKS(clk_s
);
572 dll_speed
= rv740_get_dll_speed(pi
->mem_gddr5
,
575 mclk_pwrmgt_cntl
&= ~DLL_SPEED_MASK
;
576 mclk_pwrmgt_cntl
|= DLL_SPEED(dll_speed
);
578 mclk_pwrmgt_cntl
|= (MRDCKA0_PDNB
|
587 mclk_pwrmgt_cntl
&= ~(MRDCKA0_PDNB
|
596 mclk
->mclk770
.mclk_value
= cpu_to_be32(memory_clock
);
597 mclk
->mclk770
.vMPLL_AD_FUNC_CNTL
= cpu_to_be32(mpll_ad_func_cntl
);
598 mclk
->mclk770
.vMPLL_AD_FUNC_CNTL_2
= cpu_to_be32(mpll_ad_func_cntl_2
);
599 mclk
->mclk770
.vMPLL_DQ_FUNC_CNTL
= cpu_to_be32(mpll_dq_func_cntl
);
600 mclk
->mclk770
.vMPLL_DQ_FUNC_CNTL_2
= cpu_to_be32(mpll_dq_func_cntl_2
);
601 mclk
->mclk770
.vMCLK_PWRMGT_CNTL
= cpu_to_be32(mclk_pwrmgt_cntl
);
602 mclk
->mclk770
.vDLL_CNTL
= cpu_to_be32(dll_cntl
);
603 mclk
->mclk770
.vMPLL_SS
= cpu_to_be32(mpll_ss1
);
604 mclk
->mclk770
.vMPLL_SS2
= cpu_to_be32(mpll_ss2
);
609 u8
cypress_get_mclk_frequency_ratio(struct radeon_device
*rdev
,
610 u32 memory_clock
, bool strobe_mode
)
614 if (rdev
->family
>= CHIP_BARTS
) {
616 if (memory_clock
< 10000)
617 mc_para_index
= 0x00;
618 else if (memory_clock
> 47500)
619 mc_para_index
= 0x0f;
621 mc_para_index
= (u8
)((memory_clock
- 10000) / 2500);
623 if (memory_clock
< 65000)
624 mc_para_index
= 0x00;
625 else if (memory_clock
> 135000)
626 mc_para_index
= 0x0f;
628 mc_para_index
= (u8
)((memory_clock
- 60000) / 5000);
632 if (memory_clock
< 10000)
633 mc_para_index
= 0x00;
634 else if (memory_clock
> 47500)
635 mc_para_index
= 0x0f;
637 mc_para_index
= (u8
)((memory_clock
- 10000) / 2500);
639 if (memory_clock
< 40000)
640 mc_para_index
= 0x00;
641 else if (memory_clock
> 115000)
642 mc_para_index
= 0x0f;
644 mc_para_index
= (u8
)((memory_clock
- 40000) / 5000);
647 return mc_para_index
;
650 static int cypress_populate_mvdd_value(struct radeon_device
*rdev
,
652 RV770_SMC_VOLTAGE_VALUE
*voltage
)
654 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
655 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
657 if (!pi
->mvdd_control
) {
658 voltage
->index
= eg_pi
->mvdd_high_index
;
659 voltage
->value
= cpu_to_be16(MVDD_HIGH_VALUE
);
663 if (mclk
<= pi
->mvdd_split_frequency
) {
664 voltage
->index
= eg_pi
->mvdd_low_index
;
665 voltage
->value
= cpu_to_be16(MVDD_LOW_VALUE
);
667 voltage
->index
= eg_pi
->mvdd_high_index
;
668 voltage
->value
= cpu_to_be16(MVDD_HIGH_VALUE
);
674 int cypress_convert_power_level_to_smc(struct radeon_device
*rdev
,
676 RV770_SMC_HW_PERFORMANCE_LEVEL
*level
,
679 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
680 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
684 level
->gen2PCIE
= pi
->pcie_gen2
?
685 ((pl
->flags
& ATOM_PPLIB_R600_FLAGS_PCIEGEN2
) ? 1 : 0) : 0;
686 level
->gen2XSP
= (pl
->flags
& ATOM_PPLIB_R600_FLAGS_PCIEGEN2
) ? 1 : 0;
687 level
->backbias
= (pl
->flags
& ATOM_PPLIB_R600_FLAGS_BACKBIASENABLE
) ? 1 : 0;
688 level
->displayWatermark
= watermark_level
;
690 ret
= rv740_populate_sclk_value(rdev
, pl
->sclk
, &level
->sclk
);
695 if (pi
->mclk_stutter_mode_threshold
&&
696 (pl
->mclk
<= pi
->mclk_stutter_mode_threshold
) &&
697 !eg_pi
->uvd_enabled
) {
698 level
->mcFlags
|= SMC_MC_STUTTER_EN
;
699 if (eg_pi
->sclk_deep_sleep
)
700 level
->stateFlags
|= PPSMC_STATEFLAG_AUTO_PULSE_SKIP
;
702 level
->stateFlags
&= ~PPSMC_STATEFLAG_AUTO_PULSE_SKIP
;
706 if (pl
->mclk
> pi
->mclk_edc_enable_threshold
)
707 level
->mcFlags
|= SMC_MC_EDC_RD_FLAG
;
709 if (pl
->mclk
> eg_pi
->mclk_edc_wr_enable_threshold
)
710 level
->mcFlags
|= SMC_MC_EDC_WR_FLAG
;
712 level
->strobeMode
= cypress_get_strobe_mode_settings(rdev
, pl
->mclk
);
714 if (level
->strobeMode
& SMC_STROBE_ENABLE
) {
715 if (cypress_get_mclk_frequency_ratio(rdev
, pl
->mclk
, true) >=
716 ((RREG32(MC_SEQ_MISC7
) >> 16) & 0xf))
717 dll_state_on
= ((RREG32(MC_SEQ_MISC5
) >> 1) & 0x1) ? true : false;
719 dll_state_on
= ((RREG32(MC_SEQ_MISC6
) >> 1) & 0x1) ? true : false;
721 dll_state_on
= eg_pi
->dll_default_on
;
723 ret
= cypress_populate_mclk_value(rdev
,
727 (level
->strobeMode
& SMC_STROBE_ENABLE
) != 0,
730 ret
= cypress_populate_mclk_value(rdev
,
740 ret
= cypress_populate_voltage_value(rdev
,
741 &eg_pi
->vddc_voltage_table
,
747 if (eg_pi
->vddci_control
) {
748 ret
= cypress_populate_voltage_value(rdev
,
749 &eg_pi
->vddci_voltage_table
,
756 ret
= cypress_populate_mvdd_value(rdev
, pl
->mclk
, &level
->mvdd
);
761 static int cypress_convert_power_state_to_smc(struct radeon_device
*rdev
,
762 struct radeon_ps
*radeon_state
,
763 RV770_SMC_SWSTATE
*smc_state
)
765 struct rv7xx_ps
*state
= rv770_get_ps(radeon_state
);
766 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
769 if (!(radeon_state
->caps
& ATOM_PPLIB_DISALLOW_ON_DC
))
770 smc_state
->flags
|= PPSMC_SWSTATE_FLAG_DC
;
772 ret
= cypress_convert_power_level_to_smc(rdev
,
774 &smc_state
->levels
[0],
775 PPSMC_DISPLAY_WATERMARK_LOW
);
779 ret
= cypress_convert_power_level_to_smc(rdev
,
781 &smc_state
->levels
[1],
782 PPSMC_DISPLAY_WATERMARK_LOW
);
786 ret
= cypress_convert_power_level_to_smc(rdev
,
788 &smc_state
->levels
[2],
789 PPSMC_DISPLAY_WATERMARK_HIGH
);
793 smc_state
->levels
[0].arbValue
= MC_CG_ARB_FREQ_F1
;
794 smc_state
->levels
[1].arbValue
= MC_CG_ARB_FREQ_F2
;
795 smc_state
->levels
[2].arbValue
= MC_CG_ARB_FREQ_F3
;
797 if (eg_pi
->dynamic_ac_timing
) {
798 smc_state
->levels
[0].ACIndex
= 2;
799 smc_state
->levels
[1].ACIndex
= 3;
800 smc_state
->levels
[2].ACIndex
= 4;
802 smc_state
->levels
[0].ACIndex
= 0;
803 smc_state
->levels
[1].ACIndex
= 0;
804 smc_state
->levels
[2].ACIndex
= 0;
807 rv770_populate_smc_sp(rdev
, radeon_state
, smc_state
);
809 return rv770_populate_smc_t(rdev
, radeon_state
, smc_state
);
812 static void cypress_convert_mc_registers(struct evergreen_mc_reg_entry
*entry
,
813 SMC_Evergreen_MCRegisterSet
*data
,
814 u32 num_entries
, u32 valid_flag
)
818 for (i
= 0, j
= 0; j
< num_entries
; j
++) {
819 if (valid_flag
& (1 << j
)) {
820 data
->value
[i
] = cpu_to_be32(entry
->mc_data
[j
]);
826 static void cypress_convert_mc_reg_table_entry_to_smc(struct radeon_device
*rdev
,
828 SMC_Evergreen_MCRegisterSet
*mc_reg_table_data
)
830 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
833 for (i
= 0; i
< eg_pi
->mc_reg_table
.num_entries
; i
++) {
835 eg_pi
->mc_reg_table
.mc_reg_table_entry
[i
].mclk_max
)
839 if ((i
== eg_pi
->mc_reg_table
.num_entries
) && (i
> 0))
842 cypress_convert_mc_registers(&eg_pi
->mc_reg_table
.mc_reg_table_entry
[i
],
844 eg_pi
->mc_reg_table
.last
,
845 eg_pi
->mc_reg_table
.valid_flag
);
848 static void cypress_convert_mc_reg_table_to_smc(struct radeon_device
*rdev
,
849 struct radeon_ps
*radeon_state
,
850 SMC_Evergreen_MCRegisters
*mc_reg_table
)
852 struct rv7xx_ps
*state
= rv770_get_ps(radeon_state
);
854 cypress_convert_mc_reg_table_entry_to_smc(rdev
,
856 &mc_reg_table
->data
[2]);
857 cypress_convert_mc_reg_table_entry_to_smc(rdev
,
859 &mc_reg_table
->data
[3]);
860 cypress_convert_mc_reg_table_entry_to_smc(rdev
,
862 &mc_reg_table
->data
[4]);
865 int cypress_upload_sw_state(struct radeon_device
*rdev
,
866 struct radeon_ps
*radeon_new_state
)
868 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
869 u16 address
= pi
->state_table_start
+
870 offsetof(RV770_SMC_STATETABLE
, driverState
);
871 RV770_SMC_SWSTATE state
= { 0 };
874 ret
= cypress_convert_power_state_to_smc(rdev
, radeon_new_state
, &state
);
878 return rv770_copy_bytes_to_smc(rdev
, address
, (u8
*)&state
,
879 sizeof(RV770_SMC_SWSTATE
),
883 int cypress_upload_mc_reg_table(struct radeon_device
*rdev
,
884 struct radeon_ps
*radeon_new_state
)
886 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
887 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
888 SMC_Evergreen_MCRegisters mc_reg_table
= { 0 };
891 cypress_convert_mc_reg_table_to_smc(rdev
, radeon_new_state
, &mc_reg_table
);
893 address
= eg_pi
->mc_reg_table_start
+
894 (u16
)offsetof(SMC_Evergreen_MCRegisters
, data
[2]);
896 return rv770_copy_bytes_to_smc(rdev
, address
,
897 (u8
*)&mc_reg_table
.data
[2],
898 sizeof(SMC_Evergreen_MCRegisterSet
) * 3,
902 u32
cypress_calculate_burst_time(struct radeon_device
*rdev
,
903 u32 engine_clock
, u32 memory_clock
)
905 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
906 u32 multiplier
= pi
->mem_gddr5
? 1 : 2;
907 u32 result
= (4 * multiplier
* engine_clock
) / (memory_clock
/ 2);
913 burst_time
= result
- 4;
915 burst_time
= result
/ 2 ;
923 void cypress_program_memory_timing_parameters(struct radeon_device
*rdev
,
924 struct radeon_ps
*radeon_new_state
)
926 struct rv7xx_ps
*new_state
= rv770_get_ps(radeon_new_state
);
927 u32 mc_arb_burst_time
= RREG32(MC_ARB_BURST_TIME
);
929 mc_arb_burst_time
&= ~(STATE1_MASK
| STATE2_MASK
| STATE3_MASK
);
931 mc_arb_burst_time
|= STATE1(cypress_calculate_burst_time(rdev
,
933 new_state
->low
.mclk
));
934 mc_arb_burst_time
|= STATE2(cypress_calculate_burst_time(rdev
,
935 new_state
->medium
.sclk
,
936 new_state
->medium
.mclk
));
937 mc_arb_burst_time
|= STATE3(cypress_calculate_burst_time(rdev
,
938 new_state
->high
.sclk
,
939 new_state
->high
.mclk
));
941 rv730_program_memory_timing_parameters(rdev
, radeon_new_state
);
943 WREG32(MC_ARB_BURST_TIME
, mc_arb_burst_time
);
946 static void cypress_populate_mc_reg_addresses(struct radeon_device
*rdev
,
947 SMC_Evergreen_MCRegisters
*mc_reg_table
)
949 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
952 for (i
= 0, j
= 0; j
< eg_pi
->mc_reg_table
.last
; j
++) {
953 if (eg_pi
->mc_reg_table
.valid_flag
& (1 << j
)) {
954 mc_reg_table
->address
[i
].s0
=
955 cpu_to_be16(eg_pi
->mc_reg_table
.mc_reg_address
[j
].s0
);
956 mc_reg_table
->address
[i
].s1
=
957 cpu_to_be16(eg_pi
->mc_reg_table
.mc_reg_address
[j
].s1
);
962 mc_reg_table
->last
= (u8
)i
;
965 static void cypress_set_mc_reg_address_table(struct radeon_device
*rdev
)
967 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
970 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_RAS_TIMING_LP
>> 2;
971 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_RAS_TIMING
>> 2;
974 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_CAS_TIMING_LP
>> 2;
975 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_CAS_TIMING
>> 2;
978 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_MISC_TIMING_LP
>> 2;
979 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_MISC_TIMING
>> 2;
982 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_MISC_TIMING2_LP
>> 2;
983 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_MISC_TIMING2
>> 2;
986 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_RD_CTL_D0_LP
>> 2;
987 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_RD_CTL_D0
>> 2;
990 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_RD_CTL_D1_LP
>> 2;
991 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_RD_CTL_D1
>> 2;
994 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_WR_CTL_D0_LP
>> 2;
995 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_WR_CTL_D0
>> 2;
998 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_WR_CTL_D1_LP
>> 2;
999 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_WR_CTL_D1
>> 2;
1002 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_PMG_CMD_EMRS_LP
>> 2;
1003 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_PMG_CMD_EMRS
>> 2;
1006 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_PMG_CMD_MRS_LP
>> 2;
1007 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_PMG_CMD_MRS
>> 2;
1010 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_PMG_CMD_MRS1_LP
>> 2;
1011 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_PMG_CMD_MRS1
>> 2;
1014 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_MISC1
>> 2;
1015 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_MISC1
>> 2;
1018 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_RESERVE_M
>> 2;
1019 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_RESERVE_M
>> 2;
1022 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_MISC3
>> 2;
1023 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_MISC3
>> 2;
1026 eg_pi
->mc_reg_table
.last
= (u8
)i
;
1029 static void cypress_retrieve_ac_timing_for_one_entry(struct radeon_device
*rdev
,
1030 struct evergreen_mc_reg_entry
*entry
)
1032 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1035 for (i
= 0; i
< eg_pi
->mc_reg_table
.last
; i
++)
1037 RREG32(eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
<< 2);
1041 static void cypress_retrieve_ac_timing_for_all_ranges(struct radeon_device
*rdev
,
1042 struct atom_memory_clock_range_table
*range_table
)
1044 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1047 for (i
= 0; i
< range_table
->num_entries
; i
++) {
1048 eg_pi
->mc_reg_table
.mc_reg_table_entry
[i
].mclk_max
=
1049 range_table
->mclk
[i
];
1050 radeon_atom_set_ac_timing(rdev
, range_table
->mclk
[i
]);
1051 cypress_retrieve_ac_timing_for_one_entry(rdev
,
1052 &eg_pi
->mc_reg_table
.mc_reg_table_entry
[i
]);
1055 eg_pi
->mc_reg_table
.num_entries
= range_table
->num_entries
;
1056 eg_pi
->mc_reg_table
.valid_flag
= 0;
1058 for (i
= 0; i
< eg_pi
->mc_reg_table
.last
; i
++) {
1059 for (j
= 1; j
< range_table
->num_entries
; j
++) {
1060 if (eg_pi
->mc_reg_table
.mc_reg_table_entry
[j
-1].mc_data
[i
] !=
1061 eg_pi
->mc_reg_table
.mc_reg_table_entry
[j
].mc_data
[i
]) {
1062 eg_pi
->mc_reg_table
.valid_flag
|= (1 << i
);
1069 static int cypress_initialize_mc_reg_table(struct radeon_device
*rdev
)
1071 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1072 u8 module_index
= rv770_get_memory_module_index(rdev
);
1073 struct atom_memory_clock_range_table range_table
= { 0 };
1076 ret
= radeon_atom_get_mclk_range_table(rdev
,
1078 module_index
, &range_table
);
1082 cypress_retrieve_ac_timing_for_all_ranges(rdev
, &range_table
);
1087 static void cypress_wait_for_mc_sequencer(struct radeon_device
*rdev
, u8 value
)
1092 if ((rdev
->family
== CHIP_CYPRESS
) ||
1093 (rdev
->family
== CHIP_HEMLOCK
))
1095 else if (rdev
->family
== CHIP_CEDAR
)
1098 for (i
= 0; i
< channels
; i
++) {
1099 if ((rdev
->family
== CHIP_CYPRESS
) ||
1100 (rdev
->family
== CHIP_HEMLOCK
)) {
1101 WREG32_P(MC_CONFIG_MCD
, MC_RD_ENABLE_MCD(i
), ~MC_RD_ENABLE_MCD_MASK
);
1102 WREG32_P(MC_CG_CONFIG_MCD
, MC_RD_ENABLE_MCD(i
), ~MC_RD_ENABLE_MCD_MASK
);
1104 WREG32_P(MC_CONFIG
, MC_RD_ENABLE(i
), ~MC_RD_ENABLE_MASK
);
1105 WREG32_P(MC_CG_CONFIG
, MC_RD_ENABLE(i
), ~MC_RD_ENABLE_MASK
);
1107 for (j
= 0; j
< rdev
->usec_timeout
; j
++) {
1108 if (((RREG32(MC_SEQ_CG
) & CG_SEQ_RESP_MASK
) >> CG_SEQ_RESP_SHIFT
) == value
)
1115 static void cypress_force_mc_use_s1(struct radeon_device
*rdev
,
1116 struct radeon_ps
*radeon_boot_state
)
1118 struct rv7xx_ps
*boot_state
= rv770_get_ps(radeon_boot_state
);
1123 if (RREG32(MC_SEQ_STATUS_M
) & PMG_PWRSTATE
)
1126 radeon_atom_set_ac_timing(rdev
, boot_state
->low
.mclk
);
1127 radeon_mc_wait_for_idle(rdev
);
1129 if ((rdev
->family
== CHIP_CYPRESS
) ||
1130 (rdev
->family
== CHIP_HEMLOCK
)) {
1131 WREG32(MC_CONFIG_MCD
, 0xf);
1132 WREG32(MC_CG_CONFIG_MCD
, 0xf);
1134 WREG32(MC_CONFIG
, 0xf);
1135 WREG32(MC_CG_CONFIG
, 0xf);
1138 for (i
= 0; i
< rdev
->num_crtc
; i
++)
1139 radeon_wait_for_vblank(rdev
, i
);
1141 WREG32(MC_SEQ_CG
, MC_CG_SEQ_YCLK_SUSPEND
);
1142 cypress_wait_for_mc_sequencer(rdev
, MC_CG_SEQ_YCLK_SUSPEND
);
1144 strobe_mode
= cypress_get_strobe_mode_settings(rdev
,
1145 boot_state
->low
.mclk
);
1147 mc_seq_cg
= CG_SEQ_REQ(MC_CG_SEQ_DRAMCONF_S1
);
1148 mc_seq_cg
|= SEQ_CG_RESP(strobe_mode
);
1149 WREG32(MC_SEQ_CG
, mc_seq_cg
);
1151 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
1152 if (RREG32(MC_SEQ_STATUS_M
) & PMG_PWRSTATE
)
1157 mc_seq_cg
&= ~CG_SEQ_REQ_MASK
;
1158 mc_seq_cg
|= CG_SEQ_REQ(MC_CG_SEQ_YCLK_RESUME
);
1159 WREG32(MC_SEQ_CG
, mc_seq_cg
);
1161 cypress_wait_for_mc_sequencer(rdev
, MC_CG_SEQ_YCLK_RESUME
);
1164 static void cypress_copy_ac_timing_from_s1_to_s0(struct radeon_device
*rdev
)
1166 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1170 for (i
= 0; i
< eg_pi
->mc_reg_table
.last
; i
++) {
1171 value
= RREG32(eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
<< 2);
1172 WREG32(eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
<< 2, value
);
1176 static void cypress_force_mc_use_s0(struct radeon_device
*rdev
,
1177 struct radeon_ps
*radeon_boot_state
)
1179 struct rv7xx_ps
*boot_state
= rv770_get_ps(radeon_boot_state
);
1184 cypress_copy_ac_timing_from_s1_to_s0(rdev
);
1185 radeon_mc_wait_for_idle(rdev
);
1187 if ((rdev
->family
== CHIP_CYPRESS
) ||
1188 (rdev
->family
== CHIP_HEMLOCK
)) {
1189 WREG32(MC_CONFIG_MCD
, 0xf);
1190 WREG32(MC_CG_CONFIG_MCD
, 0xf);
1192 WREG32(MC_CONFIG
, 0xf);
1193 WREG32(MC_CG_CONFIG
, 0xf);
1196 for (i
= 0; i
< rdev
->num_crtc
; i
++)
1197 radeon_wait_for_vblank(rdev
, i
);
1199 WREG32(MC_SEQ_CG
, MC_CG_SEQ_YCLK_SUSPEND
);
1200 cypress_wait_for_mc_sequencer(rdev
, MC_CG_SEQ_YCLK_SUSPEND
);
1202 strobe_mode
= cypress_get_strobe_mode_settings(rdev
,
1203 boot_state
->low
.mclk
);
1205 mc_seq_cg
= CG_SEQ_REQ(MC_CG_SEQ_DRAMCONF_S0
);
1206 mc_seq_cg
|= SEQ_CG_RESP(strobe_mode
);
1207 WREG32(MC_SEQ_CG
, mc_seq_cg
);
1209 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
1210 if (!(RREG32(MC_SEQ_STATUS_M
) & PMG_PWRSTATE
))
1215 mc_seq_cg
&= ~CG_SEQ_REQ_MASK
;
1216 mc_seq_cg
|= CG_SEQ_REQ(MC_CG_SEQ_YCLK_RESUME
);
1217 WREG32(MC_SEQ_CG
, mc_seq_cg
);
1219 cypress_wait_for_mc_sequencer(rdev
, MC_CG_SEQ_YCLK_RESUME
);
1222 static int cypress_populate_initial_mvdd_value(struct radeon_device
*rdev
,
1223 RV770_SMC_VOLTAGE_VALUE
*voltage
)
1225 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1227 voltage
->index
= eg_pi
->mvdd_high_index
;
1228 voltage
->value
= cpu_to_be16(MVDD_HIGH_VALUE
);
1233 int cypress_populate_smc_initial_state(struct radeon_device
*rdev
,
1234 struct radeon_ps
*radeon_initial_state
,
1235 RV770_SMC_STATETABLE
*table
)
1237 struct rv7xx_ps
*initial_state
= rv770_get_ps(radeon_initial_state
);
1238 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1239 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1242 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_AD_FUNC_CNTL
=
1243 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_ad_func_cntl
);
1244 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_AD_FUNC_CNTL_2
=
1245 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_ad_func_cntl_2
);
1246 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_DQ_FUNC_CNTL
=
1247 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_dq_func_cntl
);
1248 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_DQ_FUNC_CNTL_2
=
1249 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_dq_func_cntl_2
);
1250 table
->initialState
.levels
[0].mclk
.mclk770
.vMCLK_PWRMGT_CNTL
=
1251 cpu_to_be32(pi
->clk_regs
.rv770
.mclk_pwrmgt_cntl
);
1252 table
->initialState
.levels
[0].mclk
.mclk770
.vDLL_CNTL
=
1253 cpu_to_be32(pi
->clk_regs
.rv770
.dll_cntl
);
1255 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_SS
=
1256 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_ss1
);
1257 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_SS2
=
1258 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_ss2
);
1260 table
->initialState
.levels
[0].mclk
.mclk770
.mclk_value
=
1261 cpu_to_be32(initial_state
->low
.mclk
);
1263 table
->initialState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL
=
1264 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_func_cntl
);
1265 table
->initialState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL_2
=
1266 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_func_cntl_2
);
1267 table
->initialState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL_3
=
1268 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_func_cntl_3
);
1269 table
->initialState
.levels
[0].sclk
.vCG_SPLL_SPREAD_SPECTRUM
=
1270 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_spread_spectrum
);
1271 table
->initialState
.levels
[0].sclk
.vCG_SPLL_SPREAD_SPECTRUM_2
=
1272 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_spread_spectrum_2
);
1274 table
->initialState
.levels
[0].sclk
.sclk_value
=
1275 cpu_to_be32(initial_state
->low
.sclk
);
1277 table
->initialState
.levels
[0].arbValue
= MC_CG_ARB_FREQ_F0
;
1279 table
->initialState
.levels
[0].ACIndex
= 0;
1281 cypress_populate_voltage_value(rdev
,
1282 &eg_pi
->vddc_voltage_table
,
1283 initial_state
->low
.vddc
,
1284 &table
->initialState
.levels
[0].vddc
);
1286 if (eg_pi
->vddci_control
)
1287 cypress_populate_voltage_value(rdev
,
1288 &eg_pi
->vddci_voltage_table
,
1289 initial_state
->low
.vddci
,
1290 &table
->initialState
.levels
[0].vddci
);
1292 cypress_populate_initial_mvdd_value(rdev
,
1293 &table
->initialState
.levels
[0].mvdd
);
1295 a_t
= CG_R(0xffff) | CG_L(0);
1296 table
->initialState
.levels
[0].aT
= cpu_to_be32(a_t
);
1298 table
->initialState
.levels
[0].bSP
= cpu_to_be32(pi
->dsp
);
1301 if (pi
->boot_in_gen2
)
1302 table
->initialState
.levels
[0].gen2PCIE
= 1;
1304 table
->initialState
.levels
[0].gen2PCIE
= 0;
1305 if (initial_state
->low
.flags
& ATOM_PPLIB_R600_FLAGS_PCIEGEN2
)
1306 table
->initialState
.levels
[0].gen2XSP
= 1;
1308 table
->initialState
.levels
[0].gen2XSP
= 0;
1310 if (pi
->mem_gddr5
) {
1311 table
->initialState
.levels
[0].strobeMode
=
1312 cypress_get_strobe_mode_settings(rdev
,
1313 initial_state
->low
.mclk
);
1315 if (initial_state
->low
.mclk
> pi
->mclk_edc_enable_threshold
)
1316 table
->initialState
.levels
[0].mcFlags
= SMC_MC_EDC_RD_FLAG
| SMC_MC_EDC_WR_FLAG
;
1318 table
->initialState
.levels
[0].mcFlags
= 0;
1321 table
->initialState
.levels
[1] = table
->initialState
.levels
[0];
1322 table
->initialState
.levels
[2] = table
->initialState
.levels
[0];
1324 table
->initialState
.flags
|= PPSMC_SWSTATE_FLAG_DC
;
1329 int cypress_populate_smc_acpi_state(struct radeon_device
*rdev
,
1330 RV770_SMC_STATETABLE
*table
)
1332 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1333 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1334 u32 mpll_ad_func_cntl
=
1335 pi
->clk_regs
.rv770
.mpll_ad_func_cntl
;
1336 u32 mpll_ad_func_cntl_2
=
1337 pi
->clk_regs
.rv770
.mpll_ad_func_cntl_2
;
1338 u32 mpll_dq_func_cntl
=
1339 pi
->clk_regs
.rv770
.mpll_dq_func_cntl
;
1340 u32 mpll_dq_func_cntl_2
=
1341 pi
->clk_regs
.rv770
.mpll_dq_func_cntl_2
;
1342 u32 spll_func_cntl
=
1343 pi
->clk_regs
.rv770
.cg_spll_func_cntl
;
1344 u32 spll_func_cntl_2
=
1345 pi
->clk_regs
.rv770
.cg_spll_func_cntl_2
;
1346 u32 spll_func_cntl_3
=
1347 pi
->clk_regs
.rv770
.cg_spll_func_cntl_3
;
1348 u32 mclk_pwrmgt_cntl
=
1349 pi
->clk_regs
.rv770
.mclk_pwrmgt_cntl
;
1351 pi
->clk_regs
.rv770
.dll_cntl
;
1353 table
->ACPIState
= table
->initialState
;
1355 table
->ACPIState
.flags
&= ~PPSMC_SWSTATE_FLAG_DC
;
1357 if (pi
->acpi_vddc
) {
1358 cypress_populate_voltage_value(rdev
,
1359 &eg_pi
->vddc_voltage_table
,
1361 &table
->ACPIState
.levels
[0].vddc
);
1362 if (pi
->pcie_gen2
) {
1363 if (pi
->acpi_pcie_gen2
)
1364 table
->ACPIState
.levels
[0].gen2PCIE
= 1;
1366 table
->ACPIState
.levels
[0].gen2PCIE
= 0;
1368 table
->ACPIState
.levels
[0].gen2PCIE
= 0;
1369 if (pi
->acpi_pcie_gen2
)
1370 table
->ACPIState
.levels
[0].gen2XSP
= 1;
1372 table
->ACPIState
.levels
[0].gen2XSP
= 0;
1374 cypress_populate_voltage_value(rdev
,
1375 &eg_pi
->vddc_voltage_table
,
1376 pi
->min_vddc_in_table
,
1377 &table
->ACPIState
.levels
[0].vddc
);
1378 table
->ACPIState
.levels
[0].gen2PCIE
= 0;
1381 if (eg_pi
->acpi_vddci
) {
1382 if (eg_pi
->vddci_control
) {
1383 cypress_populate_voltage_value(rdev
,
1384 &eg_pi
->vddci_voltage_table
,
1386 &table
->ACPIState
.levels
[0].vddci
);
1390 mpll_ad_func_cntl
&= ~PDNB
;
1392 mpll_ad_func_cntl_2
|= BIAS_GEN_PDNB
| RESET_EN
;
1395 mpll_dq_func_cntl
&= ~PDNB
;
1396 mpll_dq_func_cntl_2
|= BIAS_GEN_PDNB
| RESET_EN
| BYPASS
;
1398 mclk_pwrmgt_cntl
|= (MRDCKA0_RESET
|
1407 mclk_pwrmgt_cntl
&= ~(MRDCKA0_PDNB
|
1416 dll_cntl
|= (MRDCKA0_BYPASS
|
1425 /* evergreen only */
1426 if (rdev
->family
<= CHIP_HEMLOCK
)
1427 spll_func_cntl
|= SPLL_RESET
| SPLL_SLEEP
| SPLL_BYPASS_EN
;
1429 spll_func_cntl_2
&= ~SCLK_MUX_SEL_MASK
;
1430 spll_func_cntl_2
|= SCLK_MUX_SEL(4);
1432 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMPLL_AD_FUNC_CNTL
=
1433 cpu_to_be32(mpll_ad_func_cntl
);
1434 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMPLL_AD_FUNC_CNTL_2
=
1435 cpu_to_be32(mpll_ad_func_cntl_2
);
1436 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMPLL_DQ_FUNC_CNTL
=
1437 cpu_to_be32(mpll_dq_func_cntl
);
1438 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMPLL_DQ_FUNC_CNTL_2
=
1439 cpu_to_be32(mpll_dq_func_cntl_2
);
1440 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMCLK_PWRMGT_CNTL
=
1441 cpu_to_be32(mclk_pwrmgt_cntl
);
1442 table
->ACPIState
.levels
[0].mclk
.mclk770
.vDLL_CNTL
= cpu_to_be32(dll_cntl
);
1444 table
->ACPIState
.levels
[0].mclk
.mclk770
.mclk_value
= 0;
1446 table
->ACPIState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL
=
1447 cpu_to_be32(spll_func_cntl
);
1448 table
->ACPIState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL_2
=
1449 cpu_to_be32(spll_func_cntl_2
);
1450 table
->ACPIState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL_3
=
1451 cpu_to_be32(spll_func_cntl_3
);
1453 table
->ACPIState
.levels
[0].sclk
.sclk_value
= 0;
1455 cypress_populate_mvdd_value(rdev
, 0, &table
->ACPIState
.levels
[0].mvdd
);
1457 if (eg_pi
->dynamic_ac_timing
)
1458 table
->ACPIState
.levels
[0].ACIndex
= 1;
1460 table
->ACPIState
.levels
[1] = table
->ACPIState
.levels
[0];
1461 table
->ACPIState
.levels
[2] = table
->ACPIState
.levels
[0];
1466 static void cypress_trim_voltage_table_to_fit_state_table(struct radeon_device
*rdev
,
1467 struct atom_voltage_table
*voltage_table
)
1469 unsigned int i
, diff
;
1471 if (voltage_table
->count
<= MAX_NO_VREG_STEPS
)
1474 diff
= voltage_table
->count
- MAX_NO_VREG_STEPS
;
1476 for (i
= 0; i
< MAX_NO_VREG_STEPS
; i
++)
1477 voltage_table
->entries
[i
] = voltage_table
->entries
[i
+ diff
];
1479 voltage_table
->count
= MAX_NO_VREG_STEPS
;
1482 int cypress_construct_voltage_tables(struct radeon_device
*rdev
)
1484 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1487 ret
= radeon_atom_get_voltage_table(rdev
, SET_VOLTAGE_TYPE_ASIC_VDDC
, 0,
1488 &eg_pi
->vddc_voltage_table
);
1492 if (eg_pi
->vddc_voltage_table
.count
> MAX_NO_VREG_STEPS
)
1493 cypress_trim_voltage_table_to_fit_state_table(rdev
,
1494 &eg_pi
->vddc_voltage_table
);
1496 if (eg_pi
->vddci_control
) {
1497 ret
= radeon_atom_get_voltage_table(rdev
, SET_VOLTAGE_TYPE_ASIC_VDDCI
, 0,
1498 &eg_pi
->vddci_voltage_table
);
1502 if (eg_pi
->vddci_voltage_table
.count
> MAX_NO_VREG_STEPS
)
1503 cypress_trim_voltage_table_to_fit_state_table(rdev
,
1504 &eg_pi
->vddci_voltage_table
);
1510 static void cypress_populate_smc_voltage_table(struct radeon_device
*rdev
,
1511 struct atom_voltage_table
*voltage_table
,
1512 RV770_SMC_STATETABLE
*table
)
1516 for (i
= 0; i
< voltage_table
->count
; i
++) {
1517 table
->highSMIO
[i
] = 0;
1518 table
->lowSMIO
[i
] |= cpu_to_be32(voltage_table
->entries
[i
].smio_low
);
1522 int cypress_populate_smc_voltage_tables(struct radeon_device
*rdev
,
1523 RV770_SMC_STATETABLE
*table
)
1525 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1526 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1529 if (eg_pi
->vddc_voltage_table
.count
) {
1530 cypress_populate_smc_voltage_table(rdev
,
1531 &eg_pi
->vddc_voltage_table
,
1534 table
->voltageMaskTable
.highMask
[RV770_SMC_VOLTAGEMASK_VDDC
] = 0;
1535 table
->voltageMaskTable
.lowMask
[RV770_SMC_VOLTAGEMASK_VDDC
] =
1536 cpu_to_be32(eg_pi
->vddc_voltage_table
.mask_low
);
1538 for (i
= 0; i
< eg_pi
->vddc_voltage_table
.count
; i
++) {
1539 if (pi
->max_vddc_in_table
<=
1540 eg_pi
->vddc_voltage_table
.entries
[i
].value
) {
1541 table
->maxVDDCIndexInPPTable
= i
;
1547 if (eg_pi
->vddci_voltage_table
.count
) {
1548 cypress_populate_smc_voltage_table(rdev
,
1549 &eg_pi
->vddci_voltage_table
,
1552 table
->voltageMaskTable
.highMask
[RV770_SMC_VOLTAGEMASK_VDDCI
] = 0;
1553 table
->voltageMaskTable
.lowMask
[RV770_SMC_VOLTAGEMASK_VDDCI
] =
1554 cpu_to_be32(eg_pi
->vddc_voltage_table
.mask_low
);
1560 static u32
cypress_get_mclk_split_point(struct atom_memory_info
*memory_info
)
1562 if ((memory_info
->mem_type
== MEM_TYPE_GDDR3
) ||
1563 (memory_info
->mem_type
== MEM_TYPE_DDR3
))
1569 int cypress_get_mvdd_configuration(struct radeon_device
*rdev
)
1571 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1572 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1574 struct atom_memory_info memory_info
;
1575 u32 tmp
= RREG32(GENERAL_PWRMGT
);
1577 if (!(tmp
& BACKBIAS_PAD_EN
)) {
1578 eg_pi
->mvdd_high_index
= 0;
1579 eg_pi
->mvdd_low_index
= 1;
1580 pi
->mvdd_control
= false;
1584 if (tmp
& BACKBIAS_VALUE
)
1585 eg_pi
->mvdd_high_index
= 1;
1587 eg_pi
->mvdd_high_index
= 0;
1589 eg_pi
->mvdd_low_index
=
1590 (eg_pi
->mvdd_high_index
== 0) ? 1 : 0;
1592 module_index
= rv770_get_memory_module_index(rdev
);
1594 if (radeon_atom_get_memory_info(rdev
, module_index
, &memory_info
)) {
1595 pi
->mvdd_control
= false;
1599 pi
->mvdd_split_frequency
=
1600 cypress_get_mclk_split_point(&memory_info
);
1602 if (pi
->mvdd_split_frequency
== 0) {
1603 pi
->mvdd_control
= false;
1610 static int cypress_init_smc_table(struct radeon_device
*rdev
,
1611 struct radeon_ps
*radeon_boot_state
)
1613 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1614 RV770_SMC_STATETABLE
*table
= &pi
->smc_statetable
;
1617 memset(table
, 0, sizeof(RV770_SMC_STATETABLE
));
1619 cypress_populate_smc_voltage_tables(rdev
, table
);
1621 switch (rdev
->pm
.int_thermal_type
) {
1622 case THERMAL_TYPE_EVERGREEN
:
1623 case THERMAL_TYPE_EMC2103_WITH_INTERNAL
:
1624 table
->thermalProtectType
= PPSMC_THERMAL_PROTECT_TYPE_INTERNAL
;
1626 case THERMAL_TYPE_NONE
:
1627 table
->thermalProtectType
= PPSMC_THERMAL_PROTECT_TYPE_NONE
;
1630 table
->thermalProtectType
= PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL
;
1634 if (rdev
->pm
.dpm
.platform_caps
& ATOM_PP_PLATFORM_CAP_HARDWAREDC
)
1635 table
->systemFlags
|= PPSMC_SYSTEMFLAG_GPIO_DC
;
1637 if (rdev
->pm
.dpm
.platform_caps
& ATOM_PP_PLATFORM_CAP_REGULATOR_HOT
)
1638 table
->systemFlags
|= PPSMC_SYSTEMFLAG_REGULATOR_HOT
;
1640 if (rdev
->pm
.dpm
.platform_caps
& ATOM_PP_PLATFORM_CAP_STEPVDDC
)
1641 table
->systemFlags
|= PPSMC_SYSTEMFLAG_STEPVDDC
;
1644 table
->systemFlags
|= PPSMC_SYSTEMFLAG_GDDR5
;
1646 ret
= cypress_populate_smc_initial_state(rdev
, radeon_boot_state
, table
);
1650 ret
= cypress_populate_smc_acpi_state(rdev
, table
);
1654 table
->driverState
= table
->initialState
;
1656 return rv770_copy_bytes_to_smc(rdev
,
1657 pi
->state_table_start
,
1658 (u8
*)table
, sizeof(RV770_SMC_STATETABLE
),
1662 int cypress_populate_mc_reg_table(struct radeon_device
*rdev
,
1663 struct radeon_ps
*radeon_boot_state
)
1665 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1666 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1667 struct rv7xx_ps
*boot_state
= rv770_get_ps(radeon_boot_state
);
1668 SMC_Evergreen_MCRegisters mc_reg_table
= { 0 };
1670 rv770_write_smc_soft_register(rdev
,
1671 RV770_SMC_SOFT_REGISTER_seq_index
, 1);
1673 cypress_populate_mc_reg_addresses(rdev
, &mc_reg_table
);
1675 cypress_convert_mc_reg_table_entry_to_smc(rdev
,
1677 &mc_reg_table
.data
[0]);
1679 cypress_convert_mc_registers(&eg_pi
->mc_reg_table
.mc_reg_table_entry
[0],
1680 &mc_reg_table
.data
[1], eg_pi
->mc_reg_table
.last
,
1681 eg_pi
->mc_reg_table
.valid_flag
);
1683 cypress_convert_mc_reg_table_to_smc(rdev
, radeon_boot_state
, &mc_reg_table
);
1685 return rv770_copy_bytes_to_smc(rdev
, eg_pi
->mc_reg_table_start
,
1686 (u8
*)&mc_reg_table
, sizeof(SMC_Evergreen_MCRegisters
),
1690 int cypress_get_table_locations(struct radeon_device
*rdev
)
1692 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1693 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1697 ret
= rv770_read_smc_sram_dword(rdev
,
1698 EVERGREEN_SMC_FIRMWARE_HEADER_LOCATION
+
1699 EVERGREEN_SMC_FIRMWARE_HEADER_stateTable
,
1700 &tmp
, pi
->sram_end
);
1704 pi
->state_table_start
= (u16
)tmp
;
1706 ret
= rv770_read_smc_sram_dword(rdev
,
1707 EVERGREEN_SMC_FIRMWARE_HEADER_LOCATION
+
1708 EVERGREEN_SMC_FIRMWARE_HEADER_softRegisters
,
1709 &tmp
, pi
->sram_end
);
1713 pi
->soft_regs_start
= (u16
)tmp
;
1715 ret
= rv770_read_smc_sram_dword(rdev
,
1716 EVERGREEN_SMC_FIRMWARE_HEADER_LOCATION
+
1717 EVERGREEN_SMC_FIRMWARE_HEADER_mcRegisterTable
,
1718 &tmp
, pi
->sram_end
);
1722 eg_pi
->mc_reg_table_start
= (u16
)tmp
;
1727 void cypress_enable_display_gap(struct radeon_device
*rdev
)
1729 u32 tmp
= RREG32(CG_DISPLAY_GAP_CNTL
);
1731 tmp
&= ~(DISP1_GAP_MASK
| DISP2_GAP_MASK
);
1732 tmp
|= (DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE
) |
1733 DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE
));
1735 tmp
&= ~(DISP1_GAP_MCHG_MASK
| DISP2_GAP_MCHG_MASK
);
1736 tmp
|= (DISP1_GAP_MCHG(R600_PM_DISPLAY_GAP_VBLANK
) |
1737 DISP2_GAP_MCHG(R600_PM_DISPLAY_GAP_IGNORE
));
1738 WREG32(CG_DISPLAY_GAP_CNTL
, tmp
);
1741 static void cypress_program_display_gap(struct radeon_device
*rdev
)
1746 tmp
= RREG32(CG_DISPLAY_GAP_CNTL
) & ~(DISP1_GAP_MASK
| DISP2_GAP_MASK
);
1747 if (rdev
->pm
.dpm
.new_active_crtc_count
> 0)
1748 tmp
|= DISP1_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM
);
1750 tmp
|= DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE
);
1752 if (rdev
->pm
.dpm
.new_active_crtc_count
> 1)
1753 tmp
|= DISP2_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM
);
1755 tmp
|= DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE
);
1757 WREG32(CG_DISPLAY_GAP_CNTL
, tmp
);
1759 tmp
= RREG32(DCCG_DISP_SLOW_SELECT_REG
);
1760 pipe
= (tmp
& DCCG_DISP1_SLOW_SELECT_MASK
) >> DCCG_DISP1_SLOW_SELECT_SHIFT
;
1762 if ((rdev
->pm
.dpm
.new_active_crtc_count
> 0) &&
1763 (!(rdev
->pm
.dpm
.new_active_crtcs
& (1 << pipe
)))) {
1764 /* find the first active crtc */
1765 for (i
= 0; i
< rdev
->num_crtc
; i
++) {
1766 if (rdev
->pm
.dpm
.new_active_crtcs
& (1 << i
))
1769 if (i
== rdev
->num_crtc
)
1774 tmp
&= ~DCCG_DISP1_SLOW_SELECT_MASK
;
1775 tmp
|= DCCG_DISP1_SLOW_SELECT(pipe
);
1776 WREG32(DCCG_DISP_SLOW_SELECT_REG
, tmp
);
1779 cypress_notify_smc_display_change(rdev
, rdev
->pm
.dpm
.new_active_crtc_count
> 0);
1782 void cypress_dpm_setup_asic(struct radeon_device
*rdev
)
1784 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1786 rv740_read_clock_registers(rdev
);
1787 rv770_read_voltage_smio_registers(rdev
);
1788 rv770_get_max_vddc(rdev
);
1789 rv770_get_memory_type(rdev
);
1791 if (eg_pi
->pcie_performance_request
)
1792 eg_pi
->pcie_performance_request_registered
= false;
1794 if (eg_pi
->pcie_performance_request
)
1795 cypress_advertise_gen2_capability(rdev
);
1797 rv770_get_pcie_gen2_status(rdev
);
1799 rv770_enable_acpi_pm(rdev
);
1802 int cypress_dpm_enable(struct radeon_device
*rdev
)
1804 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1805 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1806 struct radeon_ps
*boot_ps
= rdev
->pm
.dpm
.boot_ps
;
1809 if (pi
->gfx_clock_gating
)
1810 rv770_restore_cgcg(rdev
);
1812 if (rv770_dpm_enabled(rdev
))
1815 if (pi
->voltage_control
) {
1816 rv770_enable_voltage_control(rdev
, true);
1817 ret
= cypress_construct_voltage_tables(rdev
);
1819 DRM_ERROR("cypress_construct_voltage_tables failed\n");
1824 if (pi
->mvdd_control
) {
1825 ret
= cypress_get_mvdd_configuration(rdev
);
1827 DRM_ERROR("cypress_get_mvdd_configuration failed\n");
1832 if (eg_pi
->dynamic_ac_timing
) {
1833 cypress_set_mc_reg_address_table(rdev
);
1834 cypress_force_mc_use_s0(rdev
, boot_ps
);
1835 ret
= cypress_initialize_mc_reg_table(rdev
);
1837 eg_pi
->dynamic_ac_timing
= false;
1838 cypress_force_mc_use_s1(rdev
, boot_ps
);
1841 if (rdev
->pm
.dpm
.platform_caps
& ATOM_PP_PLATFORM_CAP_BACKBIAS
)
1842 rv770_enable_backbias(rdev
, true);
1845 cypress_enable_spread_spectrum(rdev
, true);
1847 if (pi
->thermal_protection
)
1848 rv770_enable_thermal_protection(rdev
, true);
1850 rv770_setup_bsp(rdev
);
1851 rv770_program_git(rdev
);
1852 rv770_program_tp(rdev
);
1853 rv770_program_tpp(rdev
);
1854 rv770_program_sstp(rdev
);
1855 rv770_program_engine_speed_parameters(rdev
);
1856 cypress_enable_display_gap(rdev
);
1857 rv770_program_vc(rdev
);
1859 if (pi
->dynamic_pcie_gen2
)
1860 cypress_enable_dynamic_pcie_gen2(rdev
, true);
1862 ret
= rv770_upload_firmware(rdev
);
1864 DRM_ERROR("rv770_upload_firmware failed\n");
1868 ret
= cypress_get_table_locations(rdev
);
1870 DRM_ERROR("cypress_get_table_locations failed\n");
1873 ret
= cypress_init_smc_table(rdev
, boot_ps
);
1875 DRM_ERROR("cypress_init_smc_table failed\n");
1878 if (eg_pi
->dynamic_ac_timing
) {
1879 ret
= cypress_populate_mc_reg_table(rdev
, boot_ps
);
1881 DRM_ERROR("cypress_populate_mc_reg_table failed\n");
1886 cypress_program_response_times(rdev
);
1888 r7xx_start_smc(rdev
);
1890 ret
= cypress_notify_smc_display_change(rdev
, false);
1892 DRM_ERROR("cypress_notify_smc_display_change failed\n");
1895 cypress_enable_sclk_control(rdev
, true);
1897 if (eg_pi
->memory_transition
)
1898 cypress_enable_mclk_control(rdev
, true);
1900 cypress_start_dpm(rdev
);
1902 if (pi
->gfx_clock_gating
)
1903 cypress_gfx_clock_gating_enable(rdev
, true);
1905 if (pi
->mg_clock_gating
)
1906 cypress_mg_clock_gating_enable(rdev
, true);
1908 rv770_enable_auto_throttle_source(rdev
, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL
, true);
1913 void cypress_dpm_disable(struct radeon_device
*rdev
)
1915 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1916 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1917 struct radeon_ps
*boot_ps
= rdev
->pm
.dpm
.boot_ps
;
1919 if (!rv770_dpm_enabled(rdev
))
1922 rv770_clear_vc(rdev
);
1924 if (pi
->thermal_protection
)
1925 rv770_enable_thermal_protection(rdev
, false);
1927 if (pi
->dynamic_pcie_gen2
)
1928 cypress_enable_dynamic_pcie_gen2(rdev
, false);
1930 if (rdev
->irq
.installed
&&
1931 r600_is_internal_thermal_sensor(rdev
->pm
.int_thermal_type
)) {
1932 rdev
->irq
.dpm_thermal
= false;
1933 radeon_irq_set(rdev
);
1936 if (pi
->gfx_clock_gating
)
1937 cypress_gfx_clock_gating_enable(rdev
, false);
1939 if (pi
->mg_clock_gating
)
1940 cypress_mg_clock_gating_enable(rdev
, false);
1942 rv770_stop_dpm(rdev
);
1943 r7xx_stop_smc(rdev
);
1945 cypress_enable_spread_spectrum(rdev
, false);
1947 if (eg_pi
->dynamic_ac_timing
)
1948 cypress_force_mc_use_s1(rdev
, boot_ps
);
1950 rv770_reset_smio_status(rdev
);
1953 int cypress_dpm_set_power_state(struct radeon_device
*rdev
)
1955 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1956 struct radeon_ps
*new_ps
= rdev
->pm
.dpm
.requested_ps
;
1957 struct radeon_ps
*old_ps
= rdev
->pm
.dpm
.current_ps
;
1960 ret
= rv770_restrict_performance_levels_before_switch(rdev
);
1962 DRM_ERROR("rv770_restrict_performance_levels_before_switch failed\n");
1965 if (eg_pi
->pcie_performance_request
)
1966 cypress_notify_link_speed_change_before_state_change(rdev
, new_ps
, old_ps
);
1968 rv770_set_uvd_clock_before_set_eng_clock(rdev
, new_ps
, old_ps
);
1969 ret
= rv770_halt_smc(rdev
);
1971 DRM_ERROR("rv770_halt_smc failed\n");
1974 ret
= cypress_upload_sw_state(rdev
, new_ps
);
1976 DRM_ERROR("cypress_upload_sw_state failed\n");
1979 if (eg_pi
->dynamic_ac_timing
) {
1980 ret
= cypress_upload_mc_reg_table(rdev
, new_ps
);
1982 DRM_ERROR("cypress_upload_mc_reg_table failed\n");
1987 cypress_program_memory_timing_parameters(rdev
, new_ps
);
1989 ret
= rv770_resume_smc(rdev
);
1991 DRM_ERROR("rv770_resume_smc failed\n");
1994 ret
= rv770_set_sw_state(rdev
);
1996 DRM_ERROR("rv770_set_sw_state failed\n");
1999 rv770_set_uvd_clock_after_set_eng_clock(rdev
, new_ps
, old_ps
);
2001 if (eg_pi
->pcie_performance_request
)
2002 cypress_notify_link_speed_change_after_state_change(rdev
, new_ps
, old_ps
);
2007 void cypress_dpm_reset_asic(struct radeon_device
*rdev
)
2009 rv770_restrict_performance_levels_before_switch(rdev
);
2010 rv770_set_boot_state(rdev
);
2013 void cypress_dpm_display_configuration_changed(struct radeon_device
*rdev
)
2015 cypress_program_display_gap(rdev
);
2018 int cypress_dpm_init(struct radeon_device
*rdev
)
2020 struct rv7xx_power_info
*pi
;
2021 struct evergreen_power_info
*eg_pi
;
2022 struct atom_clock_dividers dividers
;
2025 eg_pi
= kzalloc(sizeof(struct evergreen_power_info
), GFP_KERNEL
);
2028 rdev
->pm
.dpm
.priv
= eg_pi
;
2031 rv770_get_max_vddc(rdev
);
2033 eg_pi
->ulv
.supported
= false;
2035 eg_pi
->acpi_vddci
= 0;
2036 pi
->min_vddc_in_table
= 0;
2037 pi
->max_vddc_in_table
= 0;
2039 ret
= rv7xx_parse_power_table(rdev
);
2043 if (rdev
->pm
.dpm
.voltage_response_time
== 0)
2044 rdev
->pm
.dpm
.voltage_response_time
= R600_VOLTAGERESPONSETIME_DFLT
;
2045 if (rdev
->pm
.dpm
.backbias_response_time
== 0)
2046 rdev
->pm
.dpm
.backbias_response_time
= R600_BACKBIASRESPONSETIME_DFLT
;
2048 ret
= radeon_atom_get_clock_dividers(rdev
, COMPUTE_ENGINE_PLL_PARAM
,
2049 0, false, ÷rs
);
2051 pi
->ref_div
= dividers
.ref_div
+ 1;
2053 pi
->ref_div
= R600_REFERENCEDIVIDER_DFLT
;
2055 pi
->mclk_strobe_mode_threshold
= 40000;
2056 pi
->mclk_edc_enable_threshold
= 40000;
2057 eg_pi
->mclk_edc_wr_enable_threshold
= 40000;
2059 pi
->rlp
= RV770_RLP_DFLT
;
2060 pi
->rmp
= RV770_RMP_DFLT
;
2061 pi
->lhp
= RV770_LHP_DFLT
;
2062 pi
->lmp
= RV770_LMP_DFLT
;
2064 pi
->voltage_control
=
2065 radeon_atom_is_voltage_gpio(rdev
, SET_VOLTAGE_TYPE_ASIC_VDDC
, 0);
2068 radeon_atom_is_voltage_gpio(rdev
, SET_VOLTAGE_TYPE_ASIC_MVDDC
, 0);
2070 eg_pi
->vddci_control
=
2071 radeon_atom_is_voltage_gpio(rdev
, SET_VOLTAGE_TYPE_ASIC_VDDCI
, 0);
2073 rv770_get_engine_memory_ss(rdev
);
2075 pi
->asi
= RV770_ASI_DFLT
;
2076 pi
->pasi
= CYPRESS_HASI_DFLT
;
2077 pi
->vrc
= CYPRESS_VRC_DFLT
;
2079 pi
->power_gating
= false;
2081 if ((rdev
->family
== CHIP_CYPRESS
) ||
2082 (rdev
->family
== CHIP_HEMLOCK
))
2083 pi
->gfx_clock_gating
= false;
2085 pi
->gfx_clock_gating
= true;
2087 pi
->mg_clock_gating
= true;
2088 pi
->mgcgtssm
= true;
2089 eg_pi
->ls_clock_gating
= false;
2090 eg_pi
->sclk_deep_sleep
= false;
2092 pi
->dynamic_pcie_gen2
= true;
2094 if (rdev
->pm
.int_thermal_type
!= THERMAL_TYPE_NONE
)
2095 pi
->thermal_protection
= true;
2097 pi
->thermal_protection
= false;
2099 pi
->display_gap
= true;
2101 if (rdev
->flags
& RADEON_IS_MOBILITY
)
2108 eg_pi
->dynamic_ac_timing
= true;
2111 eg_pi
->light_sleep
= true;
2112 eg_pi
->memory_transition
= true;
2113 #if defined(CONFIG_ACPI)
2114 eg_pi
->pcie_performance_request
=
2115 radeon_acpi_is_pcie_performance_request_supported(rdev
);
2117 eg_pi
->pcie_performance_request
= false;
2120 if ((rdev
->family
== CHIP_CYPRESS
) ||
2121 (rdev
->family
== CHIP_HEMLOCK
) ||
2122 (rdev
->family
== CHIP_JUNIPER
))
2123 eg_pi
->dll_default_on
= true;
2125 eg_pi
->dll_default_on
= false;
2127 eg_pi
->sclk_deep_sleep
= false;
2128 pi
->mclk_stutter_mode_threshold
= 0;
2130 pi
->sram_end
= SMC_RAM_END
;
2135 void cypress_dpm_fini(struct radeon_device
*rdev
)
2139 for (i
= 0; i
< rdev
->pm
.dpm
.num_ps
; i
++) {
2140 kfree(rdev
->pm
.dpm
.ps
[i
].ps_priv
);
2142 kfree(rdev
->pm
.dpm
.ps
);
2143 kfree(rdev
->pm
.dpm
.priv
);
2146 bool cypress_dpm_vblank_too_short(struct radeon_device
*rdev
)
2148 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
2149 u32 vblank_time
= r600_dpm_get_vblank_time(rdev
);
2150 /* we never hit the non-gddr5 limit so disable it */
2151 u32 switch_limit
= pi
->mem_gddr5
? 450 : 0;
2153 if (vblank_time
< switch_limit
)