Linux Audio

Check our new training course

Loading...
v6.13.7
  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
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