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