Linux Audio

Check our new training course

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