xref: /linux/drivers/gpu/drm/radeon/radeon_clocks.c (revision 0fdebc5ec2ca492d69df2d93a6a7abade4941aae)
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 */
40 uint32_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 */
70 uint32_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  */
104 static 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
174 static bool radeon_read_clocks_OF(struct drm_device *dev)
175 {
176 	return false;
177 }
178 #endif /* CONFIG_OF */
179 
180 void 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 */
351 static 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 */
390 void 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 
476 void 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 
918