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
25 #include <linux/pci.h>
28 #include "cypress_dpm.h"
29 #include "evergreend.h"
32 #include "radeon_asic.h"
34 #define SMC_RAM_END 0x8000
36 #define MC_CG_ARB_FREQ_F0 0x0a
37 #define MC_CG_ARB_FREQ_F1 0x0b
38 #define MC_CG_ARB_FREQ_F2 0x0c
39 #define MC_CG_ARB_FREQ_F3 0x0d
41 #define MC_CG_SEQ_DRAMCONF_S0 0x05
42 #define MC_CG_SEQ_DRAMCONF_S1 0x06
43 #define MC_CG_SEQ_YCLK_SUSPEND 0x04
44 #define MC_CG_SEQ_YCLK_RESUME 0x0a
46 struct rv7xx_ps
*rv770_get_ps(struct radeon_ps
*rps
);
47 struct rv7xx_power_info
*rv770_get_pi(struct radeon_device
*rdev
);
48 struct evergreen_power_info
*evergreen_get_pi(struct radeon_device
*rdev
);
50 static void cypress_enable_bif_dynamic_pcie_gen2(struct radeon_device
*rdev
,
53 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
56 tmp
= RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
);
58 if ((tmp
& LC_OTHER_SIDE_EVER_SENT_GEN2
) &&
59 (tmp
& LC_OTHER_SIDE_SUPPORTS_GEN2
)) {
60 if (!pi
->boot_in_gen2
) {
61 bif
= RREG32(CG_BIF_REQ_AND_RSP
) & ~CG_CLIENT_REQ_MASK
;
62 bif
|= CG_CLIENT_REQ(0xd);
63 WREG32(CG_BIF_REQ_AND_RSP
, bif
);
65 tmp
&= ~LC_HW_VOLTAGE_IF_CONTROL_MASK
;
66 tmp
|= LC_HW_VOLTAGE_IF_CONTROL(1);
67 tmp
|= LC_GEN2_EN_STRAP
;
69 tmp
|= LC_CLR_FAILED_SPD_CHANGE_CNT
;
70 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
, tmp
);
72 tmp
&= ~LC_CLR_FAILED_SPD_CHANGE_CNT
;
73 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
, tmp
);
77 if (!pi
->boot_in_gen2
) {
78 tmp
&= ~LC_HW_VOLTAGE_IF_CONTROL_MASK
;
79 tmp
&= ~LC_GEN2_EN_STRAP
;
81 if ((tmp
& LC_OTHER_SIDE_EVER_SENT_GEN2
) ||
82 (tmp
& LC_OTHER_SIDE_SUPPORTS_GEN2
))
83 WREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
, tmp
);
87 static void cypress_enable_dynamic_pcie_gen2(struct radeon_device
*rdev
,
90 cypress_enable_bif_dynamic_pcie_gen2(rdev
, enable
);
93 WREG32_P(GENERAL_PWRMGT
, ENABLE_GEN2PCIE
, ~ENABLE_GEN2PCIE
);
95 WREG32_P(GENERAL_PWRMGT
, 0, ~ENABLE_GEN2PCIE
);
99 static int cypress_enter_ulp_state(struct radeon_device
*rdev
)
101 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
103 if (pi
->gfx_clock_gating
) {
104 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~DYN_GFX_CLK_OFF_EN
);
105 WREG32_P(SCLK_PWRMGT_CNTL
, GFX_CLK_FORCE_ON
, ~GFX_CLK_FORCE_ON
);
106 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~GFX_CLK_FORCE_ON
);
108 RREG32(GB_ADDR_CONFIG
);
111 WREG32_P(SMC_MSG
, HOST_SMC_MSG(PPSMC_MSG_SwitchToMinimumPower
),
120 static void cypress_gfx_clock_gating_enable(struct radeon_device
*rdev
,
123 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
126 if (eg_pi
->light_sleep
) {
127 WREG32(GRBM_GFX_INDEX
, 0xC0000000);
129 WREG32_CG(CG_CGLS_TILE_0
, 0xFFFFFFFF);
130 WREG32_CG(CG_CGLS_TILE_1
, 0xFFFFFFFF);
131 WREG32_CG(CG_CGLS_TILE_2
, 0xFFFFFFFF);
132 WREG32_CG(CG_CGLS_TILE_3
, 0xFFFFFFFF);
133 WREG32_CG(CG_CGLS_TILE_4
, 0xFFFFFFFF);
134 WREG32_CG(CG_CGLS_TILE_5
, 0xFFFFFFFF);
135 WREG32_CG(CG_CGLS_TILE_6
, 0xFFFFFFFF);
136 WREG32_CG(CG_CGLS_TILE_7
, 0xFFFFFFFF);
137 WREG32_CG(CG_CGLS_TILE_8
, 0xFFFFFFFF);
138 WREG32_CG(CG_CGLS_TILE_9
, 0xFFFFFFFF);
139 WREG32_CG(CG_CGLS_TILE_10
, 0xFFFFFFFF);
140 WREG32_CG(CG_CGLS_TILE_11
, 0xFFFFFFFF);
142 WREG32_P(SCLK_PWRMGT_CNTL
, DYN_LIGHT_SLEEP_EN
, ~DYN_LIGHT_SLEEP_EN
);
144 WREG32_P(SCLK_PWRMGT_CNTL
, DYN_GFX_CLK_OFF_EN
, ~DYN_GFX_CLK_OFF_EN
);
146 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~DYN_GFX_CLK_OFF_EN
);
147 WREG32_P(SCLK_PWRMGT_CNTL
, GFX_CLK_FORCE_ON
, ~GFX_CLK_FORCE_ON
);
148 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~GFX_CLK_FORCE_ON
);
149 RREG32(GB_ADDR_CONFIG
);
151 if (eg_pi
->light_sleep
) {
152 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~DYN_LIGHT_SLEEP_EN
);
154 WREG32(GRBM_GFX_INDEX
, 0xC0000000);
156 WREG32_CG(CG_CGLS_TILE_0
, 0);
157 WREG32_CG(CG_CGLS_TILE_1
, 0);
158 WREG32_CG(CG_CGLS_TILE_2
, 0);
159 WREG32_CG(CG_CGLS_TILE_3
, 0);
160 WREG32_CG(CG_CGLS_TILE_4
, 0);
161 WREG32_CG(CG_CGLS_TILE_5
, 0);
162 WREG32_CG(CG_CGLS_TILE_6
, 0);
163 WREG32_CG(CG_CGLS_TILE_7
, 0);
164 WREG32_CG(CG_CGLS_TILE_8
, 0);
165 WREG32_CG(CG_CGLS_TILE_9
, 0);
166 WREG32_CG(CG_CGLS_TILE_10
, 0);
167 WREG32_CG(CG_CGLS_TILE_11
, 0);
172 static void cypress_mg_clock_gating_enable(struct radeon_device
*rdev
,
175 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
176 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
179 u32 cgts_sm_ctrl_reg
;
181 if (rdev
->family
== CHIP_CEDAR
)
182 cgts_sm_ctrl_reg
= CEDAR_MGCGCGTSSMCTRL_DFLT
;
183 else if (rdev
->family
== CHIP_REDWOOD
)
184 cgts_sm_ctrl_reg
= REDWOOD_MGCGCGTSSMCTRL_DFLT
;
186 cgts_sm_ctrl_reg
= CYPRESS_MGCGCGTSSMCTRL_DFLT
;
188 WREG32(GRBM_GFX_INDEX
, 0xC0000000);
190 WREG32_CG(CG_CGTT_LOCAL_0
, CYPRESS_MGCGTTLOCAL0_DFLT
);
191 WREG32_CG(CG_CGTT_LOCAL_1
, CYPRESS_MGCGTTLOCAL1_DFLT
& 0xFFFFCFFF);
192 WREG32_CG(CG_CGTT_LOCAL_2
, CYPRESS_MGCGTTLOCAL2_DFLT
);
193 WREG32_CG(CG_CGTT_LOCAL_3
, CYPRESS_MGCGTTLOCAL3_DFLT
);
196 WREG32(CGTS_SM_CTRL_REG
, cgts_sm_ctrl_reg
);
199 WREG32_P(MC_CITF_MISC_RD_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
200 WREG32_P(MC_CITF_MISC_WR_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
201 WREG32_P(MC_CITF_MISC_VM_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
202 WREG32_P(MC_HUB_MISC_HUB_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
203 WREG32_P(MC_HUB_MISC_VM_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
204 WREG32_P(MC_HUB_MISC_SIP_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
205 WREG32_P(MC_XPB_CLK_GAT
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
206 WREG32_P(VM_L2_CG
, MEM_LS_ENABLE
, ~MEM_LS_ENABLE
);
209 WREG32(GRBM_GFX_INDEX
, 0xC0000000);
211 WREG32_CG(CG_CGTT_LOCAL_0
, 0xFFFFFFFF);
212 WREG32_CG(CG_CGTT_LOCAL_1
, 0xFFFFFFFF);
213 WREG32_CG(CG_CGTT_LOCAL_2
, 0xFFFFFFFF);
214 WREG32_CG(CG_CGTT_LOCAL_3
, 0xFFFFFFFF);
217 WREG32(CGTS_SM_CTRL_REG
, 0x81f44bc0);
221 void cypress_enable_spread_spectrum(struct radeon_device
*rdev
,
224 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
228 WREG32_P(GENERAL_PWRMGT
, DYN_SPREAD_SPECTRUM_EN
, ~DYN_SPREAD_SPECTRUM_EN
);
231 WREG32_P(MPLL_CNTL_MODE
, SS_SSEN
, ~SS_SSEN
);
233 WREG32_P(CG_SPLL_SPREAD_SPECTRUM
, 0, ~SSEN
);
234 WREG32_P(GENERAL_PWRMGT
, 0, ~DYN_SPREAD_SPECTRUM_EN
);
235 WREG32_P(MPLL_CNTL_MODE
, 0, ~SS_SSEN
);
236 WREG32_P(MPLL_CNTL_MODE
, 0, ~SS_DSMODE_EN
);
240 void cypress_start_dpm(struct radeon_device
*rdev
)
242 WREG32_P(GENERAL_PWRMGT
, GLOBAL_PWRMGT_EN
, ~GLOBAL_PWRMGT_EN
);
245 void cypress_enable_sclk_control(struct radeon_device
*rdev
,
249 WREG32_P(SCLK_PWRMGT_CNTL
, 0, ~SCLK_PWRMGT_OFF
);
251 WREG32_P(SCLK_PWRMGT_CNTL
, SCLK_PWRMGT_OFF
, ~SCLK_PWRMGT_OFF
);
254 void cypress_enable_mclk_control(struct radeon_device
*rdev
,
258 WREG32_P(MCLK_PWRMGT_CNTL
, 0, ~MPLL_PWRMGT_OFF
);
260 WREG32_P(MCLK_PWRMGT_CNTL
, MPLL_PWRMGT_OFF
, ~MPLL_PWRMGT_OFF
);
263 int cypress_notify_smc_display_change(struct radeon_device
*rdev
,
266 PPSMC_Msg msg
= has_display
?
267 (PPSMC_Msg
)PPSMC_MSG_HasDisplay
: (PPSMC_Msg
)PPSMC_MSG_NoDisplay
;
269 if (rv770_send_msg_to_smc(rdev
, msg
) != PPSMC_Result_OK
)
275 void cypress_program_response_times(struct radeon_device
*rdev
)
278 u32 mclk_switch_limit
;
280 reference_clock
= radeon_get_xclk(rdev
);
281 mclk_switch_limit
= (460 * reference_clock
) / 100;
283 rv770_write_smc_soft_register(rdev
,
284 RV770_SMC_SOFT_REGISTER_mclk_switch_lim
,
287 rv770_write_smc_soft_register(rdev
,
288 RV770_SMC_SOFT_REGISTER_mvdd_chg_time
, 1);
290 rv770_write_smc_soft_register(rdev
,
291 RV770_SMC_SOFT_REGISTER_mc_block_delay
, 0xAA);
293 rv770_program_response_times(rdev
);
295 if (ASIC_IS_LOMBOK(rdev
))
296 rv770_write_smc_soft_register(rdev
,
297 RV770_SMC_SOFT_REGISTER_is_asic_lombok
, 1);
301 static int cypress_pcie_performance_request(struct radeon_device
*rdev
,
302 u8 perf_req
, bool advertise
)
304 #if defined(CONFIG_ACPI)
305 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
310 tmp
= RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
);
311 if ((perf_req
== PCIE_PERF_REQ_PECI_GEN1
) && (tmp
& LC_CURRENT_DATA_RATE
))
314 #if defined(CONFIG_ACPI)
315 if ((perf_req
== PCIE_PERF_REQ_PECI_GEN1
) ||
316 (perf_req
== PCIE_PERF_REQ_PECI_GEN2
)) {
317 eg_pi
->pcie_performance_request_registered
= true;
318 return radeon_acpi_pcie_performance_request(rdev
, perf_req
, advertise
);
319 } else if ((perf_req
== PCIE_PERF_REQ_REMOVE_REGISTRY
) &&
320 eg_pi
->pcie_performance_request_registered
) {
321 eg_pi
->pcie_performance_request_registered
= false;
322 return radeon_acpi_pcie_performance_request(rdev
, perf_req
, advertise
);
329 void cypress_advertise_gen2_capability(struct radeon_device
*rdev
)
331 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
334 #if defined(CONFIG_ACPI)
335 radeon_acpi_pcie_notify_device_ready(rdev
);
338 tmp
= RREG32_PCIE_PORT(PCIE_LC_SPEED_CNTL
);
340 if ((tmp
& LC_OTHER_SIDE_EVER_SENT_GEN2
) &&
341 (tmp
& LC_OTHER_SIDE_SUPPORTS_GEN2
))
342 pi
->pcie_gen2
= true;
344 pi
->pcie_gen2
= false;
347 cypress_pcie_performance_request(rdev
, PCIE_PERF_REQ_PECI_GEN2
, true);
351 static enum radeon_pcie_gen
cypress_get_maximum_link_speed(struct radeon_ps
*radeon_state
)
353 struct rv7xx_ps
*state
= rv770_get_ps(radeon_state
);
355 if (state
->high
.flags
& ATOM_PPLIB_R600_FLAGS_PCIEGEN2
)
360 void cypress_notify_link_speed_change_after_state_change(struct radeon_device
*rdev
,
361 struct radeon_ps
*radeon_new_state
,
362 struct radeon_ps
*radeon_current_state
)
364 enum radeon_pcie_gen pcie_link_speed_target
=
365 cypress_get_maximum_link_speed(radeon_new_state
);
366 enum radeon_pcie_gen pcie_link_speed_current
=
367 cypress_get_maximum_link_speed(radeon_current_state
);
370 if (pcie_link_speed_target
< pcie_link_speed_current
) {
371 if (pcie_link_speed_target
== RADEON_PCIE_GEN1
)
372 request
= PCIE_PERF_REQ_PECI_GEN1
;
373 else if (pcie_link_speed_target
== RADEON_PCIE_GEN2
)
374 request
= PCIE_PERF_REQ_PECI_GEN2
;
376 request
= PCIE_PERF_REQ_PECI_GEN3
;
378 cypress_pcie_performance_request(rdev
, request
, false);
382 void cypress_notify_link_speed_change_before_state_change(struct radeon_device
*rdev
,
383 struct radeon_ps
*radeon_new_state
,
384 struct radeon_ps
*radeon_current_state
)
386 enum radeon_pcie_gen pcie_link_speed_target
=
387 cypress_get_maximum_link_speed(radeon_new_state
);
388 enum radeon_pcie_gen pcie_link_speed_current
=
389 cypress_get_maximum_link_speed(radeon_current_state
);
392 if (pcie_link_speed_target
> pcie_link_speed_current
) {
393 if (pcie_link_speed_target
== RADEON_PCIE_GEN1
)
394 request
= PCIE_PERF_REQ_PECI_GEN1
;
395 else if (pcie_link_speed_target
== RADEON_PCIE_GEN2
)
396 request
= PCIE_PERF_REQ_PECI_GEN2
;
398 request
= PCIE_PERF_REQ_PECI_GEN3
;
400 cypress_pcie_performance_request(rdev
, request
, false);
404 static int cypress_populate_voltage_value(struct radeon_device
*rdev
,
405 struct atom_voltage_table
*table
,
406 u16 value
, RV770_SMC_VOLTAGE_VALUE
*voltage
)
410 for (i
= 0; i
< table
->count
; i
++) {
411 if (value
<= table
->entries
[i
].value
) {
412 voltage
->index
= (u8
)i
;
413 voltage
->value
= cpu_to_be16(table
->entries
[i
].value
);
418 if (i
== table
->count
)
424 u8
cypress_get_strobe_mode_settings(struct radeon_device
*rdev
, u32 mclk
)
426 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
428 bool strobe_mode
= false;
431 if (mclk
<= pi
->mclk_strobe_mode_threshold
)
433 result
= cypress_get_mclk_frequency_ratio(rdev
, mclk
, strobe_mode
);
436 result
|= SMC_STROBE_ENABLE
;
442 u32
cypress_map_clkf_to_ibias(struct radeon_device
*rdev
, u32 clkf
)
444 u32 ref_clk
= rdev
->clock
.mpll
.reference_freq
;
445 u32 vco
= clkf
* ref_clk
;
447 /* 100 Mhz ref clk */
448 if (ref_clk
== 10000) {
474 static int cypress_populate_mclk_value(struct radeon_device
*rdev
,
475 u32 engine_clock
, u32 memory_clock
,
476 RV7XX_SMC_MCLK_VALUE
*mclk
,
477 bool strobe_mode
, bool dll_state_on
)
479 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
481 u32 mpll_ad_func_cntl
=
482 pi
->clk_regs
.rv770
.mpll_ad_func_cntl
;
483 u32 mpll_ad_func_cntl_2
=
484 pi
->clk_regs
.rv770
.mpll_ad_func_cntl_2
;
485 u32 mpll_dq_func_cntl
=
486 pi
->clk_regs
.rv770
.mpll_dq_func_cntl
;
487 u32 mpll_dq_func_cntl_2
=
488 pi
->clk_regs
.rv770
.mpll_dq_func_cntl_2
;
489 u32 mclk_pwrmgt_cntl
=
490 pi
->clk_regs
.rv770
.mclk_pwrmgt_cntl
;
492 pi
->clk_regs
.rv770
.dll_cntl
;
493 u32 mpll_ss1
= pi
->clk_regs
.rv770
.mpll_ss1
;
494 u32 mpll_ss2
= pi
->clk_regs
.rv770
.mpll_ss2
;
495 struct atom_clock_dividers dividers
;
501 ret
= radeon_atom_get_clock_dividers(rdev
, COMPUTE_MEMORY_PLL_PARAM
,
502 memory_clock
, strobe_mode
, ÷rs
);
507 mc_seq_misc7
= RREG32(MC_SEQ_MISC7
);
509 if(mc_seq_misc7
& 0x8000000)
510 dividers
.post_div
= 1;
513 ibias
= cypress_map_clkf_to_ibias(rdev
, dividers
.whole_fb_div
);
515 mpll_ad_func_cntl
&= ~(CLKR_MASK
|
520 mpll_ad_func_cntl
|= CLKR(dividers
.ref_div
);
521 mpll_ad_func_cntl
|= YCLK_POST_DIV(dividers
.post_div
);
522 mpll_ad_func_cntl
|= CLKF(dividers
.whole_fb_div
);
523 mpll_ad_func_cntl
|= CLKFRAC(dividers
.frac_fb_div
);
524 mpll_ad_func_cntl
|= IBIAS(ibias
);
526 if (dividers
.vco_mode
)
527 mpll_ad_func_cntl_2
|= VCO_MODE
;
529 mpll_ad_func_cntl_2
&= ~VCO_MODE
;
532 mpll_dq_func_cntl
&= ~(CLKR_MASK
|
537 mpll_dq_func_cntl
|= CLKR(dividers
.ref_div
);
538 mpll_dq_func_cntl
|= YCLK_POST_DIV(dividers
.post_div
);
539 mpll_dq_func_cntl
|= CLKF(dividers
.whole_fb_div
);
540 mpll_dq_func_cntl
|= CLKFRAC(dividers
.frac_fb_div
);
541 mpll_dq_func_cntl
|= IBIAS(ibias
);
544 mpll_dq_func_cntl
&= ~PDNB
;
546 mpll_dq_func_cntl
|= PDNB
;
548 if (dividers
.vco_mode
)
549 mpll_dq_func_cntl_2
|= VCO_MODE
;
551 mpll_dq_func_cntl_2
&= ~VCO_MODE
;
555 struct radeon_atom_ss ss
;
556 u32 vco_freq
= memory_clock
* dividers
.post_div
;
558 if (radeon_atombios_get_asic_ss_info(rdev
, &ss
,
559 ASIC_INTERNAL_MEMORY_SS
, vco_freq
)) {
560 u32 reference_clock
= rdev
->clock
.mpll
.reference_freq
;
561 u32 decoded_ref
= rv740_get_decoded_reference_divider(dividers
.ref_div
);
562 u32 clk_s
= reference_clock
* 5 / (decoded_ref
* ss
.rate
);
563 u32 clk_v
= ss
.percentage
*
564 (0x4000 * dividers
.whole_fb_div
+ 0x800 * dividers
.frac_fb_div
) / (clk_s
* 625);
566 mpll_ss1
&= ~CLKV_MASK
;
567 mpll_ss1
|= CLKV(clk_v
);
569 mpll_ss2
&= ~CLKS_MASK
;
570 mpll_ss2
|= CLKS(clk_s
);
574 dll_speed
= rv740_get_dll_speed(pi
->mem_gddr5
,
577 mclk_pwrmgt_cntl
&= ~DLL_SPEED_MASK
;
578 mclk_pwrmgt_cntl
|= DLL_SPEED(dll_speed
);
580 mclk_pwrmgt_cntl
|= (MRDCKA0_PDNB
|
589 mclk_pwrmgt_cntl
&= ~(MRDCKA0_PDNB
|
598 mclk
->mclk770
.mclk_value
= cpu_to_be32(memory_clock
);
599 mclk
->mclk770
.vMPLL_AD_FUNC_CNTL
= cpu_to_be32(mpll_ad_func_cntl
);
600 mclk
->mclk770
.vMPLL_AD_FUNC_CNTL_2
= cpu_to_be32(mpll_ad_func_cntl_2
);
601 mclk
->mclk770
.vMPLL_DQ_FUNC_CNTL
= cpu_to_be32(mpll_dq_func_cntl
);
602 mclk
->mclk770
.vMPLL_DQ_FUNC_CNTL_2
= cpu_to_be32(mpll_dq_func_cntl_2
);
603 mclk
->mclk770
.vMCLK_PWRMGT_CNTL
= cpu_to_be32(mclk_pwrmgt_cntl
);
604 mclk
->mclk770
.vDLL_CNTL
= cpu_to_be32(dll_cntl
);
605 mclk
->mclk770
.vMPLL_SS
= cpu_to_be32(mpll_ss1
);
606 mclk
->mclk770
.vMPLL_SS2
= cpu_to_be32(mpll_ss2
);
611 u8
cypress_get_mclk_frequency_ratio(struct radeon_device
*rdev
,
612 u32 memory_clock
, bool strobe_mode
)
616 if (rdev
->family
>= CHIP_BARTS
) {
618 if (memory_clock
< 10000)
619 mc_para_index
= 0x00;
620 else if (memory_clock
> 47500)
621 mc_para_index
= 0x0f;
623 mc_para_index
= (u8
)((memory_clock
- 10000) / 2500);
625 if (memory_clock
< 65000)
626 mc_para_index
= 0x00;
627 else if (memory_clock
> 135000)
628 mc_para_index
= 0x0f;
630 mc_para_index
= (u8
)((memory_clock
- 60000) / 5000);
634 if (memory_clock
< 10000)
635 mc_para_index
= 0x00;
636 else if (memory_clock
> 47500)
637 mc_para_index
= 0x0f;
639 mc_para_index
= (u8
)((memory_clock
- 10000) / 2500);
641 if (memory_clock
< 40000)
642 mc_para_index
= 0x00;
643 else if (memory_clock
> 115000)
644 mc_para_index
= 0x0f;
646 mc_para_index
= (u8
)((memory_clock
- 40000) / 5000);
649 return mc_para_index
;
652 static int cypress_populate_mvdd_value(struct radeon_device
*rdev
,
654 RV770_SMC_VOLTAGE_VALUE
*voltage
)
656 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
657 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
659 if (!pi
->mvdd_control
) {
660 voltage
->index
= eg_pi
->mvdd_high_index
;
661 voltage
->value
= cpu_to_be16(MVDD_HIGH_VALUE
);
665 if (mclk
<= pi
->mvdd_split_frequency
) {
666 voltage
->index
= eg_pi
->mvdd_low_index
;
667 voltage
->value
= cpu_to_be16(MVDD_LOW_VALUE
);
669 voltage
->index
= eg_pi
->mvdd_high_index
;
670 voltage
->value
= cpu_to_be16(MVDD_HIGH_VALUE
);
676 int cypress_convert_power_level_to_smc(struct radeon_device
*rdev
,
678 RV770_SMC_HW_PERFORMANCE_LEVEL
*level
,
681 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
682 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
686 level
->gen2PCIE
= pi
->pcie_gen2
?
687 ((pl
->flags
& ATOM_PPLIB_R600_FLAGS_PCIEGEN2
) ? 1 : 0) : 0;
688 level
->gen2XSP
= (pl
->flags
& ATOM_PPLIB_R600_FLAGS_PCIEGEN2
) ? 1 : 0;
689 level
->backbias
= (pl
->flags
& ATOM_PPLIB_R600_FLAGS_BACKBIASENABLE
) ? 1 : 0;
690 level
->displayWatermark
= watermark_level
;
692 ret
= rv740_populate_sclk_value(rdev
, pl
->sclk
, &level
->sclk
);
697 if (pi
->mclk_stutter_mode_threshold
&&
698 (pl
->mclk
<= pi
->mclk_stutter_mode_threshold
) &&
699 !eg_pi
->uvd_enabled
) {
700 level
->mcFlags
|= SMC_MC_STUTTER_EN
;
701 if (eg_pi
->sclk_deep_sleep
)
702 level
->stateFlags
|= PPSMC_STATEFLAG_AUTO_PULSE_SKIP
;
704 level
->stateFlags
&= ~PPSMC_STATEFLAG_AUTO_PULSE_SKIP
;
708 if (pl
->mclk
> pi
->mclk_edc_enable_threshold
)
709 level
->mcFlags
|= SMC_MC_EDC_RD_FLAG
;
711 if (pl
->mclk
> eg_pi
->mclk_edc_wr_enable_threshold
)
712 level
->mcFlags
|= SMC_MC_EDC_WR_FLAG
;
714 level
->strobeMode
= cypress_get_strobe_mode_settings(rdev
, pl
->mclk
);
716 if (level
->strobeMode
& SMC_STROBE_ENABLE
) {
717 if (cypress_get_mclk_frequency_ratio(rdev
, pl
->mclk
, true) >=
718 ((RREG32(MC_SEQ_MISC7
) >> 16) & 0xf))
719 dll_state_on
= ((RREG32(MC_SEQ_MISC5
) >> 1) & 0x1) ? true : false;
721 dll_state_on
= ((RREG32(MC_SEQ_MISC6
) >> 1) & 0x1) ? true : false;
723 dll_state_on
= eg_pi
->dll_default_on
;
725 ret
= cypress_populate_mclk_value(rdev
,
729 (level
->strobeMode
& SMC_STROBE_ENABLE
) != 0,
732 ret
= cypress_populate_mclk_value(rdev
,
742 ret
= cypress_populate_voltage_value(rdev
,
743 &eg_pi
->vddc_voltage_table
,
749 if (eg_pi
->vddci_control
) {
750 ret
= cypress_populate_voltage_value(rdev
,
751 &eg_pi
->vddci_voltage_table
,
758 ret
= cypress_populate_mvdd_value(rdev
, pl
->mclk
, &level
->mvdd
);
763 static int cypress_convert_power_state_to_smc(struct radeon_device
*rdev
,
764 struct radeon_ps
*radeon_state
,
765 RV770_SMC_SWSTATE
*smc_state
)
767 struct rv7xx_ps
*state
= rv770_get_ps(radeon_state
);
768 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
771 if (!(radeon_state
->caps
& ATOM_PPLIB_DISALLOW_ON_DC
))
772 smc_state
->flags
|= PPSMC_SWSTATE_FLAG_DC
;
774 ret
= cypress_convert_power_level_to_smc(rdev
,
776 &smc_state
->levels
[0],
777 PPSMC_DISPLAY_WATERMARK_LOW
);
781 ret
= cypress_convert_power_level_to_smc(rdev
,
783 &smc_state
->levels
[1],
784 PPSMC_DISPLAY_WATERMARK_LOW
);
788 ret
= cypress_convert_power_level_to_smc(rdev
,
790 &smc_state
->levels
[2],
791 PPSMC_DISPLAY_WATERMARK_HIGH
);
795 smc_state
->levels
[0].arbValue
= MC_CG_ARB_FREQ_F1
;
796 smc_state
->levels
[1].arbValue
= MC_CG_ARB_FREQ_F2
;
797 smc_state
->levels
[2].arbValue
= MC_CG_ARB_FREQ_F3
;
799 if (eg_pi
->dynamic_ac_timing
) {
800 smc_state
->levels
[0].ACIndex
= 2;
801 smc_state
->levels
[1].ACIndex
= 3;
802 smc_state
->levels
[2].ACIndex
= 4;
804 smc_state
->levels
[0].ACIndex
= 0;
805 smc_state
->levels
[1].ACIndex
= 0;
806 smc_state
->levels
[2].ACIndex
= 0;
809 rv770_populate_smc_sp(rdev
, radeon_state
, smc_state
);
811 return rv770_populate_smc_t(rdev
, radeon_state
, smc_state
);
814 static void cypress_convert_mc_registers(struct evergreen_mc_reg_entry
*entry
,
815 SMC_Evergreen_MCRegisterSet
*data
,
816 u32 num_entries
, u32 valid_flag
)
820 for (i
= 0, j
= 0; j
< num_entries
; j
++) {
821 if (valid_flag
& (1 << j
)) {
822 data
->value
[i
] = cpu_to_be32(entry
->mc_data
[j
]);
828 static void cypress_convert_mc_reg_table_entry_to_smc(struct radeon_device
*rdev
,
830 SMC_Evergreen_MCRegisterSet
*mc_reg_table_data
)
832 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
835 for (i
= 0; i
< eg_pi
->mc_reg_table
.num_entries
; i
++) {
837 eg_pi
->mc_reg_table
.mc_reg_table_entry
[i
].mclk_max
)
841 if ((i
== eg_pi
->mc_reg_table
.num_entries
) && (i
> 0))
844 cypress_convert_mc_registers(&eg_pi
->mc_reg_table
.mc_reg_table_entry
[i
],
846 eg_pi
->mc_reg_table
.last
,
847 eg_pi
->mc_reg_table
.valid_flag
);
850 static void cypress_convert_mc_reg_table_to_smc(struct radeon_device
*rdev
,
851 struct radeon_ps
*radeon_state
,
852 SMC_Evergreen_MCRegisters
*mc_reg_table
)
854 struct rv7xx_ps
*state
= rv770_get_ps(radeon_state
);
856 cypress_convert_mc_reg_table_entry_to_smc(rdev
,
858 &mc_reg_table
->data
[2]);
859 cypress_convert_mc_reg_table_entry_to_smc(rdev
,
861 &mc_reg_table
->data
[3]);
862 cypress_convert_mc_reg_table_entry_to_smc(rdev
,
864 &mc_reg_table
->data
[4]);
867 int cypress_upload_sw_state(struct radeon_device
*rdev
,
868 struct radeon_ps
*radeon_new_state
)
870 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
871 u16 address
= pi
->state_table_start
+
872 offsetof(RV770_SMC_STATETABLE
, driverState
);
873 RV770_SMC_SWSTATE state
= { 0 };
876 ret
= cypress_convert_power_state_to_smc(rdev
, radeon_new_state
, &state
);
880 return rv770_copy_bytes_to_smc(rdev
, address
, (u8
*)&state
,
881 sizeof(RV770_SMC_SWSTATE
),
885 int cypress_upload_mc_reg_table(struct radeon_device
*rdev
,
886 struct radeon_ps
*radeon_new_state
)
888 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
889 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
890 SMC_Evergreen_MCRegisters mc_reg_table
= { 0 };
893 cypress_convert_mc_reg_table_to_smc(rdev
, radeon_new_state
, &mc_reg_table
);
895 address
= eg_pi
->mc_reg_table_start
+
896 (u16
)offsetof(SMC_Evergreen_MCRegisters
, data
[2]);
898 return rv770_copy_bytes_to_smc(rdev
, address
,
899 (u8
*)&mc_reg_table
.data
[2],
900 sizeof(SMC_Evergreen_MCRegisterSet
) * 3,
904 u32
cypress_calculate_burst_time(struct radeon_device
*rdev
,
905 u32 engine_clock
, u32 memory_clock
)
907 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
908 u32 multiplier
= pi
->mem_gddr5
? 1 : 2;
909 u32 result
= (4 * multiplier
* engine_clock
) / (memory_clock
/ 2);
915 burst_time
= result
- 4;
917 burst_time
= result
/ 2 ;
925 void cypress_program_memory_timing_parameters(struct radeon_device
*rdev
,
926 struct radeon_ps
*radeon_new_state
)
928 struct rv7xx_ps
*new_state
= rv770_get_ps(radeon_new_state
);
929 u32 mc_arb_burst_time
= RREG32(MC_ARB_BURST_TIME
);
931 mc_arb_burst_time
&= ~(STATE1_MASK
| STATE2_MASK
| STATE3_MASK
);
933 mc_arb_burst_time
|= STATE1(cypress_calculate_burst_time(rdev
,
935 new_state
->low
.mclk
));
936 mc_arb_burst_time
|= STATE2(cypress_calculate_burst_time(rdev
,
937 new_state
->medium
.sclk
,
938 new_state
->medium
.mclk
));
939 mc_arb_burst_time
|= STATE3(cypress_calculate_burst_time(rdev
,
940 new_state
->high
.sclk
,
941 new_state
->high
.mclk
));
943 rv730_program_memory_timing_parameters(rdev
, radeon_new_state
);
945 WREG32(MC_ARB_BURST_TIME
, mc_arb_burst_time
);
948 static void cypress_populate_mc_reg_addresses(struct radeon_device
*rdev
,
949 SMC_Evergreen_MCRegisters
*mc_reg_table
)
951 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
954 for (i
= 0, j
= 0; j
< eg_pi
->mc_reg_table
.last
; j
++) {
955 if (eg_pi
->mc_reg_table
.valid_flag
& (1 << j
)) {
956 mc_reg_table
->address
[i
].s0
=
957 cpu_to_be16(eg_pi
->mc_reg_table
.mc_reg_address
[j
].s0
);
958 mc_reg_table
->address
[i
].s1
=
959 cpu_to_be16(eg_pi
->mc_reg_table
.mc_reg_address
[j
].s1
);
964 mc_reg_table
->last
= (u8
)i
;
967 static void cypress_set_mc_reg_address_table(struct radeon_device
*rdev
)
969 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
972 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_RAS_TIMING_LP
>> 2;
973 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_RAS_TIMING
>> 2;
976 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_CAS_TIMING_LP
>> 2;
977 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_CAS_TIMING
>> 2;
980 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_MISC_TIMING_LP
>> 2;
981 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_MISC_TIMING
>> 2;
984 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_MISC_TIMING2_LP
>> 2;
985 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_MISC_TIMING2
>> 2;
988 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_RD_CTL_D0_LP
>> 2;
989 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_RD_CTL_D0
>> 2;
992 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_RD_CTL_D1_LP
>> 2;
993 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_RD_CTL_D1
>> 2;
996 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_WR_CTL_D0_LP
>> 2;
997 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_WR_CTL_D0
>> 2;
1000 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_WR_CTL_D1_LP
>> 2;
1001 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_WR_CTL_D1
>> 2;
1004 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_PMG_CMD_EMRS_LP
>> 2;
1005 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_PMG_CMD_EMRS
>> 2;
1008 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_PMG_CMD_MRS_LP
>> 2;
1009 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_PMG_CMD_MRS
>> 2;
1012 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_PMG_CMD_MRS1_LP
>> 2;
1013 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_PMG_CMD_MRS1
>> 2;
1016 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_MISC1
>> 2;
1017 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_MISC1
>> 2;
1020 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_RESERVE_M
>> 2;
1021 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_RESERVE_M
>> 2;
1024 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
= MC_SEQ_MISC3
>> 2;
1025 eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
= MC_SEQ_MISC3
>> 2;
1028 eg_pi
->mc_reg_table
.last
= (u8
)i
;
1031 static void cypress_retrieve_ac_timing_for_one_entry(struct radeon_device
*rdev
,
1032 struct evergreen_mc_reg_entry
*entry
)
1034 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1037 for (i
= 0; i
< eg_pi
->mc_reg_table
.last
; i
++)
1039 RREG32(eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
<< 2);
1043 static void cypress_retrieve_ac_timing_for_all_ranges(struct radeon_device
*rdev
,
1044 struct atom_memory_clock_range_table
*range_table
)
1046 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1049 for (i
= 0; i
< range_table
->num_entries
; i
++) {
1050 eg_pi
->mc_reg_table
.mc_reg_table_entry
[i
].mclk_max
=
1051 range_table
->mclk
[i
];
1052 radeon_atom_set_ac_timing(rdev
, range_table
->mclk
[i
]);
1053 cypress_retrieve_ac_timing_for_one_entry(rdev
,
1054 &eg_pi
->mc_reg_table
.mc_reg_table_entry
[i
]);
1057 eg_pi
->mc_reg_table
.num_entries
= range_table
->num_entries
;
1058 eg_pi
->mc_reg_table
.valid_flag
= 0;
1060 for (i
= 0; i
< eg_pi
->mc_reg_table
.last
; i
++) {
1061 for (j
= 1; j
< range_table
->num_entries
; j
++) {
1062 if (eg_pi
->mc_reg_table
.mc_reg_table_entry
[j
-1].mc_data
[i
] !=
1063 eg_pi
->mc_reg_table
.mc_reg_table_entry
[j
].mc_data
[i
]) {
1064 eg_pi
->mc_reg_table
.valid_flag
|= (1 << i
);
1071 static int cypress_initialize_mc_reg_table(struct radeon_device
*rdev
)
1073 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1074 u8 module_index
= rv770_get_memory_module_index(rdev
);
1075 struct atom_memory_clock_range_table range_table
= { 0 };
1078 ret
= radeon_atom_get_mclk_range_table(rdev
,
1080 module_index
, &range_table
);
1084 cypress_retrieve_ac_timing_for_all_ranges(rdev
, &range_table
);
1089 static void cypress_wait_for_mc_sequencer(struct radeon_device
*rdev
, u8 value
)
1094 if ((rdev
->family
== CHIP_CYPRESS
) ||
1095 (rdev
->family
== CHIP_HEMLOCK
))
1097 else if (rdev
->family
== CHIP_CEDAR
)
1100 for (i
= 0; i
< channels
; i
++) {
1101 if ((rdev
->family
== CHIP_CYPRESS
) ||
1102 (rdev
->family
== CHIP_HEMLOCK
)) {
1103 WREG32_P(MC_CONFIG_MCD
, MC_RD_ENABLE_MCD(i
), ~MC_RD_ENABLE_MCD_MASK
);
1104 WREG32_P(MC_CG_CONFIG_MCD
, MC_RD_ENABLE_MCD(i
), ~MC_RD_ENABLE_MCD_MASK
);
1106 WREG32_P(MC_CONFIG
, MC_RD_ENABLE(i
), ~MC_RD_ENABLE_MASK
);
1107 WREG32_P(MC_CG_CONFIG
, MC_RD_ENABLE(i
), ~MC_RD_ENABLE_MASK
);
1109 for (j
= 0; j
< rdev
->usec_timeout
; j
++) {
1110 if (((RREG32(MC_SEQ_CG
) & CG_SEQ_RESP_MASK
) >> CG_SEQ_RESP_SHIFT
) == value
)
1117 static void cypress_force_mc_use_s1(struct radeon_device
*rdev
,
1118 struct radeon_ps
*radeon_boot_state
)
1120 struct rv7xx_ps
*boot_state
= rv770_get_ps(radeon_boot_state
);
1125 if (RREG32(MC_SEQ_STATUS_M
) & PMG_PWRSTATE
)
1128 radeon_atom_set_ac_timing(rdev
, boot_state
->low
.mclk
);
1129 radeon_mc_wait_for_idle(rdev
);
1131 if ((rdev
->family
== CHIP_CYPRESS
) ||
1132 (rdev
->family
== CHIP_HEMLOCK
)) {
1133 WREG32(MC_CONFIG_MCD
, 0xf);
1134 WREG32(MC_CG_CONFIG_MCD
, 0xf);
1136 WREG32(MC_CONFIG
, 0xf);
1137 WREG32(MC_CG_CONFIG
, 0xf);
1140 for (i
= 0; i
< rdev
->num_crtc
; i
++)
1141 radeon_wait_for_vblank(rdev
, i
);
1143 WREG32(MC_SEQ_CG
, MC_CG_SEQ_YCLK_SUSPEND
);
1144 cypress_wait_for_mc_sequencer(rdev
, MC_CG_SEQ_YCLK_SUSPEND
);
1146 strobe_mode
= cypress_get_strobe_mode_settings(rdev
,
1147 boot_state
->low
.mclk
);
1149 mc_seq_cg
= CG_SEQ_REQ(MC_CG_SEQ_DRAMCONF_S1
);
1150 mc_seq_cg
|= SEQ_CG_RESP(strobe_mode
);
1151 WREG32(MC_SEQ_CG
, mc_seq_cg
);
1153 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
1154 if (RREG32(MC_SEQ_STATUS_M
) & PMG_PWRSTATE
)
1159 mc_seq_cg
&= ~CG_SEQ_REQ_MASK
;
1160 mc_seq_cg
|= CG_SEQ_REQ(MC_CG_SEQ_YCLK_RESUME
);
1161 WREG32(MC_SEQ_CG
, mc_seq_cg
);
1163 cypress_wait_for_mc_sequencer(rdev
, MC_CG_SEQ_YCLK_RESUME
);
1166 static void cypress_copy_ac_timing_from_s1_to_s0(struct radeon_device
*rdev
)
1168 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1172 for (i
= 0; i
< eg_pi
->mc_reg_table
.last
; i
++) {
1173 value
= RREG32(eg_pi
->mc_reg_table
.mc_reg_address
[i
].s1
<< 2);
1174 WREG32(eg_pi
->mc_reg_table
.mc_reg_address
[i
].s0
<< 2, value
);
1178 static void cypress_force_mc_use_s0(struct radeon_device
*rdev
,
1179 struct radeon_ps
*radeon_boot_state
)
1181 struct rv7xx_ps
*boot_state
= rv770_get_ps(radeon_boot_state
);
1186 cypress_copy_ac_timing_from_s1_to_s0(rdev
);
1187 radeon_mc_wait_for_idle(rdev
);
1189 if ((rdev
->family
== CHIP_CYPRESS
) ||
1190 (rdev
->family
== CHIP_HEMLOCK
)) {
1191 WREG32(MC_CONFIG_MCD
, 0xf);
1192 WREG32(MC_CG_CONFIG_MCD
, 0xf);
1194 WREG32(MC_CONFIG
, 0xf);
1195 WREG32(MC_CG_CONFIG
, 0xf);
1198 for (i
= 0; i
< rdev
->num_crtc
; i
++)
1199 radeon_wait_for_vblank(rdev
, i
);
1201 WREG32(MC_SEQ_CG
, MC_CG_SEQ_YCLK_SUSPEND
);
1202 cypress_wait_for_mc_sequencer(rdev
, MC_CG_SEQ_YCLK_SUSPEND
);
1204 strobe_mode
= cypress_get_strobe_mode_settings(rdev
,
1205 boot_state
->low
.mclk
);
1207 mc_seq_cg
= CG_SEQ_REQ(MC_CG_SEQ_DRAMCONF_S0
);
1208 mc_seq_cg
|= SEQ_CG_RESP(strobe_mode
);
1209 WREG32(MC_SEQ_CG
, mc_seq_cg
);
1211 for (i
= 0; i
< rdev
->usec_timeout
; i
++) {
1212 if (!(RREG32(MC_SEQ_STATUS_M
) & PMG_PWRSTATE
))
1217 mc_seq_cg
&= ~CG_SEQ_REQ_MASK
;
1218 mc_seq_cg
|= CG_SEQ_REQ(MC_CG_SEQ_YCLK_RESUME
);
1219 WREG32(MC_SEQ_CG
, mc_seq_cg
);
1221 cypress_wait_for_mc_sequencer(rdev
, MC_CG_SEQ_YCLK_RESUME
);
1224 static int cypress_populate_initial_mvdd_value(struct radeon_device
*rdev
,
1225 RV770_SMC_VOLTAGE_VALUE
*voltage
)
1227 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1229 voltage
->index
= eg_pi
->mvdd_high_index
;
1230 voltage
->value
= cpu_to_be16(MVDD_HIGH_VALUE
);
1235 int cypress_populate_smc_initial_state(struct radeon_device
*rdev
,
1236 struct radeon_ps
*radeon_initial_state
,
1237 RV770_SMC_STATETABLE
*table
)
1239 struct rv7xx_ps
*initial_state
= rv770_get_ps(radeon_initial_state
);
1240 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1241 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1244 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_AD_FUNC_CNTL
=
1245 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_ad_func_cntl
);
1246 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_AD_FUNC_CNTL_2
=
1247 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_ad_func_cntl_2
);
1248 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_DQ_FUNC_CNTL
=
1249 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_dq_func_cntl
);
1250 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_DQ_FUNC_CNTL_2
=
1251 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_dq_func_cntl_2
);
1252 table
->initialState
.levels
[0].mclk
.mclk770
.vMCLK_PWRMGT_CNTL
=
1253 cpu_to_be32(pi
->clk_regs
.rv770
.mclk_pwrmgt_cntl
);
1254 table
->initialState
.levels
[0].mclk
.mclk770
.vDLL_CNTL
=
1255 cpu_to_be32(pi
->clk_regs
.rv770
.dll_cntl
);
1257 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_SS
=
1258 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_ss1
);
1259 table
->initialState
.levels
[0].mclk
.mclk770
.vMPLL_SS2
=
1260 cpu_to_be32(pi
->clk_regs
.rv770
.mpll_ss2
);
1262 table
->initialState
.levels
[0].mclk
.mclk770
.mclk_value
=
1263 cpu_to_be32(initial_state
->low
.mclk
);
1265 table
->initialState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL
=
1266 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_func_cntl
);
1267 table
->initialState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL_2
=
1268 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_func_cntl_2
);
1269 table
->initialState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL_3
=
1270 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_func_cntl_3
);
1271 table
->initialState
.levels
[0].sclk
.vCG_SPLL_SPREAD_SPECTRUM
=
1272 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_spread_spectrum
);
1273 table
->initialState
.levels
[0].sclk
.vCG_SPLL_SPREAD_SPECTRUM_2
=
1274 cpu_to_be32(pi
->clk_regs
.rv770
.cg_spll_spread_spectrum_2
);
1276 table
->initialState
.levels
[0].sclk
.sclk_value
=
1277 cpu_to_be32(initial_state
->low
.sclk
);
1279 table
->initialState
.levels
[0].arbValue
= MC_CG_ARB_FREQ_F0
;
1281 table
->initialState
.levels
[0].ACIndex
= 0;
1283 cypress_populate_voltage_value(rdev
,
1284 &eg_pi
->vddc_voltage_table
,
1285 initial_state
->low
.vddc
,
1286 &table
->initialState
.levels
[0].vddc
);
1288 if (eg_pi
->vddci_control
)
1289 cypress_populate_voltage_value(rdev
,
1290 &eg_pi
->vddci_voltage_table
,
1291 initial_state
->low
.vddci
,
1292 &table
->initialState
.levels
[0].vddci
);
1294 cypress_populate_initial_mvdd_value(rdev
,
1295 &table
->initialState
.levels
[0].mvdd
);
1297 a_t
= CG_R(0xffff) | CG_L(0);
1298 table
->initialState
.levels
[0].aT
= cpu_to_be32(a_t
);
1300 table
->initialState
.levels
[0].bSP
= cpu_to_be32(pi
->dsp
);
1303 if (pi
->boot_in_gen2
)
1304 table
->initialState
.levels
[0].gen2PCIE
= 1;
1306 table
->initialState
.levels
[0].gen2PCIE
= 0;
1307 if (initial_state
->low
.flags
& ATOM_PPLIB_R600_FLAGS_PCIEGEN2
)
1308 table
->initialState
.levels
[0].gen2XSP
= 1;
1310 table
->initialState
.levels
[0].gen2XSP
= 0;
1312 if (pi
->mem_gddr5
) {
1313 table
->initialState
.levels
[0].strobeMode
=
1314 cypress_get_strobe_mode_settings(rdev
,
1315 initial_state
->low
.mclk
);
1317 if (initial_state
->low
.mclk
> pi
->mclk_edc_enable_threshold
)
1318 table
->initialState
.levels
[0].mcFlags
= SMC_MC_EDC_RD_FLAG
| SMC_MC_EDC_WR_FLAG
;
1320 table
->initialState
.levels
[0].mcFlags
= 0;
1323 table
->initialState
.levels
[1] = table
->initialState
.levels
[0];
1324 table
->initialState
.levels
[2] = table
->initialState
.levels
[0];
1326 table
->initialState
.flags
|= PPSMC_SWSTATE_FLAG_DC
;
1331 int cypress_populate_smc_acpi_state(struct radeon_device
*rdev
,
1332 RV770_SMC_STATETABLE
*table
)
1334 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1335 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1336 u32 mpll_ad_func_cntl
=
1337 pi
->clk_regs
.rv770
.mpll_ad_func_cntl
;
1338 u32 mpll_ad_func_cntl_2
=
1339 pi
->clk_regs
.rv770
.mpll_ad_func_cntl_2
;
1340 u32 mpll_dq_func_cntl
=
1341 pi
->clk_regs
.rv770
.mpll_dq_func_cntl
;
1342 u32 mpll_dq_func_cntl_2
=
1343 pi
->clk_regs
.rv770
.mpll_dq_func_cntl_2
;
1344 u32 spll_func_cntl
=
1345 pi
->clk_regs
.rv770
.cg_spll_func_cntl
;
1346 u32 spll_func_cntl_2
=
1347 pi
->clk_regs
.rv770
.cg_spll_func_cntl_2
;
1348 u32 spll_func_cntl_3
=
1349 pi
->clk_regs
.rv770
.cg_spll_func_cntl_3
;
1350 u32 mclk_pwrmgt_cntl
=
1351 pi
->clk_regs
.rv770
.mclk_pwrmgt_cntl
;
1353 pi
->clk_regs
.rv770
.dll_cntl
;
1355 table
->ACPIState
= table
->initialState
;
1357 table
->ACPIState
.flags
&= ~PPSMC_SWSTATE_FLAG_DC
;
1359 if (pi
->acpi_vddc
) {
1360 cypress_populate_voltage_value(rdev
,
1361 &eg_pi
->vddc_voltage_table
,
1363 &table
->ACPIState
.levels
[0].vddc
);
1364 if (pi
->pcie_gen2
) {
1365 if (pi
->acpi_pcie_gen2
)
1366 table
->ACPIState
.levels
[0].gen2PCIE
= 1;
1368 table
->ACPIState
.levels
[0].gen2PCIE
= 0;
1370 table
->ACPIState
.levels
[0].gen2PCIE
= 0;
1371 if (pi
->acpi_pcie_gen2
)
1372 table
->ACPIState
.levels
[0].gen2XSP
= 1;
1374 table
->ACPIState
.levels
[0].gen2XSP
= 0;
1376 cypress_populate_voltage_value(rdev
,
1377 &eg_pi
->vddc_voltage_table
,
1378 pi
->min_vddc_in_table
,
1379 &table
->ACPIState
.levels
[0].vddc
);
1380 table
->ACPIState
.levels
[0].gen2PCIE
= 0;
1383 if (eg_pi
->acpi_vddci
) {
1384 if (eg_pi
->vddci_control
) {
1385 cypress_populate_voltage_value(rdev
,
1386 &eg_pi
->vddci_voltage_table
,
1388 &table
->ACPIState
.levels
[0].vddci
);
1392 mpll_ad_func_cntl
&= ~PDNB
;
1394 mpll_ad_func_cntl_2
|= BIAS_GEN_PDNB
| RESET_EN
;
1397 mpll_dq_func_cntl
&= ~PDNB
;
1398 mpll_dq_func_cntl_2
|= BIAS_GEN_PDNB
| RESET_EN
| BYPASS
;
1400 mclk_pwrmgt_cntl
|= (MRDCKA0_RESET
|
1409 mclk_pwrmgt_cntl
&= ~(MRDCKA0_PDNB
|
1418 dll_cntl
|= (MRDCKA0_BYPASS
|
1427 /* evergreen only */
1428 if (rdev
->family
<= CHIP_HEMLOCK
)
1429 spll_func_cntl
|= SPLL_RESET
| SPLL_SLEEP
| SPLL_BYPASS_EN
;
1431 spll_func_cntl_2
&= ~SCLK_MUX_SEL_MASK
;
1432 spll_func_cntl_2
|= SCLK_MUX_SEL(4);
1434 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMPLL_AD_FUNC_CNTL
=
1435 cpu_to_be32(mpll_ad_func_cntl
);
1436 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMPLL_AD_FUNC_CNTL_2
=
1437 cpu_to_be32(mpll_ad_func_cntl_2
);
1438 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMPLL_DQ_FUNC_CNTL
=
1439 cpu_to_be32(mpll_dq_func_cntl
);
1440 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMPLL_DQ_FUNC_CNTL_2
=
1441 cpu_to_be32(mpll_dq_func_cntl_2
);
1442 table
->ACPIState
.levels
[0].mclk
.mclk770
.vMCLK_PWRMGT_CNTL
=
1443 cpu_to_be32(mclk_pwrmgt_cntl
);
1444 table
->ACPIState
.levels
[0].mclk
.mclk770
.vDLL_CNTL
= cpu_to_be32(dll_cntl
);
1446 table
->ACPIState
.levels
[0].mclk
.mclk770
.mclk_value
= 0;
1448 table
->ACPIState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL
=
1449 cpu_to_be32(spll_func_cntl
);
1450 table
->ACPIState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL_2
=
1451 cpu_to_be32(spll_func_cntl_2
);
1452 table
->ACPIState
.levels
[0].sclk
.vCG_SPLL_FUNC_CNTL_3
=
1453 cpu_to_be32(spll_func_cntl_3
);
1455 table
->ACPIState
.levels
[0].sclk
.sclk_value
= 0;
1457 cypress_populate_mvdd_value(rdev
, 0, &table
->ACPIState
.levels
[0].mvdd
);
1459 if (eg_pi
->dynamic_ac_timing
)
1460 table
->ACPIState
.levels
[0].ACIndex
= 1;
1462 table
->ACPIState
.levels
[1] = table
->ACPIState
.levels
[0];
1463 table
->ACPIState
.levels
[2] = table
->ACPIState
.levels
[0];
1468 static void cypress_trim_voltage_table_to_fit_state_table(struct radeon_device
*rdev
,
1469 struct atom_voltage_table
*voltage_table
)
1471 unsigned int i
, diff
;
1473 if (voltage_table
->count
<= MAX_NO_VREG_STEPS
)
1476 diff
= voltage_table
->count
- MAX_NO_VREG_STEPS
;
1478 for (i
= 0; i
< MAX_NO_VREG_STEPS
; i
++)
1479 voltage_table
->entries
[i
] = voltage_table
->entries
[i
+ diff
];
1481 voltage_table
->count
= MAX_NO_VREG_STEPS
;
1484 int cypress_construct_voltage_tables(struct radeon_device
*rdev
)
1486 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1489 ret
= radeon_atom_get_voltage_table(rdev
, SET_VOLTAGE_TYPE_ASIC_VDDC
, 0,
1490 &eg_pi
->vddc_voltage_table
);
1494 if (eg_pi
->vddc_voltage_table
.count
> MAX_NO_VREG_STEPS
)
1495 cypress_trim_voltage_table_to_fit_state_table(rdev
,
1496 &eg_pi
->vddc_voltage_table
);
1498 if (eg_pi
->vddci_control
) {
1499 ret
= radeon_atom_get_voltage_table(rdev
, SET_VOLTAGE_TYPE_ASIC_VDDCI
, 0,
1500 &eg_pi
->vddci_voltage_table
);
1504 if (eg_pi
->vddci_voltage_table
.count
> MAX_NO_VREG_STEPS
)
1505 cypress_trim_voltage_table_to_fit_state_table(rdev
,
1506 &eg_pi
->vddci_voltage_table
);
1512 static void cypress_populate_smc_voltage_table(struct radeon_device
*rdev
,
1513 struct atom_voltage_table
*voltage_table
,
1514 RV770_SMC_STATETABLE
*table
)
1518 for (i
= 0; i
< voltage_table
->count
; i
++) {
1519 table
->highSMIO
[i
] = 0;
1520 table
->lowSMIO
[i
] |= cpu_to_be32(voltage_table
->entries
[i
].smio_low
);
1524 int cypress_populate_smc_voltage_tables(struct radeon_device
*rdev
,
1525 RV770_SMC_STATETABLE
*table
)
1527 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1528 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1531 if (eg_pi
->vddc_voltage_table
.count
) {
1532 cypress_populate_smc_voltage_table(rdev
,
1533 &eg_pi
->vddc_voltage_table
,
1536 table
->voltageMaskTable
.highMask
[RV770_SMC_VOLTAGEMASK_VDDC
] = 0;
1537 table
->voltageMaskTable
.lowMask
[RV770_SMC_VOLTAGEMASK_VDDC
] =
1538 cpu_to_be32(eg_pi
->vddc_voltage_table
.mask_low
);
1540 for (i
= 0; i
< eg_pi
->vddc_voltage_table
.count
; i
++) {
1541 if (pi
->max_vddc_in_table
<=
1542 eg_pi
->vddc_voltage_table
.entries
[i
].value
) {
1543 table
->maxVDDCIndexInPPTable
= i
;
1549 if (eg_pi
->vddci_voltage_table
.count
) {
1550 cypress_populate_smc_voltage_table(rdev
,
1551 &eg_pi
->vddci_voltage_table
,
1554 table
->voltageMaskTable
.highMask
[RV770_SMC_VOLTAGEMASK_VDDCI
] = 0;
1555 table
->voltageMaskTable
.lowMask
[RV770_SMC_VOLTAGEMASK_VDDCI
] =
1556 cpu_to_be32(eg_pi
->vddci_voltage_table
.mask_low
);
1562 static u32
cypress_get_mclk_split_point(struct atom_memory_info
*memory_info
)
1564 if ((memory_info
->mem_type
== MEM_TYPE_GDDR3
) ||
1565 (memory_info
->mem_type
== MEM_TYPE_DDR3
))
1571 int cypress_get_mvdd_configuration(struct radeon_device
*rdev
)
1573 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1574 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1576 struct atom_memory_info memory_info
;
1577 u32 tmp
= RREG32(GENERAL_PWRMGT
);
1579 if (!(tmp
& BACKBIAS_PAD_EN
)) {
1580 eg_pi
->mvdd_high_index
= 0;
1581 eg_pi
->mvdd_low_index
= 1;
1582 pi
->mvdd_control
= false;
1586 if (tmp
& BACKBIAS_VALUE
)
1587 eg_pi
->mvdd_high_index
= 1;
1589 eg_pi
->mvdd_high_index
= 0;
1591 eg_pi
->mvdd_low_index
=
1592 (eg_pi
->mvdd_high_index
== 0) ? 1 : 0;
1594 module_index
= rv770_get_memory_module_index(rdev
);
1596 if (radeon_atom_get_memory_info(rdev
, module_index
, &memory_info
)) {
1597 pi
->mvdd_control
= false;
1601 pi
->mvdd_split_frequency
=
1602 cypress_get_mclk_split_point(&memory_info
);
1604 if (pi
->mvdd_split_frequency
== 0) {
1605 pi
->mvdd_control
= false;
1612 static int cypress_init_smc_table(struct radeon_device
*rdev
,
1613 struct radeon_ps
*radeon_boot_state
)
1615 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1616 RV770_SMC_STATETABLE
*table
= &pi
->smc_statetable
;
1619 memset(table
, 0, sizeof(RV770_SMC_STATETABLE
));
1621 cypress_populate_smc_voltage_tables(rdev
, table
);
1623 switch (rdev
->pm
.int_thermal_type
) {
1624 case THERMAL_TYPE_EVERGREEN
:
1625 case THERMAL_TYPE_EMC2103_WITH_INTERNAL
:
1626 table
->thermalProtectType
= PPSMC_THERMAL_PROTECT_TYPE_INTERNAL
;
1628 case THERMAL_TYPE_NONE
:
1629 table
->thermalProtectType
= PPSMC_THERMAL_PROTECT_TYPE_NONE
;
1632 table
->thermalProtectType
= PPSMC_THERMAL_PROTECT_TYPE_EXTERNAL
;
1636 if (rdev
->pm
.dpm
.platform_caps
& ATOM_PP_PLATFORM_CAP_HARDWAREDC
)
1637 table
->systemFlags
|= PPSMC_SYSTEMFLAG_GPIO_DC
;
1639 if (rdev
->pm
.dpm
.platform_caps
& ATOM_PP_PLATFORM_CAP_REGULATOR_HOT
)
1640 table
->systemFlags
|= PPSMC_SYSTEMFLAG_REGULATOR_HOT
;
1642 if (rdev
->pm
.dpm
.platform_caps
& ATOM_PP_PLATFORM_CAP_STEPVDDC
)
1643 table
->systemFlags
|= PPSMC_SYSTEMFLAG_STEPVDDC
;
1646 table
->systemFlags
|= PPSMC_SYSTEMFLAG_GDDR5
;
1648 ret
= cypress_populate_smc_initial_state(rdev
, radeon_boot_state
, table
);
1652 ret
= cypress_populate_smc_acpi_state(rdev
, table
);
1656 table
->driverState
= table
->initialState
;
1658 return rv770_copy_bytes_to_smc(rdev
,
1659 pi
->state_table_start
,
1660 (u8
*)table
, sizeof(RV770_SMC_STATETABLE
),
1664 int cypress_populate_mc_reg_table(struct radeon_device
*rdev
,
1665 struct radeon_ps
*radeon_boot_state
)
1667 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1668 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1669 struct rv7xx_ps
*boot_state
= rv770_get_ps(radeon_boot_state
);
1670 SMC_Evergreen_MCRegisters mc_reg_table
= { 0 };
1672 rv770_write_smc_soft_register(rdev
,
1673 RV770_SMC_SOFT_REGISTER_seq_index
, 1);
1675 cypress_populate_mc_reg_addresses(rdev
, &mc_reg_table
);
1677 cypress_convert_mc_reg_table_entry_to_smc(rdev
,
1679 &mc_reg_table
.data
[0]);
1681 cypress_convert_mc_registers(&eg_pi
->mc_reg_table
.mc_reg_table_entry
[0],
1682 &mc_reg_table
.data
[1], eg_pi
->mc_reg_table
.last
,
1683 eg_pi
->mc_reg_table
.valid_flag
);
1685 cypress_convert_mc_reg_table_to_smc(rdev
, radeon_boot_state
, &mc_reg_table
);
1687 return rv770_copy_bytes_to_smc(rdev
, eg_pi
->mc_reg_table_start
,
1688 (u8
*)&mc_reg_table
, sizeof(SMC_Evergreen_MCRegisters
),
1692 int cypress_get_table_locations(struct radeon_device
*rdev
)
1694 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1695 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1699 ret
= rv770_read_smc_sram_dword(rdev
,
1700 EVERGREEN_SMC_FIRMWARE_HEADER_LOCATION
+
1701 EVERGREEN_SMC_FIRMWARE_HEADER_stateTable
,
1702 &tmp
, pi
->sram_end
);
1706 pi
->state_table_start
= (u16
)tmp
;
1708 ret
= rv770_read_smc_sram_dword(rdev
,
1709 EVERGREEN_SMC_FIRMWARE_HEADER_LOCATION
+
1710 EVERGREEN_SMC_FIRMWARE_HEADER_softRegisters
,
1711 &tmp
, pi
->sram_end
);
1715 pi
->soft_regs_start
= (u16
)tmp
;
1717 ret
= rv770_read_smc_sram_dword(rdev
,
1718 EVERGREEN_SMC_FIRMWARE_HEADER_LOCATION
+
1719 EVERGREEN_SMC_FIRMWARE_HEADER_mcRegisterTable
,
1720 &tmp
, pi
->sram_end
);
1724 eg_pi
->mc_reg_table_start
= (u16
)tmp
;
1729 void cypress_enable_display_gap(struct radeon_device
*rdev
)
1731 u32 tmp
= RREG32(CG_DISPLAY_GAP_CNTL
);
1733 tmp
&= ~(DISP1_GAP_MASK
| DISP2_GAP_MASK
);
1734 tmp
|= (DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE
) |
1735 DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE
));
1737 tmp
&= ~(DISP1_GAP_MCHG_MASK
| DISP2_GAP_MCHG_MASK
);
1738 tmp
|= (DISP1_GAP_MCHG(R600_PM_DISPLAY_GAP_VBLANK
) |
1739 DISP2_GAP_MCHG(R600_PM_DISPLAY_GAP_IGNORE
));
1740 WREG32(CG_DISPLAY_GAP_CNTL
, tmp
);
1743 static void cypress_program_display_gap(struct radeon_device
*rdev
)
1748 tmp
= RREG32(CG_DISPLAY_GAP_CNTL
) & ~(DISP1_GAP_MASK
| DISP2_GAP_MASK
);
1749 if (rdev
->pm
.dpm
.new_active_crtc_count
> 0)
1750 tmp
|= DISP1_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM
);
1752 tmp
|= DISP1_GAP(R600_PM_DISPLAY_GAP_IGNORE
);
1754 if (rdev
->pm
.dpm
.new_active_crtc_count
> 1)
1755 tmp
|= DISP2_GAP(R600_PM_DISPLAY_GAP_VBLANK_OR_WM
);
1757 tmp
|= DISP2_GAP(R600_PM_DISPLAY_GAP_IGNORE
);
1759 WREG32(CG_DISPLAY_GAP_CNTL
, tmp
);
1761 tmp
= RREG32(DCCG_DISP_SLOW_SELECT_REG
);
1762 pipe
= (tmp
& DCCG_DISP1_SLOW_SELECT_MASK
) >> DCCG_DISP1_SLOW_SELECT_SHIFT
;
1764 if ((rdev
->pm
.dpm
.new_active_crtc_count
> 0) &&
1765 (!(rdev
->pm
.dpm
.new_active_crtcs
& (1 << pipe
)))) {
1766 /* find the first active crtc */
1767 for (i
= 0; i
< rdev
->num_crtc
; i
++) {
1768 if (rdev
->pm
.dpm
.new_active_crtcs
& (1 << i
))
1771 if (i
== rdev
->num_crtc
)
1776 tmp
&= ~DCCG_DISP1_SLOW_SELECT_MASK
;
1777 tmp
|= DCCG_DISP1_SLOW_SELECT(pipe
);
1778 WREG32(DCCG_DISP_SLOW_SELECT_REG
, tmp
);
1781 cypress_notify_smc_display_change(rdev
, rdev
->pm
.dpm
.new_active_crtc_count
> 0);
1784 void cypress_dpm_setup_asic(struct radeon_device
*rdev
)
1786 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1788 rv740_read_clock_registers(rdev
);
1789 rv770_read_voltage_smio_registers(rdev
);
1790 rv770_get_max_vddc(rdev
);
1791 rv770_get_memory_type(rdev
);
1793 if (eg_pi
->pcie_performance_request
)
1794 eg_pi
->pcie_performance_request_registered
= false;
1796 if (eg_pi
->pcie_performance_request
)
1797 cypress_advertise_gen2_capability(rdev
);
1799 rv770_get_pcie_gen2_status(rdev
);
1801 rv770_enable_acpi_pm(rdev
);
1804 int cypress_dpm_enable(struct radeon_device
*rdev
)
1806 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1807 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1808 struct radeon_ps
*boot_ps
= rdev
->pm
.dpm
.boot_ps
;
1811 if (pi
->gfx_clock_gating
)
1812 rv770_restore_cgcg(rdev
);
1814 if (rv770_dpm_enabled(rdev
))
1817 if (pi
->voltage_control
) {
1818 rv770_enable_voltage_control(rdev
, true);
1819 ret
= cypress_construct_voltage_tables(rdev
);
1821 DRM_ERROR("cypress_construct_voltage_tables failed\n");
1826 if (pi
->mvdd_control
) {
1827 ret
= cypress_get_mvdd_configuration(rdev
);
1829 DRM_ERROR("cypress_get_mvdd_configuration failed\n");
1834 if (eg_pi
->dynamic_ac_timing
) {
1835 cypress_set_mc_reg_address_table(rdev
);
1836 cypress_force_mc_use_s0(rdev
, boot_ps
);
1837 ret
= cypress_initialize_mc_reg_table(rdev
);
1839 eg_pi
->dynamic_ac_timing
= false;
1840 cypress_force_mc_use_s1(rdev
, boot_ps
);
1843 if (rdev
->pm
.dpm
.platform_caps
& ATOM_PP_PLATFORM_CAP_BACKBIAS
)
1844 rv770_enable_backbias(rdev
, true);
1847 cypress_enable_spread_spectrum(rdev
, true);
1849 if (pi
->thermal_protection
)
1850 rv770_enable_thermal_protection(rdev
, true);
1852 rv770_setup_bsp(rdev
);
1853 rv770_program_git(rdev
);
1854 rv770_program_tp(rdev
);
1855 rv770_program_tpp(rdev
);
1856 rv770_program_sstp(rdev
);
1857 rv770_program_engine_speed_parameters(rdev
);
1858 cypress_enable_display_gap(rdev
);
1859 rv770_program_vc(rdev
);
1861 if (pi
->dynamic_pcie_gen2
)
1862 cypress_enable_dynamic_pcie_gen2(rdev
, true);
1864 ret
= rv770_upload_firmware(rdev
);
1866 DRM_ERROR("rv770_upload_firmware failed\n");
1870 ret
= cypress_get_table_locations(rdev
);
1872 DRM_ERROR("cypress_get_table_locations failed\n");
1875 ret
= cypress_init_smc_table(rdev
, boot_ps
);
1877 DRM_ERROR("cypress_init_smc_table failed\n");
1880 if (eg_pi
->dynamic_ac_timing
) {
1881 ret
= cypress_populate_mc_reg_table(rdev
, boot_ps
);
1883 DRM_ERROR("cypress_populate_mc_reg_table failed\n");
1888 cypress_program_response_times(rdev
);
1890 r7xx_start_smc(rdev
);
1892 ret
= cypress_notify_smc_display_change(rdev
, false);
1894 DRM_ERROR("cypress_notify_smc_display_change failed\n");
1897 cypress_enable_sclk_control(rdev
, true);
1899 if (eg_pi
->memory_transition
)
1900 cypress_enable_mclk_control(rdev
, true);
1902 cypress_start_dpm(rdev
);
1904 if (pi
->gfx_clock_gating
)
1905 cypress_gfx_clock_gating_enable(rdev
, true);
1907 if (pi
->mg_clock_gating
)
1908 cypress_mg_clock_gating_enable(rdev
, true);
1910 rv770_enable_auto_throttle_source(rdev
, RADEON_DPM_AUTO_THROTTLE_SRC_THERMAL
, true);
1915 void cypress_dpm_disable(struct radeon_device
*rdev
)
1917 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
1918 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1919 struct radeon_ps
*boot_ps
= rdev
->pm
.dpm
.boot_ps
;
1921 if (!rv770_dpm_enabled(rdev
))
1924 rv770_clear_vc(rdev
);
1926 if (pi
->thermal_protection
)
1927 rv770_enable_thermal_protection(rdev
, false);
1929 if (pi
->dynamic_pcie_gen2
)
1930 cypress_enable_dynamic_pcie_gen2(rdev
, false);
1932 if (rdev
->irq
.installed
&&
1933 r600_is_internal_thermal_sensor(rdev
->pm
.int_thermal_type
)) {
1934 rdev
->irq
.dpm_thermal
= false;
1935 radeon_irq_set(rdev
);
1938 if (pi
->gfx_clock_gating
)
1939 cypress_gfx_clock_gating_enable(rdev
, false);
1941 if (pi
->mg_clock_gating
)
1942 cypress_mg_clock_gating_enable(rdev
, false);
1944 rv770_stop_dpm(rdev
);
1945 r7xx_stop_smc(rdev
);
1947 cypress_enable_spread_spectrum(rdev
, false);
1949 if (eg_pi
->dynamic_ac_timing
)
1950 cypress_force_mc_use_s1(rdev
, boot_ps
);
1952 rv770_reset_smio_status(rdev
);
1955 int cypress_dpm_set_power_state(struct radeon_device
*rdev
)
1957 struct evergreen_power_info
*eg_pi
= evergreen_get_pi(rdev
);
1958 struct radeon_ps
*new_ps
= rdev
->pm
.dpm
.requested_ps
;
1959 struct radeon_ps
*old_ps
= rdev
->pm
.dpm
.current_ps
;
1962 ret
= rv770_restrict_performance_levels_before_switch(rdev
);
1964 DRM_ERROR("rv770_restrict_performance_levels_before_switch failed\n");
1967 if (eg_pi
->pcie_performance_request
)
1968 cypress_notify_link_speed_change_before_state_change(rdev
, new_ps
, old_ps
);
1970 rv770_set_uvd_clock_before_set_eng_clock(rdev
, new_ps
, old_ps
);
1971 ret
= rv770_halt_smc(rdev
);
1973 DRM_ERROR("rv770_halt_smc failed\n");
1976 ret
= cypress_upload_sw_state(rdev
, new_ps
);
1978 DRM_ERROR("cypress_upload_sw_state failed\n");
1981 if (eg_pi
->dynamic_ac_timing
) {
1982 ret
= cypress_upload_mc_reg_table(rdev
, new_ps
);
1984 DRM_ERROR("cypress_upload_mc_reg_table failed\n");
1989 cypress_program_memory_timing_parameters(rdev
, new_ps
);
1991 ret
= rv770_resume_smc(rdev
);
1993 DRM_ERROR("rv770_resume_smc failed\n");
1996 ret
= rv770_set_sw_state(rdev
);
1998 DRM_ERROR("rv770_set_sw_state failed\n");
2001 rv770_set_uvd_clock_after_set_eng_clock(rdev
, new_ps
, old_ps
);
2003 if (eg_pi
->pcie_performance_request
)
2004 cypress_notify_link_speed_change_after_state_change(rdev
, new_ps
, old_ps
);
2010 void cypress_dpm_reset_asic(struct radeon_device
*rdev
)
2012 rv770_restrict_performance_levels_before_switch(rdev
);
2013 rv770_set_boot_state(rdev
);
2017 void cypress_dpm_display_configuration_changed(struct radeon_device
*rdev
)
2019 cypress_program_display_gap(rdev
);
2022 int cypress_dpm_init(struct radeon_device
*rdev
)
2024 struct rv7xx_power_info
*pi
;
2025 struct evergreen_power_info
*eg_pi
;
2026 struct atom_clock_dividers dividers
;
2029 eg_pi
= kzalloc(sizeof(struct evergreen_power_info
), GFP_KERNEL
);
2032 rdev
->pm
.dpm
.priv
= eg_pi
;
2035 rv770_get_max_vddc(rdev
);
2037 eg_pi
->ulv
.supported
= false;
2039 eg_pi
->acpi_vddci
= 0;
2040 pi
->min_vddc_in_table
= 0;
2041 pi
->max_vddc_in_table
= 0;
2043 ret
= r600_get_platform_caps(rdev
);
2047 ret
= rv7xx_parse_power_table(rdev
);
2051 if (rdev
->pm
.dpm
.voltage_response_time
== 0)
2052 rdev
->pm
.dpm
.voltage_response_time
= R600_VOLTAGERESPONSETIME_DFLT
;
2053 if (rdev
->pm
.dpm
.backbias_response_time
== 0)
2054 rdev
->pm
.dpm
.backbias_response_time
= R600_BACKBIASRESPONSETIME_DFLT
;
2056 ret
= radeon_atom_get_clock_dividers(rdev
, COMPUTE_ENGINE_PLL_PARAM
,
2057 0, false, ÷rs
);
2059 pi
->ref_div
= dividers
.ref_div
+ 1;
2061 pi
->ref_div
= R600_REFERENCEDIVIDER_DFLT
;
2063 pi
->mclk_strobe_mode_threshold
= 40000;
2064 pi
->mclk_edc_enable_threshold
= 40000;
2065 eg_pi
->mclk_edc_wr_enable_threshold
= 40000;
2067 pi
->rlp
= RV770_RLP_DFLT
;
2068 pi
->rmp
= RV770_RMP_DFLT
;
2069 pi
->lhp
= RV770_LHP_DFLT
;
2070 pi
->lmp
= RV770_LMP_DFLT
;
2072 pi
->voltage_control
=
2073 radeon_atom_is_voltage_gpio(rdev
, SET_VOLTAGE_TYPE_ASIC_VDDC
, 0);
2076 radeon_atom_is_voltage_gpio(rdev
, SET_VOLTAGE_TYPE_ASIC_MVDDC
, 0);
2078 eg_pi
->vddci_control
=
2079 radeon_atom_is_voltage_gpio(rdev
, SET_VOLTAGE_TYPE_ASIC_VDDCI
, 0);
2081 rv770_get_engine_memory_ss(rdev
);
2083 pi
->asi
= RV770_ASI_DFLT
;
2084 pi
->pasi
= CYPRESS_HASI_DFLT
;
2085 pi
->vrc
= CYPRESS_VRC_DFLT
;
2087 pi
->power_gating
= false;
2089 if ((rdev
->family
== CHIP_CYPRESS
) ||
2090 (rdev
->family
== CHIP_HEMLOCK
))
2091 pi
->gfx_clock_gating
= false;
2093 pi
->gfx_clock_gating
= true;
2095 pi
->mg_clock_gating
= true;
2096 pi
->mgcgtssm
= true;
2097 eg_pi
->ls_clock_gating
= false;
2098 eg_pi
->sclk_deep_sleep
= false;
2100 pi
->dynamic_pcie_gen2
= true;
2102 if (rdev
->pm
.int_thermal_type
!= THERMAL_TYPE_NONE
)
2103 pi
->thermal_protection
= true;
2105 pi
->thermal_protection
= false;
2107 pi
->display_gap
= true;
2109 if (rdev
->flags
& RADEON_IS_MOBILITY
)
2116 eg_pi
->dynamic_ac_timing
= true;
2119 eg_pi
->light_sleep
= true;
2120 eg_pi
->memory_transition
= true;
2121 #if defined(CONFIG_ACPI)
2122 eg_pi
->pcie_performance_request
=
2123 radeon_acpi_is_pcie_performance_request_supported(rdev
);
2125 eg_pi
->pcie_performance_request
= false;
2128 if ((rdev
->family
== CHIP_CYPRESS
) ||
2129 (rdev
->family
== CHIP_HEMLOCK
) ||
2130 (rdev
->family
== CHIP_JUNIPER
))
2131 eg_pi
->dll_default_on
= true;
2133 eg_pi
->dll_default_on
= false;
2135 eg_pi
->sclk_deep_sleep
= false;
2136 pi
->mclk_stutter_mode_threshold
= 0;
2138 pi
->sram_end
= SMC_RAM_END
;
2143 void cypress_dpm_fini(struct radeon_device
*rdev
)
2147 for (i
= 0; i
< rdev
->pm
.dpm
.num_ps
; i
++) {
2148 kfree(rdev
->pm
.dpm
.ps
[i
].ps_priv
);
2150 kfree(rdev
->pm
.dpm
.ps
);
2151 kfree(rdev
->pm
.dpm
.priv
);
2154 bool cypress_dpm_vblank_too_short(struct radeon_device
*rdev
)
2156 struct rv7xx_power_info
*pi
= rv770_get_pi(rdev
);
2157 u32 vblank_time
= r600_dpm_get_vblank_time(rdev
);
2158 /* we never hit the non-gddr5 limit so disable it */
2159 u32 switch_limit
= pi
->mem_gddr5
? 450 : 0;
2161 if (vblank_time
< switch_limit
)