Subversion Repositories Kolibri OS

Rev

Rev 1117 | Rev 1128 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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