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)
96 * Read XTAL (ref clock), SCLK and MCLK from Open Firmware device
97 * tree. Hopefully, ATI OF driver is kind enough to fill these
99 static bool __devinit radeon_read_clocks_OF(struct drm_device *dev)
101 struct radeon_device *rdev = dev->dev_private;
102 struct device_node *dp = rdev->pdev->dev.of_node;
104 struct radeon_pll *p1pll = &rdev->clock.p1pll;
105 struct radeon_pll *p2pll = &rdev->clock.p2pll;
106 struct radeon_pll *spll = &rdev->clock.spll;
107 struct radeon_pll *mpll = &rdev->clock.mpll;
111 val = of_get_property(dp, "ATY,RefCLK", NULL);
113 printk(KERN_WARNING "radeonfb: No ATY,RefCLK property !\n");
116 p1pll->reference_freq = p2pll->reference_freq = (*val) / 10;
117 p1pll->reference_div = RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
118 if (p1pll->reference_div < 2)
119 p1pll->reference_div = 12;
120 p2pll->reference_div = p1pll->reference_div;
122 /* These aren't in the device-tree */
123 if (rdev->family >= CHIP_R420) {
124 p1pll->pll_in_min = 100;
125 p1pll->pll_in_max = 1350;
126 p1pll->pll_out_min = 20000;
127 p1pll->pll_out_max = 50000;
128 p2pll->pll_in_min = 100;
129 p2pll->pll_in_max = 1350;
130 p2pll->pll_out_min = 20000;
131 p2pll->pll_out_max = 50000;
133 p1pll->pll_in_min = 40;
134 p1pll->pll_in_max = 500;
135 p1pll->pll_out_min = 12500;
136 p1pll->pll_out_max = 35000;
137 p2pll->pll_in_min = 40;
138 p2pll->pll_in_max = 500;
139 p2pll->pll_out_min = 12500;
140 p2pll->pll_out_max = 35000;
143 spll->reference_freq = mpll->reference_freq = p1pll->reference_freq;
144 spll->reference_div = mpll->reference_div =
145 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
146 RADEON_M_SPLL_REF_DIV_MASK;
148 val = of_get_property(dp, "ATY,SCLK", NULL);
150 rdev->clock.default_sclk = (*val) / 10;
152 rdev->clock.default_sclk =
153 radeon_legacy_get_engine_clock(rdev);
155 val = of_get_property(dp, "ATY,MCLK", NULL);
157 rdev->clock.default_mclk = (*val) / 10;
159 rdev->clock.default_mclk =
160 radeon_legacy_get_memory_clock(rdev);
162 DRM_INFO("Using device-tree clock info\n");
167 static bool __devinit radeon_read_clocks_OF(struct drm_device *dev)
171 #endif /* CONFIG_OF */
173 void radeon_get_clock_info(struct drm_device *dev)
175 struct radeon_device *rdev = dev->dev_private;
176 struct radeon_pll *p1pll = &rdev->clock.p1pll;
177 struct radeon_pll *p2pll = &rdev->clock.p2pll;
178 struct radeon_pll *dcpll = &rdev->clock.dcpll;
179 struct radeon_pll *spll = &rdev->clock.spll;
180 struct radeon_pll *mpll = &rdev->clock.mpll;
183 if (rdev->is_atom_bios)
184 ret = radeon_atom_get_clock_info(dev);
186 ret = radeon_combios_get_clock_info(dev);
188 ret = radeon_read_clocks_OF(dev);
191 if (p1pll->reference_div < 2) {
192 if (!ASIC_IS_AVIVO(rdev)) {
193 u32 tmp = RREG32_PLL(RADEON_PPLL_REF_DIV);
194 if (ASIC_IS_R300(rdev))
195 p1pll->reference_div =
196 (tmp & R300_PPLL_REF_DIV_ACC_MASK) >> R300_PPLL_REF_DIV_ACC_SHIFT;
198 p1pll->reference_div = tmp & RADEON_PPLL_REF_DIV_MASK;
199 if (p1pll->reference_div < 2)
200 p1pll->reference_div = 12;
202 p1pll->reference_div = 12;
204 if (p2pll->reference_div < 2)
205 p2pll->reference_div = 12;
206 if (rdev->family < CHIP_RS600) {
207 if (spll->reference_div < 2)
208 spll->reference_div =
209 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
210 RADEON_M_SPLL_REF_DIV_MASK;
212 if (mpll->reference_div < 2)
213 mpll->reference_div = spll->reference_div;
215 if (ASIC_IS_AVIVO(rdev)) {
218 DRM_INFO("Using generic clock info\n");
220 if (rdev->flags & RADEON_IS_IGP) {
221 p1pll->reference_freq = 1432;
222 p2pll->reference_freq = 1432;
223 spll->reference_freq = 1432;
224 mpll->reference_freq = 1432;
226 p1pll->reference_freq = 2700;
227 p2pll->reference_freq = 2700;
228 spll->reference_freq = 2700;
229 mpll->reference_freq = 2700;
231 p1pll->reference_div =
232 RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
233 if (p1pll->reference_div < 2)
234 p1pll->reference_div = 12;
235 p2pll->reference_div = p1pll->reference_div;
237 if (rdev->family >= CHIP_R420) {
238 p1pll->pll_in_min = 100;
239 p1pll->pll_in_max = 1350;
240 p1pll->pll_out_min = 20000;
241 p1pll->pll_out_max = 50000;
242 p2pll->pll_in_min = 100;
243 p2pll->pll_in_max = 1350;
244 p2pll->pll_out_min = 20000;
245 p2pll->pll_out_max = 50000;
247 p1pll->pll_in_min = 40;
248 p1pll->pll_in_max = 500;
249 p1pll->pll_out_min = 12500;
250 p1pll->pll_out_max = 35000;
251 p2pll->pll_in_min = 40;
252 p2pll->pll_in_max = 500;
253 p2pll->pll_out_min = 12500;
254 p2pll->pll_out_max = 35000;
257 spll->reference_div =
258 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
259 RADEON_M_SPLL_REF_DIV_MASK;
260 mpll->reference_div = spll->reference_div;
261 rdev->clock.default_sclk =
262 radeon_legacy_get_engine_clock(rdev);
263 rdev->clock.default_mclk =
264 radeon_legacy_get_memory_clock(rdev);
269 if (ASIC_IS_AVIVO(rdev)) {
270 p1pll->min_post_div = 2;
271 p1pll->max_post_div = 0x7f;
272 p1pll->min_frac_feedback_div = 0;
273 p1pll->max_frac_feedback_div = 9;
274 p2pll->min_post_div = 2;
275 p2pll->max_post_div = 0x7f;
276 p2pll->min_frac_feedback_div = 0;
277 p2pll->max_frac_feedback_div = 9;
279 p1pll->min_post_div = 1;
280 p1pll->max_post_div = 16;
281 p1pll->min_frac_feedback_div = 0;
282 p1pll->max_frac_feedback_div = 0;
283 p2pll->min_post_div = 1;
284 p2pll->max_post_div = 12;
285 p2pll->min_frac_feedback_div = 0;
286 p2pll->max_frac_feedback_div = 0;
289 /* dcpll is DCE4 only */
290 dcpll->min_post_div = 2;
291 dcpll->max_post_div = 0x7f;
292 dcpll->min_frac_feedback_div = 0;
293 dcpll->max_frac_feedback_div = 9;
294 dcpll->min_ref_div = 2;
295 dcpll->max_ref_div = 0x3ff;
296 dcpll->min_feedback_div = 4;
297 dcpll->max_feedback_div = 0xfff;
300 p1pll->min_ref_div = 2;
301 p1pll->max_ref_div = 0x3ff;
302 p1pll->min_feedback_div = 4;
303 p1pll->max_feedback_div = 0x7ff;
306 p2pll->min_ref_div = 2;
307 p2pll->max_ref_div = 0x3ff;
308 p2pll->min_feedback_div = 4;
309 p2pll->max_feedback_div = 0x7ff;
313 spll->min_post_div = 1;
314 spll->max_post_div = 1;
315 spll->min_ref_div = 2;
316 spll->max_ref_div = 0xff;
317 spll->min_feedback_div = 4;
318 spll->max_feedback_div = 0xff;
322 mpll->min_post_div = 1;
323 mpll->max_post_div = 1;
324 mpll->min_ref_div = 2;
325 mpll->max_ref_div = 0xff;
326 mpll->min_feedback_div = 4;
327 mpll->max_feedback_div = 0xff;
333 static uint32_t calc_eng_mem_clock(struct radeon_device *rdev,
335 int *fb_div, int *post_div)
337 struct radeon_pll *spll = &rdev->clock.spll;
338 int ref_div = spll->reference_div;
342 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
343 RADEON_M_SPLL_REF_DIV_MASK;
345 if (req_clock < 15000) {
348 } else if (req_clock < 30000) {
351 } else if (req_clock < 60000) {
357 req_clock *= ref_div;
358 req_clock += spll->reference_freq;
359 req_clock /= (2 * spll->reference_freq);
361 *fb_div = req_clock & 0xff;
363 req_clock = (req_clock & 0xffff) << 1;
364 req_clock *= spll->reference_freq;
365 req_clock /= ref_div;
366 req_clock /= *post_div;
372 void radeon_legacy_set_engine_clock(struct radeon_device *rdev,
376 int fb_div, post_div;
378 /* XXX: wait for idle */
380 eng_clock = calc_eng_mem_clock(rdev, eng_clock, &fb_div, &post_div);
382 tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
383 tmp &= ~RADEON_DONT_USE_XTALIN;
384 WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
386 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
387 tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
388 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
392 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
393 tmp |= RADEON_SPLL_SLEEP;
394 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
398 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
399 tmp |= RADEON_SPLL_RESET;
400 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
404 tmp = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
405 tmp &= ~(RADEON_SPLL_FB_DIV_MASK << RADEON_SPLL_FB_DIV_SHIFT);
406 tmp |= (fb_div & RADEON_SPLL_FB_DIV_MASK) << RADEON_SPLL_FB_DIV_SHIFT;
407 WREG32_PLL(RADEON_M_SPLL_REF_FB_DIV, tmp);
409 /* XXX: verify on different asics */
410 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
411 tmp &= ~RADEON_SPLL_PVG_MASK;
412 if ((eng_clock * post_div) >= 90000)
413 tmp |= (0x7 << RADEON_SPLL_PVG_SHIFT);
415 tmp |= (0x4 << RADEON_SPLL_PVG_SHIFT);
416 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
418 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
419 tmp &= ~RADEON_SPLL_SLEEP;
420 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
424 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
425 tmp &= ~RADEON_SPLL_RESET;
426 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
430 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
431 tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
447 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
451 tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
452 tmp |= RADEON_DONT_USE_XTALIN;
453 WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
458 void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable)
463 if (rdev->flags & RADEON_SINGLE_CRTC) {
464 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
465 if ((RREG32(RADEON_CONFIG_CNTL) &
466 RADEON_CFG_ATI_REV_ID_MASK) >
467 RADEON_CFG_ATI_REV_A13) {
469 ~(RADEON_SCLK_FORCE_CP |
470 RADEON_SCLK_FORCE_RB);
473 ~(RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 |
474 RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_SE |
475 RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_RE |
476 RADEON_SCLK_FORCE_PB | RADEON_SCLK_FORCE_TAM |
477 RADEON_SCLK_FORCE_TDM);
478 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
479 } else if (ASIC_IS_R300(rdev)) {
480 if ((rdev->family == CHIP_RS400) ||
481 (rdev->family == CHIP_RS480)) {
482 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
484 ~(RADEON_SCLK_FORCE_DISP2 |
485 RADEON_SCLK_FORCE_CP |
486 RADEON_SCLK_FORCE_HDP |
487 RADEON_SCLK_FORCE_DISP1 |
488 RADEON_SCLK_FORCE_TOP |
489 RADEON_SCLK_FORCE_E2 | R300_SCLK_FORCE_VAP
490 | RADEON_SCLK_FORCE_IDCT |
491 RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR
492 | R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX
493 | R300_SCLK_FORCE_US |
494 RADEON_SCLK_FORCE_TV_SCLK |
496 RADEON_SCLK_FORCE_OV0);
497 tmp |= RADEON_DYN_STOP_LAT_MASK;
499 RADEON_SCLK_FORCE_TOP |
500 RADEON_SCLK_FORCE_VIP;
501 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
503 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
504 tmp &= ~RADEON_SCLK_MORE_FORCEON;
505 tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
506 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
508 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
509 tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
510 RADEON_PIXCLK_DAC_ALWAYS_ONb);
511 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
513 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
514 tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
515 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
516 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
517 R300_DVOCLK_ALWAYS_ONb |
518 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
519 RADEON_PIXCLK_GV_ALWAYS_ONb |
520 R300_PIXCLK_DVO_ALWAYS_ONb |
521 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
522 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
523 R300_PIXCLK_TRANS_ALWAYS_ONb |
524 R300_PIXCLK_TVO_ALWAYS_ONb |
525 R300_P2G2CLK_ALWAYS_ONb |
526 R300_P2G2CLK_DAC_ALWAYS_ONb);
527 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
528 } else if (rdev->family >= CHIP_RV350) {
529 tmp = RREG32_PLL(R300_SCLK_CNTL2);
530 tmp &= ~(R300_SCLK_FORCE_TCL |
532 R300_SCLK_FORCE_CBA);
533 tmp |= (R300_SCLK_TCL_MAX_DYN_STOP_LAT |
534 R300_SCLK_GA_MAX_DYN_STOP_LAT |
535 R300_SCLK_CBA_MAX_DYN_STOP_LAT);
536 WREG32_PLL(R300_SCLK_CNTL2, tmp);
538 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
540 ~(RADEON_SCLK_FORCE_DISP2 |
541 RADEON_SCLK_FORCE_CP |
542 RADEON_SCLK_FORCE_HDP |
543 RADEON_SCLK_FORCE_DISP1 |
544 RADEON_SCLK_FORCE_TOP |
545 RADEON_SCLK_FORCE_E2 | R300_SCLK_FORCE_VAP
546 | RADEON_SCLK_FORCE_IDCT |
547 RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR
548 | R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX
549 | R300_SCLK_FORCE_US |
550 RADEON_SCLK_FORCE_TV_SCLK |
552 RADEON_SCLK_FORCE_OV0);
553 tmp |= RADEON_DYN_STOP_LAT_MASK;
554 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
556 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
557 tmp &= ~RADEON_SCLK_MORE_FORCEON;
558 tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
559 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
561 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
562 tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
563 RADEON_PIXCLK_DAC_ALWAYS_ONb);
564 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
566 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
567 tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
568 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
569 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
570 R300_DVOCLK_ALWAYS_ONb |
571 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
572 RADEON_PIXCLK_GV_ALWAYS_ONb |
573 R300_PIXCLK_DVO_ALWAYS_ONb |
574 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
575 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
576 R300_PIXCLK_TRANS_ALWAYS_ONb |
577 R300_PIXCLK_TVO_ALWAYS_ONb |
578 R300_P2G2CLK_ALWAYS_ONb |
579 R300_P2G2CLK_DAC_ALWAYS_ONb);
580 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
582 tmp = RREG32_PLL(RADEON_MCLK_MISC);
583 tmp |= (RADEON_MC_MCLK_DYN_ENABLE |
584 RADEON_IO_MCLK_DYN_ENABLE);
585 WREG32_PLL(RADEON_MCLK_MISC, tmp);
587 tmp = RREG32_PLL(RADEON_MCLK_CNTL);
588 tmp |= (RADEON_FORCEON_MCLKA |
589 RADEON_FORCEON_MCLKB);
591 tmp &= ~(RADEON_FORCEON_YCLKA |
592 RADEON_FORCEON_YCLKB |
595 /* Some releases of vbios have set DISABLE_MC_MCLKA
596 and DISABLE_MC_MCLKB bits in the vbios table. Setting these
597 bits will cause H/W hang when reading video memory with dynamic clocking
599 if ((tmp & R300_DISABLE_MC_MCLKA) &&
600 (tmp & R300_DISABLE_MC_MCLKB)) {
601 /* If both bits are set, then check the active channels */
602 tmp = RREG32_PLL(RADEON_MCLK_CNTL);
603 if (rdev->mc.vram_width == 64) {
604 if (RREG32(RADEON_MEM_CNTL) &
605 R300_MEM_USE_CD_CH_ONLY)
607 ~R300_DISABLE_MC_MCLKB;
610 ~R300_DISABLE_MC_MCLKA;
612 tmp &= ~(R300_DISABLE_MC_MCLKA |
613 R300_DISABLE_MC_MCLKB);
617 WREG32_PLL(RADEON_MCLK_CNTL, tmp);
619 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
620 tmp &= ~(R300_SCLK_FORCE_VAP);
621 tmp |= RADEON_SCLK_FORCE_CP;
622 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
625 tmp = RREG32_PLL(R300_SCLK_CNTL2);
626 tmp &= ~(R300_SCLK_FORCE_TCL |
628 R300_SCLK_FORCE_CBA);
629 WREG32_PLL(R300_SCLK_CNTL2, tmp);
632 tmp = RREG32_PLL(RADEON_CLK_PWRMGT_CNTL);
634 tmp &= ~(RADEON_ACTIVE_HILO_LAT_MASK |
635 RADEON_DISP_DYN_STOP_LAT_MASK |
636 RADEON_DYN_STOP_MODE_MASK);
638 tmp |= (RADEON_ENGIN_DYNCLK_MODE |
639 (0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT));
640 WREG32_PLL(RADEON_CLK_PWRMGT_CNTL, tmp);
643 tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
644 tmp |= RADEON_SCLK_DYN_START_CNTL;
645 WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
648 /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200
649 to lockup randomly, leave them as set by BIOS.
651 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
652 /*tmp &= RADEON_SCLK_SRC_SEL_MASK; */
653 tmp &= ~RADEON_SCLK_FORCEON_MASK;
655 /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300 */
656 if (((rdev->family == CHIP_RV250) &&
657 ((RREG32(RADEON_CONFIG_CNTL) &
658 RADEON_CFG_ATI_REV_ID_MASK) <
659 RADEON_CFG_ATI_REV_A13))
660 || ((rdev->family == CHIP_RV100)
662 ((RREG32(RADEON_CONFIG_CNTL) &
663 RADEON_CFG_ATI_REV_ID_MASK) <=
664 RADEON_CFG_ATI_REV_A13))) {
665 tmp |= RADEON_SCLK_FORCE_CP;
666 tmp |= RADEON_SCLK_FORCE_VIP;
669 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
671 if ((rdev->family == CHIP_RV200) ||
672 (rdev->family == CHIP_RV250) ||
673 (rdev->family == CHIP_RV280)) {
674 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
675 tmp &= ~RADEON_SCLK_MORE_FORCEON;
677 /* RV200::A11 A12 RV250::A11 A12 */
678 if (((rdev->family == CHIP_RV200) ||
679 (rdev->family == CHIP_RV250)) &&
680 ((RREG32(RADEON_CONFIG_CNTL) &
681 RADEON_CFG_ATI_REV_ID_MASK) <
682 RADEON_CFG_ATI_REV_A13)) {
683 tmp |= RADEON_SCLK_MORE_FORCEON;
685 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
689 /* RV200::A11 A12, RV250::A11 A12 */
690 if (((rdev->family == CHIP_RV200) ||
691 (rdev->family == CHIP_RV250)) &&
692 ((RREG32(RADEON_CONFIG_CNTL) &
693 RADEON_CFG_ATI_REV_ID_MASK) <
694 RADEON_CFG_ATI_REV_A13)) {
695 tmp = RREG32_PLL(RADEON_PLL_PWRMGT_CNTL);
696 tmp |= RADEON_TCL_BYPASS_DISABLE;
697 WREG32_PLL(RADEON_PLL_PWRMGT_CNTL, tmp);
701 /*enable dynamic mode for display clocks (PIXCLK and PIX2CLK) */
702 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
703 tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
704 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
705 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
706 RADEON_PIXCLK_GV_ALWAYS_ONb |
707 RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
708 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
709 RADEON_PIXCLK_TMDS_ALWAYS_ONb);
711 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
714 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
715 tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
716 RADEON_PIXCLK_DAC_ALWAYS_ONb);
718 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
722 /* Turn everything OFF (ForceON to everything) */
723 if (rdev->flags & RADEON_SINGLE_CRTC) {
724 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
725 tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_HDP |
726 RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_TOP
727 | RADEON_SCLK_FORCE_E2 | RADEON_SCLK_FORCE_SE |
728 RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_VIP |
729 RADEON_SCLK_FORCE_RE | RADEON_SCLK_FORCE_PB |
730 RADEON_SCLK_FORCE_TAM | RADEON_SCLK_FORCE_TDM |
731 RADEON_SCLK_FORCE_RB);
732 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
733 } else if ((rdev->family == CHIP_RS400) ||
734 (rdev->family == CHIP_RS480)) {
735 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
736 tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP |
737 RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1
738 | RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 |
739 R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT |
740 RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR |
741 R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX |
742 R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK |
743 R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0);
744 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
746 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
747 tmp |= RADEON_SCLK_MORE_FORCEON;
748 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
750 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
751 tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
752 RADEON_PIXCLK_DAC_ALWAYS_ONb |
753 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
754 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
756 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
757 tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
758 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
759 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
760 R300_DVOCLK_ALWAYS_ONb |
761 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
762 RADEON_PIXCLK_GV_ALWAYS_ONb |
763 R300_PIXCLK_DVO_ALWAYS_ONb |
764 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
765 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
766 R300_PIXCLK_TRANS_ALWAYS_ONb |
767 R300_PIXCLK_TVO_ALWAYS_ONb |
768 R300_P2G2CLK_ALWAYS_ONb |
769 R300_P2G2CLK_DAC_ALWAYS_ONb |
770 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
771 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
772 } else if (rdev->family >= CHIP_RV350) {
773 /* for RV350/M10, no delays are required. */
774 tmp = RREG32_PLL(R300_SCLK_CNTL2);
775 tmp |= (R300_SCLK_FORCE_TCL |
776 R300_SCLK_FORCE_GA | R300_SCLK_FORCE_CBA);
777 WREG32_PLL(R300_SCLK_CNTL2, tmp);
779 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
780 tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP |
781 RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1
782 | RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 |
783 R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT |
784 RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR |
785 R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX |
786 R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK |
787 R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0);
788 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
790 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
791 tmp |= RADEON_SCLK_MORE_FORCEON;
792 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
794 tmp = RREG32_PLL(RADEON_MCLK_CNTL);
795 tmp |= (RADEON_FORCEON_MCLKA |
796 RADEON_FORCEON_MCLKB |
797 RADEON_FORCEON_YCLKA |
798 RADEON_FORCEON_YCLKB | RADEON_FORCEON_MC);
799 WREG32_PLL(RADEON_MCLK_CNTL, tmp);
801 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
802 tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
803 RADEON_PIXCLK_DAC_ALWAYS_ONb |
804 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
805 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
807 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
808 tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
809 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
810 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
811 R300_DVOCLK_ALWAYS_ONb |
812 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
813 RADEON_PIXCLK_GV_ALWAYS_ONb |
814 R300_PIXCLK_DVO_ALWAYS_ONb |
815 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
816 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
817 R300_PIXCLK_TRANS_ALWAYS_ONb |
818 R300_PIXCLK_TVO_ALWAYS_ONb |
819 R300_P2G2CLK_ALWAYS_ONb |
820 R300_P2G2CLK_DAC_ALWAYS_ONb |
821 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
822 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
824 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
825 tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_E2);
826 tmp |= RADEON_SCLK_FORCE_SE;
828 if (rdev->flags & RADEON_SINGLE_CRTC) {
829 tmp |= (RADEON_SCLK_FORCE_RB |
830 RADEON_SCLK_FORCE_TDM |
831 RADEON_SCLK_FORCE_TAM |
832 RADEON_SCLK_FORCE_PB |
833 RADEON_SCLK_FORCE_RE |
834 RADEON_SCLK_FORCE_VIP |
835 RADEON_SCLK_FORCE_IDCT |
836 RADEON_SCLK_FORCE_TOP |
837 RADEON_SCLK_FORCE_DISP1 |
838 RADEON_SCLK_FORCE_DISP2 |
839 RADEON_SCLK_FORCE_HDP);
840 } else if ((rdev->family == CHIP_R300) ||
841 (rdev->family == CHIP_R350)) {
842 tmp |= (RADEON_SCLK_FORCE_HDP |
843 RADEON_SCLK_FORCE_DISP1 |
844 RADEON_SCLK_FORCE_DISP2 |
845 RADEON_SCLK_FORCE_TOP |
846 RADEON_SCLK_FORCE_IDCT |
847 RADEON_SCLK_FORCE_VIP);
849 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
853 if ((rdev->family == CHIP_R300) ||
854 (rdev->family == CHIP_R350)) {
855 tmp = RREG32_PLL(R300_SCLK_CNTL2);
856 tmp |= (R300_SCLK_FORCE_TCL |
858 R300_SCLK_FORCE_CBA);
859 WREG32_PLL(R300_SCLK_CNTL2, tmp);
863 if (rdev->flags & RADEON_IS_IGP) {
864 tmp = RREG32_PLL(RADEON_MCLK_CNTL);
865 tmp &= ~(RADEON_FORCEON_MCLKA |
866 RADEON_FORCEON_YCLKA);
867 WREG32_PLL(RADEON_MCLK_CNTL, tmp);
871 if ((rdev->family == CHIP_RV200) ||
872 (rdev->family == CHIP_RV250) ||
873 (rdev->family == CHIP_RV280)) {
874 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
875 tmp |= RADEON_SCLK_MORE_FORCEON;
876 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
880 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
881 tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
882 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
883 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
884 RADEON_PIXCLK_GV_ALWAYS_ONb |
885 RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
886 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
887 RADEON_PIXCLK_TMDS_ALWAYS_ONb);
889 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
892 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
893 tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
894 RADEON_PIXCLK_DAC_ALWAYS_ONb);
895 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
900 static void radeon_apply_clock_quirks(struct radeon_device *rdev)
904 /* XXX make sure engine is idle */
906 if (rdev->family < CHIP_RS600) {
907 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
908 if (ASIC_IS_R300(rdev) || ASIC_IS_RV100(rdev))
909 tmp |= RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_VIP;
910 if ((rdev->family == CHIP_RV250)
911 || (rdev->family == CHIP_RV280))
913 RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_DISP2;
914 if ((rdev->family == CHIP_RV350)
915 || (rdev->family == CHIP_RV380))
916 tmp |= R300_SCLK_FORCE_VAP;
917 if (rdev->family == CHIP_R420)
918 tmp |= R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX;
919 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
920 } else if (rdev->family < CHIP_R600) {
921 tmp = RREG32_PLL(AVIVO_CP_DYN_CNTL);
922 tmp |= AVIVO_CP_FORCEON;
923 WREG32_PLL(AVIVO_CP_DYN_CNTL, tmp);
925 tmp = RREG32_PLL(AVIVO_E2_DYN_CNTL);
926 tmp |= AVIVO_E2_FORCEON;
927 WREG32_PLL(AVIVO_E2_DYN_CNTL, tmp);
929 tmp = RREG32_PLL(AVIVO_IDCT_DYN_CNTL);
930 tmp |= AVIVO_IDCT_FORCEON;
931 WREG32_PLL(AVIVO_IDCT_DYN_CNTL, tmp);
935 int radeon_static_clocks_init(struct drm_device *dev)
937 struct radeon_device *rdev = dev->dev_private;
939 /* XXX make sure engine is idle */
941 if (radeon_dynclks != -1) {
942 if (radeon_dynclks) {
943 if (rdev->asic->set_clock_gating)
944 radeon_set_clock_gating(rdev, 1);
947 radeon_apply_clock_quirks(rdev);