Subversion Repositories Kolibri OS

Rev

Rev 1268 | Rev 1321 | 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;
1268 serge 51
	struct drm_display_mode *native_mode = &radeon_crtc->native_mode;
1179 serge 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
 
1268 serge 98
	if (native_mode->hdisplay == 0 ||
99
	    native_mode->vdisplay == 0) {
1179 serge 100
		hscale = false;
101
		vscale = false;
102
	} else {
1268 serge 103
		if (xres > native_mode->hdisplay)
104
			xres = native_mode->hdisplay;
105
		if (yres > native_mode->vdisplay)
106
			yres = native_mode->vdisplay;
1179 serge 107
 
1268 serge 108
		if (xres == native_mode->hdisplay)
1179 serge 109
			hscale = false;
1268 serge 110
		if (yres == native_mode->vdisplay)
1179 serge 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)
1268 serge 122
				/ native_mode->hdisplay + 1;
1179 serge 123
			fp_horz_stretch |= (((scale) & RADEON_HORZ_STRETCH_RATIO_MASK) |
124
					RADEON_HORZ_STRETCH_BLEND |
125
					RADEON_HORZ_STRETCH_ENABLE |
1268 serge 126
					((native_mode->hdisplay/8-1) << 16));
1179 serge 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)
1268 serge 134
				/ native_mode->vdisplay + 1;
1179 serge 135
			fp_vert_stretch |= (((scale) & RADEON_VERT_STRETCH_RATIO_MASK) |
136
					RADEON_VERT_STRETCH_ENABLE |
137
					RADEON_VERT_STRETCH_BLEND |
1268 serge 138
					((native_mode->vdisplay-1) << 12));
1179 serge 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
 
1268 serge 178
		fp_horz_vert_active = (((native_mode->vdisplay) & 0xfff) |
179
				(((native_mode->hdisplay / 8) & 0x1ff) << 16));
1179 serge 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);
1275 serge 456
    tiling_flags = 0;
457
 
1179 serge 458
	if (tiling_flags & RADEON_TILING_MICRO)
459
		DRM_ERROR("trying to scanout microtiled buffer\n");
460
 
461
	if (tiling_flags & RADEON_TILING_MACRO) {
1123 serge 462
		if (ASIC_IS_R300(rdev))
463
			crtc_offset_cntl |= (R300_CRTC_X_Y_MODE_EN |
464
					     R300_CRTC_MICRO_TILE_BUFFER_DIS |
465
					     R300_CRTC_MACRO_TILE_EN);
466
		else
467
			crtc_offset_cntl |= RADEON_CRTC_TILE_EN;
468
	} else {
469
		if (ASIC_IS_R300(rdev))
470
			crtc_offset_cntl &= ~(R300_CRTC_X_Y_MODE_EN |
471
					      R300_CRTC_MICRO_TILE_BUFFER_DIS |
472
					      R300_CRTC_MACRO_TILE_EN);
473
		else
474
			crtc_offset_cntl &= ~RADEON_CRTC_TILE_EN;
475
	}
476
 
1179 serge 477
	if (tiling_flags & RADEON_TILING_MACRO) {
1123 serge 478
		if (ASIC_IS_R300(rdev)) {
479
			crtc_tile_x0_y0 = x | (y << 16);
480
			base &= ~0x7ff;
481
		} else {
482
			int byteshift = crtc->fb->bits_per_pixel >> 4;
1179 serge 483
			int tile_addr = (((y >> 3) * pitch_pixels +  x) >> (8 - byteshift)) << 11;
1123 serge 484
			base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8);
485
			crtc_offset_cntl |= (y % 16);
486
		}
487
	} else {
488
		int offset = y * pitch_pixels + x;
489
		switch (crtc->fb->bits_per_pixel) {
1179 serge 490
		case 8:
491
			offset *= 1;
492
			break;
1123 serge 493
		case 15:
494
		case 16:
495
			offset *= 2;
496
			break;
497
		case 24:
498
			offset *= 3;
499
			break;
500
		case 32:
501
			offset *= 4;
502
			break;
503
		default:
504
			return false;
505
		}
506
		base += offset;
507
	}
508
 
509
	base &= ~7;
510
 
1179 serge 511
	if (radeon_crtc->crtc_id == 1)
512
		gen_cntl_reg = RADEON_CRTC2_GEN_CNTL;
513
	else
514
		gen_cntl_reg = RADEON_CRTC_GEN_CNTL;
1123 serge 515
 
1179 serge 516
	gen_cntl_val = RREG32(gen_cntl_reg);
517
	gen_cntl_val &= ~(0xf << 8);
518
	gen_cntl_val |= (format << 8);
519
	WREG32(gen_cntl_reg, gen_cntl_val);
520
 
1123 serge 521
	crtc_offset = (u32)base;
522
 
1179 serge 523
	WREG32(RADEON_DISPLAY_BASE_ADDR + radeon_crtc->crtc_offset, radeon_crtc->legacy_display_base_addr);
1123 serge 524
 
525
	if (ASIC_IS_R300(rdev)) {
526
		if (radeon_crtc->crtc_id)
527
			WREG32(R300_CRTC2_TILE_X0_Y0, crtc_tile_x0_y0);
528
		else
529
			WREG32(R300_CRTC_TILE_X0_Y0, crtc_tile_x0_y0);
530
	}
531
	WREG32(RADEON_CRTC_OFFSET_CNTL + radeon_crtc->crtc_offset, crtc_offset_cntl);
532
	WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, crtc_offset);
533
	WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
534
 
1275 serge 535
//   if (old_fb && old_fb != crtc->fb) {
536
//       radeon_fb = to_radeon_framebuffer(old_fb);
1123 serge 537
//       radeon_gem_object_unpin(radeon_fb->obj);
1275 serge 538
//   }
1268 serge 539
 
540
	/* Bytes per pixel may have changed */
541
	radeon_bandwidth_update(rdev);
542
 
1123 serge 543
	return 0;
544
}
545
 
546
static bool radeon_set_crtc_timing(struct drm_crtc *crtc, struct drm_display_mode *mode)
547
{
548
	struct drm_device *dev = crtc->dev;
549
	struct radeon_device *rdev = dev->dev_private;
550
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1179 serge 551
	struct drm_encoder *encoder;
1123 serge 552
	int format;
553
	int hsync_start;
554
	int hsync_wid;
555
	int vsync_wid;
556
	uint32_t crtc_h_total_disp;
557
	uint32_t crtc_h_sync_strt_wid;
558
	uint32_t crtc_v_total_disp;
559
	uint32_t crtc_v_sync_strt_wid;
1179 serge 560
	bool is_tv = false;
1123 serge 561
 
562
	DRM_DEBUG("\n");
1179 serge 563
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
564
		if (encoder->crtc == crtc) {
565
			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
566
			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
567
				is_tv = true;
568
				DRM_INFO("crtc %d is connected to a TV\n", radeon_crtc->crtc_id);
569
				break;
570
			}
571
		}
572
	}
1123 serge 573
 
574
	switch (crtc->fb->bits_per_pixel) {
1179 serge 575
	case 8:
576
		format = 2;
577
		break;
1123 serge 578
	case 15:      /*  555 */
579
		format = 3;
580
		break;
581
	case 16:      /*  565 */
582
		format = 4;
583
		break;
584
	case 24:      /*  RGB */
585
		format = 5;
586
		break;
587
	case 32:      /* xRGB */
588
		format = 6;
589
		break;
590
	default:
591
		return false;
592
	}
593
 
594
	crtc_h_total_disp = ((((mode->crtc_htotal / 8) - 1) & 0x3ff)
595
			     | ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
596
 
597
	hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
598
	if (!hsync_wid)
599
		hsync_wid = 1;
600
	hsync_start = mode->crtc_hsync_start - 8;
601
 
602
	crtc_h_sync_strt_wid = ((hsync_start & 0x1fff)
603
				| ((hsync_wid & 0x3f) << 16)
604
				| ((mode->flags & DRM_MODE_FLAG_NHSYNC)
605
				   ? RADEON_CRTC_H_SYNC_POL
606
				   : 0));
607
 
608
	/* This works for double scan mode. */
609
	crtc_v_total_disp = (((mode->crtc_vtotal - 1) & 0xffff)
610
			     | ((mode->crtc_vdisplay - 1) << 16));
611
 
612
	vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
613
	if (!vsync_wid)
614
		vsync_wid = 1;
615
 
616
	crtc_v_sync_strt_wid = (((mode->crtc_vsync_start - 1) & 0xfff)
617
				| ((vsync_wid & 0x1f) << 16)
618
				| ((mode->flags & DRM_MODE_FLAG_NVSYNC)
619
				   ? RADEON_CRTC_V_SYNC_POL
620
				   : 0));
621
 
622
	/* TODO -> Dell Server */
623
	if (0) {
624
		uint32_t disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG);
625
		uint32_t tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL);
626
		uint32_t dac2_cntl = RREG32(RADEON_DAC_CNTL2);
627
		uint32_t crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL);
628
 
629
		dac2_cntl &= ~RADEON_DAC2_DAC_CLK_SEL;
630
		dac2_cntl |= RADEON_DAC2_DAC2_CLK_SEL;
631
 
632
		/* For CRT on DAC2, don't turn it on if BIOS didn't
633
		   enable it, even it's detected.
634
		*/
635
		disp_hw_debug |= RADEON_CRT2_DISP1_SEL;
636
		tv_dac_cntl &= ~((1<<2) | (3<<8) | (7<<24) | (0xff<<16));
637
		tv_dac_cntl |= (0x03 | (2<<8) | (0x58<<16));
638
 
639
		WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl);
640
		WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug);
641
		WREG32(RADEON_DAC_CNTL2, dac2_cntl);
642
		WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
643
	}
644
 
645
	if (radeon_crtc->crtc_id) {
646
		uint32_t crtc2_gen_cntl;
647
		uint32_t disp2_merge_cntl;
648
 
649
		/* check to see if TV DAC is enabled for another crtc and keep it enabled */
650
		if (RREG32(RADEON_CRTC2_GEN_CNTL) & RADEON_CRTC2_CRT2_ON)
651
			crtc2_gen_cntl = RADEON_CRTC2_CRT2_ON;
652
		else
653
			crtc2_gen_cntl = 0;
654
 
655
		crtc2_gen_cntl |= ((format << 8)
656
				   | RADEON_CRTC2_VSYNC_DIS
657
				   | RADEON_CRTC2_HSYNC_DIS
658
				   | RADEON_CRTC2_DISP_DIS
659
				   | RADEON_CRTC2_DISP_REQ_EN_B
660
				   | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
661
				      ? RADEON_CRTC2_DBL_SCAN_EN
662
				      : 0)
663
				   | ((mode->flags & DRM_MODE_FLAG_CSYNC)
664
				      ? RADEON_CRTC2_CSYNC_EN
665
				      : 0)
666
				   | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
667
				      ? RADEON_CRTC2_INTERLACE_EN
668
				      : 0));
669
 
670
		disp2_merge_cntl = RREG32(RADEON_DISP2_MERGE_CNTL);
671
		disp2_merge_cntl &= ~RADEON_DISP2_RGB_OFFSET_EN;
672
 
673
		WREG32(RADEON_DISP2_MERGE_CNTL, disp2_merge_cntl);
674
		WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
1268 serge 675
 
676
		WREG32(RADEON_FP_H2_SYNC_STRT_WID, crtc_h_sync_strt_wid);
677
		WREG32(RADEON_FP_V2_SYNC_STRT_WID, crtc_v_sync_strt_wid);
1123 serge 678
	} else {
679
		uint32_t crtc_gen_cntl;
680
		uint32_t crtc_ext_cntl;
681
		uint32_t disp_merge_cntl;
682
 
683
		crtc_gen_cntl = (RADEON_CRTC_EXT_DISP_EN
684
				 | (format << 8)
685
				 | RADEON_CRTC_DISP_REQ_EN_B
686
				 | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
687
				    ? RADEON_CRTC_DBL_SCAN_EN
688
				    : 0)
689
				 | ((mode->flags & DRM_MODE_FLAG_CSYNC)
690
				    ? RADEON_CRTC_CSYNC_EN
691
				    : 0)
692
				 | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
693
				    ? RADEON_CRTC_INTERLACE_EN
694
				    : 0));
695
 
696
		crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
697
		crtc_ext_cntl |= (RADEON_XCRT_CNT_EN |
698
				  RADEON_CRTC_VSYNC_DIS |
699
				  RADEON_CRTC_HSYNC_DIS |
700
				  RADEON_CRTC_DISPLAY_DIS);
701
 
702
		disp_merge_cntl = RREG32(RADEON_DISP_MERGE_CNTL);
703
		disp_merge_cntl &= ~RADEON_DISP_RGB_OFFSET_EN;
704
 
705
		WREG32(RADEON_DISP_MERGE_CNTL, disp_merge_cntl);
706
		WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl);
707
		WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
708
	}
709
 
1179 serge 710
	if (is_tv)
711
		radeon_legacy_tv_adjust_crtc_reg(encoder, &crtc_h_total_disp,
712
						 &crtc_h_sync_strt_wid, &crtc_v_total_disp,
713
						 &crtc_v_sync_strt_wid);
714
 
1123 serge 715
	WREG32(RADEON_CRTC_H_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_h_total_disp);
716
	WREG32(RADEON_CRTC_H_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_h_sync_strt_wid);
717
	WREG32(RADEON_CRTC_V_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_v_total_disp);
718
	WREG32(RADEON_CRTC_V_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_v_sync_strt_wid);
719
 
720
	return true;
721
}
722
 
723
static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
724
{
725
	struct drm_device *dev = crtc->dev;
726
	struct radeon_device *rdev = dev->dev_private;
727
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
728
	struct drm_encoder *encoder;
729
	uint32_t feedback_div = 0;
730
	uint32_t frac_fb_div = 0;
731
	uint32_t reference_div = 0;
732
	uint32_t post_divider = 0;
733
	uint32_t freq = 0;
734
	uint8_t pll_gain;
735
	int pll_flags = RADEON_PLL_LEGACY;
736
	bool use_bios_divs = false;
737
	/* PLL registers */
738
	uint32_t pll_ref_div = 0;
739
	uint32_t pll_fb_post_div = 0;
740
	uint32_t htotal_cntl = 0;
1179 serge 741
	bool is_tv = false;
1123 serge 742
	struct radeon_pll *pll;
743
 
744
	struct {
745
		int divider;
746
		int bitvalue;
747
	} *post_div, post_divs[]   = {
748
		/* From RAGE 128 VR/RAGE 128 GL Register
749
		 * Reference Manual (Technical Reference
750
		 * Manual P/N RRG-G04100-C Rev. 0.04), page
751
		 * 3-17 (PLL_DIV_[3:0]).
752
		 */
753
		{  1, 0 },              /* VCLK_SRC                 */
754
		{  2, 1 },              /* VCLK_SRC/2               */
755
		{  4, 2 },              /* VCLK_SRC/4               */
756
		{  8, 3 },              /* VCLK_SRC/8               */
757
		{  3, 4 },              /* VCLK_SRC/3               */
758
		{ 16, 5 },              /* VCLK_SRC/16              */
759
		{  6, 6 },              /* VCLK_SRC/6               */
760
		{ 12, 7 },              /* VCLK_SRC/12              */
761
		{  0, 0 }
762
	};
763
 
764
	if (radeon_crtc->crtc_id)
765
		pll = &rdev->clock.p2pll;
766
	else
767
		pll = &rdev->clock.p1pll;
768
 
769
	if (mode->clock > 200000) /* range limits??? */
770
		pll_flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
771
	else
772
		pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
773
 
774
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
775
		if (encoder->crtc == crtc) {
1179 serge 776
			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
777
 
778
			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
779
				is_tv = true;
780
				break;
781
			}
782
 
1123 serge 783
			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC)
784
				pll_flags |= RADEON_PLL_NO_ODD_POST_DIV;
785
			if (encoder->encoder_type == DRM_MODE_ENCODER_LVDS) {
786
				struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
787
				struct radeon_encoder_lvds *lvds = (struct radeon_encoder_lvds *)radeon_encoder->enc_priv;
788
				if (lvds) {
789
					if (lvds->use_bios_dividers) {
790
						pll_ref_div = lvds->panel_ref_divider;
791
						pll_fb_post_div   = (lvds->panel_fb_divider |
792
								     (lvds->panel_post_divider << 16));
793
						htotal_cntl  = 0;
794
						use_bios_divs = true;
795
					}
796
				}
797
				pll_flags |= RADEON_PLL_USE_REF_DIV;
798
			}
799
		}
800
	}
801
 
802
	DRM_DEBUG("\n");
803
 
804
	if (!use_bios_divs) {
805
		radeon_compute_pll(pll, mode->clock,
806
				   &freq, &feedback_div, &frac_fb_div,
807
				   &reference_div, &post_divider,
808
				   pll_flags);
809
 
810
		for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
811
			if (post_div->divider == post_divider)
812
				break;
813
		}
814
 
815
		if (!post_div->divider)
816
			post_div = &post_divs[0];
817
 
818
		DRM_DEBUG("dc=%u, fd=%d, rd=%d, pd=%d\n",
819
			  (unsigned)freq,
820
			  feedback_div,
821
			  reference_div,
822
			  post_divider);
823
 
824
		pll_ref_div   = reference_div;
825
#if defined(__powerpc__) && (0) /* TODO */
826
		/* apparently programming this otherwise causes a hang??? */
827
		if (info->MacModel == RADEON_MAC_IBOOK)
828
			pll_fb_post_div = 0x000600ad;
829
		else
830
#endif
831
			pll_fb_post_div     = (feedback_div | (post_div->bitvalue << 16));
832
 
833
		htotal_cntl    = mode->htotal & 0x7;
834
 
835
	}
836
 
837
	pll_gain = radeon_compute_pll_gain(pll->reference_freq,
838
					   pll_ref_div & 0x3ff,
839
					   pll_fb_post_div & 0x7ff);
840
 
841
	if (radeon_crtc->crtc_id) {
842
		uint32_t pixclks_cntl = ((RREG32_PLL(RADEON_PIXCLKS_CNTL) &
843
					  ~(RADEON_PIX2CLK_SRC_SEL_MASK)) |
844
					 RADEON_PIX2CLK_SRC_SEL_P2PLLCLK);
845
 
1179 serge 846
		if (is_tv) {
847
			radeon_legacy_tv_adjust_pll2(encoder, &htotal_cntl,
848
						     &pll_ref_div, &pll_fb_post_div,
849
						     &pixclks_cntl);
850
		}
851
 
1123 serge 852
		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
853
			     RADEON_PIX2CLK_SRC_SEL_CPUCLK,
854
			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
855
 
856
		WREG32_PLL_P(RADEON_P2PLL_CNTL,
857
			     RADEON_P2PLL_RESET
858
			     | RADEON_P2PLL_ATOMIC_UPDATE_EN
859
			     | ((uint32_t)pll_gain << RADEON_P2PLL_PVG_SHIFT),
860
			     ~(RADEON_P2PLL_RESET
861
			       | RADEON_P2PLL_ATOMIC_UPDATE_EN
862
			       | RADEON_P2PLL_PVG_MASK));
863
 
864
		WREG32_PLL_P(RADEON_P2PLL_REF_DIV,
865
			     pll_ref_div,
866
			     ~RADEON_P2PLL_REF_DIV_MASK);
867
 
868
		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
869
			     pll_fb_post_div,
870
			     ~RADEON_P2PLL_FB0_DIV_MASK);
871
 
872
		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
873
			     pll_fb_post_div,
874
			     ~RADEON_P2PLL_POST0_DIV_MASK);
875
 
876
		radeon_pll2_write_update(dev);
877
		radeon_pll2_wait_for_read_update_complete(dev);
878
 
879
		WREG32_PLL(RADEON_HTOTAL2_CNTL, htotal_cntl);
880
 
881
		WREG32_PLL_P(RADEON_P2PLL_CNTL,
882
			     0,
883
			     ~(RADEON_P2PLL_RESET
884
			       | RADEON_P2PLL_SLEEP
885
			       | RADEON_P2PLL_ATOMIC_UPDATE_EN));
886
 
887
		DRM_DEBUG("Wrote2: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
888
			  (unsigned)pll_ref_div,
889
			  (unsigned)pll_fb_post_div,
890
			  (unsigned)htotal_cntl,
891
			  RREG32_PLL(RADEON_P2PLL_CNTL));
892
		DRM_DEBUG("Wrote2: rd=%u, fd=%u, pd=%u\n",
893
			  (unsigned)pll_ref_div & RADEON_P2PLL_REF_DIV_MASK,
894
			  (unsigned)pll_fb_post_div & RADEON_P2PLL_FB0_DIV_MASK,
895
			  (unsigned)((pll_fb_post_div &
896
				      RADEON_P2PLL_POST0_DIV_MASK) >> 16));
897
 
898
		mdelay(50); /* Let the clock to lock */
899
 
900
		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
901
			     RADEON_PIX2CLK_SRC_SEL_P2PLLCLK,
902
			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
903
 
904
		WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
905
	} else {
1179 serge 906
		uint32_t pixclks_cntl;
907
 
908
 
909
		if (is_tv) {
910
			pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
911
			radeon_legacy_tv_adjust_pll1(encoder, &htotal_cntl, &pll_ref_div,
912
						     &pll_fb_post_div, &pixclks_cntl);
913
		}
914
 
1123 serge 915
		if (rdev->flags & RADEON_IS_MOBILITY) {
916
			/* A temporal workaround for the occational blanking on certain laptop panels.
917
			   This appears to related to the PLL divider registers (fail to lock?).
918
			   It occurs even when all dividers are the same with their old settings.
919
			   In this case we really don't need to fiddle with PLL registers.
920
			   By doing this we can avoid the blanking problem with some panels.
921
			*/
922
			if ((pll_ref_div == (RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_REF_DIV_MASK)) &&
923
			    (pll_fb_post_div == (RREG32_PLL(RADEON_PPLL_DIV_3) &
924
						 (RADEON_PPLL_POST3_DIV_MASK | RADEON_PPLL_FB3_DIV_MASK)))) {
925
				WREG32_P(RADEON_CLOCK_CNTL_INDEX,
926
					 RADEON_PLL_DIV_SEL,
927
					 ~(RADEON_PLL_DIV_SEL));
928
				r100_pll_errata_after_index(rdev);
929
				return;
930
			}
931
		}
932
 
933
		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
934
			     RADEON_VCLK_SRC_SEL_CPUCLK,
935
			     ~(RADEON_VCLK_SRC_SEL_MASK));
936
		WREG32_PLL_P(RADEON_PPLL_CNTL,
937
			     RADEON_PPLL_RESET
938
			     | RADEON_PPLL_ATOMIC_UPDATE_EN
939
			     | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
940
			     | ((uint32_t)pll_gain << RADEON_PPLL_PVG_SHIFT),
941
			     ~(RADEON_PPLL_RESET
942
			       | RADEON_PPLL_ATOMIC_UPDATE_EN
943
			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
944
			       | RADEON_PPLL_PVG_MASK));
945
 
946
		WREG32_P(RADEON_CLOCK_CNTL_INDEX,
947
			 RADEON_PLL_DIV_SEL,
948
			 ~(RADEON_PLL_DIV_SEL));
949
		r100_pll_errata_after_index(rdev);
950
 
951
		if (ASIC_IS_R300(rdev) ||
952
		    (rdev->family == CHIP_RS300) ||
953
		    (rdev->family == CHIP_RS400) ||
954
		    (rdev->family == CHIP_RS480)) {
955
			if (pll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) {
956
				/* When restoring console mode, use saved PPLL_REF_DIV
957
				 * setting.
958
				 */
959
				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
960
					     pll_ref_div,
961
					     0);
962
			} else {
963
				/* R300 uses ref_div_acc field as real ref divider */
964
				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
965
					     (pll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT),
966
					     ~R300_PPLL_REF_DIV_ACC_MASK);
967
			}
968
		} else
969
			WREG32_PLL_P(RADEON_PPLL_REF_DIV,
970
				     pll_ref_div,
971
				     ~RADEON_PPLL_REF_DIV_MASK);
972
 
973
		WREG32_PLL_P(RADEON_PPLL_DIV_3,
974
			     pll_fb_post_div,
975
			     ~RADEON_PPLL_FB3_DIV_MASK);
976
 
977
		WREG32_PLL_P(RADEON_PPLL_DIV_3,
978
			     pll_fb_post_div,
979
			     ~RADEON_PPLL_POST3_DIV_MASK);
980
 
981
		radeon_pll_write_update(dev);
982
		radeon_pll_wait_for_read_update_complete(dev);
983
 
984
		WREG32_PLL(RADEON_HTOTAL_CNTL, htotal_cntl);
985
 
986
		WREG32_PLL_P(RADEON_PPLL_CNTL,
987
			     0,
988
			     ~(RADEON_PPLL_RESET
989
			       | RADEON_PPLL_SLEEP
990
			       | RADEON_PPLL_ATOMIC_UPDATE_EN
991
			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN));
992
 
993
		DRM_DEBUG("Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
994
			  pll_ref_div,
995
			  pll_fb_post_div,
996
			  (unsigned)htotal_cntl,
997
			  RREG32_PLL(RADEON_PPLL_CNTL));
998
		DRM_DEBUG("Wrote: rd=%d, fd=%d, pd=%d\n",
999
			  pll_ref_div & RADEON_PPLL_REF_DIV_MASK,
1000
			  pll_fb_post_div & RADEON_PPLL_FB3_DIV_MASK,
1001
			  (pll_fb_post_div & RADEON_PPLL_POST3_DIV_MASK) >> 16);
1002
 
1003
		mdelay(50); /* Let the clock to lock */
1004
 
1005
		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
1006
			     RADEON_VCLK_SRC_SEL_PPLLCLK,
1007
			     ~(RADEON_VCLK_SRC_SEL_MASK));
1008
 
1179 serge 1009
		if (is_tv)
1010
			WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
1123 serge 1011
	}
1012
}
1013
 
1014
static bool radeon_crtc_mode_fixup(struct drm_crtc *crtc,
1015
				   struct drm_display_mode *mode,
1016
				   struct drm_display_mode *adjusted_mode)
1017
{
1179 serge 1018
	if (!radeon_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode))
1019
		return false;
1123 serge 1020
	return true;
1021
}
1022
 
1023
static int radeon_crtc_mode_set(struct drm_crtc *crtc,
1024
				 struct drm_display_mode *mode,
1025
				 struct drm_display_mode *adjusted_mode,
1026
				 int x, int y, struct drm_framebuffer *old_fb)
1027
{
1179 serge 1028
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1123 serge 1029
 
1030
	/* TODO TV */
1031
	radeon_crtc_set_base(crtc, x, y, old_fb);
1032
	radeon_set_crtc_timing(crtc, adjusted_mode);
1033
	radeon_set_pll(crtc, adjusted_mode);
1179 serge 1034
	if (radeon_crtc->crtc_id == 0) {
1035
		radeon_legacy_rmx_mode_set(crtc, mode, adjusted_mode);
1036
	} else {
1037
		if (radeon_crtc->rmx_type != RMX_OFF) {
1038
			/* FIXME: only first crtc has rmx what should we
1039
			 * do ?
1040
			 */
1041
			DRM_ERROR("Mode need scaling but only first crtc can do that.\n");
1042
		}
1043
	}
1123 serge 1044
	return 0;
1045
}
1046
 
1047
static void radeon_crtc_prepare(struct drm_crtc *crtc)
1048
{
1049
	radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
1050
}
1051
 
1052
static void radeon_crtc_commit(struct drm_crtc *crtc)
1053
{
1054
	radeon_crtc_dpms(crtc, DRM_MODE_DPMS_ON);
1055
}
1056
 
1057
static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
1058
	.dpms = radeon_crtc_dpms,
1059
	.mode_fixup = radeon_crtc_mode_fixup,
1060
	.mode_set = radeon_crtc_mode_set,
1061
	.mode_set_base = radeon_crtc_set_base,
1062
	.prepare = radeon_crtc_prepare,
1063
	.commit = radeon_crtc_commit,
1221 serge 1064
	.load_lut = radeon_crtc_load_lut,
1123 serge 1065
};
1066
 
1067
 
1068
void radeon_legacy_init_crtc(struct drm_device *dev,
1069
			       struct radeon_crtc *radeon_crtc)
1070
{
1071
	if (radeon_crtc->crtc_id == 1)
1072
		radeon_crtc->crtc_offset = RADEON_CRTC2_H_TOTAL_DISP - RADEON_CRTC_H_TOTAL_DISP;
1073
	drm_crtc_helper_add(&radeon_crtc->base, &legacy_helper_funcs);
1074
}