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