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