Loading...
1/*
2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
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:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
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.
23 *
24 * Authors: Dave Airlie
25 * Alex Deucher
26 * Jerome Glisse
27 */
28
29#include <linux/pci.h>
30
31#include <drm/drm_device.h>
32#include <drm/radeon_drm.h>
33
34#include "atom.h"
35#include "radeon.h"
36#include "radeon_asic.h"
37#include "radeon_reg.h"
38
39/* 10 khz */
40uint32_t radeon_legacy_get_engine_clock(struct radeon_device *rdev)
41{
42 struct radeon_pll *spll = &rdev->clock.spll;
43 uint32_t fb_div, ref_div, post_div, sclk;
44
45 fb_div = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
46 fb_div = (fb_div >> RADEON_SPLL_FB_DIV_SHIFT) & RADEON_SPLL_FB_DIV_MASK;
47 fb_div <<= 1;
48 fb_div *= spll->reference_freq;
49
50 ref_div =
51 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) & RADEON_M_SPLL_REF_DIV_MASK;
52
53 if (ref_div == 0)
54 return 0;
55
56 sclk = fb_div / ref_div;
57
58 post_div = RREG32_PLL(RADEON_SCLK_CNTL) & RADEON_SCLK_SRC_SEL_MASK;
59 if (post_div == 2)
60 sclk >>= 1;
61 else if (post_div == 3)
62 sclk >>= 2;
63 else if (post_div == 4)
64 sclk >>= 3;
65
66 return sclk;
67}
68
69/* 10 khz */
70uint32_t radeon_legacy_get_memory_clock(struct radeon_device *rdev)
71{
72 struct radeon_pll *mpll = &rdev->clock.mpll;
73 uint32_t fb_div, ref_div, post_div, mclk;
74
75 fb_div = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
76 fb_div = (fb_div >> RADEON_MPLL_FB_DIV_SHIFT) & RADEON_MPLL_FB_DIV_MASK;
77 fb_div <<= 1;
78 fb_div *= mpll->reference_freq;
79
80 ref_div =
81 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) & RADEON_M_SPLL_REF_DIV_MASK;
82
83 if (ref_div == 0)
84 return 0;
85
86 mclk = fb_div / ref_div;
87
88 post_div = RREG32_PLL(RADEON_MCLK_CNTL) & 0x7;
89 if (post_div == 2)
90 mclk >>= 1;
91 else if (post_div == 3)
92 mclk >>= 2;
93 else if (post_div == 4)
94 mclk >>= 3;
95
96 return mclk;
97}
98
99#ifdef CONFIG_OF
100/*
101 * Read XTAL (ref clock), SCLK and MCLK from Open Firmware device
102 * tree. Hopefully, ATI OF driver is kind enough to fill these
103 */
104static bool radeon_read_clocks_OF(struct drm_device *dev)
105{
106 struct radeon_device *rdev = dev->dev_private;
107 struct device_node *dp = rdev->pdev->dev.of_node;
108 const u32 *val;
109 struct radeon_pll *p1pll = &rdev->clock.p1pll;
110 struct radeon_pll *p2pll = &rdev->clock.p2pll;
111 struct radeon_pll *spll = &rdev->clock.spll;
112 struct radeon_pll *mpll = &rdev->clock.mpll;
113
114 if (dp == NULL)
115 return false;
116 val = of_get_property(dp, "ATY,RefCLK", NULL);
117 if (!val || !*val) {
118 pr_warn("radeonfb: No ATY,RefCLK property !\n");
119 return false;
120 }
121 p1pll->reference_freq = p2pll->reference_freq = (*val) / 10;
122 p1pll->reference_div = RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
123 if (p1pll->reference_div < 2)
124 p1pll->reference_div = 12;
125 p2pll->reference_div = p1pll->reference_div;
126
127 /* These aren't in the device-tree */
128 if (rdev->family >= CHIP_R420) {
129 p1pll->pll_in_min = 100;
130 p1pll->pll_in_max = 1350;
131 p1pll->pll_out_min = 20000;
132 p1pll->pll_out_max = 50000;
133 p2pll->pll_in_min = 100;
134 p2pll->pll_in_max = 1350;
135 p2pll->pll_out_min = 20000;
136 p2pll->pll_out_max = 50000;
137 } else {
138 p1pll->pll_in_min = 40;
139 p1pll->pll_in_max = 500;
140 p1pll->pll_out_min = 12500;
141 p1pll->pll_out_max = 35000;
142 p2pll->pll_in_min = 40;
143 p2pll->pll_in_max = 500;
144 p2pll->pll_out_min = 12500;
145 p2pll->pll_out_max = 35000;
146 }
147 /* not sure what the max should be in all cases */
148 rdev->clock.max_pixel_clock = 35000;
149
150 spll->reference_freq = mpll->reference_freq = p1pll->reference_freq;
151 spll->reference_div = mpll->reference_div =
152 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
153 RADEON_M_SPLL_REF_DIV_MASK;
154
155 val = of_get_property(dp, "ATY,SCLK", NULL);
156 if (val && *val)
157 rdev->clock.default_sclk = (*val) / 10;
158 else
159 rdev->clock.default_sclk =
160 radeon_legacy_get_engine_clock(rdev);
161
162 val = of_get_property(dp, "ATY,MCLK", NULL);
163 if (val && *val)
164 rdev->clock.default_mclk = (*val) / 10;
165 else
166 rdev->clock.default_mclk =
167 radeon_legacy_get_memory_clock(rdev);
168
169 DRM_INFO("Using device-tree clock info\n");
170
171 return true;
172}
173#else
174static bool radeon_read_clocks_OF(struct drm_device *dev)
175{
176 return false;
177}
178#endif /* CONFIG_OF */
179
180void radeon_get_clock_info(struct drm_device *dev)
181{
182 struct radeon_device *rdev = dev->dev_private;
183 struct radeon_pll *p1pll = &rdev->clock.p1pll;
184 struct radeon_pll *p2pll = &rdev->clock.p2pll;
185 struct radeon_pll *dcpll = &rdev->clock.dcpll;
186 struct radeon_pll *spll = &rdev->clock.spll;
187 struct radeon_pll *mpll = &rdev->clock.mpll;
188 int ret;
189
190 if (rdev->is_atom_bios)
191 ret = radeon_atom_get_clock_info(dev);
192 else
193 ret = radeon_combios_get_clock_info(dev);
194 if (!ret)
195 ret = radeon_read_clocks_OF(dev);
196
197 if (ret) {
198 if (p1pll->reference_div < 2) {
199 if (!ASIC_IS_AVIVO(rdev)) {
200 u32 tmp = RREG32_PLL(RADEON_PPLL_REF_DIV);
201 if (ASIC_IS_R300(rdev))
202 p1pll->reference_div =
203 (tmp & R300_PPLL_REF_DIV_ACC_MASK) >> R300_PPLL_REF_DIV_ACC_SHIFT;
204 else
205 p1pll->reference_div = tmp & RADEON_PPLL_REF_DIV_MASK;
206 if (p1pll->reference_div < 2)
207 p1pll->reference_div = 12;
208 } else
209 p1pll->reference_div = 12;
210 }
211 if (p2pll->reference_div < 2)
212 p2pll->reference_div = 12;
213 if (rdev->family < CHIP_RS600) {
214 if (spll->reference_div < 2)
215 spll->reference_div =
216 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
217 RADEON_M_SPLL_REF_DIV_MASK;
218 }
219 if (mpll->reference_div < 2)
220 mpll->reference_div = spll->reference_div;
221 } else {
222 if (ASIC_IS_AVIVO(rdev)) {
223 /* TODO FALLBACK */
224 } else {
225 DRM_INFO("Using generic clock info\n");
226
227 /* may need to be per card */
228 rdev->clock.max_pixel_clock = 35000;
229
230 if (rdev->flags & RADEON_IS_IGP) {
231 p1pll->reference_freq = 1432;
232 p2pll->reference_freq = 1432;
233 spll->reference_freq = 1432;
234 mpll->reference_freq = 1432;
235 } else {
236 p1pll->reference_freq = 2700;
237 p2pll->reference_freq = 2700;
238 spll->reference_freq = 2700;
239 mpll->reference_freq = 2700;
240 }
241 p1pll->reference_div =
242 RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
243 if (p1pll->reference_div < 2)
244 p1pll->reference_div = 12;
245 p2pll->reference_div = p1pll->reference_div;
246
247 if (rdev->family >= CHIP_R420) {
248 p1pll->pll_in_min = 100;
249 p1pll->pll_in_max = 1350;
250 p1pll->pll_out_min = 20000;
251 p1pll->pll_out_max = 50000;
252 p2pll->pll_in_min = 100;
253 p2pll->pll_in_max = 1350;
254 p2pll->pll_out_min = 20000;
255 p2pll->pll_out_max = 50000;
256 } else {
257 p1pll->pll_in_min = 40;
258 p1pll->pll_in_max = 500;
259 p1pll->pll_out_min = 12500;
260 p1pll->pll_out_max = 35000;
261 p2pll->pll_in_min = 40;
262 p2pll->pll_in_max = 500;
263 p2pll->pll_out_min = 12500;
264 p2pll->pll_out_max = 35000;
265 }
266
267 spll->reference_div =
268 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
269 RADEON_M_SPLL_REF_DIV_MASK;
270 mpll->reference_div = spll->reference_div;
271 rdev->clock.default_sclk =
272 radeon_legacy_get_engine_clock(rdev);
273 rdev->clock.default_mclk =
274 radeon_legacy_get_memory_clock(rdev);
275 }
276 }
277
278 /* pixel clocks */
279 if (ASIC_IS_AVIVO(rdev)) {
280 p1pll->min_post_div = 2;
281 p1pll->max_post_div = 0x7f;
282 p1pll->min_frac_feedback_div = 0;
283 p1pll->max_frac_feedback_div = 9;
284 p2pll->min_post_div = 2;
285 p2pll->max_post_div = 0x7f;
286 p2pll->min_frac_feedback_div = 0;
287 p2pll->max_frac_feedback_div = 9;
288 } else {
289 p1pll->min_post_div = 1;
290 p1pll->max_post_div = 16;
291 p1pll->min_frac_feedback_div = 0;
292 p1pll->max_frac_feedback_div = 0;
293 p2pll->min_post_div = 1;
294 p2pll->max_post_div = 12;
295 p2pll->min_frac_feedback_div = 0;
296 p2pll->max_frac_feedback_div = 0;
297 }
298
299 /* dcpll is DCE4 only */
300 dcpll->min_post_div = 2;
301 dcpll->max_post_div = 0x7f;
302 dcpll->min_frac_feedback_div = 0;
303 dcpll->max_frac_feedback_div = 9;
304 dcpll->min_ref_div = 2;
305 dcpll->max_ref_div = 0x3ff;
306 dcpll->min_feedback_div = 4;
307 dcpll->max_feedback_div = 0xfff;
308 dcpll->best_vco = 0;
309
310 p1pll->min_ref_div = 2;
311 p1pll->max_ref_div = 0x3ff;
312 p1pll->min_feedback_div = 4;
313 p1pll->max_feedback_div = 0x7ff;
314 p1pll->best_vco = 0;
315
316 p2pll->min_ref_div = 2;
317 p2pll->max_ref_div = 0x3ff;
318 p2pll->min_feedback_div = 4;
319 p2pll->max_feedback_div = 0x7ff;
320 p2pll->best_vco = 0;
321
322 /* system clock */
323 spll->min_post_div = 1;
324 spll->max_post_div = 1;
325 spll->min_ref_div = 2;
326 spll->max_ref_div = 0xff;
327 spll->min_feedback_div = 4;
328 spll->max_feedback_div = 0xff;
329 spll->best_vco = 0;
330
331 /* memory clock */
332 mpll->min_post_div = 1;
333 mpll->max_post_div = 1;
334 mpll->min_ref_div = 2;
335 mpll->max_ref_div = 0xff;
336 mpll->min_feedback_div = 4;
337 mpll->max_feedback_div = 0xff;
338 mpll->best_vco = 0;
339
340 if (!rdev->clock.default_sclk)
341 rdev->clock.default_sclk = radeon_get_engine_clock(rdev);
342 if ((!rdev->clock.default_mclk) && rdev->asic->pm.get_memory_clock)
343 rdev->clock.default_mclk = radeon_get_memory_clock(rdev);
344
345 rdev->pm.current_sclk = rdev->clock.default_sclk;
346 rdev->pm.current_mclk = rdev->clock.default_mclk;
347
348}
349
350/* 10 khz */
351static uint32_t calc_eng_mem_clock(struct radeon_device *rdev,
352 uint32_t req_clock,
353 int *fb_div, int *post_div)
354{
355 struct radeon_pll *spll = &rdev->clock.spll;
356 int ref_div = spll->reference_div;
357
358 if (!ref_div)
359 ref_div =
360 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
361 RADEON_M_SPLL_REF_DIV_MASK;
362
363 if (req_clock < 15000) {
364 *post_div = 8;
365 req_clock *= 8;
366 } else if (req_clock < 30000) {
367 *post_div = 4;
368 req_clock *= 4;
369 } else if (req_clock < 60000) {
370 *post_div = 2;
371 req_clock *= 2;
372 } else
373 *post_div = 1;
374
375 req_clock *= ref_div;
376 req_clock += spll->reference_freq;
377 req_clock /= (2 * spll->reference_freq);
378
379 *fb_div = req_clock & 0xff;
380
381 req_clock = (req_clock & 0xffff) << 1;
382 req_clock *= spll->reference_freq;
383 req_clock /= ref_div;
384 req_clock /= *post_div;
385
386 return req_clock;
387}
388
389/* 10 khz */
390void radeon_legacy_set_engine_clock(struct radeon_device *rdev,
391 uint32_t eng_clock)
392{
393 uint32_t tmp;
394 int fb_div, post_div;
395
396 /* XXX: wait for idle */
397
398 eng_clock = calc_eng_mem_clock(rdev, eng_clock, &fb_div, &post_div);
399
400 tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
401 tmp &= ~RADEON_DONT_USE_XTALIN;
402 WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
403
404 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
405 tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
406 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
407
408 udelay(10);
409
410 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
411 tmp |= RADEON_SPLL_SLEEP;
412 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
413
414 udelay(2);
415
416 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
417 tmp |= RADEON_SPLL_RESET;
418 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
419
420 udelay(200);
421
422 tmp = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
423 tmp &= ~(RADEON_SPLL_FB_DIV_MASK << RADEON_SPLL_FB_DIV_SHIFT);
424 tmp |= (fb_div & RADEON_SPLL_FB_DIV_MASK) << RADEON_SPLL_FB_DIV_SHIFT;
425 WREG32_PLL(RADEON_M_SPLL_REF_FB_DIV, tmp);
426
427 /* XXX: verify on different asics */
428 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
429 tmp &= ~RADEON_SPLL_PVG_MASK;
430 if ((eng_clock * post_div) >= 90000)
431 tmp |= (0x7 << RADEON_SPLL_PVG_SHIFT);
432 else
433 tmp |= (0x4 << RADEON_SPLL_PVG_SHIFT);
434 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
435
436 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
437 tmp &= ~RADEON_SPLL_SLEEP;
438 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
439
440 udelay(2);
441
442 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
443 tmp &= ~RADEON_SPLL_RESET;
444 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
445
446 udelay(200);
447
448 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
449 tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
450 switch (post_div) {
451 case 1:
452 default:
453 tmp |= 1;
454 break;
455 case 2:
456 tmp |= 2;
457 break;
458 case 4:
459 tmp |= 3;
460 break;
461 case 8:
462 tmp |= 4;
463 break;
464 }
465 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
466
467 udelay(20);
468
469 tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
470 tmp |= RADEON_DONT_USE_XTALIN;
471 WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
472
473 udelay(10);
474}
475
476void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable)
477{
478 uint32_t tmp;
479
480 if (enable) {
481 if (rdev->flags & RADEON_SINGLE_CRTC) {
482 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
483 if ((RREG32(RADEON_CONFIG_CNTL) &
484 RADEON_CFG_ATI_REV_ID_MASK) >
485 RADEON_CFG_ATI_REV_A13) {
486 tmp &=
487 ~(RADEON_SCLK_FORCE_CP |
488 RADEON_SCLK_FORCE_RB);
489 }
490 tmp &=
491 ~(RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 |
492 RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_SE |
493 RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_RE |
494 RADEON_SCLK_FORCE_PB | RADEON_SCLK_FORCE_TAM |
495 RADEON_SCLK_FORCE_TDM);
496 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
497 } else if (ASIC_IS_R300(rdev)) {
498 if ((rdev->family == CHIP_RS400) ||
499 (rdev->family == CHIP_RS480)) {
500 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
501 tmp &=
502 ~(RADEON_SCLK_FORCE_DISP2 |
503 RADEON_SCLK_FORCE_CP |
504 RADEON_SCLK_FORCE_HDP |
505 RADEON_SCLK_FORCE_DISP1 |
506 RADEON_SCLK_FORCE_TOP |
507 RADEON_SCLK_FORCE_E2 | R300_SCLK_FORCE_VAP
508 | RADEON_SCLK_FORCE_IDCT |
509 RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR
510 | R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX
511 | R300_SCLK_FORCE_US |
512 RADEON_SCLK_FORCE_TV_SCLK |
513 R300_SCLK_FORCE_SU |
514 RADEON_SCLK_FORCE_OV0);
515 tmp |= RADEON_DYN_STOP_LAT_MASK;
516 tmp |=
517 RADEON_SCLK_FORCE_TOP |
518 RADEON_SCLK_FORCE_VIP;
519 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
520
521 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
522 tmp &= ~RADEON_SCLK_MORE_FORCEON;
523 tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
524 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
525
526 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
527 tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
528 RADEON_PIXCLK_DAC_ALWAYS_ONb);
529 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
530
531 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
532 tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
533 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
534 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
535 R300_DVOCLK_ALWAYS_ONb |
536 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
537 RADEON_PIXCLK_GV_ALWAYS_ONb |
538 R300_PIXCLK_DVO_ALWAYS_ONb |
539 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
540 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
541 R300_PIXCLK_TRANS_ALWAYS_ONb |
542 R300_PIXCLK_TVO_ALWAYS_ONb |
543 R300_P2G2CLK_ALWAYS_ONb |
544 R300_P2G2CLK_DAC_ALWAYS_ONb);
545 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
546 } else if (rdev->family >= CHIP_RV350) {
547 tmp = RREG32_PLL(R300_SCLK_CNTL2);
548 tmp &= ~(R300_SCLK_FORCE_TCL |
549 R300_SCLK_FORCE_GA |
550 R300_SCLK_FORCE_CBA);
551 tmp |= (R300_SCLK_TCL_MAX_DYN_STOP_LAT |
552 R300_SCLK_GA_MAX_DYN_STOP_LAT |
553 R300_SCLK_CBA_MAX_DYN_STOP_LAT);
554 WREG32_PLL(R300_SCLK_CNTL2, tmp);
555
556 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
557 tmp &=
558 ~(RADEON_SCLK_FORCE_DISP2 |
559 RADEON_SCLK_FORCE_CP |
560 RADEON_SCLK_FORCE_HDP |
561 RADEON_SCLK_FORCE_DISP1 |
562 RADEON_SCLK_FORCE_TOP |
563 RADEON_SCLK_FORCE_E2 | R300_SCLK_FORCE_VAP
564 | RADEON_SCLK_FORCE_IDCT |
565 RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR
566 | R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX
567 | R300_SCLK_FORCE_US |
568 RADEON_SCLK_FORCE_TV_SCLK |
569 R300_SCLK_FORCE_SU |
570 RADEON_SCLK_FORCE_OV0);
571 tmp |= RADEON_DYN_STOP_LAT_MASK;
572 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
573
574 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
575 tmp &= ~RADEON_SCLK_MORE_FORCEON;
576 tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
577 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
578
579 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
580 tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
581 RADEON_PIXCLK_DAC_ALWAYS_ONb);
582 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
583
584 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
585 tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
586 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
587 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
588 R300_DVOCLK_ALWAYS_ONb |
589 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
590 RADEON_PIXCLK_GV_ALWAYS_ONb |
591 R300_PIXCLK_DVO_ALWAYS_ONb |
592 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
593 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
594 R300_PIXCLK_TRANS_ALWAYS_ONb |
595 R300_PIXCLK_TVO_ALWAYS_ONb |
596 R300_P2G2CLK_ALWAYS_ONb |
597 R300_P2G2CLK_DAC_ALWAYS_ONb);
598 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
599
600 tmp = RREG32_PLL(RADEON_MCLK_MISC);
601 tmp |= (RADEON_MC_MCLK_DYN_ENABLE |
602 RADEON_IO_MCLK_DYN_ENABLE);
603 WREG32_PLL(RADEON_MCLK_MISC, tmp);
604
605 tmp = RREG32_PLL(RADEON_MCLK_CNTL);
606 tmp |= (RADEON_FORCEON_MCLKA |
607 RADEON_FORCEON_MCLKB);
608
609 tmp &= ~(RADEON_FORCEON_YCLKA |
610 RADEON_FORCEON_YCLKB |
611 RADEON_FORCEON_MC);
612
613 /* Some releases of vbios have set DISABLE_MC_MCLKA
614 and DISABLE_MC_MCLKB bits in the vbios table. Setting these
615 bits will cause H/W hang when reading video memory with dynamic clocking
616 enabled. */
617 if ((tmp & R300_DISABLE_MC_MCLKA) &&
618 (tmp & R300_DISABLE_MC_MCLKB)) {
619 /* If both bits are set, then check the active channels */
620 tmp = RREG32_PLL(RADEON_MCLK_CNTL);
621 if (rdev->mc.vram_width == 64) {
622 if (RREG32(RADEON_MEM_CNTL) &
623 R300_MEM_USE_CD_CH_ONLY)
624 tmp &=
625 ~R300_DISABLE_MC_MCLKB;
626 else
627 tmp &=
628 ~R300_DISABLE_MC_MCLKA;
629 } else {
630 tmp &= ~(R300_DISABLE_MC_MCLKA |
631 R300_DISABLE_MC_MCLKB);
632 }
633 }
634
635 WREG32_PLL(RADEON_MCLK_CNTL, tmp);
636 } else {
637 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
638 tmp &= ~(R300_SCLK_FORCE_VAP);
639 tmp |= RADEON_SCLK_FORCE_CP;
640 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
641 mdelay(15);
642
643 tmp = RREG32_PLL(R300_SCLK_CNTL2);
644 tmp &= ~(R300_SCLK_FORCE_TCL |
645 R300_SCLK_FORCE_GA |
646 R300_SCLK_FORCE_CBA);
647 WREG32_PLL(R300_SCLK_CNTL2, tmp);
648 }
649 } else {
650 tmp = RREG32_PLL(RADEON_CLK_PWRMGT_CNTL);
651
652 tmp &= ~(RADEON_ACTIVE_HILO_LAT_MASK |
653 RADEON_DISP_DYN_STOP_LAT_MASK |
654 RADEON_DYN_STOP_MODE_MASK);
655
656 tmp |= (RADEON_ENGIN_DYNCLK_MODE |
657 (0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT));
658 WREG32_PLL(RADEON_CLK_PWRMGT_CNTL, tmp);
659 mdelay(15);
660
661 tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
662 tmp |= RADEON_SCLK_DYN_START_CNTL;
663 WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
664 mdelay(15);
665
666 /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200
667 to lockup randomly, leave them as set by BIOS.
668 */
669 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
670 /*tmp &= RADEON_SCLK_SRC_SEL_MASK; */
671 tmp &= ~RADEON_SCLK_FORCEON_MASK;
672
673 /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300 */
674 if (((rdev->family == CHIP_RV250) &&
675 ((RREG32(RADEON_CONFIG_CNTL) &
676 RADEON_CFG_ATI_REV_ID_MASK) <
677 RADEON_CFG_ATI_REV_A13))
678 || ((rdev->family == CHIP_RV100)
679 &&
680 ((RREG32(RADEON_CONFIG_CNTL) &
681 RADEON_CFG_ATI_REV_ID_MASK) <=
682 RADEON_CFG_ATI_REV_A13))) {
683 tmp |= RADEON_SCLK_FORCE_CP;
684 tmp |= RADEON_SCLK_FORCE_VIP;
685 }
686
687 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
688
689 if ((rdev->family == CHIP_RV200) ||
690 (rdev->family == CHIP_RV250) ||
691 (rdev->family == CHIP_RV280)) {
692 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
693 tmp &= ~RADEON_SCLK_MORE_FORCEON;
694
695 /* RV200::A11 A12 RV250::A11 A12 */
696 if (((rdev->family == CHIP_RV200) ||
697 (rdev->family == CHIP_RV250)) &&
698 ((RREG32(RADEON_CONFIG_CNTL) &
699 RADEON_CFG_ATI_REV_ID_MASK) <
700 RADEON_CFG_ATI_REV_A13)) {
701 tmp |= RADEON_SCLK_MORE_FORCEON;
702 }
703 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
704 mdelay(15);
705 }
706
707 /* RV200::A11 A12, RV250::A11 A12 */
708 if (((rdev->family == CHIP_RV200) ||
709 (rdev->family == CHIP_RV250)) &&
710 ((RREG32(RADEON_CONFIG_CNTL) &
711 RADEON_CFG_ATI_REV_ID_MASK) <
712 RADEON_CFG_ATI_REV_A13)) {
713 tmp = RREG32_PLL(RADEON_PLL_PWRMGT_CNTL);
714 tmp |= RADEON_TCL_BYPASS_DISABLE;
715 WREG32_PLL(RADEON_PLL_PWRMGT_CNTL, tmp);
716 }
717 mdelay(15);
718
719 /*enable dynamic mode for display clocks (PIXCLK and PIX2CLK) */
720 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
721 tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
722 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
723 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
724 RADEON_PIXCLK_GV_ALWAYS_ONb |
725 RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
726 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
727 RADEON_PIXCLK_TMDS_ALWAYS_ONb);
728
729 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
730 mdelay(15);
731
732 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
733 tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
734 RADEON_PIXCLK_DAC_ALWAYS_ONb);
735
736 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
737 mdelay(15);
738 }
739 } else {
740 /* Turn everything OFF (ForceON to everything) */
741 if (rdev->flags & RADEON_SINGLE_CRTC) {
742 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
743 tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_HDP |
744 RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_TOP
745 | RADEON_SCLK_FORCE_E2 | RADEON_SCLK_FORCE_SE |
746 RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_VIP |
747 RADEON_SCLK_FORCE_RE | RADEON_SCLK_FORCE_PB |
748 RADEON_SCLK_FORCE_TAM | RADEON_SCLK_FORCE_TDM |
749 RADEON_SCLK_FORCE_RB);
750 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
751 } else if ((rdev->family == CHIP_RS400) ||
752 (rdev->family == CHIP_RS480)) {
753 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
754 tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP |
755 RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1
756 | RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 |
757 R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT |
758 RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR |
759 R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX |
760 R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK |
761 R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0);
762 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
763
764 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
765 tmp |= RADEON_SCLK_MORE_FORCEON;
766 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
767
768 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
769 tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
770 RADEON_PIXCLK_DAC_ALWAYS_ONb |
771 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
772 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
773
774 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
775 tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
776 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
777 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
778 R300_DVOCLK_ALWAYS_ONb |
779 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
780 RADEON_PIXCLK_GV_ALWAYS_ONb |
781 R300_PIXCLK_DVO_ALWAYS_ONb |
782 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
783 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
784 R300_PIXCLK_TRANS_ALWAYS_ONb |
785 R300_PIXCLK_TVO_ALWAYS_ONb |
786 R300_P2G2CLK_ALWAYS_ONb |
787 R300_P2G2CLK_DAC_ALWAYS_ONb |
788 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
789 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
790 } else if (rdev->family >= CHIP_RV350) {
791 /* for RV350/M10, no delays are required. */
792 tmp = RREG32_PLL(R300_SCLK_CNTL2);
793 tmp |= (R300_SCLK_FORCE_TCL |
794 R300_SCLK_FORCE_GA | R300_SCLK_FORCE_CBA);
795 WREG32_PLL(R300_SCLK_CNTL2, tmp);
796
797 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
798 tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP |
799 RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1
800 | RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 |
801 R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT |
802 RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR |
803 R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX |
804 R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK |
805 R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0);
806 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
807
808 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
809 tmp |= RADEON_SCLK_MORE_FORCEON;
810 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
811
812 tmp = RREG32_PLL(RADEON_MCLK_CNTL);
813 tmp |= (RADEON_FORCEON_MCLKA |
814 RADEON_FORCEON_MCLKB |
815 RADEON_FORCEON_YCLKA |
816 RADEON_FORCEON_YCLKB | RADEON_FORCEON_MC);
817 WREG32_PLL(RADEON_MCLK_CNTL, tmp);
818
819 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
820 tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
821 RADEON_PIXCLK_DAC_ALWAYS_ONb |
822 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
823 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
824
825 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
826 tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
827 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
828 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
829 R300_DVOCLK_ALWAYS_ONb |
830 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
831 RADEON_PIXCLK_GV_ALWAYS_ONb |
832 R300_PIXCLK_DVO_ALWAYS_ONb |
833 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
834 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
835 R300_PIXCLK_TRANS_ALWAYS_ONb |
836 R300_PIXCLK_TVO_ALWAYS_ONb |
837 R300_P2G2CLK_ALWAYS_ONb |
838 R300_P2G2CLK_DAC_ALWAYS_ONb |
839 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
840 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
841 } else {
842 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
843 tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_E2);
844 tmp |= RADEON_SCLK_FORCE_SE;
845
846 if (rdev->flags & RADEON_SINGLE_CRTC) {
847 tmp |= (RADEON_SCLK_FORCE_RB |
848 RADEON_SCLK_FORCE_TDM |
849 RADEON_SCLK_FORCE_TAM |
850 RADEON_SCLK_FORCE_PB |
851 RADEON_SCLK_FORCE_RE |
852 RADEON_SCLK_FORCE_VIP |
853 RADEON_SCLK_FORCE_IDCT |
854 RADEON_SCLK_FORCE_TOP |
855 RADEON_SCLK_FORCE_DISP1 |
856 RADEON_SCLK_FORCE_DISP2 |
857 RADEON_SCLK_FORCE_HDP);
858 } else if ((rdev->family == CHIP_R300) ||
859 (rdev->family == CHIP_R350)) {
860 tmp |= (RADEON_SCLK_FORCE_HDP |
861 RADEON_SCLK_FORCE_DISP1 |
862 RADEON_SCLK_FORCE_DISP2 |
863 RADEON_SCLK_FORCE_TOP |
864 RADEON_SCLK_FORCE_IDCT |
865 RADEON_SCLK_FORCE_VIP);
866 }
867 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
868
869 mdelay(16);
870
871 if ((rdev->family == CHIP_R300) ||
872 (rdev->family == CHIP_R350)) {
873 tmp = RREG32_PLL(R300_SCLK_CNTL2);
874 tmp |= (R300_SCLK_FORCE_TCL |
875 R300_SCLK_FORCE_GA |
876 R300_SCLK_FORCE_CBA);
877 WREG32_PLL(R300_SCLK_CNTL2, tmp);
878 mdelay(16);
879 }
880
881 if (rdev->flags & RADEON_IS_IGP) {
882 tmp = RREG32_PLL(RADEON_MCLK_CNTL);
883 tmp &= ~(RADEON_FORCEON_MCLKA |
884 RADEON_FORCEON_YCLKA);
885 WREG32_PLL(RADEON_MCLK_CNTL, tmp);
886 mdelay(16);
887 }
888
889 if ((rdev->family == CHIP_RV200) ||
890 (rdev->family == CHIP_RV250) ||
891 (rdev->family == CHIP_RV280)) {
892 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
893 tmp |= RADEON_SCLK_MORE_FORCEON;
894 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
895 mdelay(16);
896 }
897
898 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
899 tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
900 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
901 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
902 RADEON_PIXCLK_GV_ALWAYS_ONb |
903 RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
904 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
905 RADEON_PIXCLK_TMDS_ALWAYS_ONb);
906
907 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
908 mdelay(16);
909
910 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
911 tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
912 RADEON_PIXCLK_DAC_ALWAYS_ONb);
913 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
914 }
915 }
916}
917
1/*
2 * Copyright 2008 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
4 * Copyright 2009 Jerome Glisse.
5 *
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:
12 *
13 * The above copyright notice and this permission notice shall be included in
14 * all copies or substantial portions of the Software.
15 *
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.
23 *
24 * Authors: Dave Airlie
25 * Alex Deucher
26 * Jerome Glisse
27 */
28#include <drm/drmP.h>
29#include <drm/radeon_drm.h>
30#include "radeon_reg.h"
31#include "radeon.h"
32#include "radeon_asic.h"
33#include "atom.h"
34
35/* 10 khz */
36uint32_t radeon_legacy_get_engine_clock(struct radeon_device *rdev)
37{
38 struct radeon_pll *spll = &rdev->clock.spll;
39 uint32_t fb_div, ref_div, post_div, sclk;
40
41 fb_div = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
42 fb_div = (fb_div >> RADEON_SPLL_FB_DIV_SHIFT) & RADEON_SPLL_FB_DIV_MASK;
43 fb_div <<= 1;
44 fb_div *= spll->reference_freq;
45
46 ref_div =
47 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) & RADEON_M_SPLL_REF_DIV_MASK;
48
49 if (ref_div == 0)
50 return 0;
51
52 sclk = fb_div / ref_div;
53
54 post_div = RREG32_PLL(RADEON_SCLK_CNTL) & RADEON_SCLK_SRC_SEL_MASK;
55 if (post_div == 2)
56 sclk >>= 1;
57 else if (post_div == 3)
58 sclk >>= 2;
59 else if (post_div == 4)
60 sclk >>= 3;
61
62 return sclk;
63}
64
65/* 10 khz */
66uint32_t radeon_legacy_get_memory_clock(struct radeon_device *rdev)
67{
68 struct radeon_pll *mpll = &rdev->clock.mpll;
69 uint32_t fb_div, ref_div, post_div, mclk;
70
71 fb_div = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
72 fb_div = (fb_div >> RADEON_MPLL_FB_DIV_SHIFT) & RADEON_MPLL_FB_DIV_MASK;
73 fb_div <<= 1;
74 fb_div *= mpll->reference_freq;
75
76 ref_div =
77 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) & RADEON_M_SPLL_REF_DIV_MASK;
78
79 if (ref_div == 0)
80 return 0;
81
82 mclk = fb_div / ref_div;
83
84 post_div = RREG32_PLL(RADEON_MCLK_CNTL) & 0x7;
85 if (post_div == 2)
86 mclk >>= 1;
87 else if (post_div == 3)
88 mclk >>= 2;
89 else if (post_div == 4)
90 mclk >>= 3;
91
92 return mclk;
93}
94
95#ifdef CONFIG_OF
96/*
97 * Read XTAL (ref clock), SCLK and MCLK from Open Firmware device
98 * tree. Hopefully, ATI OF driver is kind enough to fill these
99 */
100static bool radeon_read_clocks_OF(struct drm_device *dev)
101{
102 struct radeon_device *rdev = dev->dev_private;
103 struct device_node *dp = rdev->pdev->dev.of_node;
104 const u32 *val;
105 struct radeon_pll *p1pll = &rdev->clock.p1pll;
106 struct radeon_pll *p2pll = &rdev->clock.p2pll;
107 struct radeon_pll *spll = &rdev->clock.spll;
108 struct radeon_pll *mpll = &rdev->clock.mpll;
109
110 if (dp == NULL)
111 return false;
112 val = of_get_property(dp, "ATY,RefCLK", NULL);
113 if (!val || !*val) {
114 pr_warn("radeonfb: No ATY,RefCLK property !\n");
115 return false;
116 }
117 p1pll->reference_freq = p2pll->reference_freq = (*val) / 10;
118 p1pll->reference_div = RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
119 if (p1pll->reference_div < 2)
120 p1pll->reference_div = 12;
121 p2pll->reference_div = p1pll->reference_div;
122
123 /* These aren't in the device-tree */
124 if (rdev->family >= CHIP_R420) {
125 p1pll->pll_in_min = 100;
126 p1pll->pll_in_max = 1350;
127 p1pll->pll_out_min = 20000;
128 p1pll->pll_out_max = 50000;
129 p2pll->pll_in_min = 100;
130 p2pll->pll_in_max = 1350;
131 p2pll->pll_out_min = 20000;
132 p2pll->pll_out_max = 50000;
133 } else {
134 p1pll->pll_in_min = 40;
135 p1pll->pll_in_max = 500;
136 p1pll->pll_out_min = 12500;
137 p1pll->pll_out_max = 35000;
138 p2pll->pll_in_min = 40;
139 p2pll->pll_in_max = 500;
140 p2pll->pll_out_min = 12500;
141 p2pll->pll_out_max = 35000;
142 }
143 /* not sure what the max should be in all cases */
144 rdev->clock.max_pixel_clock = 35000;
145
146 spll->reference_freq = mpll->reference_freq = p1pll->reference_freq;
147 spll->reference_div = mpll->reference_div =
148 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
149 RADEON_M_SPLL_REF_DIV_MASK;
150
151 val = of_get_property(dp, "ATY,SCLK", NULL);
152 if (val && *val)
153 rdev->clock.default_sclk = (*val) / 10;
154 else
155 rdev->clock.default_sclk =
156 radeon_legacy_get_engine_clock(rdev);
157
158 val = of_get_property(dp, "ATY,MCLK", NULL);
159 if (val && *val)
160 rdev->clock.default_mclk = (*val) / 10;
161 else
162 rdev->clock.default_mclk =
163 radeon_legacy_get_memory_clock(rdev);
164
165 DRM_INFO("Using device-tree clock info\n");
166
167 return true;
168}
169#else
170static bool radeon_read_clocks_OF(struct drm_device *dev)
171{
172 return false;
173}
174#endif /* CONFIG_OF */
175
176void radeon_get_clock_info(struct drm_device *dev)
177{
178 struct radeon_device *rdev = dev->dev_private;
179 struct radeon_pll *p1pll = &rdev->clock.p1pll;
180 struct radeon_pll *p2pll = &rdev->clock.p2pll;
181 struct radeon_pll *dcpll = &rdev->clock.dcpll;
182 struct radeon_pll *spll = &rdev->clock.spll;
183 struct radeon_pll *mpll = &rdev->clock.mpll;
184 int ret;
185
186 if (rdev->is_atom_bios)
187 ret = radeon_atom_get_clock_info(dev);
188 else
189 ret = radeon_combios_get_clock_info(dev);
190 if (!ret)
191 ret = radeon_read_clocks_OF(dev);
192
193 if (ret) {
194 if (p1pll->reference_div < 2) {
195 if (!ASIC_IS_AVIVO(rdev)) {
196 u32 tmp = RREG32_PLL(RADEON_PPLL_REF_DIV);
197 if (ASIC_IS_R300(rdev))
198 p1pll->reference_div =
199 (tmp & R300_PPLL_REF_DIV_ACC_MASK) >> R300_PPLL_REF_DIV_ACC_SHIFT;
200 else
201 p1pll->reference_div = tmp & RADEON_PPLL_REF_DIV_MASK;
202 if (p1pll->reference_div < 2)
203 p1pll->reference_div = 12;
204 } else
205 p1pll->reference_div = 12;
206 }
207 if (p2pll->reference_div < 2)
208 p2pll->reference_div = 12;
209 if (rdev->family < CHIP_RS600) {
210 if (spll->reference_div < 2)
211 spll->reference_div =
212 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
213 RADEON_M_SPLL_REF_DIV_MASK;
214 }
215 if (mpll->reference_div < 2)
216 mpll->reference_div = spll->reference_div;
217 } else {
218 if (ASIC_IS_AVIVO(rdev)) {
219 /* TODO FALLBACK */
220 } else {
221 DRM_INFO("Using generic clock info\n");
222
223 /* may need to be per card */
224 rdev->clock.max_pixel_clock = 35000;
225
226 if (rdev->flags & RADEON_IS_IGP) {
227 p1pll->reference_freq = 1432;
228 p2pll->reference_freq = 1432;
229 spll->reference_freq = 1432;
230 mpll->reference_freq = 1432;
231 } else {
232 p1pll->reference_freq = 2700;
233 p2pll->reference_freq = 2700;
234 spll->reference_freq = 2700;
235 mpll->reference_freq = 2700;
236 }
237 p1pll->reference_div =
238 RREG32_PLL(RADEON_PPLL_REF_DIV) & 0x3ff;
239 if (p1pll->reference_div < 2)
240 p1pll->reference_div = 12;
241 p2pll->reference_div = p1pll->reference_div;
242
243 if (rdev->family >= CHIP_R420) {
244 p1pll->pll_in_min = 100;
245 p1pll->pll_in_max = 1350;
246 p1pll->pll_out_min = 20000;
247 p1pll->pll_out_max = 50000;
248 p2pll->pll_in_min = 100;
249 p2pll->pll_in_max = 1350;
250 p2pll->pll_out_min = 20000;
251 p2pll->pll_out_max = 50000;
252 } else {
253 p1pll->pll_in_min = 40;
254 p1pll->pll_in_max = 500;
255 p1pll->pll_out_min = 12500;
256 p1pll->pll_out_max = 35000;
257 p2pll->pll_in_min = 40;
258 p2pll->pll_in_max = 500;
259 p2pll->pll_out_min = 12500;
260 p2pll->pll_out_max = 35000;
261 }
262
263 spll->reference_div =
264 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
265 RADEON_M_SPLL_REF_DIV_MASK;
266 mpll->reference_div = spll->reference_div;
267 rdev->clock.default_sclk =
268 radeon_legacy_get_engine_clock(rdev);
269 rdev->clock.default_mclk =
270 radeon_legacy_get_memory_clock(rdev);
271 }
272 }
273
274 /* pixel clocks */
275 if (ASIC_IS_AVIVO(rdev)) {
276 p1pll->min_post_div = 2;
277 p1pll->max_post_div = 0x7f;
278 p1pll->min_frac_feedback_div = 0;
279 p1pll->max_frac_feedback_div = 9;
280 p2pll->min_post_div = 2;
281 p2pll->max_post_div = 0x7f;
282 p2pll->min_frac_feedback_div = 0;
283 p2pll->max_frac_feedback_div = 9;
284 } else {
285 p1pll->min_post_div = 1;
286 p1pll->max_post_div = 16;
287 p1pll->min_frac_feedback_div = 0;
288 p1pll->max_frac_feedback_div = 0;
289 p2pll->min_post_div = 1;
290 p2pll->max_post_div = 12;
291 p2pll->min_frac_feedback_div = 0;
292 p2pll->max_frac_feedback_div = 0;
293 }
294
295 /* dcpll is DCE4 only */
296 dcpll->min_post_div = 2;
297 dcpll->max_post_div = 0x7f;
298 dcpll->min_frac_feedback_div = 0;
299 dcpll->max_frac_feedback_div = 9;
300 dcpll->min_ref_div = 2;
301 dcpll->max_ref_div = 0x3ff;
302 dcpll->min_feedback_div = 4;
303 dcpll->max_feedback_div = 0xfff;
304 dcpll->best_vco = 0;
305
306 p1pll->min_ref_div = 2;
307 p1pll->max_ref_div = 0x3ff;
308 p1pll->min_feedback_div = 4;
309 p1pll->max_feedback_div = 0x7ff;
310 p1pll->best_vco = 0;
311
312 p2pll->min_ref_div = 2;
313 p2pll->max_ref_div = 0x3ff;
314 p2pll->min_feedback_div = 4;
315 p2pll->max_feedback_div = 0x7ff;
316 p2pll->best_vco = 0;
317
318 /* system clock */
319 spll->min_post_div = 1;
320 spll->max_post_div = 1;
321 spll->min_ref_div = 2;
322 spll->max_ref_div = 0xff;
323 spll->min_feedback_div = 4;
324 spll->max_feedback_div = 0xff;
325 spll->best_vco = 0;
326
327 /* memory clock */
328 mpll->min_post_div = 1;
329 mpll->max_post_div = 1;
330 mpll->min_ref_div = 2;
331 mpll->max_ref_div = 0xff;
332 mpll->min_feedback_div = 4;
333 mpll->max_feedback_div = 0xff;
334 mpll->best_vco = 0;
335
336 if (!rdev->clock.default_sclk)
337 rdev->clock.default_sclk = radeon_get_engine_clock(rdev);
338 if ((!rdev->clock.default_mclk) && rdev->asic->pm.get_memory_clock)
339 rdev->clock.default_mclk = radeon_get_memory_clock(rdev);
340
341 rdev->pm.current_sclk = rdev->clock.default_sclk;
342 rdev->pm.current_mclk = rdev->clock.default_mclk;
343
344}
345
346/* 10 khz */
347static uint32_t calc_eng_mem_clock(struct radeon_device *rdev,
348 uint32_t req_clock,
349 int *fb_div, int *post_div)
350{
351 struct radeon_pll *spll = &rdev->clock.spll;
352 int ref_div = spll->reference_div;
353
354 if (!ref_div)
355 ref_div =
356 RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV) &
357 RADEON_M_SPLL_REF_DIV_MASK;
358
359 if (req_clock < 15000) {
360 *post_div = 8;
361 req_clock *= 8;
362 } else if (req_clock < 30000) {
363 *post_div = 4;
364 req_clock *= 4;
365 } else if (req_clock < 60000) {
366 *post_div = 2;
367 req_clock *= 2;
368 } else
369 *post_div = 1;
370
371 req_clock *= ref_div;
372 req_clock += spll->reference_freq;
373 req_clock /= (2 * spll->reference_freq);
374
375 *fb_div = req_clock & 0xff;
376
377 req_clock = (req_clock & 0xffff) << 1;
378 req_clock *= spll->reference_freq;
379 req_clock /= ref_div;
380 req_clock /= *post_div;
381
382 return req_clock;
383}
384
385/* 10 khz */
386void radeon_legacy_set_engine_clock(struct radeon_device *rdev,
387 uint32_t eng_clock)
388{
389 uint32_t tmp;
390 int fb_div, post_div;
391
392 /* XXX: wait for idle */
393
394 eng_clock = calc_eng_mem_clock(rdev, eng_clock, &fb_div, &post_div);
395
396 tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
397 tmp &= ~RADEON_DONT_USE_XTALIN;
398 WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
399
400 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
401 tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
402 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
403
404 udelay(10);
405
406 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
407 tmp |= RADEON_SPLL_SLEEP;
408 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
409
410 udelay(2);
411
412 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
413 tmp |= RADEON_SPLL_RESET;
414 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
415
416 udelay(200);
417
418 tmp = RREG32_PLL(RADEON_M_SPLL_REF_FB_DIV);
419 tmp &= ~(RADEON_SPLL_FB_DIV_MASK << RADEON_SPLL_FB_DIV_SHIFT);
420 tmp |= (fb_div & RADEON_SPLL_FB_DIV_MASK) << RADEON_SPLL_FB_DIV_SHIFT;
421 WREG32_PLL(RADEON_M_SPLL_REF_FB_DIV, tmp);
422
423 /* XXX: verify on different asics */
424 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
425 tmp &= ~RADEON_SPLL_PVG_MASK;
426 if ((eng_clock * post_div) >= 90000)
427 tmp |= (0x7 << RADEON_SPLL_PVG_SHIFT);
428 else
429 tmp |= (0x4 << RADEON_SPLL_PVG_SHIFT);
430 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
431
432 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
433 tmp &= ~RADEON_SPLL_SLEEP;
434 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
435
436 udelay(2);
437
438 tmp = RREG32_PLL(RADEON_SPLL_CNTL);
439 tmp &= ~RADEON_SPLL_RESET;
440 WREG32_PLL(RADEON_SPLL_CNTL, tmp);
441
442 udelay(200);
443
444 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
445 tmp &= ~RADEON_SCLK_SRC_SEL_MASK;
446 switch (post_div) {
447 case 1:
448 default:
449 tmp |= 1;
450 break;
451 case 2:
452 tmp |= 2;
453 break;
454 case 4:
455 tmp |= 3;
456 break;
457 case 8:
458 tmp |= 4;
459 break;
460 }
461 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
462
463 udelay(20);
464
465 tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
466 tmp |= RADEON_DONT_USE_XTALIN;
467 WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
468
469 udelay(10);
470}
471
472void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int enable)
473{
474 uint32_t tmp;
475
476 if (enable) {
477 if (rdev->flags & RADEON_SINGLE_CRTC) {
478 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
479 if ((RREG32(RADEON_CONFIG_CNTL) &
480 RADEON_CFG_ATI_REV_ID_MASK) >
481 RADEON_CFG_ATI_REV_A13) {
482 tmp &=
483 ~(RADEON_SCLK_FORCE_CP |
484 RADEON_SCLK_FORCE_RB);
485 }
486 tmp &=
487 ~(RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1 |
488 RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_SE |
489 RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_RE |
490 RADEON_SCLK_FORCE_PB | RADEON_SCLK_FORCE_TAM |
491 RADEON_SCLK_FORCE_TDM);
492 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
493 } else if (ASIC_IS_R300(rdev)) {
494 if ((rdev->family == CHIP_RS400) ||
495 (rdev->family == CHIP_RS480)) {
496 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
497 tmp &=
498 ~(RADEON_SCLK_FORCE_DISP2 |
499 RADEON_SCLK_FORCE_CP |
500 RADEON_SCLK_FORCE_HDP |
501 RADEON_SCLK_FORCE_DISP1 |
502 RADEON_SCLK_FORCE_TOP |
503 RADEON_SCLK_FORCE_E2 | R300_SCLK_FORCE_VAP
504 | RADEON_SCLK_FORCE_IDCT |
505 RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR
506 | R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX
507 | R300_SCLK_FORCE_US |
508 RADEON_SCLK_FORCE_TV_SCLK |
509 R300_SCLK_FORCE_SU |
510 RADEON_SCLK_FORCE_OV0);
511 tmp |= RADEON_DYN_STOP_LAT_MASK;
512 tmp |=
513 RADEON_SCLK_FORCE_TOP |
514 RADEON_SCLK_FORCE_VIP;
515 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
516
517 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
518 tmp &= ~RADEON_SCLK_MORE_FORCEON;
519 tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
520 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
521
522 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
523 tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
524 RADEON_PIXCLK_DAC_ALWAYS_ONb);
525 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
526
527 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
528 tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
529 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
530 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
531 R300_DVOCLK_ALWAYS_ONb |
532 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
533 RADEON_PIXCLK_GV_ALWAYS_ONb |
534 R300_PIXCLK_DVO_ALWAYS_ONb |
535 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
536 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
537 R300_PIXCLK_TRANS_ALWAYS_ONb |
538 R300_PIXCLK_TVO_ALWAYS_ONb |
539 R300_P2G2CLK_ALWAYS_ONb |
540 R300_P2G2CLK_DAC_ALWAYS_ONb);
541 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
542 } else if (rdev->family >= CHIP_RV350) {
543 tmp = RREG32_PLL(R300_SCLK_CNTL2);
544 tmp &= ~(R300_SCLK_FORCE_TCL |
545 R300_SCLK_FORCE_GA |
546 R300_SCLK_FORCE_CBA);
547 tmp |= (R300_SCLK_TCL_MAX_DYN_STOP_LAT |
548 R300_SCLK_GA_MAX_DYN_STOP_LAT |
549 R300_SCLK_CBA_MAX_DYN_STOP_LAT);
550 WREG32_PLL(R300_SCLK_CNTL2, tmp);
551
552 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
553 tmp &=
554 ~(RADEON_SCLK_FORCE_DISP2 |
555 RADEON_SCLK_FORCE_CP |
556 RADEON_SCLK_FORCE_HDP |
557 RADEON_SCLK_FORCE_DISP1 |
558 RADEON_SCLK_FORCE_TOP |
559 RADEON_SCLK_FORCE_E2 | R300_SCLK_FORCE_VAP
560 | RADEON_SCLK_FORCE_IDCT |
561 RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR
562 | R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX
563 | R300_SCLK_FORCE_US |
564 RADEON_SCLK_FORCE_TV_SCLK |
565 R300_SCLK_FORCE_SU |
566 RADEON_SCLK_FORCE_OV0);
567 tmp |= RADEON_DYN_STOP_LAT_MASK;
568 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
569
570 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
571 tmp &= ~RADEON_SCLK_MORE_FORCEON;
572 tmp |= RADEON_SCLK_MORE_MAX_DYN_STOP_LAT;
573 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
574
575 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
576 tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
577 RADEON_PIXCLK_DAC_ALWAYS_ONb);
578 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
579
580 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
581 tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
582 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
583 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
584 R300_DVOCLK_ALWAYS_ONb |
585 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
586 RADEON_PIXCLK_GV_ALWAYS_ONb |
587 R300_PIXCLK_DVO_ALWAYS_ONb |
588 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
589 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
590 R300_PIXCLK_TRANS_ALWAYS_ONb |
591 R300_PIXCLK_TVO_ALWAYS_ONb |
592 R300_P2G2CLK_ALWAYS_ONb |
593 R300_P2G2CLK_DAC_ALWAYS_ONb);
594 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
595
596 tmp = RREG32_PLL(RADEON_MCLK_MISC);
597 tmp |= (RADEON_MC_MCLK_DYN_ENABLE |
598 RADEON_IO_MCLK_DYN_ENABLE);
599 WREG32_PLL(RADEON_MCLK_MISC, tmp);
600
601 tmp = RREG32_PLL(RADEON_MCLK_CNTL);
602 tmp |= (RADEON_FORCEON_MCLKA |
603 RADEON_FORCEON_MCLKB);
604
605 tmp &= ~(RADEON_FORCEON_YCLKA |
606 RADEON_FORCEON_YCLKB |
607 RADEON_FORCEON_MC);
608
609 /* Some releases of vbios have set DISABLE_MC_MCLKA
610 and DISABLE_MC_MCLKB bits in the vbios table. Setting these
611 bits will cause H/W hang when reading video memory with dynamic clocking
612 enabled. */
613 if ((tmp & R300_DISABLE_MC_MCLKA) &&
614 (tmp & R300_DISABLE_MC_MCLKB)) {
615 /* If both bits are set, then check the active channels */
616 tmp = RREG32_PLL(RADEON_MCLK_CNTL);
617 if (rdev->mc.vram_width == 64) {
618 if (RREG32(RADEON_MEM_CNTL) &
619 R300_MEM_USE_CD_CH_ONLY)
620 tmp &=
621 ~R300_DISABLE_MC_MCLKB;
622 else
623 tmp &=
624 ~R300_DISABLE_MC_MCLKA;
625 } else {
626 tmp &= ~(R300_DISABLE_MC_MCLKA |
627 R300_DISABLE_MC_MCLKB);
628 }
629 }
630
631 WREG32_PLL(RADEON_MCLK_CNTL, tmp);
632 } else {
633 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
634 tmp &= ~(R300_SCLK_FORCE_VAP);
635 tmp |= RADEON_SCLK_FORCE_CP;
636 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
637 mdelay(15);
638
639 tmp = RREG32_PLL(R300_SCLK_CNTL2);
640 tmp &= ~(R300_SCLK_FORCE_TCL |
641 R300_SCLK_FORCE_GA |
642 R300_SCLK_FORCE_CBA);
643 WREG32_PLL(R300_SCLK_CNTL2, tmp);
644 }
645 } else {
646 tmp = RREG32_PLL(RADEON_CLK_PWRMGT_CNTL);
647
648 tmp &= ~(RADEON_ACTIVE_HILO_LAT_MASK |
649 RADEON_DISP_DYN_STOP_LAT_MASK |
650 RADEON_DYN_STOP_MODE_MASK);
651
652 tmp |= (RADEON_ENGIN_DYNCLK_MODE |
653 (0x01 << RADEON_ACTIVE_HILO_LAT_SHIFT));
654 WREG32_PLL(RADEON_CLK_PWRMGT_CNTL, tmp);
655 mdelay(15);
656
657 tmp = RREG32_PLL(RADEON_CLK_PIN_CNTL);
658 tmp |= RADEON_SCLK_DYN_START_CNTL;
659 WREG32_PLL(RADEON_CLK_PIN_CNTL, tmp);
660 mdelay(15);
661
662 /* When DRI is enabled, setting DYN_STOP_LAT to zero can cause some R200
663 to lockup randomly, leave them as set by BIOS.
664 */
665 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
666 /*tmp &= RADEON_SCLK_SRC_SEL_MASK; */
667 tmp &= ~RADEON_SCLK_FORCEON_MASK;
668
669 /*RAGE_6::A11 A12 A12N1 A13, RV250::A11 A12, R300 */
670 if (((rdev->family == CHIP_RV250) &&
671 ((RREG32(RADEON_CONFIG_CNTL) &
672 RADEON_CFG_ATI_REV_ID_MASK) <
673 RADEON_CFG_ATI_REV_A13))
674 || ((rdev->family == CHIP_RV100)
675 &&
676 ((RREG32(RADEON_CONFIG_CNTL) &
677 RADEON_CFG_ATI_REV_ID_MASK) <=
678 RADEON_CFG_ATI_REV_A13))) {
679 tmp |= RADEON_SCLK_FORCE_CP;
680 tmp |= RADEON_SCLK_FORCE_VIP;
681 }
682
683 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
684
685 if ((rdev->family == CHIP_RV200) ||
686 (rdev->family == CHIP_RV250) ||
687 (rdev->family == CHIP_RV280)) {
688 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
689 tmp &= ~RADEON_SCLK_MORE_FORCEON;
690
691 /* RV200::A11 A12 RV250::A11 A12 */
692 if (((rdev->family == CHIP_RV200) ||
693 (rdev->family == CHIP_RV250)) &&
694 ((RREG32(RADEON_CONFIG_CNTL) &
695 RADEON_CFG_ATI_REV_ID_MASK) <
696 RADEON_CFG_ATI_REV_A13)) {
697 tmp |= RADEON_SCLK_MORE_FORCEON;
698 }
699 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
700 mdelay(15);
701 }
702
703 /* RV200::A11 A12, RV250::A11 A12 */
704 if (((rdev->family == CHIP_RV200) ||
705 (rdev->family == CHIP_RV250)) &&
706 ((RREG32(RADEON_CONFIG_CNTL) &
707 RADEON_CFG_ATI_REV_ID_MASK) <
708 RADEON_CFG_ATI_REV_A13)) {
709 tmp = RREG32_PLL(RADEON_PLL_PWRMGT_CNTL);
710 tmp |= RADEON_TCL_BYPASS_DISABLE;
711 WREG32_PLL(RADEON_PLL_PWRMGT_CNTL, tmp);
712 }
713 mdelay(15);
714
715 /*enable dynamic mode for display clocks (PIXCLK and PIX2CLK) */
716 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
717 tmp |= (RADEON_PIX2CLK_ALWAYS_ONb |
718 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
719 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
720 RADEON_PIXCLK_GV_ALWAYS_ONb |
721 RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
722 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
723 RADEON_PIXCLK_TMDS_ALWAYS_ONb);
724
725 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
726 mdelay(15);
727
728 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
729 tmp |= (RADEON_PIXCLK_ALWAYS_ONb |
730 RADEON_PIXCLK_DAC_ALWAYS_ONb);
731
732 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
733 mdelay(15);
734 }
735 } else {
736 /* Turn everything OFF (ForceON to everything) */
737 if (rdev->flags & RADEON_SINGLE_CRTC) {
738 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
739 tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_HDP |
740 RADEON_SCLK_FORCE_DISP1 | RADEON_SCLK_FORCE_TOP
741 | RADEON_SCLK_FORCE_E2 | RADEON_SCLK_FORCE_SE |
742 RADEON_SCLK_FORCE_IDCT | RADEON_SCLK_FORCE_VIP |
743 RADEON_SCLK_FORCE_RE | RADEON_SCLK_FORCE_PB |
744 RADEON_SCLK_FORCE_TAM | RADEON_SCLK_FORCE_TDM |
745 RADEON_SCLK_FORCE_RB);
746 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
747 } else if ((rdev->family == CHIP_RS400) ||
748 (rdev->family == CHIP_RS480)) {
749 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
750 tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP |
751 RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1
752 | RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 |
753 R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT |
754 RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR |
755 R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX |
756 R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK |
757 R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0);
758 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
759
760 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
761 tmp |= RADEON_SCLK_MORE_FORCEON;
762 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
763
764 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
765 tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
766 RADEON_PIXCLK_DAC_ALWAYS_ONb |
767 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
768 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
769
770 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
771 tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
772 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
773 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
774 R300_DVOCLK_ALWAYS_ONb |
775 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
776 RADEON_PIXCLK_GV_ALWAYS_ONb |
777 R300_PIXCLK_DVO_ALWAYS_ONb |
778 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
779 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
780 R300_PIXCLK_TRANS_ALWAYS_ONb |
781 R300_PIXCLK_TVO_ALWAYS_ONb |
782 R300_P2G2CLK_ALWAYS_ONb |
783 R300_P2G2CLK_DAC_ALWAYS_ONb |
784 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
785 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
786 } else if (rdev->family >= CHIP_RV350) {
787 /* for RV350/M10, no delays are required. */
788 tmp = RREG32_PLL(R300_SCLK_CNTL2);
789 tmp |= (R300_SCLK_FORCE_TCL |
790 R300_SCLK_FORCE_GA | R300_SCLK_FORCE_CBA);
791 WREG32_PLL(R300_SCLK_CNTL2, tmp);
792
793 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
794 tmp |= (RADEON_SCLK_FORCE_DISP2 | RADEON_SCLK_FORCE_CP |
795 RADEON_SCLK_FORCE_HDP | RADEON_SCLK_FORCE_DISP1
796 | RADEON_SCLK_FORCE_TOP | RADEON_SCLK_FORCE_E2 |
797 R300_SCLK_FORCE_VAP | RADEON_SCLK_FORCE_IDCT |
798 RADEON_SCLK_FORCE_VIP | R300_SCLK_FORCE_SR |
799 R300_SCLK_FORCE_PX | R300_SCLK_FORCE_TX |
800 R300_SCLK_FORCE_US | RADEON_SCLK_FORCE_TV_SCLK |
801 R300_SCLK_FORCE_SU | RADEON_SCLK_FORCE_OV0);
802 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
803
804 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
805 tmp |= RADEON_SCLK_MORE_FORCEON;
806 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
807
808 tmp = RREG32_PLL(RADEON_MCLK_CNTL);
809 tmp |= (RADEON_FORCEON_MCLKA |
810 RADEON_FORCEON_MCLKB |
811 RADEON_FORCEON_YCLKA |
812 RADEON_FORCEON_YCLKB | RADEON_FORCEON_MC);
813 WREG32_PLL(RADEON_MCLK_CNTL, tmp);
814
815 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
816 tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
817 RADEON_PIXCLK_DAC_ALWAYS_ONb |
818 R300_DISP_DAC_PIXCLK_DAC_BLANK_OFF);
819 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
820
821 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
822 tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
823 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
824 RADEON_DISP_TVOUT_PIXCLK_TV_ALWAYS_ONb |
825 R300_DVOCLK_ALWAYS_ONb |
826 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
827 RADEON_PIXCLK_GV_ALWAYS_ONb |
828 R300_PIXCLK_DVO_ALWAYS_ONb |
829 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
830 RADEON_PIXCLK_TMDS_ALWAYS_ONb |
831 R300_PIXCLK_TRANS_ALWAYS_ONb |
832 R300_PIXCLK_TVO_ALWAYS_ONb |
833 R300_P2G2CLK_ALWAYS_ONb |
834 R300_P2G2CLK_DAC_ALWAYS_ONb |
835 R300_DISP_DAC_PIXCLK_DAC2_BLANK_OFF);
836 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
837 } else {
838 tmp = RREG32_PLL(RADEON_SCLK_CNTL);
839 tmp |= (RADEON_SCLK_FORCE_CP | RADEON_SCLK_FORCE_E2);
840 tmp |= RADEON_SCLK_FORCE_SE;
841
842 if (rdev->flags & RADEON_SINGLE_CRTC) {
843 tmp |= (RADEON_SCLK_FORCE_RB |
844 RADEON_SCLK_FORCE_TDM |
845 RADEON_SCLK_FORCE_TAM |
846 RADEON_SCLK_FORCE_PB |
847 RADEON_SCLK_FORCE_RE |
848 RADEON_SCLK_FORCE_VIP |
849 RADEON_SCLK_FORCE_IDCT |
850 RADEON_SCLK_FORCE_TOP |
851 RADEON_SCLK_FORCE_DISP1 |
852 RADEON_SCLK_FORCE_DISP2 |
853 RADEON_SCLK_FORCE_HDP);
854 } else if ((rdev->family == CHIP_R300) ||
855 (rdev->family == CHIP_R350)) {
856 tmp |= (RADEON_SCLK_FORCE_HDP |
857 RADEON_SCLK_FORCE_DISP1 |
858 RADEON_SCLK_FORCE_DISP2 |
859 RADEON_SCLK_FORCE_TOP |
860 RADEON_SCLK_FORCE_IDCT |
861 RADEON_SCLK_FORCE_VIP);
862 }
863 WREG32_PLL(RADEON_SCLK_CNTL, tmp);
864
865 mdelay(16);
866
867 if ((rdev->family == CHIP_R300) ||
868 (rdev->family == CHIP_R350)) {
869 tmp = RREG32_PLL(R300_SCLK_CNTL2);
870 tmp |= (R300_SCLK_FORCE_TCL |
871 R300_SCLK_FORCE_GA |
872 R300_SCLK_FORCE_CBA);
873 WREG32_PLL(R300_SCLK_CNTL2, tmp);
874 mdelay(16);
875 }
876
877 if (rdev->flags & RADEON_IS_IGP) {
878 tmp = RREG32_PLL(RADEON_MCLK_CNTL);
879 tmp &= ~(RADEON_FORCEON_MCLKA |
880 RADEON_FORCEON_YCLKA);
881 WREG32_PLL(RADEON_MCLK_CNTL, tmp);
882 mdelay(16);
883 }
884
885 if ((rdev->family == CHIP_RV200) ||
886 (rdev->family == CHIP_RV250) ||
887 (rdev->family == CHIP_RV280)) {
888 tmp = RREG32_PLL(RADEON_SCLK_MORE_CNTL);
889 tmp |= RADEON_SCLK_MORE_FORCEON;
890 WREG32_PLL(RADEON_SCLK_MORE_CNTL, tmp);
891 mdelay(16);
892 }
893
894 tmp = RREG32_PLL(RADEON_PIXCLKS_CNTL);
895 tmp &= ~(RADEON_PIX2CLK_ALWAYS_ONb |
896 RADEON_PIX2CLK_DAC_ALWAYS_ONb |
897 RADEON_PIXCLK_BLEND_ALWAYS_ONb |
898 RADEON_PIXCLK_GV_ALWAYS_ONb |
899 RADEON_PIXCLK_DIG_TMDS_ALWAYS_ONb |
900 RADEON_PIXCLK_LVDS_ALWAYS_ONb |
901 RADEON_PIXCLK_TMDS_ALWAYS_ONb);
902
903 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp);
904 mdelay(16);
905
906 tmp = RREG32_PLL(RADEON_VCLK_ECP_CNTL);
907 tmp &= ~(RADEON_PIXCLK_ALWAYS_ONb |
908 RADEON_PIXCLK_DAC_ALWAYS_ONb);
909 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp);
910 }
911 }
912}
913