2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the "Software"),
8 * to deal in the Software without restriction, including without limitation
9 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10 * and/or sell copies of the Software, and to permit persons to whom the
11 * Software is furnished to do so, subject to the following conditions:
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
22 * OTHER DEALINGS IN THE SOFTWARE.
24 * Authors: Dave Airlie
29 #include "radeon_drm.h"
30 #include "radeon_reg.h"
35 uint32_t radeon_legacy_get_engine_clock(struct radeon_device
*rdev
)
37 struct radeon_pll
*spll
= &rdev
->clock
.spll
;
38 uint32_t fb_div
, ref_div
, post_div
, sclk
;
40 fb_div
= RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
);
41 fb_div
= (fb_div
>> RADEON_SPLL_FB_DIV_SHIFT
) & RADEON_SPLL_FB_DIV_MASK
;
43 fb_div
*= spll
->reference_freq
;
46 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
) & RADEON_M_SPLL_REF_DIV_MASK
;
51 sclk
= fb_div
/ ref_div
;
53 post_div
= RREG32_PLL(RADEON_SCLK_CNTL
) & RADEON_SCLK_SRC_SEL_MASK
;
56 else if (post_div
== 3)
58 else if (post_div
== 4)
65 uint32_t radeon_legacy_get_memory_clock(struct radeon_device
*rdev
)
67 struct radeon_pll
*mpll
= &rdev
->clock
.mpll
;
68 uint32_t fb_div
, ref_div
, post_div
, mclk
;
70 fb_div
= RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
);
71 fb_div
= (fb_div
>> RADEON_MPLL_FB_DIV_SHIFT
) & RADEON_MPLL_FB_DIV_MASK
;
73 fb_div
*= mpll
->reference_freq
;
76 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
) & RADEON_M_SPLL_REF_DIV_MASK
;
81 mclk
= fb_div
/ ref_div
;
83 post_div
= RREG32_PLL(RADEON_MCLK_CNTL
) & 0x7;
86 else if (post_div
== 3)
88 else if (post_div
== 4)
94 void radeon_get_clock_info(struct drm_device
*dev
)
96 struct radeon_device
*rdev
= dev
->dev_private
;
97 struct radeon_pll
*p1pll
= &rdev
->clock
.p1pll
;
98 struct radeon_pll
*p2pll
= &rdev
->clock
.p2pll
;
99 struct radeon_pll
*dcpll
= &rdev
->clock
.dcpll
;
100 struct radeon_pll
*spll
= &rdev
->clock
.spll
;
101 struct radeon_pll
*mpll
= &rdev
->clock
.mpll
;
104 if (rdev
->is_atom_bios
)
105 ret
= radeon_atom_get_clock_info(dev
);
107 ret
= radeon_combios_get_clock_info(dev
);
110 if (p1pll
->reference_div
< 2) {
111 if (!ASIC_IS_AVIVO(rdev
)) {
112 u32 tmp
= RREG32_PLL(RADEON_PPLL_REF_DIV
);
113 if (ASIC_IS_R300(rdev
))
114 p1pll
->reference_div
=
115 (tmp
& R300_PPLL_REF_DIV_ACC_MASK
) >> R300_PPLL_REF_DIV_ACC_SHIFT
;
117 p1pll
->reference_div
= tmp
& RADEON_PPLL_REF_DIV_MASK
;
118 if (p1pll
->reference_div
< 2)
119 p1pll
->reference_div
= 12;
121 p1pll
->reference_div
= 12;
123 if (p2pll
->reference_div
< 2)
124 p2pll
->reference_div
= 12;
125 if (rdev
->family
< CHIP_RS600
) {
126 if (spll
->reference_div
< 2)
127 spll
->reference_div
=
128 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
) &
129 RADEON_M_SPLL_REF_DIV_MASK
;
131 if (mpll
->reference_div
< 2)
132 mpll
->reference_div
= spll
->reference_div
;
134 if (ASIC_IS_AVIVO(rdev
)) {
137 DRM_INFO("Using generic clock info\n");
139 if (rdev
->flags
& RADEON_IS_IGP
) {
140 p1pll
->reference_freq
= 1432;
141 p2pll
->reference_freq
= 1432;
142 spll
->reference_freq
= 1432;
143 mpll
->reference_freq
= 1432;
145 p1pll
->reference_freq
= 2700;
146 p2pll
->reference_freq
= 2700;
147 spll
->reference_freq
= 2700;
148 mpll
->reference_freq
= 2700;
150 p1pll
->reference_div
=
151 RREG32_PLL(RADEON_PPLL_REF_DIV
) & 0x3ff;
152 if (p1pll
->reference_div
< 2)
153 p1pll
->reference_div
= 12;
154 p2pll
->reference_div
= p1pll
->reference_div
;
156 if (rdev
->family
>= CHIP_R420
) {
157 p1pll
->pll_in_min
= 100;
158 p1pll
->pll_in_max
= 1350;
159 p1pll
->pll_out_min
= 20000;
160 p1pll
->pll_out_max
= 50000;
161 p2pll
->pll_in_min
= 100;
162 p2pll
->pll_in_max
= 1350;
163 p2pll
->pll_out_min
= 20000;
164 p2pll
->pll_out_max
= 50000;
166 p1pll
->pll_in_min
= 40;
167 p1pll
->pll_in_max
= 500;
168 p1pll
->pll_out_min
= 12500;
169 p1pll
->pll_out_max
= 35000;
170 p2pll
->pll_in_min
= 40;
171 p2pll
->pll_in_max
= 500;
172 p2pll
->pll_out_min
= 12500;
173 p2pll
->pll_out_max
= 35000;
176 spll
->reference_div
=
177 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
) &
178 RADEON_M_SPLL_REF_DIV_MASK
;
179 mpll
->reference_div
= spll
->reference_div
;
180 rdev
->clock
.default_sclk
=
181 radeon_legacy_get_engine_clock(rdev
);
182 rdev
->clock
.default_mclk
=
183 radeon_legacy_get_memory_clock(rdev
);
188 if (ASIC_IS_AVIVO(rdev
)) {
189 p1pll
->min_post_div
= 2;
190 p1pll
->max_post_div
= 0x7f;
191 p1pll
->min_frac_feedback_div
= 0;
192 p1pll
->max_frac_feedback_div
= 9;
193 p2pll
->min_post_div
= 2;
194 p2pll
->max_post_div
= 0x7f;
195 p2pll
->min_frac_feedback_div
= 0;
196 p2pll
->max_frac_feedback_div
= 9;
198 p1pll
->min_post_div
= 1;
199 p1pll
->max_post_div
= 16;
200 p1pll
->min_frac_feedback_div
= 0;
201 p1pll
->max_frac_feedback_div
= 0;
202 p2pll
->min_post_div
= 1;
203 p2pll
->max_post_div
= 12;
204 p2pll
->min_frac_feedback_div
= 0;
205 p2pll
->max_frac_feedback_div
= 0;
208 /* dcpll is DCE4 only */
209 dcpll
->min_post_div
= 2;
210 dcpll
->max_post_div
= 0x7f;
211 dcpll
->min_frac_feedback_div
= 0;
212 dcpll
->max_frac_feedback_div
= 9;
213 dcpll
->min_ref_div
= 2;
214 dcpll
->max_ref_div
= 0x3ff;
215 dcpll
->min_feedback_div
= 4;
216 dcpll
->max_feedback_div
= 0xfff;
219 p1pll
->min_ref_div
= 2;
220 p1pll
->max_ref_div
= 0x3ff;
221 p1pll
->min_feedback_div
= 4;
222 p1pll
->max_feedback_div
= 0x7ff;
225 p2pll
->min_ref_div
= 2;
226 p2pll
->max_ref_div
= 0x3ff;
227 p2pll
->min_feedback_div
= 4;
228 p2pll
->max_feedback_div
= 0x7ff;
232 spll
->min_post_div
= 1;
233 spll
->max_post_div
= 1;
234 spll
->min_ref_div
= 2;
235 spll
->max_ref_div
= 0xff;
236 spll
->min_feedback_div
= 4;
237 spll
->max_feedback_div
= 0xff;
241 mpll
->min_post_div
= 1;
242 mpll
->max_post_div
= 1;
243 mpll
->min_ref_div
= 2;
244 mpll
->max_ref_div
= 0xff;
245 mpll
->min_feedback_div
= 4;
246 mpll
->max_feedback_div
= 0xff;
252 static uint32_t calc_eng_mem_clock(struct radeon_device
*rdev
,
254 int *fb_div
, int *post_div
)
256 struct radeon_pll
*spll
= &rdev
->clock
.spll
;
257 int ref_div
= spll
->reference_div
;
261 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
) &
262 RADEON_M_SPLL_REF_DIV_MASK
;
264 if (req_clock
< 15000) {
267 } else if (req_clock
< 30000) {
270 } else if (req_clock
< 60000) {
276 req_clock
*= ref_div
;
277 req_clock
+= spll
->reference_freq
;
278 req_clock
/= (2 * spll
->reference_freq
);
280 *fb_div
= req_clock
& 0xff;
282 req_clock
= (req_clock
& 0xffff) << 1;
283 req_clock
*= spll
->reference_freq
;
284 req_clock
/= ref_div
;
285 req_clock
/= *post_div
;
291 void radeon_legacy_set_engine_clock(struct radeon_device
*rdev
,
295 int fb_div
, post_div
;
297 /* XXX: wait for idle */
299 eng_clock
= calc_eng_mem_clock(rdev
, eng_clock
, &fb_div
, &post_div
);
301 tmp
= RREG32_PLL(RADEON_CLK_PIN_CNTL
);
302 tmp
&= ~RADEON_DONT_USE_XTALIN
;
303 WREG32_PLL(RADEON_CLK_PIN_CNTL
, tmp
);
305 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
306 tmp
&= ~RADEON_SCLK_SRC_SEL_MASK
;
307 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
311 tmp
= RREG32_PLL(RADEON_SPLL_CNTL
);
312 tmp
|= RADEON_SPLL_SLEEP
;
313 WREG32_PLL(RADEON_SPLL_CNTL
, tmp
);
317 tmp
= RREG32_PLL(RADEON_SPLL_CNTL
);
318 tmp
|= RADEON_SPLL_RESET
;
319 WREG32_PLL(RADEON_SPLL_CNTL
, tmp
);
323 tmp
= RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
);
324 tmp
&= ~(RADEON_SPLL_FB_DIV_MASK
<< RADEON_SPLL_FB_DIV_SHIFT
);
325 tmp
|= (fb_div
& RADEON_SPLL_FB_DIV_MASK
) << RADEON_SPLL_FB_DIV_SHIFT
;
326 WREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
, tmp
);
328 /* XXX: verify on different asics */
329 tmp
= RREG32_PLL(RADEON_SPLL_CNTL
);
330 tmp
&= ~RADEON_SPLL_PVG_MASK
;
331 if ((eng_clock
* post_div
) >= 90000)
332 tmp
|= (0x7 << RADEON_SPLL_PVG_SHIFT
);
334 tmp
|= (0x4 << RADEON_SPLL_PVG_SHIFT
);
335 WREG32_PLL(RADEON_SPLL_CNTL
, tmp
);
337 tmp
= RREG32_PLL(RADEON_SPLL_CNTL
);
338 tmp
&= ~RADEON_SPLL_SLEEP
;
339 WREG32_PLL(RADEON_SPLL_CNTL
, tmp
);
343 tmp
= RREG32_PLL(RADEON_SPLL_CNTL
);
344 tmp
&= ~RADEON_SPLL_RESET
;
345 WREG32_PLL(RADEON_SPLL_CNTL
, tmp
);
349 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
350 tmp
&= ~RADEON_SCLK_SRC_SEL_MASK
;
366 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
370 tmp
= RREG32_PLL(RADEON_CLK_PIN_CNTL
);
371 tmp
|= RADEON_DONT_USE_XTALIN
;
372 WREG32_PLL(RADEON_CLK_PIN_CNTL
, tmp
);
377 void radeon_legacy_set_clock_gating(struct radeon_device
*rdev
, int enable
)
382 if (rdev
->flags
& RADEON_SINGLE_CRTC
) {
383 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
384 if ((RREG32(RADEON_CONFIG_CNTL
) &
385 RADEON_CFG_ATI_REV_ID_MASK
) >
386 RADEON_CFG_ATI_REV_A13
) {
388 ~(RADEON_SCLK_FORCE_CP
|
389 RADEON_SCLK_FORCE_RB
);
392 ~(RADEON_SCLK_FORCE_HDP
| RADEON_SCLK_FORCE_DISP1
|
393 RADEON_SCLK_FORCE_TOP
| RADEON_SCLK_FORCE_SE
|
394 RADEON_SCLK_FORCE_IDCT
| RADEON_SCLK_FORCE_RE
|
395 RADEON_SCLK_FORCE_PB
| RADEON_SCLK_FORCE_TAM
|
396 RADEON_SCLK_FORCE_TDM
);
397 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
398 } else if (ASIC_IS_R300(rdev
)) {
399 if ((rdev
->family
== CHIP_RS400
) ||
400 (rdev
->family
== CHIP_RS480
)) {
401 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
403 ~(RADEON_SCLK_FORCE_DISP2
|
404 RADEON_SCLK_FORCE_CP
|
405 RADEON_SCLK_FORCE_HDP
|
406 RADEON_SCLK_FORCE_DISP1
|
407 RADEON_SCLK_FORCE_TOP
|
408 RADEON_SCLK_FORCE_E2
| R300_SCLK_FORCE_VAP
409 | RADEON_SCLK_FORCE_IDCT
|
410 RADEON_SCLK_FORCE_VIP
| R300_SCLK_FORCE_SR
411 | R300_SCLK_FORCE_PX
| R300_SCLK_FORCE_TX
412 | R300_SCLK_FORCE_US
|
413 RADEON_SCLK_FORCE_TV_SCLK
|
415 RADEON_SCLK_FORCE_OV0
);
416 tmp
|= RADEON_DYN_STOP_LAT_MASK
;
418 RADEON_SCLK_FORCE_TOP
|
419 RADEON_SCLK_FORCE_VIP
;
420 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
422 tmp
= RREG32_PLL(RADEON_SCLK_MORE_CNTL
);
423 tmp
&= ~RADEON_SCLK_MORE_FORCEON
;
424 tmp
|= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT
;
425 WREG32_PLL(RADEON_SCLK_MORE_CNTL
, tmp
);
427 tmp
= RREG32_PLL(RADEON_VCLK_ECP_CNTL
);
428 tmp
|= (RADEON_PIXCLK_ALWAYS_ONb
|
429 RADEON_PIXCLK_DAC_ALWAYS_ONb
);
430 WREG32_PLL(RADEON_VCLK_ECP_CNTL
, tmp
);
432 tmp
= RREG32_PLL(RADEON_PIXCLKS_CNTL
);
433 tmp
|= (RADEON_PIX2CLK_ALWAYS_ONb
|
434 RADEON_PIX2CLK_DAC_ALWAYS_ONb
|
435 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb
|
436 R300_DVOCLK_ALWAYS_ONb
|
437 RADEON_PIXCLK_BLEND_ALWAYS_ONb
|
438 RADEON_PIXCLK_GV_ALWAYS_ONb
|
439 R300_PIXCLK_DVO_ALWAYS_ONb
|
440 RADEON_PIXCLK_LVDS_ALWAYS_ONb
|
441 RADEON_PIXCLK_TMDS_ALWAYS_ONb
|
442 R300_PIXCLK_TRANS_ALWAYS_ONb
|
443 R300_PIXCLK_TVO_ALWAYS_ONb
|
444 R300_P2G2CLK_ALWAYS_ONb
|
445 R300_P2G2CLK_DAC_ALWAYS_ONb
);
446 WREG32_PLL(RADEON_PIXCLKS_CNTL
, tmp
);
447 } else if (rdev
->family
>= CHIP_RV350
) {
448 tmp
= RREG32_PLL(R300_SCLK_CNTL2
);
449 tmp
&= ~(R300_SCLK_FORCE_TCL
|
451 R300_SCLK_FORCE_CBA
);
452 tmp
|= (R300_SCLK_TCL_MAX_DYN_STOP_LAT
|
453 R300_SCLK_GA_MAX_DYN_STOP_LAT
|
454 R300_SCLK_CBA_MAX_DYN_STOP_LAT
);
455 WREG32_PLL(R300_SCLK_CNTL2
, tmp
);
457 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
459 ~(RADEON_SCLK_FORCE_DISP2
|
460 RADEON_SCLK_FORCE_CP
|
461 RADEON_SCLK_FORCE_HDP
|
462 RADEON_SCLK_FORCE_DISP1
|
463 RADEON_SCLK_FORCE_TOP
|
464 RADEON_SCLK_FORCE_E2
| R300_SCLK_FORCE_VAP
465 | RADEON_SCLK_FORCE_IDCT
|
466 RADEON_SCLK_FORCE_VIP
| R300_SCLK_FORCE_SR
467 | R300_SCLK_FORCE_PX
| R300_SCLK_FORCE_TX
468 | R300_SCLK_FORCE_US
|
469 RADEON_SCLK_FORCE_TV_SCLK
|
471 RADEON_SCLK_FORCE_OV0
);
472 tmp
|= RADEON_DYN_STOP_LAT_MASK
;
473 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
475 tmp
= RREG32_PLL(RADEON_SCLK_MORE_CNTL
);
476 tmp
&= ~RADEON_SCLK_MORE_FORCEON
;
477 tmp
|= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT
;
478 WREG32_PLL(RADEON_SCLK_MORE_CNTL
, tmp
);
480 tmp
= RREG32_PLL(RADEON_VCLK_ECP_CNTL
);
481 tmp
|= (RADEON_PIXCLK_ALWAYS_ONb
|
482 RADEON_PIXCLK_DAC_ALWAYS_ONb
);
483 WREG32_PLL(RADEON_VCLK_ECP_CNTL
, tmp
);
485 tmp
= RREG32_PLL(RADEON_PIXCLKS_CNTL
);
486 tmp
|= (RADEON_PIX2CLK_ALWAYS_ONb
|
487 RADEON_PIX2CLK_DAC_ALWAYS_ONb
|
488 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb
|
489 R300_DVOCLK_ALWAYS_ONb
|
490 RADEON_PIXCLK_BLEND_ALWAYS_ONb
|
491 RADEON_PIXCLK_GV_ALWAYS_ONb
|
492 R300_PIXCLK_DVO_ALWAYS_ONb
|
493 RADEON_PIXCLK_LVDS_ALWAYS_ONb
|
494 RADEON_PIXCLK_TMDS_ALWAYS_ONb
|
495 R300_PIXCLK_TRANS_ALWAYS_ONb
|
496 R300_PIXCLK_TVO_ALWAYS_ONb
|
497 R300_P2G2CLK_ALWAYS_ONb
|
498 R300_P2G2CLK_DAC_ALWAYS_ONb
);
499 WREG32_PLL(RADEON_PIXCLKS_CNTL
, tmp
);
501 tmp
= RREG32_PLL(RADEON_MCLK_MISC
);
502 tmp
|= (RADEON_MC_MCLK_DYN_ENABLE
|
503 RADEON_IO_MCLK_DYN_ENABLE
);
504 WREG32_PLL(RADEON_MCLK_MISC
, tmp
);
506 tmp
= RREG32_PLL(RADEON_MCLK_CNTL
);
507 tmp
|= (RADEON_FORCEON_MCLKA
|
508 RADEON_FORCEON_MCLKB
);
510 tmp
&= ~(RADEON_FORCEON_YCLKA
|
511 RADEON_FORCEON_YCLKB
|
514 /* Some releases of vbios have set DISABLE_MC_MCLKA
515 and DISABLE_MC_MCLKB bits in the vbios table. Setting these
516 bits will cause H/W hang when reading video memory with dynamic clocking
518 if ((tmp
& R300_DISABLE_MC_MCLKA
) &&
519 (tmp
& R300_DISABLE_MC_MCLKB
)) {
520 /* If both bits are set, then check the active channels */
521 tmp
= RREG32_PLL(RADEON_MCLK_CNTL
);
522 if (rdev
->mc
.vram_width
== 64) {
523 if (RREG32(RADEON_MEM_CNTL
) &
524 R300_MEM_USE_CD_CH_ONLY
)
526 ~R300_DISABLE_MC_MCLKB
;
529 ~R300_DISABLE_MC_MCLKA
;
531 tmp
&= ~(R300_DISABLE_MC_MCLKA
|
532 R300_DISABLE_MC_MCLKB
);
536 WREG32_PLL(RADEON_MCLK_CNTL
, tmp
);
538 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
539 tmp
&= ~(R300_SCLK_FORCE_VAP
);
540 tmp
|= RADEON_SCLK_FORCE_CP
;
541 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
544 tmp
= RREG32_PLL(R300_SCLK_CNTL2
);
545 tmp
&= ~(R300_SCLK_FORCE_TCL
|
547 R300_SCLK_FORCE_CBA
);
548 WREG32_PLL(R300_SCLK_CNTL2
, tmp
);
551 tmp
= RREG32_PLL(RADEON_CLK_PWRMGT_CNTL
);
553 tmp
&= ~(RADEON_ACTIVE_HILO_LAT_MASK
|
554 RADEON_DISP_DYN_STOP_LAT_MASK
|
555 RADEON_DYN_STOP_MODE_MASK
);
557 tmp
|= (RADEON_ENGIN_DYNCLK_MODE
|
558 (0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT
));
559 WREG32_PLL(RADEON_CLK_PWRMGT_CNTL
, tmp
);
562 tmp
= RREG32_PLL(RADEON_CLK_PIN_CNTL
);
563 tmp
|= RADEON_SCLK_DYN_START_CNTL
;
564 WREG32_PLL(RADEON_CLK_PIN_CNTL
, tmp
);
567 /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200
568 to lockup randomly, leave them as set by BIOS.
570 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
571 /*tmp &= RADEON_SCLK_SRC_SEL_MASK; */
572 tmp
&= ~RADEON_SCLK_FORCEON_MASK
;
574 /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300 */
575 if (((rdev
->family
== CHIP_RV250
) &&
576 ((RREG32(RADEON_CONFIG_CNTL
) &
577 RADEON_CFG_ATI_REV_ID_MASK
) <
578 RADEON_CFG_ATI_REV_A13
))
579 || ((rdev
->family
== CHIP_RV100
)
581 ((RREG32(RADEON_CONFIG_CNTL
) &
582 RADEON_CFG_ATI_REV_ID_MASK
) <=
583 RADEON_CFG_ATI_REV_A13
))) {
584 tmp
|= RADEON_SCLK_FORCE_CP
;
585 tmp
|= RADEON_SCLK_FORCE_VIP
;
588 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
590 if ((rdev
->family
== CHIP_RV200
) ||
591 (rdev
->family
== CHIP_RV250
) ||
592 (rdev
->family
== CHIP_RV280
)) {
593 tmp
= RREG32_PLL(RADEON_SCLK_MORE_CNTL
);
594 tmp
&= ~RADEON_SCLK_MORE_FORCEON
;
596 /* RV200::A11 A12 RV250::A11 A12 */
597 if (((rdev
->family
== CHIP_RV200
) ||
598 (rdev
->family
== CHIP_RV250
)) &&
599 ((RREG32(RADEON_CONFIG_CNTL
) &
600 RADEON_CFG_ATI_REV_ID_MASK
) <
601 RADEON_CFG_ATI_REV_A13
)) {
602 tmp
|= RADEON_SCLK_MORE_FORCEON
;
604 WREG32_PLL(RADEON_SCLK_MORE_CNTL
, tmp
);
608 /* RV200::A11 A12, RV250::A11 A12 */
609 if (((rdev
->family
== CHIP_RV200
) ||
610 (rdev
->family
== CHIP_RV250
)) &&
611 ((RREG32(RADEON_CONFIG_CNTL
) &
612 RADEON_CFG_ATI_REV_ID_MASK
) <
613 RADEON_CFG_ATI_REV_A13
)) {
614 tmp
= RREG32_PLL(RADEON_PLL_PWRMGT_CNTL
);
615 tmp
|= RADEON_TCL_BYPASS_DISABLE
;
616 WREG32_PLL(RADEON_PLL_PWRMGT_CNTL
, tmp
);
620 /*enable dynamic mode for display clocks (PIXCLK and PIX2CLK) */
621 tmp
= RREG32_PLL(RADEON_PIXCLKS_CNTL
);
622 tmp
|= (RADEON_PIX2CLK_ALWAYS_ONb
|
623 RADEON_PIX2CLK_DAC_ALWAYS_ONb
|
624 RADEON_PIXCLK_BLEND_ALWAYS_ONb
|
625 RADEON_PIXCLK_GV_ALWAYS_ONb
|
626 RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb
|
627 RADEON_PIXCLK_LVDS_ALWAYS_ONb
|
628 RADEON_PIXCLK_TMDS_ALWAYS_ONb
);
630 WREG32_PLL(RADEON_PIXCLKS_CNTL
, tmp
);
633 tmp
= RREG32_PLL(RADEON_VCLK_ECP_CNTL
);
634 tmp
|= (RADEON_PIXCLK_ALWAYS_ONb
|
635 RADEON_PIXCLK_DAC_ALWAYS_ONb
);
637 WREG32_PLL(RADEON_VCLK_ECP_CNTL
, tmp
);
641 /* Turn everything OFF (ForceON to everything) */
642 if (rdev
->flags
& RADEON_SINGLE_CRTC
) {
643 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
644 tmp
|= (RADEON_SCLK_FORCE_CP
| RADEON_SCLK_FORCE_HDP
|
645 RADEON_SCLK_FORCE_DISP1
| RADEON_SCLK_FORCE_TOP
646 | RADEON_SCLK_FORCE_E2
| RADEON_SCLK_FORCE_SE
|
647 RADEON_SCLK_FORCE_IDCT
| RADEON_SCLK_FORCE_VIP
|
648 RADEON_SCLK_FORCE_RE
| RADEON_SCLK_FORCE_PB
|
649 RADEON_SCLK_FORCE_TAM
| RADEON_SCLK_FORCE_TDM
|
650 RADEON_SCLK_FORCE_RB
);
651 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
652 } else if ((rdev
->family
== CHIP_RS400
) ||
653 (rdev
->family
== CHIP_RS480
)) {
654 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
655 tmp
|= (RADEON_SCLK_FORCE_DISP2
| RADEON_SCLK_FORCE_CP
|
656 RADEON_SCLK_FORCE_HDP
| RADEON_SCLK_FORCE_DISP1
657 | RADEON_SCLK_FORCE_TOP
| RADEON_SCLK_FORCE_E2
|
658 R300_SCLK_FORCE_VAP
| RADEON_SCLK_FORCE_IDCT
|
659 RADEON_SCLK_FORCE_VIP
| R300_SCLK_FORCE_SR
|
660 R300_SCLK_FORCE_PX
| R300_SCLK_FORCE_TX
|
661 R300_SCLK_FORCE_US
| RADEON_SCLK_FORCE_TV_SCLK
|
662 R300_SCLK_FORCE_SU
| RADEON_SCLK_FORCE_OV0
);
663 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
665 tmp
= RREG32_PLL(RADEON_SCLK_MORE_CNTL
);
666 tmp
|= RADEON_SCLK_MORE_FORCEON
;
667 WREG32_PLL(RADEON_SCLK_MORE_CNTL
, tmp
);
669 tmp
= RREG32_PLL(RADEON_VCLK_ECP_CNTL
);
670 tmp
&= ~(RADEON_PIXCLK_ALWAYS_ONb
|
671 RADEON_PIXCLK_DAC_ALWAYS_ONb
|
672 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF
);
673 WREG32_PLL(RADEON_VCLK_ECP_CNTL
, tmp
);
675 tmp
= RREG32_PLL(RADEON_PIXCLKS_CNTL
);
676 tmp
&= ~(RADEON_PIX2CLK_ALWAYS_ONb
|
677 RADEON_PIX2CLK_DAC_ALWAYS_ONb
|
678 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb
|
679 R300_DVOCLK_ALWAYS_ONb
|
680 RADEON_PIXCLK_BLEND_ALWAYS_ONb
|
681 RADEON_PIXCLK_GV_ALWAYS_ONb
|
682 R300_PIXCLK_DVO_ALWAYS_ONb
|
683 RADEON_PIXCLK_LVDS_ALWAYS_ONb
|
684 RADEON_PIXCLK_TMDS_ALWAYS_ONb
|
685 R300_PIXCLK_TRANS_ALWAYS_ONb
|
686 R300_PIXCLK_TVO_ALWAYS_ONb
|
687 R300_P2G2CLK_ALWAYS_ONb
|
688 R300_P2G2CLK_DAC_ALWAYS_ONb
|
689 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF
);
690 WREG32_PLL(RADEON_PIXCLKS_CNTL
, tmp
);
691 } else if (rdev
->family
>= CHIP_RV350
) {
692 /* for RV350/M10, no delays are required. */
693 tmp
= RREG32_PLL(R300_SCLK_CNTL2
);
694 tmp
|= (R300_SCLK_FORCE_TCL
|
695 R300_SCLK_FORCE_GA
| R300_SCLK_FORCE_CBA
);
696 WREG32_PLL(R300_SCLK_CNTL2
, tmp
);
698 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
699 tmp
|= (RADEON_SCLK_FORCE_DISP2
| RADEON_SCLK_FORCE_CP
|
700 RADEON_SCLK_FORCE_HDP
| RADEON_SCLK_FORCE_DISP1
701 | RADEON_SCLK_FORCE_TOP
| RADEON_SCLK_FORCE_E2
|
702 R300_SCLK_FORCE_VAP
| RADEON_SCLK_FORCE_IDCT
|
703 RADEON_SCLK_FORCE_VIP
| R300_SCLK_FORCE_SR
|
704 R300_SCLK_FORCE_PX
| R300_SCLK_FORCE_TX
|
705 R300_SCLK_FORCE_US
| RADEON_SCLK_FORCE_TV_SCLK
|
706 R300_SCLK_FORCE_SU
| RADEON_SCLK_FORCE_OV0
);
707 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
709 tmp
= RREG32_PLL(RADEON_SCLK_MORE_CNTL
);
710 tmp
|= RADEON_SCLK_MORE_FORCEON
;
711 WREG32_PLL(RADEON_SCLK_MORE_CNTL
, tmp
);
713 tmp
= RREG32_PLL(RADEON_MCLK_CNTL
);
714 tmp
|= (RADEON_FORCEON_MCLKA
|
715 RADEON_FORCEON_MCLKB
|
716 RADEON_FORCEON_YCLKA
|
717 RADEON_FORCEON_YCLKB
| RADEON_FORCEON_MC
);
718 WREG32_PLL(RADEON_MCLK_CNTL
, tmp
);
720 tmp
= RREG32_PLL(RADEON_VCLK_ECP_CNTL
);
721 tmp
&= ~(RADEON_PIXCLK_ALWAYS_ONb
|
722 RADEON_PIXCLK_DAC_ALWAYS_ONb
|
723 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF
);
724 WREG32_PLL(RADEON_VCLK_ECP_CNTL
, tmp
);
726 tmp
= RREG32_PLL(RADEON_PIXCLKS_CNTL
);
727 tmp
&= ~(RADEON_PIX2CLK_ALWAYS_ONb
|
728 RADEON_PIX2CLK_DAC_ALWAYS_ONb
|
729 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb
|
730 R300_DVOCLK_ALWAYS_ONb
|
731 RADEON_PIXCLK_BLEND_ALWAYS_ONb
|
732 RADEON_PIXCLK_GV_ALWAYS_ONb
|
733 R300_PIXCLK_DVO_ALWAYS_ONb
|
734 RADEON_PIXCLK_LVDS_ALWAYS_ONb
|
735 RADEON_PIXCLK_TMDS_ALWAYS_ONb
|
736 R300_PIXCLK_TRANS_ALWAYS_ONb
|
737 R300_PIXCLK_TVO_ALWAYS_ONb
|
738 R300_P2G2CLK_ALWAYS_ONb
|
739 R300_P2G2CLK_DAC_ALWAYS_ONb
|
740 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF
);
741 WREG32_PLL(RADEON_PIXCLKS_CNTL
, tmp
);
743 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
744 tmp
|= (RADEON_SCLK_FORCE_CP
| RADEON_SCLK_FORCE_E2
);
745 tmp
|= RADEON_SCLK_FORCE_SE
;
747 if (rdev
->flags
& RADEON_SINGLE_CRTC
) {
748 tmp
|= (RADEON_SCLK_FORCE_RB
|
749 RADEON_SCLK_FORCE_TDM
|
750 RADEON_SCLK_FORCE_TAM
|
751 RADEON_SCLK_FORCE_PB
|
752 RADEON_SCLK_FORCE_RE
|
753 RADEON_SCLK_FORCE_VIP
|
754 RADEON_SCLK_FORCE_IDCT
|
755 RADEON_SCLK_FORCE_TOP
|
756 RADEON_SCLK_FORCE_DISP1
|
757 RADEON_SCLK_FORCE_DISP2
|
758 RADEON_SCLK_FORCE_HDP
);
759 } else if ((rdev
->family
== CHIP_R300
) ||
760 (rdev
->family
== CHIP_R350
)) {
761 tmp
|= (RADEON_SCLK_FORCE_HDP
|
762 RADEON_SCLK_FORCE_DISP1
|
763 RADEON_SCLK_FORCE_DISP2
|
764 RADEON_SCLK_FORCE_TOP
|
765 RADEON_SCLK_FORCE_IDCT
|
766 RADEON_SCLK_FORCE_VIP
);
768 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
772 if ((rdev
->family
== CHIP_R300
) ||
773 (rdev
->family
== CHIP_R350
)) {
774 tmp
= RREG32_PLL(R300_SCLK_CNTL2
);
775 tmp
|= (R300_SCLK_FORCE_TCL
|
777 R300_SCLK_FORCE_CBA
);
778 WREG32_PLL(R300_SCLK_CNTL2
, tmp
);
782 if (rdev
->flags
& RADEON_IS_IGP
) {
783 tmp
= RREG32_PLL(RADEON_MCLK_CNTL
);
784 tmp
&= ~(RADEON_FORCEON_MCLKA
|
785 RADEON_FORCEON_YCLKA
);
786 WREG32_PLL(RADEON_MCLK_CNTL
, tmp
);
790 if ((rdev
->family
== CHIP_RV200
) ||
791 (rdev
->family
== CHIP_RV250
) ||
792 (rdev
->family
== CHIP_RV280
)) {
793 tmp
= RREG32_PLL(RADEON_SCLK_MORE_CNTL
);
794 tmp
|= RADEON_SCLK_MORE_FORCEON
;
795 WREG32_PLL(RADEON_SCLK_MORE_CNTL
, tmp
);
799 tmp
= RREG32_PLL(RADEON_PIXCLKS_CNTL
);
800 tmp
&= ~(RADEON_PIX2CLK_ALWAYS_ONb
|
801 RADEON_PIX2CLK_DAC_ALWAYS_ONb
|
802 RADEON_PIXCLK_BLEND_ALWAYS_ONb
|
803 RADEON_PIXCLK_GV_ALWAYS_ONb
|
804 RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb
|
805 RADEON_PIXCLK_LVDS_ALWAYS_ONb
|
806 RADEON_PIXCLK_TMDS_ALWAYS_ONb
);
808 WREG32_PLL(RADEON_PIXCLKS_CNTL
, tmp
);
811 tmp
= RREG32_PLL(RADEON_VCLK_ECP_CNTL
);
812 tmp
&= ~(RADEON_PIXCLK_ALWAYS_ONb
|
813 RADEON_PIXCLK_DAC_ALWAYS_ONb
);
814 WREG32_PLL(RADEON_VCLK_ECP_CNTL
, tmp
);
819 static void radeon_apply_clock_quirks(struct radeon_device
*rdev
)
823 /* XXX make sure engine is idle */
825 if (rdev
->family
< CHIP_RS600
) {
826 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
827 if (ASIC_IS_R300(rdev
) || ASIC_IS_RV100(rdev
))
828 tmp
|= RADEON_SCLK_FORCE_CP
| RADEON_SCLK_FORCE_VIP
;
829 if ((rdev
->family
== CHIP_RV250
)
830 || (rdev
->family
== CHIP_RV280
))
832 RADEON_SCLK_FORCE_DISP1
| RADEON_SCLK_FORCE_DISP2
;
833 if ((rdev
->family
== CHIP_RV350
)
834 || (rdev
->family
== CHIP_RV380
))
835 tmp
|= R300_SCLK_FORCE_VAP
;
836 if (rdev
->family
== CHIP_R420
)
837 tmp
|= R300_SCLK_FORCE_PX
| R300_SCLK_FORCE_TX
;
838 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
839 } else if (rdev
->family
< CHIP_R600
) {
840 tmp
= RREG32_PLL(AVIVO_CP_DYN_CNTL
);
841 tmp
|= AVIVO_CP_FORCEON
;
842 WREG32_PLL(AVIVO_CP_DYN_CNTL
, tmp
);
844 tmp
= RREG32_PLL(AVIVO_E2_DYN_CNTL
);
845 tmp
|= AVIVO_E2_FORCEON
;
846 WREG32_PLL(AVIVO_E2_DYN_CNTL
, tmp
);
848 tmp
= RREG32_PLL(AVIVO_IDCT_DYN_CNTL
);
849 tmp
|= AVIVO_IDCT_FORCEON
;
850 WREG32_PLL(AVIVO_IDCT_DYN_CNTL
, tmp
);
854 int radeon_static_clocks_init(struct drm_device
*dev
)
856 struct radeon_device
*rdev
= dev
->dev_private
;
858 /* XXX make sure engine is idle */
860 if (radeon_dynclks
!= -1) {
861 if (radeon_dynclks
) {
862 if (rdev
->asic
->set_clock_gating
)
863 radeon_set_clock_gating(rdev
, 1);
866 radeon_apply_clock_quirks(rdev
);