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