Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
1123 serge 1
/*
2
 * Copyright 2007-8 Advanced Micro Devices, Inc.
3
 * Copyright 2008 Red Hat Inc.
4
 *
5
 * Permission is hereby granted, free of charge, to any person obtaining a
6
 * copy of this software and associated documentation files (the "Software"),
7
 * to deal in the Software without restriction, including without limitation
8
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9
 * and/or sell copies of the Software, and to permit persons to whom the
10
 * Software is furnished to do so, subject to the following conditions:
11
 *
12
 * The above copyright notice and this permission notice shall be included in
13
 * all copies or substantial portions of the Software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21
 * OTHER DEALINGS IN THE SOFTWARE.
22
 *
23
 * Authors: Dave Airlie
24
 *          Alex Deucher
25
 */
1179 serge 26
#include 
27
#include 
28
#include 
1123 serge 29
#include "radeon_fixed.h"
30
#include "radeon.h"
1179 serge 31
#include "atom.h"
1123 serge 32
 
1179 serge 33
static void radeon_legacy_rmx_mode_set(struct drm_crtc *crtc,
34
				       struct drm_display_mode *mode,
35
				       struct drm_display_mode *adjusted_mode)
36
{
37
	struct drm_device *dev = crtc->dev;
38
	struct radeon_device *rdev = dev->dev_private;
39
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
40
	int xres = mode->hdisplay;
41
	int yres = mode->vdisplay;
42
	bool hscale = true, vscale = true;
43
	int hsync_wid;
44
	int vsync_wid;
45
	int hsync_start;
46
	int blank_width;
47
	u32 scale, inc, crtc_more_cntl;
48
	u32 fp_horz_stretch, fp_vert_stretch, fp_horz_vert_active;
49
	u32 fp_h_sync_strt_wid, fp_crtc_h_total_disp;
50
	u32 fp_v_sync_strt_wid, fp_crtc_v_total_disp;
51
	struct radeon_native_mode *native_mode = &radeon_crtc->native_mode;
52
 
53
	fp_vert_stretch = RREG32(RADEON_FP_VERT_STRETCH) &
54
		(RADEON_VERT_STRETCH_RESERVED |
55
		 RADEON_VERT_AUTO_RATIO_INC);
56
	fp_horz_stretch = RREG32(RADEON_FP_HORZ_STRETCH) &
57
		(RADEON_HORZ_FP_LOOP_STRETCH |
58
		 RADEON_HORZ_AUTO_RATIO_INC);
59
 
60
	crtc_more_cntl = 0;
61
	if ((rdev->family == CHIP_RS100) ||
62
	    (rdev->family == CHIP_RS200)) {
63
		/* This is to workaround the asic bug for RMX, some versions
64
		   of BIOS dosen't have this register initialized correctly. */
65
		crtc_more_cntl |= RADEON_CRTC_H_CUTOFF_ACTIVE_EN;
66
	}
67
 
68
 
69
	fp_crtc_h_total_disp = ((((mode->crtc_htotal / 8) - 1) & 0x3ff)
70
				| ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
71
 
72
	hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
73
	if (!hsync_wid)
74
		hsync_wid = 1;
75
	hsync_start = mode->crtc_hsync_start - 8;
76
 
77
	fp_h_sync_strt_wid = ((hsync_start & 0x1fff)
78
			      | ((hsync_wid & 0x3f) << 16)
79
			      | ((mode->flags & DRM_MODE_FLAG_NHSYNC)
80
				 ? RADEON_CRTC_H_SYNC_POL
81
				 : 0));
82
 
83
	fp_crtc_v_total_disp = (((mode->crtc_vtotal - 1) & 0xffff)
84
				| ((mode->crtc_vdisplay - 1) << 16));
85
 
86
	vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
87
	if (!vsync_wid)
88
		vsync_wid = 1;
89
 
90
	fp_v_sync_strt_wid = (((mode->crtc_vsync_start - 1) & 0xfff)
91
			      | ((vsync_wid & 0x1f) << 16)
92
			      | ((mode->flags & DRM_MODE_FLAG_NVSYNC)
93
				 ? RADEON_CRTC_V_SYNC_POL
94
				 : 0));
95
 
96
	fp_horz_vert_active = 0;
97
 
98
	if (native_mode->panel_xres == 0 ||
99
	    native_mode->panel_yres == 0) {
100
		hscale = false;
101
		vscale = false;
102
	} else {
103
		if (xres > native_mode->panel_xres)
104
			xres = native_mode->panel_xres;
105
		if (yres > native_mode->panel_yres)
106
			yres = native_mode->panel_yres;
107
 
108
		if (xres == native_mode->panel_xres)
109
			hscale = false;
110
		if (yres == native_mode->panel_yres)
111
			vscale = false;
112
	}
113
 
114
	switch (radeon_crtc->rmx_type) {
115
	case RMX_FULL:
116
	case RMX_ASPECT:
117
		if (!hscale)
118
			fp_horz_stretch |= ((xres/8-1) << 16);
119
		else {
120
			inc = (fp_horz_stretch & RADEON_HORZ_AUTO_RATIO_INC) ? 1 : 0;
121
			scale = ((xres + inc) * RADEON_HORZ_STRETCH_RATIO_MAX)
122
				/ native_mode->panel_xres + 1;
123
			fp_horz_stretch |= (((scale) & RADEON_HORZ_STRETCH_RATIO_MASK) |
124
					RADEON_HORZ_STRETCH_BLEND |
125
					RADEON_HORZ_STRETCH_ENABLE |
126
					((native_mode->panel_xres/8-1) << 16));
127
		}
128
 
129
		if (!vscale)
130
			fp_vert_stretch |= ((yres-1) << 12);
131
		else {
132
			inc = (fp_vert_stretch & RADEON_VERT_AUTO_RATIO_INC) ? 1 : 0;
133
			scale = ((yres + inc) * RADEON_VERT_STRETCH_RATIO_MAX)
134
				/ native_mode->panel_yres + 1;
135
			fp_vert_stretch |= (((scale) & RADEON_VERT_STRETCH_RATIO_MASK) |
136
					RADEON_VERT_STRETCH_ENABLE |
137
					RADEON_VERT_STRETCH_BLEND |
138
					((native_mode->panel_yres-1) << 12));
139
		}
140
		break;
141
	case RMX_CENTER:
142
		fp_horz_stretch |= ((xres/8-1) << 16);
143
		fp_vert_stretch |= ((yres-1) << 12);
144
 
145
		crtc_more_cntl |= (RADEON_CRTC_AUTO_HORZ_CENTER_EN |
146
				RADEON_CRTC_AUTO_VERT_CENTER_EN);
147
 
148
		blank_width = (mode->crtc_hblank_end - mode->crtc_hblank_start) / 8;
149
		if (blank_width > 110)
150
			blank_width = 110;
151
 
152
		fp_crtc_h_total_disp = (((blank_width) & 0x3ff)
153
				| ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
154
 
155
		hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
156
		if (!hsync_wid)
157
			hsync_wid = 1;
158
 
159
		fp_h_sync_strt_wid = ((((mode->crtc_hsync_start - mode->crtc_hblank_start) / 8) & 0x1fff)
160
				| ((hsync_wid & 0x3f) << 16)
161
				| ((mode->flags & DRM_MODE_FLAG_NHSYNC)
162
					? RADEON_CRTC_H_SYNC_POL
163
					: 0));
164
 
165
		fp_crtc_v_total_disp = (((mode->crtc_vblank_end - mode->crtc_vblank_start) & 0xffff)
166
				| ((mode->crtc_vdisplay - 1) << 16));
167
 
168
		vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
169
		if (!vsync_wid)
170
			vsync_wid = 1;
171
 
172
		fp_v_sync_strt_wid = ((((mode->crtc_vsync_start - mode->crtc_vblank_start) & 0xfff)
173
					| ((vsync_wid & 0x1f) << 16)
174
					| ((mode->flags & DRM_MODE_FLAG_NVSYNC)
175
						? RADEON_CRTC_V_SYNC_POL
176
						: 0)));
177
 
178
		fp_horz_vert_active = (((native_mode->panel_yres) & 0xfff) |
179
				(((native_mode->panel_xres / 8) & 0x1ff) << 16));
180
		break;
181
	case RMX_OFF:
182
	default:
183
		fp_horz_stretch |= ((xres/8-1) << 16);
184
		fp_vert_stretch |= ((yres-1) << 12);
185
		break;
186
	}
187
 
188
	WREG32(RADEON_FP_HORZ_STRETCH,      fp_horz_stretch);
189
	WREG32(RADEON_FP_VERT_STRETCH,      fp_vert_stretch);
190
	WREG32(RADEON_CRTC_MORE_CNTL,       crtc_more_cntl);
191
	WREG32(RADEON_FP_HORZ_VERT_ACTIVE,  fp_horz_vert_active);
192
	WREG32(RADEON_FP_H_SYNC_STRT_WID,   fp_h_sync_strt_wid);
193
	WREG32(RADEON_FP_V_SYNC_STRT_WID,   fp_v_sync_strt_wid);
194
	WREG32(RADEON_FP_CRTC_H_TOTAL_DISP, fp_crtc_h_total_disp);
195
	WREG32(RADEON_FP_CRTC_V_TOTAL_DISP, fp_crtc_v_total_disp);
196
}
197
 
1123 serge 198
void radeon_restore_common_regs(struct drm_device *dev)
199
{
200
	/* don't need this yet */
201
}
202
 
203
static void radeon_pll_wait_for_read_update_complete(struct drm_device *dev)
204
{
205
	struct radeon_device *rdev = dev->dev_private;
206
	int i = 0;
207
 
208
	/* FIXME: Certain revisions of R300 can't recover here.  Not sure of
209
	   the cause yet, but this workaround will mask the problem for now.
210
	   Other chips usually will pass at the very first test, so the
211
	   workaround shouldn't have any effect on them. */
212
	for (i = 0;
213
	     (i < 10000 &&
214
	      RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R);
215
	     i++);
216
}
217
 
218
static void radeon_pll_write_update(struct drm_device *dev)
219
{
220
	struct radeon_device *rdev = dev->dev_private;
221
 
222
	while (RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R);
223
 
224
	WREG32_PLL_P(RADEON_PPLL_REF_DIV,
225
			   RADEON_PPLL_ATOMIC_UPDATE_W,
226
			   ~(RADEON_PPLL_ATOMIC_UPDATE_W));
227
}
228
 
229
static void radeon_pll2_wait_for_read_update_complete(struct drm_device *dev)
230
{
231
	struct radeon_device *rdev = dev->dev_private;
232
	int i = 0;
233
 
234
 
235
	/* FIXME: Certain revisions of R300 can't recover here.  Not sure of
236
	   the cause yet, but this workaround will mask the problem for now.
237
	   Other chips usually will pass at the very first test, so the
238
	   workaround shouldn't have any effect on them. */
239
	for (i = 0;
240
	     (i < 10000 &&
241
	      RREG32_PLL(RADEON_P2PLL_REF_DIV) & RADEON_P2PLL_ATOMIC_UPDATE_R);
242
	     i++);
243
}
244
 
245
static void radeon_pll2_write_update(struct drm_device *dev)
246
{
247
	struct radeon_device *rdev = dev->dev_private;
248
 
249
	while (RREG32_PLL(RADEON_P2PLL_REF_DIV) & RADEON_P2PLL_ATOMIC_UPDATE_R);
250
 
251
	WREG32_PLL_P(RADEON_P2PLL_REF_DIV,
252
			   RADEON_P2PLL_ATOMIC_UPDATE_W,
253
			   ~(RADEON_P2PLL_ATOMIC_UPDATE_W));
254
}
255
 
256
static uint8_t radeon_compute_pll_gain(uint16_t ref_freq, uint16_t ref_div,
257
				       uint16_t fb_div)
258
{
259
	unsigned int vcoFreq;
260
 
261
	if (!ref_div)
262
		return 1;
263
 
264
	vcoFreq = ((unsigned)ref_freq & fb_div) / ref_div;
265
 
266
	/*
267
	 * This is horribly crude: the VCO frequency range is divided into
268
	 * 3 parts, each part having a fixed PLL gain value.
269
	 */
270
	if (vcoFreq >= 30000)
271
		/*
272
		 * [300..max] MHz : 7
273
		 */
274
		return 7;
275
	else if (vcoFreq >= 18000)
276
		/*
277
		 * [180..300) MHz : 4
278
		 */
279
		return 4;
280
	else
281
		/*
282
		 * [0..180) MHz : 1
283
		 */
284
		return 1;
285
}
286
 
287
void radeon_crtc_dpms(struct drm_crtc *crtc, int mode)
288
{
289
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
290
	struct drm_device *dev = crtc->dev;
291
	struct radeon_device *rdev = dev->dev_private;
292
	uint32_t mask;
293
 
294
	if (radeon_crtc->crtc_id)
295
		mask = (RADEON_CRTC2_EN |
296
			RADEON_CRTC2_DISP_DIS |
297
			RADEON_CRTC2_VSYNC_DIS |
298
			RADEON_CRTC2_HSYNC_DIS |
299
			RADEON_CRTC2_DISP_REQ_EN_B);
300
	else
301
		mask = (RADEON_CRTC_DISPLAY_DIS |
302
			RADEON_CRTC_VSYNC_DIS |
303
			RADEON_CRTC_HSYNC_DIS);
304
 
305
	switch (mode) {
306
	case DRM_MODE_DPMS_ON:
307
		if (radeon_crtc->crtc_id)
308
			WREG32_P(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_EN, ~mask);
309
		else {
310
			WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_EN, ~(RADEON_CRTC_EN |
311
									 RADEON_CRTC_DISP_REQ_EN_B));
312
			WREG32_P(RADEON_CRTC_EXT_CNTL, 0, ~mask);
313
		}
1179 serge 314
//       drm_vblank_post_modeset(dev, radeon_crtc->crtc_id);
315
		radeon_crtc_load_lut(crtc);
1123 serge 316
		break;
317
	case DRM_MODE_DPMS_STANDBY:
318
	case DRM_MODE_DPMS_SUSPEND:
319
	case DRM_MODE_DPMS_OFF:
1179 serge 320
//       drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id);
1123 serge 321
		if (radeon_crtc->crtc_id)
322
			WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~mask);
323
		else {
324
			WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~(RADEON_CRTC_EN |
325
										    RADEON_CRTC_DISP_REQ_EN_B));
326
			WREG32_P(RADEON_CRTC_EXT_CNTL, mask, ~mask);
327
		}
328
		break;
329
	}
330
}
331
 
332
/* properly set crtc bpp when using atombios */
333
void radeon_legacy_atom_set_surface(struct drm_crtc *crtc)
334
{
335
	struct drm_device *dev = crtc->dev;
336
	struct radeon_device *rdev = dev->dev_private;
337
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
338
	int format;
339
	uint32_t crtc_gen_cntl;
340
	uint32_t disp_merge_cntl;
341
	uint32_t crtc_pitch;
342
 
343
	switch (crtc->fb->bits_per_pixel) {
1179 serge 344
	case 8:
345
		format = 2;
346
		break;
1123 serge 347
	case 15:      /*  555 */
348
		format = 3;
349
		break;
350
	case 16:      /*  565 */
351
		format = 4;
352
		break;
353
	case 24:      /*  RGB */
354
		format = 5;
355
		break;
356
	case 32:      /* xRGB */
357
		format = 6;
358
		break;
359
	default:
360
		return;
361
	}
362
 
363
	crtc_pitch  = ((((crtc->fb->pitch / (crtc->fb->bits_per_pixel / 8)) * crtc->fb->bits_per_pixel) +
364
			((crtc->fb->bits_per_pixel * 8) - 1)) /
365
		       (crtc->fb->bits_per_pixel * 8));
366
	crtc_pitch |= crtc_pitch << 16;
367
 
368
	WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
369
 
370
	switch (radeon_crtc->crtc_id) {
371
	case 0:
372
		disp_merge_cntl = RREG32(RADEON_DISP_MERGE_CNTL);
373
		disp_merge_cntl &= ~RADEON_DISP_RGB_OFFSET_EN;
374
		WREG32(RADEON_DISP_MERGE_CNTL, disp_merge_cntl);
375
 
376
		crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL) & 0xfffff0ff;
377
		crtc_gen_cntl |= (format << 8);
378
		crtc_gen_cntl |= RADEON_CRTC_EXT_DISP_EN;
379
		WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl);
380
		break;
381
	case 1:
382
		disp_merge_cntl = RREG32(RADEON_DISP2_MERGE_CNTL);
383
		disp_merge_cntl &= ~RADEON_DISP2_RGB_OFFSET_EN;
384
		WREG32(RADEON_DISP2_MERGE_CNTL, disp_merge_cntl);
385
 
386
		crtc_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL) & 0xfffff0ff;
387
		crtc_gen_cntl |= (format << 8);
388
		WREG32(RADEON_CRTC2_GEN_CNTL, crtc_gen_cntl);
389
		WREG32(RADEON_FP_H2_SYNC_STRT_WID,   RREG32(RADEON_CRTC2_H_SYNC_STRT_WID));
390
		WREG32(RADEON_FP_V2_SYNC_STRT_WID,   RREG32(RADEON_CRTC2_V_SYNC_STRT_WID));
391
		break;
392
	}
393
}
394
 
395
int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
396
			 struct drm_framebuffer *old_fb)
397
{
398
	struct drm_device *dev = crtc->dev;
399
	struct radeon_device *rdev = dev->dev_private;
400
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
401
	struct radeon_framebuffer *radeon_fb;
402
	struct drm_gem_object *obj;
403
	uint64_t base;
404
	uint32_t crtc_offset, crtc_offset_cntl, crtc_tile_x0_y0 = 0;
405
	uint32_t crtc_pitch, pitch_pixels;
1179 serge 406
	uint32_t tiling_flags;
407
	int format;
408
	uint32_t gen_cntl_reg, gen_cntl_val;
1123 serge 409
 
410
	DRM_DEBUG("\n");
411
 
412
	radeon_fb = to_radeon_framebuffer(crtc->fb);
413
 
1179 serge 414
	switch (crtc->fb->bits_per_pixel) {
415
	case 8:
416
		format = 2;
417
		break;
418
	case 15:      /*  555 */
419
		format = 3;
420
		break;
421
	case 16:      /*  565 */
422
		format = 4;
423
		break;
424
	case 24:      /*  RGB */
425
		format = 5;
426
		break;
427
	case 32:      /* xRGB */
428
		format = 6;
429
		break;
430
	default:
431
		return false;
432
	}
433
 
1123 serge 434
	obj = radeon_fb->obj;
435
//   if (radeon_gem_object_pin(obj, RADEON_GEM_DOMAIN_VRAM, &base)) {
436
//       return -EINVAL;
437
//   }
1246 serge 438
    base = rdev->mc.vram_location;
439
 
1179 serge 440
	/* if scanout was in GTT this really wouldn't work */
441
	/* crtc offset is from display base addr not FB location */
442
	radeon_crtc->legacy_display_base_addr = rdev->mc.vram_location;
443
 
444
	base -= radeon_crtc->legacy_display_base_addr;
445
 
1123 serge 446
	crtc_offset_cntl = 0;
447
 
448
	pitch_pixels = crtc->fb->pitch / (crtc->fb->bits_per_pixel / 8);
449
	crtc_pitch  = (((pitch_pixels * crtc->fb->bits_per_pixel) +
450
			((crtc->fb->bits_per_pixel * 8) - 1)) /
451
		       (crtc->fb->bits_per_pixel * 8));
452
	crtc_pitch |= crtc_pitch << 16;
453
 
1179 serge 454
//	radeon_object_get_tiling_flags(obj->driver_private,
455
//				       &tiling_flags, NULL);
456
	if (tiling_flags & RADEON_TILING_MICRO)
457
		DRM_ERROR("trying to scanout microtiled buffer\n");
458
 
459
	if (tiling_flags & RADEON_TILING_MACRO) {
1123 serge 460
		if (ASIC_IS_R300(rdev))
461
			crtc_offset_cntl |= (R300_CRTC_X_Y_MODE_EN |
462
					     R300_CRTC_MICRO_TILE_BUFFER_DIS |
463
					     R300_CRTC_MACRO_TILE_EN);
464
		else
465
			crtc_offset_cntl |= RADEON_CRTC_TILE_EN;
466
	} else {
467
		if (ASIC_IS_R300(rdev))
468
			crtc_offset_cntl &= ~(R300_CRTC_X_Y_MODE_EN |
469
					      R300_CRTC_MICRO_TILE_BUFFER_DIS |
470
					      R300_CRTC_MACRO_TILE_EN);
471
		else
472
			crtc_offset_cntl &= ~RADEON_CRTC_TILE_EN;
473
	}
474
 
1179 serge 475
	if (tiling_flags & RADEON_TILING_MACRO) {
1123 serge 476
		if (ASIC_IS_R300(rdev)) {
477
			crtc_tile_x0_y0 = x | (y << 16);
478
			base &= ~0x7ff;
479
		} else {
480
			int byteshift = crtc->fb->bits_per_pixel >> 4;
1179 serge 481
			int tile_addr = (((y >> 3) * pitch_pixels +  x) >> (8 - byteshift)) << 11;
1123 serge 482
			base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8);
483
			crtc_offset_cntl |= (y % 16);
484
		}
485
	} else {
486
		int offset = y * pitch_pixels + x;
487
		switch (crtc->fb->bits_per_pixel) {
1179 serge 488
		case 8:
489
			offset *= 1;
490
			break;
1123 serge 491
		case 15:
492
		case 16:
493
			offset *= 2;
494
			break;
495
		case 24:
496
			offset *= 3;
497
			break;
498
		case 32:
499
			offset *= 4;
500
			break;
501
		default:
502
			return false;
503
		}
504
		base += offset;
505
	}
506
 
507
	base &= ~7;
508
 
1179 serge 509
	if (radeon_crtc->crtc_id == 1)
510
		gen_cntl_reg = RADEON_CRTC2_GEN_CNTL;
511
	else
512
		gen_cntl_reg = RADEON_CRTC_GEN_CNTL;
1123 serge 513
 
1179 serge 514
	gen_cntl_val = RREG32(gen_cntl_reg);
515
	gen_cntl_val &= ~(0xf << 8);
516
	gen_cntl_val |= (format << 8);
517
	WREG32(gen_cntl_reg, gen_cntl_val);
518
 
1123 serge 519
	crtc_offset = (u32)base;
520
 
1179 serge 521
	WREG32(RADEON_DISPLAY_BASE_ADDR + radeon_crtc->crtc_offset, radeon_crtc->legacy_display_base_addr);
1123 serge 522
 
523
	if (ASIC_IS_R300(rdev)) {
524
		if (radeon_crtc->crtc_id)
525
			WREG32(R300_CRTC2_TILE_X0_Y0, crtc_tile_x0_y0);
526
		else
527
			WREG32(R300_CRTC_TILE_X0_Y0, crtc_tile_x0_y0);
528
	}
529
	WREG32(RADEON_CRTC_OFFSET_CNTL + radeon_crtc->crtc_offset, crtc_offset_cntl);
530
	WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, crtc_offset);
531
	WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
532
 
533
	if (old_fb && old_fb != crtc->fb) {
534
		radeon_fb = to_radeon_framebuffer(old_fb);
535
//       radeon_gem_object_unpin(radeon_fb->obj);
536
	}
537
	return 0;
538
}
539
 
540
static bool radeon_set_crtc_timing(struct drm_crtc *crtc, struct drm_display_mode *mode)
541
{
542
	struct drm_device *dev = crtc->dev;
543
	struct radeon_device *rdev = dev->dev_private;
544
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1179 serge 545
	struct drm_encoder *encoder;
1123 serge 546
	int format;
547
	int hsync_start;
548
	int hsync_wid;
549
	int vsync_wid;
550
	uint32_t crtc_h_total_disp;
551
	uint32_t crtc_h_sync_strt_wid;
552
	uint32_t crtc_v_total_disp;
553
	uint32_t crtc_v_sync_strt_wid;
1179 serge 554
	bool is_tv = false;
1123 serge 555
 
556
	DRM_DEBUG("\n");
1179 serge 557
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
558
		if (encoder->crtc == crtc) {
559
			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
560
			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
561
				is_tv = true;
562
				DRM_INFO("crtc %d is connected to a TV\n", radeon_crtc->crtc_id);
563
				break;
564
			}
565
		}
566
	}
1123 serge 567
 
568
	switch (crtc->fb->bits_per_pixel) {
1179 serge 569
	case 8:
570
		format = 2;
571
		break;
1123 serge 572
	case 15:      /*  555 */
573
		format = 3;
574
		break;
575
	case 16:      /*  565 */
576
		format = 4;
577
		break;
578
	case 24:      /*  RGB */
579
		format = 5;
580
		break;
581
	case 32:      /* xRGB */
582
		format = 6;
583
		break;
584
	default:
585
		return false;
586
	}
587
 
588
	crtc_h_total_disp = ((((mode->crtc_htotal / 8) - 1) & 0x3ff)
589
			     | ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
590
 
591
	hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
592
	if (!hsync_wid)
593
		hsync_wid = 1;
594
	hsync_start = mode->crtc_hsync_start - 8;
595
 
596
	crtc_h_sync_strt_wid = ((hsync_start & 0x1fff)
597
				| ((hsync_wid & 0x3f) << 16)
598
				| ((mode->flags & DRM_MODE_FLAG_NHSYNC)
599
				   ? RADEON_CRTC_H_SYNC_POL
600
				   : 0));
601
 
602
	/* This works for double scan mode. */
603
	crtc_v_total_disp = (((mode->crtc_vtotal - 1) & 0xffff)
604
			     | ((mode->crtc_vdisplay - 1) << 16));
605
 
606
	vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
607
	if (!vsync_wid)
608
		vsync_wid = 1;
609
 
610
	crtc_v_sync_strt_wid = (((mode->crtc_vsync_start - 1) & 0xfff)
611
				| ((vsync_wid & 0x1f) << 16)
612
				| ((mode->flags & DRM_MODE_FLAG_NVSYNC)
613
				   ? RADEON_CRTC_V_SYNC_POL
614
				   : 0));
615
 
616
	/* TODO -> Dell Server */
617
	if (0) {
618
		uint32_t disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG);
619
		uint32_t tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL);
620
		uint32_t dac2_cntl = RREG32(RADEON_DAC_CNTL2);
621
		uint32_t crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL);
622
 
623
		dac2_cntl &= ~RADEON_DAC2_DAC_CLK_SEL;
624
		dac2_cntl |= RADEON_DAC2_DAC2_CLK_SEL;
625
 
626
		/* For CRT on DAC2, don't turn it on if BIOS didn't
627
		   enable it, even it's detected.
628
		*/
629
		disp_hw_debug |= RADEON_CRT2_DISP1_SEL;
630
		tv_dac_cntl &= ~((1<<2) | (3<<8) | (7<<24) | (0xff<<16));
631
		tv_dac_cntl |= (0x03 | (2<<8) | (0x58<<16));
632
 
633
		WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
634
		WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug);
635
		WREG32(RADEON_DAC_CNTL2, dac2_cntl);
636
		WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
637
	}
638
 
639
	if (radeon_crtc->crtc_id) {
640
		uint32_t crtc2_gen_cntl;
641
		uint32_t disp2_merge_cntl;
642
 
643
		/* check to see if TV DAC is enabled for another crtc and keep it enabled */
644
		if (RREG32(RADEON_CRTC2_GEN_CNTL) & RADEON_CRTC2_CRT2_ON)
645
			crtc2_gen_cntl = RADEON_CRTC2_CRT2_ON;
646
		else
647
			crtc2_gen_cntl = 0;
648
 
649
		crtc2_gen_cntl |= ((format << 8)
650
				   | RADEON_CRTC2_VSYNC_DIS
651
				   | RADEON_CRTC2_HSYNC_DIS
652
				   | RADEON_CRTC2_DISP_DIS
653
				   | RADEON_CRTC2_DISP_REQ_EN_B
654
				   | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
655
				      ? RADEON_CRTC2_DBL_SCAN_EN
656
				      : 0)
657
				   | ((mode->flags & DRM_MODE_FLAG_CSYNC)
658
				      ? RADEON_CRTC2_CSYNC_EN
659
				      : 0)
660
				   | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
661
				      ? RADEON_CRTC2_INTERLACE_EN
662
				      : 0));
663
 
664
		disp2_merge_cntl = RREG32(RADEON_DISP2_MERGE_CNTL);
665
		disp2_merge_cntl &= ~RADEON_DISP2_RGB_OFFSET_EN;
666
 
667
		WREG32(RADEON_DISP2_MERGE_CNTL, disp2_merge_cntl);
668
		WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
669
	} else {
670
		uint32_t crtc_gen_cntl;
671
		uint32_t crtc_ext_cntl;
672
		uint32_t disp_merge_cntl;
673
 
674
		crtc_gen_cntl = (RADEON_CRTC_EXT_DISP_EN
675
				 | (format << 8)
676
				 | RADEON_CRTC_DISP_REQ_EN_B
677
				 | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
678
				    ? RADEON_CRTC_DBL_SCAN_EN
679
				    : 0)
680
				 | ((mode->flags & DRM_MODE_FLAG_CSYNC)
681
				    ? RADEON_CRTC_CSYNC_EN
682
				    : 0)
683
				 | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
684
				    ? RADEON_CRTC_INTERLACE_EN
685
				    : 0));
686
 
687
		crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
688
		crtc_ext_cntl |= (RADEON_XCRT_CNT_EN |
689
				  RADEON_CRTC_VSYNC_DIS |
690
				  RADEON_CRTC_HSYNC_DIS |
691
				  RADEON_CRTC_DISPLAY_DIS);
692
 
693
		disp_merge_cntl = RREG32(RADEON_DISP_MERGE_CNTL);
694
		disp_merge_cntl &= ~RADEON_DISP_RGB_OFFSET_EN;
695
 
696
		WREG32(RADEON_DISP_MERGE_CNTL, disp_merge_cntl);
697
		WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl);
698
		WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
699
	}
700
 
1179 serge 701
	if (is_tv)
702
		radeon_legacy_tv_adjust_crtc_reg(encoder, &crtc_h_total_disp,
703
						 &crtc_h_sync_strt_wid, &crtc_v_total_disp,
704
						 &crtc_v_sync_strt_wid);
705
 
1123 serge 706
	WREG32(RADEON_CRTC_H_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_h_total_disp);
707
	WREG32(RADEON_CRTC_H_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_h_sync_strt_wid);
708
	WREG32(RADEON_CRTC_V_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_v_total_disp);
709
	WREG32(RADEON_CRTC_V_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_v_sync_strt_wid);
710
 
711
	return true;
712
}
713
 
714
static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
715
{
716
	struct drm_device *dev = crtc->dev;
717
	struct radeon_device *rdev = dev->dev_private;
718
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
719
	struct drm_encoder *encoder;
720
	uint32_t feedback_div = 0;
721
	uint32_t frac_fb_div = 0;
722
	uint32_t reference_div = 0;
723
	uint32_t post_divider = 0;
724
	uint32_t freq = 0;
725
	uint8_t pll_gain;
726
	int pll_flags = RADEON_PLL_LEGACY;
727
	bool use_bios_divs = false;
728
	/* PLL registers */
729
	uint32_t pll_ref_div = 0;
730
	uint32_t pll_fb_post_div = 0;
731
	uint32_t htotal_cntl = 0;
1179 serge 732
	bool is_tv = false;
1123 serge 733
	struct radeon_pll *pll;
734
 
735
	struct {
736
		int divider;
737
		int bitvalue;
738
	} *post_div, post_divs[]   = {
739
		/* From RAGE 128 VR/RAGE 128 GL Register
740
		 * Reference Manual (Technical Reference
741
		 * Manual P/N RRG-G04100-C Rev. 0.04), page
742
		 * 3-17 (PLL_DIV_[3:0]).
743
		 */
744
		{  1, 0 },              /* VCLK_SRC                 */
745
		{  2, 1 },              /* VCLK_SRC/2               */
746
		{  4, 2 },              /* VCLK_SRC/4               */
747
		{  8, 3 },              /* VCLK_SRC/8               */
748
		{  3, 4 },              /* VCLK_SRC/3               */
749
		{ 16, 5 },              /* VCLK_SRC/16              */
750
		{  6, 6 },              /* VCLK_SRC/6               */
751
		{ 12, 7 },              /* VCLK_SRC/12              */
752
		{  0, 0 }
753
	};
754
 
755
	if (radeon_crtc->crtc_id)
756
		pll = &rdev->clock.p2pll;
757
	else
758
		pll = &rdev->clock.p1pll;
759
 
760
	if (mode->clock > 200000) /* range limits??? */
761
		pll_flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
762
	else
763
		pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
764
 
765
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
766
		if (encoder->crtc == crtc) {
1179 serge 767
			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
768
 
769
			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
770
				is_tv = true;
771
				break;
772
			}
773
 
1123 serge 774
			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC)
775
				pll_flags |= RADEON_PLL_NO_ODD_POST_DIV;
776
			if (encoder->encoder_type == DRM_MODE_ENCODER_LVDS) {
777
				struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
778
				struct radeon_encoder_lvds *lvds = (struct radeon_encoder_lvds *)radeon_encoder->enc_priv;
779
				if (lvds) {
780
					if (lvds->use_bios_dividers) {
781
						pll_ref_div = lvds->panel_ref_divider;
782
						pll_fb_post_div   = (lvds->panel_fb_divider |
783
								     (lvds->panel_post_divider << 16));
784
						htotal_cntl  = 0;
785
						use_bios_divs = true;
786
					}
787
				}
788
				pll_flags |= RADEON_PLL_USE_REF_DIV;
789
			}
790
		}
791
	}
792
 
793
	DRM_DEBUG("\n");
794
 
795
	if (!use_bios_divs) {
796
		radeon_compute_pll(pll, mode->clock,
797
				   &freq, &feedback_div, &frac_fb_div,
798
				   &reference_div, &post_divider,
799
				   pll_flags);
800
 
801
		for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
802
			if (post_div->divider == post_divider)
803
				break;
804
		}
805
 
806
		if (!post_div->divider)
807
			post_div = &post_divs[0];
808
 
809
		DRM_DEBUG("dc=%u, fd=%d, rd=%d, pd=%d\n",
810
			  (unsigned)freq,
811
			  feedback_div,
812
			  reference_div,
813
			  post_divider);
814
 
815
		pll_ref_div   = reference_div;
816
#if defined(__powerpc__) && (0) /* TODO */
817
		/* apparently programming this otherwise causes a hang??? */
818
		if (info->MacModel == RADEON_MAC_IBOOK)
819
			pll_fb_post_div = 0x000600ad;
820
		else
821
#endif
822
			pll_fb_post_div     = (feedback_div | (post_div->bitvalue << 16));
823
 
824
		htotal_cntl    = mode->htotal & 0x7;
825
 
826
	}
827
 
828
	pll_gain = radeon_compute_pll_gain(pll->reference_freq,
829
					   pll_ref_div & 0x3ff,
830
					   pll_fb_post_div & 0x7ff);
831
 
832
	if (radeon_crtc->crtc_id) {
833
		uint32_t pixclks_cntl = ((RREG32_PLL(RADEON_PIXCLKS_CNTL) &
834
					  ~(RADEON_PIX2CLK_SRC_SEL_MASK)) |
835
					 RADEON_PIX2CLK_SRC_SEL_P2PLLCLK);
836
 
1179 serge 837
		if (is_tv) {
838
			radeon_legacy_tv_adjust_pll2(encoder, &htotal_cntl,
839
						     &pll_ref_div, &pll_fb_post_div,
840
						     &pixclks_cntl);
841
		}
842
 
1123 serge 843
		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
844
			     RADEON_PIX2CLK_SRC_SEL_CPUCLK,
845
			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
846
 
847
		WREG32_PLL_P(RADEON_P2PLL_CNTL,
848
			     RADEON_P2PLL_RESET
849
			     | RADEON_P2PLL_ATOMIC_UPDATE_EN
850
			     | ((uint32_t)pll_gain << RADEON_P2PLL_PVG_SHIFT),
851
			     ~(RADEON_P2PLL_RESET
852
			       | RADEON_P2PLL_ATOMIC_UPDATE_EN
853
			       | RADEON_P2PLL_PVG_MASK));
854
 
855
		WREG32_PLL_P(RADEON_P2PLL_REF_DIV,
856
			     pll_ref_div,
857
			     ~RADEON_P2PLL_REF_DIV_MASK);
858
 
859
		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
860
			     pll_fb_post_div,
861
			     ~RADEON_P2PLL_FB0_DIV_MASK);
862
 
863
		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
864
			     pll_fb_post_div,
865
			     ~RADEON_P2PLL_POST0_DIV_MASK);
866
 
867
		radeon_pll2_write_update(dev);
868
		radeon_pll2_wait_for_read_update_complete(dev);
869
 
870
		WREG32_PLL(RADEON_HTOTAL2_CNTL, htotal_cntl);
871
 
872
		WREG32_PLL_P(RADEON_P2PLL_CNTL,
873
			     0,
874
			     ~(RADEON_P2PLL_RESET
875
			       | RADEON_P2PLL_SLEEP
876
			       | RADEON_P2PLL_ATOMIC_UPDATE_EN));
877
 
878
		DRM_DEBUG("Wrote2: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
879
			  (unsigned)pll_ref_div,
880
			  (unsigned)pll_fb_post_div,
881
			  (unsigned)htotal_cntl,
882
			  RREG32_PLL(RADEON_P2PLL_CNTL));
883
		DRM_DEBUG("Wrote2: rd=%u, fd=%u, pd=%u\n",
884
			  (unsigned)pll_ref_div & RADEON_P2PLL_REF_DIV_MASK,
885
			  (unsigned)pll_fb_post_div & RADEON_P2PLL_FB0_DIV_MASK,
886
			  (unsigned)((pll_fb_post_div &
887
				      RADEON_P2PLL_POST0_DIV_MASK) >> 16));
888
 
889
		mdelay(50); /* Let the clock to lock */
890
 
891
		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
892
			     RADEON_PIX2CLK_SRC_SEL_P2PLLCLK,
893
			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
894
 
895
		WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
896
	} else {
1179 serge 897
		uint32_t pixclks_cntl;
898
 
899
 
900
		if (is_tv) {
901
			pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
902
			radeon_legacy_tv_adjust_pll1(encoder, &htotal_cntl, &pll_ref_div,
903
						     &pll_fb_post_div, &pixclks_cntl);
904
		}
905
 
1123 serge 906
		if (rdev->flags & RADEON_IS_MOBILITY) {
907
			/* A temporal workaround for the occational blanking on certain laptop panels.
908
			   This appears to related to the PLL divider registers (fail to lock?).
909
			   It occurs even when all dividers are the same with their old settings.
910
			   In this case we really don't need to fiddle with PLL registers.
911
			   By doing this we can avoid the blanking problem with some panels.
912
			*/
913
			if ((pll_ref_div == (RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_REF_DIV_MASK)) &&
914
			    (pll_fb_post_div == (RREG32_PLL(RADEON_PPLL_DIV_3) &
915
						 (RADEON_PPLL_POST3_DIV_MASK | RADEON_PPLL_FB3_DIV_MASK)))) {
916
				WREG32_P(RADEON_CLOCK_CNTL_INDEX,
917
					 RADEON_PLL_DIV_SEL,
918
					 ~(RADEON_PLL_DIV_SEL));
919
				r100_pll_errata_after_index(rdev);
920
				return;
921
			}
922
		}
923
 
924
		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
925
			     RADEON_VCLK_SRC_SEL_CPUCLK,
926
			     ~(RADEON_VCLK_SRC_SEL_MASK));
927
		WREG32_PLL_P(RADEON_PPLL_CNTL,
928
			     RADEON_PPLL_RESET
929
			     | RADEON_PPLL_ATOMIC_UPDATE_EN
930
			     | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
931
			     | ((uint32_t)pll_gain << RADEON_PPLL_PVG_SHIFT),
932
			     ~(RADEON_PPLL_RESET
933
			       | RADEON_PPLL_ATOMIC_UPDATE_EN
934
			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
935
			       | RADEON_PPLL_PVG_MASK));
936
 
937
		WREG32_P(RADEON_CLOCK_CNTL_INDEX,
938
			 RADEON_PLL_DIV_SEL,
939
			 ~(RADEON_PLL_DIV_SEL));
940
		r100_pll_errata_after_index(rdev);
941
 
942
		if (ASIC_IS_R300(rdev) ||
943
		    (rdev->family == CHIP_RS300) ||
944
		    (rdev->family == CHIP_RS400) ||
945
		    (rdev->family == CHIP_RS480)) {
946
			if (pll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) {
947
				/* When restoring console mode, use saved PPLL_REF_DIV
948
				 * setting.
949
				 */
950
				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
951
					     pll_ref_div,
952
					     0);
953
			} else {
954
				/* R300 uses ref_div_acc field as real ref divider */
955
				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
956
					     (pll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT),
957
					     ~R300_PPLL_REF_DIV_ACC_MASK);
958
			}
959
		} else
960
			WREG32_PLL_P(RADEON_PPLL_REF_DIV,
961
				     pll_ref_div,
962
				     ~RADEON_PPLL_REF_DIV_MASK);
963
 
964
		WREG32_PLL_P(RADEON_PPLL_DIV_3,
965
			     pll_fb_post_div,
966
			     ~RADEON_PPLL_FB3_DIV_MASK);
967
 
968
		WREG32_PLL_P(RADEON_PPLL_DIV_3,
969
			     pll_fb_post_div,
970
			     ~RADEON_PPLL_POST3_DIV_MASK);
971
 
972
		radeon_pll_write_update(dev);
973
		radeon_pll_wait_for_read_update_complete(dev);
974
 
975
		WREG32_PLL(RADEON_HTOTAL_CNTL, htotal_cntl);
976
 
977
		WREG32_PLL_P(RADEON_PPLL_CNTL,
978
			     0,
979
			     ~(RADEON_PPLL_RESET
980
			       | RADEON_PPLL_SLEEP
981
			       | RADEON_PPLL_ATOMIC_UPDATE_EN
982
			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN));
983
 
984
		DRM_DEBUG("Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
985
			  pll_ref_div,
986
			  pll_fb_post_div,
987
			  (unsigned)htotal_cntl,
988
			  RREG32_PLL(RADEON_PPLL_CNTL));
989
		DRM_DEBUG("Wrote: rd=%d, fd=%d, pd=%d\n",
990
			  pll_ref_div & RADEON_PPLL_REF_DIV_MASK,
991
			  pll_fb_post_div & RADEON_PPLL_FB3_DIV_MASK,
992
			  (pll_fb_post_div & RADEON_PPLL_POST3_DIV_MASK) >> 16);
993
 
994
		mdelay(50); /* Let the clock to lock */
995
 
996
		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
997
			     RADEON_VCLK_SRC_SEL_PPLLCLK,
998
			     ~(RADEON_VCLK_SRC_SEL_MASK));
999
 
1179 serge 1000
		if (is_tv)
1001
			WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
1123 serge 1002
	}
1003
}
1004
 
1005
static bool radeon_crtc_mode_fixup(struct drm_crtc *crtc,
1006
				   struct drm_display_mode *mode,
1007
				   struct drm_display_mode *adjusted_mode)
1008
{
1179 serge 1009
	if (!radeon_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode))
1010
		return false;
1123 serge 1011
	return true;
1012
}
1013
 
1014
static int radeon_crtc_mode_set(struct drm_crtc *crtc,
1015
				 struct drm_display_mode *mode,
1016
				 struct drm_display_mode *adjusted_mode,
1017
				 int x, int y, struct drm_framebuffer *old_fb)
1018
{
1179 serge 1019
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1020
	struct drm_device *dev = crtc->dev;
1021
	struct radeon_device *rdev = dev->dev_private;
1123 serge 1022
 
1023
	/* TODO TV */
1024
	radeon_crtc_set_base(crtc, x, y, old_fb);
1025
	radeon_set_crtc_timing(crtc, adjusted_mode);
1026
	radeon_set_pll(crtc, adjusted_mode);
1179 serge 1027
	radeon_bandwidth_update(rdev);
1028
	if (radeon_crtc->crtc_id == 0) {
1029
		radeon_legacy_rmx_mode_set(crtc, mode, adjusted_mode);
1030
	} else {
1031
		if (radeon_crtc->rmx_type != RMX_OFF) {
1032
			/* FIXME: only first crtc has rmx what should we
1033
			 * do ?
1034
			 */
1035
			DRM_ERROR("Mode need scaling but only first crtc can do that.\n");
1036
		}
1037
	}
1123 serge 1038
	return 0;
1039
}
1040
 
1041
static void radeon_crtc_prepare(struct drm_crtc *crtc)
1042
{
1043
	radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
1044
}
1045
 
1046
static void radeon_crtc_commit(struct drm_crtc *crtc)
1047
{
1048
	radeon_crtc_dpms(crtc, DRM_MODE_DPMS_ON);
1049
}
1050
 
1051
static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
1052
	.dpms = radeon_crtc_dpms,
1053
	.mode_fixup = radeon_crtc_mode_fixup,
1054
	.mode_set = radeon_crtc_mode_set,
1055
	.mode_set_base = radeon_crtc_set_base,
1056
	.prepare = radeon_crtc_prepare,
1057
	.commit = radeon_crtc_commit,
1221 serge 1058
	.load_lut = radeon_crtc_load_lut,
1123 serge 1059
};
1060
 
1061
 
1062
void radeon_legacy_init_crtc(struct drm_device *dev,
1063
			       struct radeon_crtc *radeon_crtc)
1064
{
1065
	if (radeon_crtc->crtc_id == 1)
1066
		radeon_crtc->crtc_offset = RADEON_CRTC2_H_TOTAL_DISP - RADEON_CRTC_H_TOTAL_DISP;
1067
	drm_crtc_helper_add(&radeon_crtc->base, &legacy_helper_funcs);
1068
}