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 static 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
;
47 sclk
= fb_div
/ ref_div
;
49 post_div
= RREG32_PLL(RADEON_SCLK_CNTL
) & RADEON_SCLK_SRC_SEL_MASK
;
52 else if (post_div
== 3)
54 else if (post_div
== 4)
61 static uint32_t radeon_legacy_get_memory_clock(struct radeon_device
*rdev
)
63 struct radeon_pll
*mpll
= &rdev
->clock
.mpll
;
64 uint32_t fb_div
, ref_div
, post_div
, mclk
;
66 fb_div
= RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
);
67 fb_div
= (fb_div
>> RADEON_MPLL_FB_DIV_SHIFT
) & RADEON_MPLL_FB_DIV_MASK
;
69 fb_div
*= mpll
->reference_freq
;
72 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
) & RADEON_M_SPLL_REF_DIV_MASK
;
73 mclk
= fb_div
/ ref_div
;
75 post_div
= RREG32_PLL(RADEON_MCLK_CNTL
) & 0x7;
78 else if (post_div
== 3)
80 else if (post_div
== 4)
86 void radeon_get_clock_info(struct drm_device
*dev
)
88 struct radeon_device
*rdev
= dev
->dev_private
;
89 struct radeon_pll
*p1pll
= &rdev
->clock
.p1pll
;
90 struct radeon_pll
*p2pll
= &rdev
->clock
.p2pll
;
91 struct radeon_pll
*spll
= &rdev
->clock
.spll
;
92 struct radeon_pll
*mpll
= &rdev
->clock
.mpll
;
95 if (rdev
->is_atom_bios
)
96 ret
= radeon_atom_get_clock_info(dev
);
98 ret
= radeon_combios_get_clock_info(dev
);
101 if (p1pll
->reference_div
< 2)
102 p1pll
->reference_div
= 12;
103 if (p2pll
->reference_div
< 2)
104 p2pll
->reference_div
= 12;
105 if (spll
->reference_div
< 2)
106 spll
->reference_div
=
107 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
) &
108 RADEON_M_SPLL_REF_DIV_MASK
;
109 if (mpll
->reference_div
< 2)
110 mpll
->reference_div
= spll
->reference_div
;
112 if (ASIC_IS_AVIVO(rdev
)) {
115 DRM_INFO("Using generic clock info\n");
117 if (rdev
->flags
& RADEON_IS_IGP
) {
118 p1pll
->reference_freq
= 1432;
119 p2pll
->reference_freq
= 1432;
120 spll
->reference_freq
= 1432;
121 mpll
->reference_freq
= 1432;
123 p1pll
->reference_freq
= 2700;
124 p2pll
->reference_freq
= 2700;
125 spll
->reference_freq
= 2700;
126 mpll
->reference_freq
= 2700;
128 p1pll
->reference_div
=
129 RREG32_PLL(RADEON_PPLL_REF_DIV
) & 0x3ff;
130 if (p1pll
->reference_div
< 2)
131 p1pll
->reference_div
= 12;
132 p2pll
->reference_div
= p1pll
->reference_div
;
134 if (rdev
->family
>= CHIP_R420
) {
135 p1pll
->pll_in_min
= 100;
136 p1pll
->pll_in_max
= 1350;
137 p1pll
->pll_out_min
= 20000;
138 p1pll
->pll_out_max
= 50000;
139 p2pll
->pll_in_min
= 100;
140 p2pll
->pll_in_max
= 1350;
141 p2pll
->pll_out_min
= 20000;
142 p2pll
->pll_out_max
= 50000;
144 p1pll
->pll_in_min
= 40;
145 p1pll
->pll_in_max
= 500;
146 p1pll
->pll_out_min
= 12500;
147 p1pll
->pll_out_max
= 35000;
148 p2pll
->pll_in_min
= 40;
149 p2pll
->pll_in_max
= 500;
150 p2pll
->pll_out_min
= 12500;
151 p2pll
->pll_out_max
= 35000;
154 spll
->reference_div
=
155 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
) &
156 RADEON_M_SPLL_REF_DIV_MASK
;
157 mpll
->reference_div
= spll
->reference_div
;
158 rdev
->clock
.default_sclk
=
159 radeon_legacy_get_engine_clock(rdev
);
160 rdev
->clock
.default_mclk
=
161 radeon_legacy_get_memory_clock(rdev
);
166 if (ASIC_IS_AVIVO(rdev
)) {
167 p1pll
->min_post_div
= 2;
168 p1pll
->max_post_div
= 0x7f;
169 p1pll
->min_frac_feedback_div
= 0;
170 p1pll
->max_frac_feedback_div
= 9;
171 p2pll
->min_post_div
= 2;
172 p2pll
->max_post_div
= 0x7f;
173 p2pll
->min_frac_feedback_div
= 0;
174 p2pll
->max_frac_feedback_div
= 9;
176 p1pll
->min_post_div
= 1;
177 p1pll
->max_post_div
= 16;
178 p1pll
->min_frac_feedback_div
= 0;
179 p1pll
->max_frac_feedback_div
= 0;
180 p2pll
->min_post_div
= 1;
181 p2pll
->max_post_div
= 12;
182 p2pll
->min_frac_feedback_div
= 0;
183 p2pll
->max_frac_feedback_div
= 0;
186 p1pll
->min_ref_div
= 2;
187 p1pll
->max_ref_div
= 0x3ff;
188 p1pll
->min_feedback_div
= 4;
189 p1pll
->max_feedback_div
= 0x7ff;
192 p2pll
->min_ref_div
= 2;
193 p2pll
->max_ref_div
= 0x3ff;
194 p2pll
->min_feedback_div
= 4;
195 p2pll
->max_feedback_div
= 0x7ff;
199 spll
->min_post_div
= 1;
200 spll
->max_post_div
= 1;
201 spll
->min_ref_div
= 2;
202 spll
->max_ref_div
= 0xff;
203 spll
->min_feedback_div
= 4;
204 spll
->max_feedback_div
= 0xff;
208 mpll
->min_post_div
= 1;
209 mpll
->max_post_div
= 1;
210 mpll
->min_ref_div
= 2;
211 mpll
->max_ref_div
= 0xff;
212 mpll
->min_feedback_div
= 4;
213 mpll
->max_feedback_div
= 0xff;
219 static uint32_t calc_eng_mem_clock(struct radeon_device
*rdev
,
221 int *fb_div
, int *post_div
)
223 struct radeon_pll
*spll
= &rdev
->clock
.spll
;
224 int ref_div
= spll
->reference_div
;
228 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
) &
229 RADEON_M_SPLL_REF_DIV_MASK
;
231 if (req_clock
< 15000) {
234 } else if (req_clock
< 30000) {
237 } else if (req_clock
< 60000) {
243 req_clock
*= ref_div
;
244 req_clock
+= spll
->reference_freq
;
245 req_clock
/= (2 * spll
->reference_freq
);
247 *fb_div
= req_clock
& 0xff;
249 req_clock
= (req_clock
& 0xffff) << 1;
250 req_clock
*= spll
->reference_freq
;
251 req_clock
/= ref_div
;
252 req_clock
/= *post_div
;
258 void radeon_legacy_set_engine_clock(struct radeon_device
*rdev
,
262 int fb_div
, post_div
;
264 /* XXX: wait for idle */
266 eng_clock
= calc_eng_mem_clock(rdev
, eng_clock
, &fb_div
, &post_div
);
268 tmp
= RREG32_PLL(RADEON_CLK_PIN_CNTL
);
269 tmp
&= ~RADEON_DONT_USE_XTALIN
;
270 WREG32_PLL(RADEON_CLK_PIN_CNTL
, tmp
);
272 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
273 tmp
&= ~RADEON_SCLK_SRC_SEL_MASK
;
274 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
278 tmp
= RREG32_PLL(RADEON_SPLL_CNTL
);
279 tmp
|= RADEON_SPLL_SLEEP
;
280 WREG32_PLL(RADEON_SPLL_CNTL
, tmp
);
284 tmp
= RREG32_PLL(RADEON_SPLL_CNTL
);
285 tmp
|= RADEON_SPLL_RESET
;
286 WREG32_PLL(RADEON_SPLL_CNTL
, tmp
);
290 tmp
= RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
);
291 tmp
&= ~(RADEON_SPLL_FB_DIV_MASK
<< RADEON_SPLL_FB_DIV_SHIFT
);
292 tmp
|= (fb_div
& RADEON_SPLL_FB_DIV_MASK
) << RADEON_SPLL_FB_DIV_SHIFT
;
293 WREG32_PLL(RADEON_M_SPLL_REF_FB_DIV
, tmp
);
295 /* XXX: verify on different asics */
296 tmp
= RREG32_PLL(RADEON_SPLL_CNTL
);
297 tmp
&= ~RADEON_SPLL_PVG_MASK
;
298 if ((eng_clock
* post_div
) >= 90000)
299 tmp
|= (0x7 << RADEON_SPLL_PVG_SHIFT
);
301 tmp
|= (0x4 << RADEON_SPLL_PVG_SHIFT
);
302 WREG32_PLL(RADEON_SPLL_CNTL
, tmp
);
304 tmp
= RREG32_PLL(RADEON_SPLL_CNTL
);
305 tmp
&= ~RADEON_SPLL_SLEEP
;
306 WREG32_PLL(RADEON_SPLL_CNTL
, tmp
);
310 tmp
= RREG32_PLL(RADEON_SPLL_CNTL
);
311 tmp
&= ~RADEON_SPLL_RESET
;
312 WREG32_PLL(RADEON_SPLL_CNTL
, tmp
);
316 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
317 tmp
&= ~RADEON_SCLK_SRC_SEL_MASK
;
333 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
337 tmp
= RREG32_PLL(RADEON_CLK_PIN_CNTL
);
338 tmp
|= RADEON_DONT_USE_XTALIN
;
339 WREG32_PLL(RADEON_CLK_PIN_CNTL
, tmp
);
344 void radeon_legacy_set_clock_gating(struct radeon_device
*rdev
, int enable
)
349 if (rdev
->flags
& RADEON_SINGLE_CRTC
) {
350 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
351 if ((RREG32(RADEON_CONFIG_CNTL
) &
352 RADEON_CFG_ATI_REV_ID_MASK
) >
353 RADEON_CFG_ATI_REV_A13
) {
355 ~(RADEON_SCLK_FORCE_CP
|
356 RADEON_SCLK_FORCE_RB
);
359 ~(RADEON_SCLK_FORCE_HDP
| RADEON_SCLK_FORCE_DISP1
|
360 RADEON_SCLK_FORCE_TOP
| RADEON_SCLK_FORCE_SE
|
361 RADEON_SCLK_FORCE_IDCT
| RADEON_SCLK_FORCE_RE
|
362 RADEON_SCLK_FORCE_PB
| RADEON_SCLK_FORCE_TAM
|
363 RADEON_SCLK_FORCE_TDM
);
364 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
365 } else if (ASIC_IS_R300(rdev
)) {
366 if ((rdev
->family
== CHIP_RS400
) ||
367 (rdev
->family
== CHIP_RS480
)) {
368 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
370 ~(RADEON_SCLK_FORCE_DISP2
|
371 RADEON_SCLK_FORCE_CP
|
372 RADEON_SCLK_FORCE_HDP
|
373 RADEON_SCLK_FORCE_DISP1
|
374 RADEON_SCLK_FORCE_TOP
|
375 RADEON_SCLK_FORCE_E2
| R300_SCLK_FORCE_VAP
376 | RADEON_SCLK_FORCE_IDCT
|
377 RADEON_SCLK_FORCE_VIP
| R300_SCLK_FORCE_SR
378 | R300_SCLK_FORCE_PX
| R300_SCLK_FORCE_TX
379 | R300_SCLK_FORCE_US
|
380 RADEON_SCLK_FORCE_TV_SCLK
|
382 RADEON_SCLK_FORCE_OV0
);
383 tmp
|= RADEON_DYN_STOP_LAT_MASK
;
385 RADEON_SCLK_FORCE_TOP
|
386 RADEON_SCLK_FORCE_VIP
;
387 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
389 tmp
= RREG32_PLL(RADEON_SCLK_MORE_CNTL
);
390 tmp
&= ~RADEON_SCLK_MORE_FORCEON
;
391 tmp
|= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT
;
392 WREG32_PLL(RADEON_SCLK_MORE_CNTL
, tmp
);
394 tmp
= RREG32_PLL(RADEON_VCLK_ECP_CNTL
);
395 tmp
|= (RADEON_PIXCLK_ALWAYS_ONb
|
396 RADEON_PIXCLK_DAC_ALWAYS_ONb
);
397 WREG32_PLL(RADEON_VCLK_ECP_CNTL
, tmp
);
399 tmp
= RREG32_PLL(RADEON_PIXCLKS_CNTL
);
400 tmp
|= (RADEON_PIX2CLK_ALWAYS_ONb
|
401 RADEON_PIX2CLK_DAC_ALWAYS_ONb
|
402 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb
|
403 R300_DVOCLK_ALWAYS_ONb
|
404 RADEON_PIXCLK_BLEND_ALWAYS_ONb
|
405 RADEON_PIXCLK_GV_ALWAYS_ONb
|
406 R300_PIXCLK_DVO_ALWAYS_ONb
|
407 RADEON_PIXCLK_LVDS_ALWAYS_ONb
|
408 RADEON_PIXCLK_TMDS_ALWAYS_ONb
|
409 R300_PIXCLK_TRANS_ALWAYS_ONb
|
410 R300_PIXCLK_TVO_ALWAYS_ONb
|
411 R300_P2G2CLK_ALWAYS_ONb
|
412 R300_P2G2CLK_ALWAYS_ONb
);
413 WREG32_PLL(RADEON_PIXCLKS_CNTL
, tmp
);
414 } else if (rdev
->family
>= CHIP_RV350
) {
415 tmp
= RREG32_PLL(R300_SCLK_CNTL2
);
416 tmp
&= ~(R300_SCLK_FORCE_TCL
|
418 R300_SCLK_FORCE_CBA
);
419 tmp
|= (R300_SCLK_TCL_MAX_DYN_STOP_LAT
|
420 R300_SCLK_GA_MAX_DYN_STOP_LAT
|
421 R300_SCLK_CBA_MAX_DYN_STOP_LAT
);
422 WREG32_PLL(R300_SCLK_CNTL2
, tmp
);
424 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
426 ~(RADEON_SCLK_FORCE_DISP2
|
427 RADEON_SCLK_FORCE_CP
|
428 RADEON_SCLK_FORCE_HDP
|
429 RADEON_SCLK_FORCE_DISP1
|
430 RADEON_SCLK_FORCE_TOP
|
431 RADEON_SCLK_FORCE_E2
| R300_SCLK_FORCE_VAP
432 | RADEON_SCLK_FORCE_IDCT
|
433 RADEON_SCLK_FORCE_VIP
| R300_SCLK_FORCE_SR
434 | R300_SCLK_FORCE_PX
| R300_SCLK_FORCE_TX
435 | R300_SCLK_FORCE_US
|
436 RADEON_SCLK_FORCE_TV_SCLK
|
438 RADEON_SCLK_FORCE_OV0
);
439 tmp
|= RADEON_DYN_STOP_LAT_MASK
;
440 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
442 tmp
= RREG32_PLL(RADEON_SCLK_MORE_CNTL
);
443 tmp
&= ~RADEON_SCLK_MORE_FORCEON
;
444 tmp
|= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT
;
445 WREG32_PLL(RADEON_SCLK_MORE_CNTL
, tmp
);
447 tmp
= RREG32_PLL(RADEON_VCLK_ECP_CNTL
);
448 tmp
|= (RADEON_PIXCLK_ALWAYS_ONb
|
449 RADEON_PIXCLK_DAC_ALWAYS_ONb
);
450 WREG32_PLL(RADEON_VCLK_ECP_CNTL
, tmp
);
452 tmp
= RREG32_PLL(RADEON_PIXCLKS_CNTL
);
453 tmp
|= (RADEON_PIX2CLK_ALWAYS_ONb
|
454 RADEON_PIX2CLK_DAC_ALWAYS_ONb
|
455 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb
|
456 R300_DVOCLK_ALWAYS_ONb
|
457 RADEON_PIXCLK_BLEND_ALWAYS_ONb
|
458 RADEON_PIXCLK_GV_ALWAYS_ONb
|
459 R300_PIXCLK_DVO_ALWAYS_ONb
|
460 RADEON_PIXCLK_LVDS_ALWAYS_ONb
|
461 RADEON_PIXCLK_TMDS_ALWAYS_ONb
|
462 R300_PIXCLK_TRANS_ALWAYS_ONb
|
463 R300_PIXCLK_TVO_ALWAYS_ONb
|
464 R300_P2G2CLK_ALWAYS_ONb
|
465 R300_P2G2CLK_ALWAYS_ONb
);
466 WREG32_PLL(RADEON_PIXCLKS_CNTL
, tmp
);
468 tmp
= RREG32_PLL(RADEON_MCLK_MISC
);
469 tmp
|= (RADEON_MC_MCLK_DYN_ENABLE
|
470 RADEON_IO_MCLK_DYN_ENABLE
);
471 WREG32_PLL(RADEON_MCLK_MISC
, tmp
);
473 tmp
= RREG32_PLL(RADEON_MCLK_CNTL
);
474 tmp
|= (RADEON_FORCEON_MCLKA
|
475 RADEON_FORCEON_MCLKB
);
477 tmp
&= ~(RADEON_FORCEON_YCLKA
|
478 RADEON_FORCEON_YCLKB
|
481 /* Some releases of vbios have set DISABLE_MC_MCLKA
482 and DISABLE_MC_MCLKB bits in the vbios table. Setting these
483 bits will cause H/W hang when reading video memory with dynamic clocking
485 if ((tmp
& R300_DISABLE_MC_MCLKA
) &&
486 (tmp
& R300_DISABLE_MC_MCLKB
)) {
487 /* If both bits are set, then check the active channels */
488 tmp
= RREG32_PLL(RADEON_MCLK_CNTL
);
489 if (rdev
->mc
.vram_width
== 64) {
490 if (RREG32(RADEON_MEM_CNTL
) &
491 R300_MEM_USE_CD_CH_ONLY
)
493 ~R300_DISABLE_MC_MCLKB
;
496 ~R300_DISABLE_MC_MCLKA
;
498 tmp
&= ~(R300_DISABLE_MC_MCLKA
|
499 R300_DISABLE_MC_MCLKB
);
503 WREG32_PLL(RADEON_MCLK_CNTL
, tmp
);
505 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
506 tmp
&= ~(R300_SCLK_FORCE_VAP
);
507 tmp
|= RADEON_SCLK_FORCE_CP
;
508 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
511 tmp
= RREG32_PLL(R300_SCLK_CNTL2
);
512 tmp
&= ~(R300_SCLK_FORCE_TCL
|
514 R300_SCLK_FORCE_CBA
);
515 WREG32_PLL(R300_SCLK_CNTL2
, tmp
);
518 tmp
= RREG32_PLL(RADEON_CLK_PWRMGT_CNTL
);
520 tmp
&= ~(RADEON_ACTIVE_HILO_LAT_MASK
|
521 RADEON_DISP_DYN_STOP_LAT_MASK
|
522 RADEON_DYN_STOP_MODE_MASK
);
524 tmp
|= (RADEON_ENGIN_DYNCLK_MODE
|
525 (0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT
));
526 WREG32_PLL(RADEON_CLK_PWRMGT_CNTL
, tmp
);
529 tmp
= RREG32_PLL(RADEON_CLK_PIN_CNTL
);
530 tmp
|= RADEON_SCLK_DYN_START_CNTL
;
531 WREG32_PLL(RADEON_CLK_PIN_CNTL
, tmp
);
534 /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200
535 to lockup randomly, leave them as set by BIOS.
537 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
538 /*tmp &= RADEON_SCLK_SRC_SEL_MASK; */
539 tmp
&= ~RADEON_SCLK_FORCEON_MASK
;
541 /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300 */
542 if (((rdev
->family
== CHIP_RV250
) &&
543 ((RREG32(RADEON_CONFIG_CNTL
) &
544 RADEON_CFG_ATI_REV_ID_MASK
) <
545 RADEON_CFG_ATI_REV_A13
))
546 || ((rdev
->family
== CHIP_RV100
)
548 ((RREG32(RADEON_CONFIG_CNTL
) &
549 RADEON_CFG_ATI_REV_ID_MASK
) <=
550 RADEON_CFG_ATI_REV_A13
))) {
551 tmp
|= RADEON_SCLK_FORCE_CP
;
552 tmp
|= RADEON_SCLK_FORCE_VIP
;
555 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
557 if ((rdev
->family
== CHIP_RV200
) ||
558 (rdev
->family
== CHIP_RV250
) ||
559 (rdev
->family
== CHIP_RV280
)) {
560 tmp
= RREG32_PLL(RADEON_SCLK_MORE_CNTL
);
561 tmp
&= ~RADEON_SCLK_MORE_FORCEON
;
563 /* RV200::A11 A12 RV250::A11 A12 */
564 if (((rdev
->family
== CHIP_RV200
) ||
565 (rdev
->family
== CHIP_RV250
)) &&
566 ((RREG32(RADEON_CONFIG_CNTL
) &
567 RADEON_CFG_ATI_REV_ID_MASK
) <
568 RADEON_CFG_ATI_REV_A13
)) {
569 tmp
|= RADEON_SCLK_MORE_FORCEON
;
571 WREG32_PLL(RADEON_SCLK_MORE_CNTL
, tmp
);
575 /* RV200::A11 A12, RV250::A11 A12 */
576 if (((rdev
->family
== CHIP_RV200
) ||
577 (rdev
->family
== CHIP_RV250
)) &&
578 ((RREG32(RADEON_CONFIG_CNTL
) &
579 RADEON_CFG_ATI_REV_ID_MASK
) <
580 RADEON_CFG_ATI_REV_A13
)) {
581 tmp
= RREG32_PLL(RADEON_PLL_PWRMGT_CNTL
);
582 tmp
|= RADEON_TCL_BYPASS_DISABLE
;
583 WREG32_PLL(RADEON_PLL_PWRMGT_CNTL
, tmp
);
587 /*enable dynamic mode for display clocks (PIXCLK and PIX2CLK) */
588 tmp
= RREG32_PLL(RADEON_PIXCLKS_CNTL
);
589 tmp
|= (RADEON_PIX2CLK_ALWAYS_ONb
|
590 RADEON_PIX2CLK_DAC_ALWAYS_ONb
|
591 RADEON_PIXCLK_BLEND_ALWAYS_ONb
|
592 RADEON_PIXCLK_GV_ALWAYS_ONb
|
593 RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb
|
594 RADEON_PIXCLK_LVDS_ALWAYS_ONb
|
595 RADEON_PIXCLK_TMDS_ALWAYS_ONb
);
597 WREG32_PLL(RADEON_PIXCLKS_CNTL
, tmp
);
600 tmp
= RREG32_PLL(RADEON_VCLK_ECP_CNTL
);
601 tmp
|= (RADEON_PIXCLK_ALWAYS_ONb
|
602 RADEON_PIXCLK_DAC_ALWAYS_ONb
);
604 WREG32_PLL(RADEON_VCLK_ECP_CNTL
, tmp
);
608 /* Turn everything OFF (ForceON to everything) */
609 if (rdev
->flags
& RADEON_SINGLE_CRTC
) {
610 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
611 tmp
|= (RADEON_SCLK_FORCE_CP
| RADEON_SCLK_FORCE_HDP
|
612 RADEON_SCLK_FORCE_DISP1
| RADEON_SCLK_FORCE_TOP
613 | RADEON_SCLK_FORCE_E2
| RADEON_SCLK_FORCE_SE
|
614 RADEON_SCLK_FORCE_IDCT
| RADEON_SCLK_FORCE_VIP
|
615 RADEON_SCLK_FORCE_RE
| RADEON_SCLK_FORCE_PB
|
616 RADEON_SCLK_FORCE_TAM
| RADEON_SCLK_FORCE_TDM
|
617 RADEON_SCLK_FORCE_RB
);
618 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
619 } else if ((rdev
->family
== CHIP_RS400
) ||
620 (rdev
->family
== CHIP_RS480
)) {
621 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
622 tmp
|= (RADEON_SCLK_FORCE_DISP2
| RADEON_SCLK_FORCE_CP
|
623 RADEON_SCLK_FORCE_HDP
| RADEON_SCLK_FORCE_DISP1
624 | RADEON_SCLK_FORCE_TOP
| RADEON_SCLK_FORCE_E2
|
625 R300_SCLK_FORCE_VAP
| RADEON_SCLK_FORCE_IDCT
|
626 RADEON_SCLK_FORCE_VIP
| R300_SCLK_FORCE_SR
|
627 R300_SCLK_FORCE_PX
| R300_SCLK_FORCE_TX
|
628 R300_SCLK_FORCE_US
| RADEON_SCLK_FORCE_TV_SCLK
|
629 R300_SCLK_FORCE_SU
| RADEON_SCLK_FORCE_OV0
);
630 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
632 tmp
= RREG32_PLL(RADEON_SCLK_MORE_CNTL
);
633 tmp
|= RADEON_SCLK_MORE_FORCEON
;
634 WREG32_PLL(RADEON_SCLK_MORE_CNTL
, tmp
);
636 tmp
= RREG32_PLL(RADEON_VCLK_ECP_CNTL
);
637 tmp
&= ~(RADEON_PIXCLK_ALWAYS_ONb
|
638 RADEON_PIXCLK_DAC_ALWAYS_ONb
|
639 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF
);
640 WREG32_PLL(RADEON_VCLK_ECP_CNTL
, tmp
);
642 tmp
= RREG32_PLL(RADEON_PIXCLKS_CNTL
);
643 tmp
&= ~(RADEON_PIX2CLK_ALWAYS_ONb
|
644 RADEON_PIX2CLK_DAC_ALWAYS_ONb
|
645 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb
|
646 R300_DVOCLK_ALWAYS_ONb
|
647 RADEON_PIXCLK_BLEND_ALWAYS_ONb
|
648 RADEON_PIXCLK_GV_ALWAYS_ONb
|
649 R300_PIXCLK_DVO_ALWAYS_ONb
|
650 RADEON_PIXCLK_LVDS_ALWAYS_ONb
|
651 RADEON_PIXCLK_TMDS_ALWAYS_ONb
|
652 R300_PIXCLK_TRANS_ALWAYS_ONb
|
653 R300_PIXCLK_TVO_ALWAYS_ONb
|
654 R300_P2G2CLK_ALWAYS_ONb
|
655 R300_P2G2CLK_ALWAYS_ONb
|
656 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF
);
657 WREG32_PLL(RADEON_PIXCLKS_CNTL
, tmp
);
658 } else if (rdev
->family
>= CHIP_RV350
) {
659 /* for RV350/M10, no delays are required. */
660 tmp
= RREG32_PLL(R300_SCLK_CNTL2
);
661 tmp
|= (R300_SCLK_FORCE_TCL
|
662 R300_SCLK_FORCE_GA
| R300_SCLK_FORCE_CBA
);
663 WREG32_PLL(R300_SCLK_CNTL2
, tmp
);
665 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
666 tmp
|= (RADEON_SCLK_FORCE_DISP2
| RADEON_SCLK_FORCE_CP
|
667 RADEON_SCLK_FORCE_HDP
| RADEON_SCLK_FORCE_DISP1
668 | RADEON_SCLK_FORCE_TOP
| RADEON_SCLK_FORCE_E2
|
669 R300_SCLK_FORCE_VAP
| RADEON_SCLK_FORCE_IDCT
|
670 RADEON_SCLK_FORCE_VIP
| R300_SCLK_FORCE_SR
|
671 R300_SCLK_FORCE_PX
| R300_SCLK_FORCE_TX
|
672 R300_SCLK_FORCE_US
| RADEON_SCLK_FORCE_TV_SCLK
|
673 R300_SCLK_FORCE_SU
| RADEON_SCLK_FORCE_OV0
);
674 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
676 tmp
= RREG32_PLL(RADEON_SCLK_MORE_CNTL
);
677 tmp
|= RADEON_SCLK_MORE_FORCEON
;
678 WREG32_PLL(RADEON_SCLK_MORE_CNTL
, tmp
);
680 tmp
= RREG32_PLL(RADEON_MCLK_CNTL
);
681 tmp
|= (RADEON_FORCEON_MCLKA
|
682 RADEON_FORCEON_MCLKB
|
683 RADEON_FORCEON_YCLKA
|
684 RADEON_FORCEON_YCLKB
| RADEON_FORCEON_MC
);
685 WREG32_PLL(RADEON_MCLK_CNTL
, tmp
);
687 tmp
= RREG32_PLL(RADEON_VCLK_ECP_CNTL
);
688 tmp
&= ~(RADEON_PIXCLK_ALWAYS_ONb
|
689 RADEON_PIXCLK_DAC_ALWAYS_ONb
|
690 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF
);
691 WREG32_PLL(RADEON_VCLK_ECP_CNTL
, tmp
);
693 tmp
= RREG32_PLL(RADEON_PIXCLKS_CNTL
);
694 tmp
&= ~(RADEON_PIX2CLK_ALWAYS_ONb
|
695 RADEON_PIX2CLK_DAC_ALWAYS_ONb
|
696 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb
|
697 R300_DVOCLK_ALWAYS_ONb
|
698 RADEON_PIXCLK_BLEND_ALWAYS_ONb
|
699 RADEON_PIXCLK_GV_ALWAYS_ONb
|
700 R300_PIXCLK_DVO_ALWAYS_ONb
|
701 RADEON_PIXCLK_LVDS_ALWAYS_ONb
|
702 RADEON_PIXCLK_TMDS_ALWAYS_ONb
|
703 R300_PIXCLK_TRANS_ALWAYS_ONb
|
704 R300_PIXCLK_TVO_ALWAYS_ONb
|
705 R300_P2G2CLK_ALWAYS_ONb
|
706 R300_P2G2CLK_ALWAYS_ONb
|
707 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF
);
708 WREG32_PLL(RADEON_PIXCLKS_CNTL
, tmp
);
710 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
711 tmp
|= (RADEON_SCLK_FORCE_CP
| RADEON_SCLK_FORCE_E2
);
712 tmp
|= RADEON_SCLK_FORCE_SE
;
714 if (rdev
->flags
& RADEON_SINGLE_CRTC
) {
715 tmp
|= (RADEON_SCLK_FORCE_RB
|
716 RADEON_SCLK_FORCE_TDM
|
717 RADEON_SCLK_FORCE_TAM
|
718 RADEON_SCLK_FORCE_PB
|
719 RADEON_SCLK_FORCE_RE
|
720 RADEON_SCLK_FORCE_VIP
|
721 RADEON_SCLK_FORCE_IDCT
|
722 RADEON_SCLK_FORCE_TOP
|
723 RADEON_SCLK_FORCE_DISP1
|
724 RADEON_SCLK_FORCE_DISP2
|
725 RADEON_SCLK_FORCE_HDP
);
726 } else if ((rdev
->family
== CHIP_R300
) ||
727 (rdev
->family
== CHIP_R350
)) {
728 tmp
|= (RADEON_SCLK_FORCE_HDP
|
729 RADEON_SCLK_FORCE_DISP1
|
730 RADEON_SCLK_FORCE_DISP2
|
731 RADEON_SCLK_FORCE_TOP
|
732 RADEON_SCLK_FORCE_IDCT
|
733 RADEON_SCLK_FORCE_VIP
);
735 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
739 if ((rdev
->family
== CHIP_R300
) ||
740 (rdev
->family
== CHIP_R350
)) {
741 tmp
= RREG32_PLL(R300_SCLK_CNTL2
);
742 tmp
|= (R300_SCLK_FORCE_TCL
|
744 R300_SCLK_FORCE_CBA
);
745 WREG32_PLL(R300_SCLK_CNTL2
, tmp
);
749 if (rdev
->flags
& RADEON_IS_IGP
) {
750 tmp
= RREG32_PLL(RADEON_MCLK_CNTL
);
751 tmp
&= ~(RADEON_FORCEON_MCLKA
|
752 RADEON_FORCEON_YCLKA
);
753 WREG32_PLL(RADEON_MCLK_CNTL
, tmp
);
757 if ((rdev
->family
== CHIP_RV200
) ||
758 (rdev
->family
== CHIP_RV250
) ||
759 (rdev
->family
== CHIP_RV280
)) {
760 tmp
= RREG32_PLL(RADEON_SCLK_MORE_CNTL
);
761 tmp
|= RADEON_SCLK_MORE_FORCEON
;
762 WREG32_PLL(RADEON_SCLK_MORE_CNTL
, tmp
);
766 tmp
= RREG32_PLL(RADEON_PIXCLKS_CNTL
);
767 tmp
&= ~(RADEON_PIX2CLK_ALWAYS_ONb
|
768 RADEON_PIX2CLK_DAC_ALWAYS_ONb
|
769 RADEON_PIXCLK_BLEND_ALWAYS_ONb
|
770 RADEON_PIXCLK_GV_ALWAYS_ONb
|
771 RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb
|
772 RADEON_PIXCLK_LVDS_ALWAYS_ONb
|
773 RADEON_PIXCLK_TMDS_ALWAYS_ONb
);
775 WREG32_PLL(RADEON_PIXCLKS_CNTL
, tmp
);
778 tmp
= RREG32_PLL(RADEON_VCLK_ECP_CNTL
);
779 tmp
&= ~(RADEON_PIXCLK_ALWAYS_ONb
|
780 RADEON_PIXCLK_DAC_ALWAYS_ONb
);
781 WREG32_PLL(RADEON_VCLK_ECP_CNTL
, tmp
);
786 static void radeon_apply_clock_quirks(struct radeon_device
*rdev
)
790 /* XXX make sure engine is idle */
792 if (rdev
->family
< CHIP_RS600
) {
793 tmp
= RREG32_PLL(RADEON_SCLK_CNTL
);
794 if (ASIC_IS_R300(rdev
) || ASIC_IS_RV100(rdev
))
795 tmp
|= RADEON_SCLK_FORCE_CP
| RADEON_SCLK_FORCE_VIP
;
796 if ((rdev
->family
== CHIP_RV250
)
797 || (rdev
->family
== CHIP_RV280
))
799 RADEON_SCLK_FORCE_DISP1
| RADEON_SCLK_FORCE_DISP2
;
800 if ((rdev
->family
== CHIP_RV350
)
801 || (rdev
->family
== CHIP_RV380
))
802 tmp
|= R300_SCLK_FORCE_VAP
;
803 if (rdev
->family
== CHIP_R420
)
804 tmp
|= R300_SCLK_FORCE_PX
| R300_SCLK_FORCE_TX
;
805 WREG32_PLL(RADEON_SCLK_CNTL
, tmp
);
806 } else if (rdev
->family
< CHIP_R600
) {
807 tmp
= RREG32_PLL(AVIVO_CP_DYN_CNTL
);
808 tmp
|= AVIVO_CP_FORCEON
;
809 WREG32_PLL(AVIVO_CP_DYN_CNTL
, tmp
);
811 tmp
= RREG32_PLL(AVIVO_E2_DYN_CNTL
);
812 tmp
|= AVIVO_E2_FORCEON
;
813 WREG32_PLL(AVIVO_E2_DYN_CNTL
, tmp
);
815 tmp
= RREG32_PLL(AVIVO_IDCT_DYN_CNTL
);
816 tmp
|= AVIVO_IDCT_FORCEON
;
817 WREG32_PLL(AVIVO_IDCT_DYN_CNTL
, tmp
);
821 int radeon_static_clocks_init(struct drm_device
*dev
)
823 struct radeon_device
*rdev
= dev
->dev_private
;
825 /* XXX make sure engine is idle */
827 if (radeon_dynclks
!= -1) {
829 radeon_set_clock_gating(rdev
, 1);
831 radeon_apply_clock_quirks(rdev
);