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