Subversion Repositories Kolibri OS

Rev

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