Subversion Repositories Kolibri OS

Rev

Rev 3120 | Rev 5078 | 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 */
3764 Serge 429
	r = radeon_bo_pin_restricted(rbo, RADEON_GEM_DOMAIN_VRAM, 1 << 27,
430
				     &base);
1321 serge 431
	if (unlikely(r != 0)) {
432
		radeon_bo_unreserve(rbo);
433
		return -EINVAL;
434
	}
435
	radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL);
436
	radeon_bo_unreserve(rbo);
437
	if (tiling_flags & RADEON_TILING_MICRO)
438
		DRM_ERROR("trying to scanout microtiled buffer\n");
1246 serge 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 */
1430 serge 442
	radeon_crtc->legacy_display_base_addr = rdev->mc.vram_start;
1179 serge 443
 
444
	base -= radeon_crtc->legacy_display_base_addr;
445
 
1123 serge 446
	crtc_offset_cntl = 0;
447
 
2997 Serge 448
	pitch_pixels = target_fb->pitches[0] / (target_fb->bits_per_pixel / 8);
1963 serge 449
	crtc_pitch  = (((pitch_pixels * target_fb->bits_per_pixel) +
450
			((target_fb->bits_per_pixel * 8) - 1)) /
451
		       (target_fb->bits_per_pixel * 8));
1123 serge 452
	crtc_pitch |= crtc_pitch << 16;
453
 
1963 serge 454
	crtc_offset_cntl |= RADEON_CRTC_GUI_TRIG_OFFSET_LEFT_EN;
1179 serge 455
	if (tiling_flags & RADEON_TILING_MACRO) {
1123 serge 456
		if (ASIC_IS_R300(rdev))
457
			crtc_offset_cntl |= (R300_CRTC_X_Y_MODE_EN |
458
					     R300_CRTC_MICRO_TILE_BUFFER_DIS |
459
					     R300_CRTC_MACRO_TILE_EN);
460
		else
461
			crtc_offset_cntl |= RADEON_CRTC_TILE_EN;
462
	} else {
463
		if (ASIC_IS_R300(rdev))
464
			crtc_offset_cntl &= ~(R300_CRTC_X_Y_MODE_EN |
465
					      R300_CRTC_MICRO_TILE_BUFFER_DIS |
466
					      R300_CRTC_MACRO_TILE_EN);
467
		else
468
			crtc_offset_cntl &= ~RADEON_CRTC_TILE_EN;
469
	}
470
 
1179 serge 471
	if (tiling_flags & RADEON_TILING_MACRO) {
1123 serge 472
		if (ASIC_IS_R300(rdev)) {
473
			crtc_tile_x0_y0 = x | (y << 16);
474
			base &= ~0x7ff;
475
		} else {
1963 serge 476
			int byteshift = target_fb->bits_per_pixel >> 4;
1179 serge 477
			int tile_addr = (((y >> 3) * pitch_pixels +  x) >> (8 - byteshift)) << 11;
1123 serge 478
			base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8);
479
			crtc_offset_cntl |= (y % 16);
480
		}
481
	} else {
482
		int offset = y * pitch_pixels + x;
1963 serge 483
		switch (target_fb->bits_per_pixel) {
1179 serge 484
		case 8:
485
			offset *= 1;
486
			break;
1123 serge 487
		case 15:
488
		case 16:
489
			offset *= 2;
490
			break;
491
		case 24:
492
			offset *= 3;
493
			break;
494
		case 32:
495
			offset *= 4;
496
			break;
497
		default:
498
			return false;
499
		}
500
		base += offset;
501
	}
502
 
503
	base &= ~7;
504
 
1179 serge 505
	if (radeon_crtc->crtc_id == 1)
506
		gen_cntl_reg = RADEON_CRTC2_GEN_CNTL;
507
	else
508
		gen_cntl_reg = RADEON_CRTC_GEN_CNTL;
1123 serge 509
 
1179 serge 510
	gen_cntl_val = RREG32(gen_cntl_reg);
511
	gen_cntl_val &= ~(0xf << 8);
512
	gen_cntl_val |= (format << 8);
1963 serge 513
	gen_cntl_val &= ~RADEON_CRTC_VSTAT_MODE_MASK;
1179 serge 514
	WREG32(gen_cntl_reg, gen_cntl_val);
515
 
1123 serge 516
	crtc_offset = (u32)base;
517
 
1179 serge 518
	WREG32(RADEON_DISPLAY_BASE_ADDR + radeon_crtc->crtc_offset, radeon_crtc->legacy_display_base_addr);
1123 serge 519
 
520
	if (ASIC_IS_R300(rdev)) {
521
		if (radeon_crtc->crtc_id)
522
			WREG32(R300_CRTC2_TILE_X0_Y0, crtc_tile_x0_y0);
523
		else
524
			WREG32(R300_CRTC_TILE_X0_Y0, crtc_tile_x0_y0);
525
	}
526
	WREG32(RADEON_CRTC_OFFSET_CNTL + radeon_crtc->crtc_offset, crtc_offset_cntl);
527
	WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, crtc_offset);
528
	WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
529
 
1963 serge 530
	if (!atomic && fb && fb != crtc->fb) {
531
		radeon_fb = to_radeon_framebuffer(fb);
532
		rbo = gem_to_radeon_bo(radeon_fb->obj);
1321 serge 533
		r = radeon_bo_reserve(rbo, false);
534
		if (unlikely(r != 0))
535
			return r;
536
		radeon_bo_unpin(rbo);
537
		radeon_bo_unreserve(rbo);
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
 
1963 serge 562
	DRM_DEBUG_KMS("\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
	if (radeon_crtc->crtc_id) {
623
		uint32_t crtc2_gen_cntl;
624
		uint32_t disp2_merge_cntl;
625
 
1321 serge 626
		/* if TV DAC is enabled for another crtc and keep it enabled */
627
		crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL) & 0x00718080;
1123 serge 628
		crtc2_gen_cntl |= ((format << 8)
629
				   | RADEON_CRTC2_VSYNC_DIS
630
				   | RADEON_CRTC2_HSYNC_DIS
631
				   | RADEON_CRTC2_DISP_DIS
632
				   | RADEON_CRTC2_DISP_REQ_EN_B
633
				   | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
634
				      ? RADEON_CRTC2_DBL_SCAN_EN
635
				      : 0)
636
				   | ((mode->flags & DRM_MODE_FLAG_CSYNC)
637
				      ? RADEON_CRTC2_CSYNC_EN
638
				      : 0)
639
				   | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
640
				      ? RADEON_CRTC2_INTERLACE_EN
641
				      : 0));
642
 
1963 serge 643
		/* rs4xx chips seem to like to have the crtc enabled when the timing is set */
644
		if ((rdev->family == CHIP_RS400) || (rdev->family == CHIP_RS480))
645
			crtc2_gen_cntl |= RADEON_CRTC2_EN;
646
 
1123 serge 647
		disp2_merge_cntl = RREG32(RADEON_DISP2_MERGE_CNTL);
648
		disp2_merge_cntl &= ~RADEON_DISP2_RGB_OFFSET_EN;
649
 
650
		WREG32(RADEON_DISP2_MERGE_CNTL, disp2_merge_cntl);
651
		WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
1268 serge 652
 
653
		WREG32(RADEON_FP_H2_SYNC_STRT_WID, crtc_h_sync_strt_wid);
654
		WREG32(RADEON_FP_V2_SYNC_STRT_WID, crtc_v_sync_strt_wid);
1123 serge 655
	} else {
656
		uint32_t crtc_gen_cntl;
657
		uint32_t crtc_ext_cntl;
658
		uint32_t disp_merge_cntl;
659
 
1321 serge 660
		crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL) & 0x00718000;
661
		crtc_gen_cntl |= (RADEON_CRTC_EXT_DISP_EN
1123 serge 662
				 | (format << 8)
663
				 | RADEON_CRTC_DISP_REQ_EN_B
664
				 | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
665
				    ? RADEON_CRTC_DBL_SCAN_EN
666
				    : 0)
667
				 | ((mode->flags & DRM_MODE_FLAG_CSYNC)
668
				    ? RADEON_CRTC_CSYNC_EN
669
				    : 0)
670
				 | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
671
				    ? RADEON_CRTC_INTERLACE_EN
672
				    : 0));
673
 
1963 serge 674
		/* rs4xx chips seem to like to have the crtc enabled when the timing is set */
675
		if ((rdev->family == CHIP_RS400) || (rdev->family == CHIP_RS480))
676
			crtc_gen_cntl |= RADEON_CRTC_EN;
677
 
1123 serge 678
		crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
679
		crtc_ext_cntl |= (RADEON_XCRT_CNT_EN |
680
				  RADEON_CRTC_VSYNC_DIS |
681
				  RADEON_CRTC_HSYNC_DIS |
682
				  RADEON_CRTC_DISPLAY_DIS);
683
 
684
		disp_merge_cntl = RREG32(RADEON_DISP_MERGE_CNTL);
685
		disp_merge_cntl &= ~RADEON_DISP_RGB_OFFSET_EN;
686
 
687
		WREG32(RADEON_DISP_MERGE_CNTL, disp_merge_cntl);
688
		WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl);
689
		WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
690
	}
691
 
1179 serge 692
	if (is_tv)
693
		radeon_legacy_tv_adjust_crtc_reg(encoder, &crtc_h_total_disp,
694
						 &crtc_h_sync_strt_wid, &crtc_v_total_disp,
695
						 &crtc_v_sync_strt_wid);
696
 
1123 serge 697
	WREG32(RADEON_CRTC_H_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_h_total_disp);
698
	WREG32(RADEON_CRTC_H_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_h_sync_strt_wid);
699
	WREG32(RADEON_CRTC_V_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_v_total_disp);
700
	WREG32(RADEON_CRTC_V_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_v_sync_strt_wid);
701
 
702
	return true;
703
}
704
 
705
static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
706
{
707
	struct drm_device *dev = crtc->dev;
708
	struct radeon_device *rdev = dev->dev_private;
709
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
710
	struct drm_encoder *encoder;
711
	uint32_t feedback_div = 0;
712
	uint32_t frac_fb_div = 0;
713
	uint32_t reference_div = 0;
714
	uint32_t post_divider = 0;
715
	uint32_t freq = 0;
716
	uint8_t pll_gain;
717
	bool use_bios_divs = false;
718
	/* PLL registers */
719
	uint32_t pll_ref_div = 0;
720
	uint32_t pll_fb_post_div = 0;
721
	uint32_t htotal_cntl = 0;
1179 serge 722
	bool is_tv = false;
1123 serge 723
	struct radeon_pll *pll;
724
 
725
	struct {
726
		int divider;
727
		int bitvalue;
728
	} *post_div, post_divs[]   = {
729
		/* From RAGE 128 VR/RAGE 128 GL Register
730
		 * Reference Manual (Technical Reference
731
		 * Manual P/N RRG-G04100-C Rev. 0.04), page
732
		 * 3-17 (PLL_DIV_[3:0]).
733
		 */
734
		{  1, 0 },              /* VCLK_SRC                 */
735
		{  2, 1 },              /* VCLK_SRC/2               */
736
		{  4, 2 },              /* VCLK_SRC/4               */
737
		{  8, 3 },              /* VCLK_SRC/8               */
738
		{  3, 4 },              /* VCLK_SRC/3               */
739
		{ 16, 5 },              /* VCLK_SRC/16              */
740
		{  6, 6 },              /* VCLK_SRC/6               */
741
		{ 12, 7 },              /* VCLK_SRC/12              */
742
		{  0, 0 }
743
	};
744
 
745
	if (radeon_crtc->crtc_id)
746
		pll = &rdev->clock.p2pll;
747
	else
748
		pll = &rdev->clock.p1pll;
749
 
1404 serge 750
	pll->flags = RADEON_PLL_LEGACY;
751
 
1123 serge 752
	if (mode->clock > 200000) /* range limits??? */
1404 serge 753
		pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
1123 serge 754
	else
1404 serge 755
		pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
1123 serge 756
 
757
	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
758
		if (encoder->crtc == crtc) {
1179 serge 759
			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
760
 
761
			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
762
				is_tv = true;
763
				break;
764
			}
765
 
1123 serge 766
			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC)
1404 serge 767
				pll->flags |= RADEON_PLL_NO_ODD_POST_DIV;
1123 serge 768
			if (encoder->encoder_type == DRM_MODE_ENCODER_LVDS) {
1321 serge 769
				if (!rdev->is_atom_bios) {
1123 serge 770
				struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
771
				struct radeon_encoder_lvds *lvds = (struct radeon_encoder_lvds *)radeon_encoder->enc_priv;
772
				if (lvds) {
773
					if (lvds->use_bios_dividers) {
774
						pll_ref_div = lvds->panel_ref_divider;
775
						pll_fb_post_div   = (lvds->panel_fb_divider |
776
								     (lvds->panel_post_divider << 16));
777
						htotal_cntl  = 0;
778
						use_bios_divs = true;
779
					}
780
				}
1321 serge 781
				}
1404 serge 782
				pll->flags |= RADEON_PLL_USE_REF_DIV;
1123 serge 783
			}
784
		}
785
	}
786
 
1963 serge 787
	DRM_DEBUG_KMS("\n");
1123 serge 788
 
789
	if (!use_bios_divs) {
1963 serge 790
		radeon_compute_pll_legacy(pll, mode->clock,
1123 serge 791
				   &freq, &feedback_div, &frac_fb_div,
1404 serge 792
				   &reference_div, &post_divider);
1123 serge 793
 
794
		for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
795
			if (post_div->divider == post_divider)
796
				break;
797
		}
798
 
799
		if (!post_div->divider)
800
			post_div = &post_divs[0];
801
 
1963 serge 802
		DRM_DEBUG_KMS("dc=%u, fd=%d, rd=%d, pd=%d\n",
1123 serge 803
			  (unsigned)freq,
804
			  feedback_div,
805
			  reference_div,
806
			  post_divider);
807
 
808
		pll_ref_div   = reference_div;
809
#if defined(__powerpc__) && (0) /* TODO */
810
		/* apparently programming this otherwise causes a hang??? */
811
		if (info->MacModel == RADEON_MAC_IBOOK)
812
			pll_fb_post_div = 0x000600ad;
813
		else
814
#endif
815
			pll_fb_post_div     = (feedback_div | (post_div->bitvalue << 16));
816
 
817
		htotal_cntl    = mode->htotal & 0x7;
818
 
819
	}
820
 
821
	pll_gain = radeon_compute_pll_gain(pll->reference_freq,
822
					   pll_ref_div & 0x3ff,
823
					   pll_fb_post_div & 0x7ff);
824
 
825
	if (radeon_crtc->crtc_id) {
826
		uint32_t pixclks_cntl = ((RREG32_PLL(RADEON_PIXCLKS_CNTL) &
827
					  ~(RADEON_PIX2CLK_SRC_SEL_MASK)) |
828
					 RADEON_PIX2CLK_SRC_SEL_P2PLLCLK);
829
 
1179 serge 830
		if (is_tv) {
831
			radeon_legacy_tv_adjust_pll2(encoder, &htotal_cntl,
832
						     &pll_ref_div, &pll_fb_post_div,
833
						     &pixclks_cntl);
834
		}
835
 
1123 serge 836
		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
837
			     RADEON_PIX2CLK_SRC_SEL_CPUCLK,
838
			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
839
 
840
		WREG32_PLL_P(RADEON_P2PLL_CNTL,
841
			     RADEON_P2PLL_RESET
842
			     | RADEON_P2PLL_ATOMIC_UPDATE_EN
843
			     | ((uint32_t)pll_gain << RADEON_P2PLL_PVG_SHIFT),
844
			     ~(RADEON_P2PLL_RESET
845
			       | RADEON_P2PLL_ATOMIC_UPDATE_EN
846
			       | RADEON_P2PLL_PVG_MASK));
847
 
848
		WREG32_PLL_P(RADEON_P2PLL_REF_DIV,
849
			     pll_ref_div,
850
			     ~RADEON_P2PLL_REF_DIV_MASK);
851
 
852
		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
853
			     pll_fb_post_div,
854
			     ~RADEON_P2PLL_FB0_DIV_MASK);
855
 
856
		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
857
			     pll_fb_post_div,
858
			     ~RADEON_P2PLL_POST0_DIV_MASK);
859
 
860
		radeon_pll2_write_update(dev);
861
		radeon_pll2_wait_for_read_update_complete(dev);
862
 
863
		WREG32_PLL(RADEON_HTOTAL2_CNTL, htotal_cntl);
864
 
865
		WREG32_PLL_P(RADEON_P2PLL_CNTL,
866
			     0,
867
			     ~(RADEON_P2PLL_RESET
868
			       | RADEON_P2PLL_SLEEP
869
			       | RADEON_P2PLL_ATOMIC_UPDATE_EN));
870
 
1963 serge 871
		DRM_DEBUG_KMS("Wrote2: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
1123 serge 872
			  (unsigned)pll_ref_div,
873
			  (unsigned)pll_fb_post_div,
874
			  (unsigned)htotal_cntl,
875
			  RREG32_PLL(RADEON_P2PLL_CNTL));
1963 serge 876
		DRM_DEBUG_KMS("Wrote2: rd=%u, fd=%u, pd=%u\n",
1123 serge 877
			  (unsigned)pll_ref_div & RADEON_P2PLL_REF_DIV_MASK,
878
			  (unsigned)pll_fb_post_div & RADEON_P2PLL_FB0_DIV_MASK,
879
			  (unsigned)((pll_fb_post_div &
880
				      RADEON_P2PLL_POST0_DIV_MASK) >> 16));
881
 
882
		mdelay(50); /* Let the clock to lock */
883
 
884
		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
885
			     RADEON_PIX2CLK_SRC_SEL_P2PLLCLK,
886
			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
887
 
888
		WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
889
	} else {
1179 serge 890
		uint32_t pixclks_cntl;
891
 
892
 
893
		if (is_tv) {
894
			pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
895
			radeon_legacy_tv_adjust_pll1(encoder, &htotal_cntl, &pll_ref_div,
896
						     &pll_fb_post_div, &pixclks_cntl);
897
		}
898
 
1123 serge 899
		if (rdev->flags & RADEON_IS_MOBILITY) {
1963 serge 900
			/* A temporal workaround for the occasional blanking on certain laptop panels.
1123 serge 901
			   This appears to related to the PLL divider registers (fail to lock?).
902
			   It occurs even when all dividers are the same with their old settings.
903
			   In this case we really don't need to fiddle with PLL registers.
904
			   By doing this we can avoid the blanking problem with some panels.
905
			*/
906
			if ((pll_ref_div == (RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_REF_DIV_MASK)) &&
907
			    (pll_fb_post_div == (RREG32_PLL(RADEON_PPLL_DIV_3) &
908
						 (RADEON_PPLL_POST3_DIV_MASK | RADEON_PPLL_FB3_DIV_MASK)))) {
909
				WREG32_P(RADEON_CLOCK_CNTL_INDEX,
910
					 RADEON_PLL_DIV_SEL,
911
					 ~(RADEON_PLL_DIV_SEL));
912
				r100_pll_errata_after_index(rdev);
913
				return;
914
			}
915
		}
916
 
917
		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
918
			     RADEON_VCLK_SRC_SEL_CPUCLK,
919
			     ~(RADEON_VCLK_SRC_SEL_MASK));
920
		WREG32_PLL_P(RADEON_PPLL_CNTL,
921
			     RADEON_PPLL_RESET
922
			     | RADEON_PPLL_ATOMIC_UPDATE_EN
923
			     | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
924
			     | ((uint32_t)pll_gain << RADEON_PPLL_PVG_SHIFT),
925
			     ~(RADEON_PPLL_RESET
926
			       | RADEON_PPLL_ATOMIC_UPDATE_EN
927
			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
928
			       | RADEON_PPLL_PVG_MASK));
929
 
930
		WREG32_P(RADEON_CLOCK_CNTL_INDEX,
931
			 RADEON_PLL_DIV_SEL,
932
			 ~(RADEON_PLL_DIV_SEL));
933
		r100_pll_errata_after_index(rdev);
934
 
935
		if (ASIC_IS_R300(rdev) ||
936
		    (rdev->family == CHIP_RS300) ||
937
		    (rdev->family == CHIP_RS400) ||
938
		    (rdev->family == CHIP_RS480)) {
939
			if (pll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) {
940
				/* When restoring console mode, use saved PPLL_REF_DIV
941
				 * setting.
942
				 */
943
				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
944
					     pll_ref_div,
945
					     0);
946
			} else {
947
				/* R300 uses ref_div_acc field as real ref divider */
948
				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
949
					     (pll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT),
950
					     ~R300_PPLL_REF_DIV_ACC_MASK);
951
			}
952
		} else
953
			WREG32_PLL_P(RADEON_PPLL_REF_DIV,
954
				     pll_ref_div,
955
				     ~RADEON_PPLL_REF_DIV_MASK);
956
 
957
		WREG32_PLL_P(RADEON_PPLL_DIV_3,
958
			     pll_fb_post_div,
959
			     ~RADEON_PPLL_FB3_DIV_MASK);
960
 
961
		WREG32_PLL_P(RADEON_PPLL_DIV_3,
962
			     pll_fb_post_div,
963
			     ~RADEON_PPLL_POST3_DIV_MASK);
964
 
965
		radeon_pll_write_update(dev);
966
		radeon_pll_wait_for_read_update_complete(dev);
967
 
968
		WREG32_PLL(RADEON_HTOTAL_CNTL, htotal_cntl);
969
 
970
		WREG32_PLL_P(RADEON_PPLL_CNTL,
971
			     0,
972
			     ~(RADEON_PPLL_RESET
973
			       | RADEON_PPLL_SLEEP
974
			       | RADEON_PPLL_ATOMIC_UPDATE_EN
975
			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN));
976
 
1963 serge 977
		DRM_DEBUG_KMS("Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
1123 serge 978
			  pll_ref_div,
979
			  pll_fb_post_div,
980
			  (unsigned)htotal_cntl,
981
			  RREG32_PLL(RADEON_PPLL_CNTL));
1963 serge 982
		DRM_DEBUG_KMS("Wrote: rd=%d, fd=%d, pd=%d\n",
1123 serge 983
			  pll_ref_div & RADEON_PPLL_REF_DIV_MASK,
984
			  pll_fb_post_div & RADEON_PPLL_FB3_DIV_MASK,
985
			  (pll_fb_post_div & RADEON_PPLL_POST3_DIV_MASK) >> 16);
986
 
987
		mdelay(50); /* Let the clock to lock */
988
 
989
		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
990
			     RADEON_VCLK_SRC_SEL_PPLLCLK,
991
			     ~(RADEON_VCLK_SRC_SEL_MASK));
992
 
1179 serge 993
		if (is_tv)
994
			WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
1123 serge 995
	}
996
}
997
 
998
static bool radeon_crtc_mode_fixup(struct drm_crtc *crtc,
2997 Serge 999
				   const struct drm_display_mode *mode,
1123 serge 1000
				   struct drm_display_mode *adjusted_mode)
1001
{
1179 serge 1002
	if (!radeon_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode))
1003
		return false;
1123 serge 1004
	return true;
1005
}
1006
 
1007
static int radeon_crtc_mode_set(struct drm_crtc *crtc,
1008
				 struct drm_display_mode *mode,
1009
				 struct drm_display_mode *adjusted_mode,
1010
				 int x, int y, struct drm_framebuffer *old_fb)
1011
{
1179 serge 1012
	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
1123 serge 1013
 
1014
	/* TODO TV */
1015
	radeon_crtc_set_base(crtc, x, y, old_fb);
1016
	radeon_set_crtc_timing(crtc, adjusted_mode);
1017
	radeon_set_pll(crtc, adjusted_mode);
1321 serge 1018
	radeon_overscan_setup(crtc, adjusted_mode);
1179 serge 1019
	if (radeon_crtc->crtc_id == 0) {
1404 serge 1020
		radeon_legacy_rmx_mode_set(crtc, adjusted_mode);
1179 serge 1021
	} else {
1022
		if (radeon_crtc->rmx_type != RMX_OFF) {
1023
			/* FIXME: only first crtc has rmx what should we
1024
			 * do ?
1025
			 */
1026
			DRM_ERROR("Mode need scaling but only first crtc can do that.\n");
1027
		}
1028
	}
1123 serge 1029
	return 0;
1030
}
1031
 
1032
static void radeon_crtc_prepare(struct drm_crtc *crtc)
1033
{
1321 serge 1034
	struct drm_device *dev = crtc->dev;
1035
	struct drm_crtc *crtci;
1036
 
1037
	/*
1038
	* The hardware wedges sometimes if you reconfigure one CRTC
1039
	* whilst another is running (see fdo bug #24611).
1040
	*/
1041
	list_for_each_entry(crtci, &dev->mode_config.crtc_list, head)
1042
		radeon_crtc_dpms(crtci, DRM_MODE_DPMS_OFF);
1123 serge 1043
}
1044
 
1045
static void radeon_crtc_commit(struct drm_crtc *crtc)
1046
{
1321 serge 1047
	struct drm_device *dev = crtc->dev;
1048
	struct drm_crtc *crtci;
1049
 
1050
	/*
1051
	* Reenable the CRTCs that should be running.
1052
	*/
1053
	list_for_each_entry(crtci, &dev->mode_config.crtc_list, head) {
1054
		if (crtci->enabled)
1055
			radeon_crtc_dpms(crtci, DRM_MODE_DPMS_ON);
1056
	}
1123 serge 1057
}
1058
 
1059
static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
1060
	.dpms = radeon_crtc_dpms,
1061
	.mode_fixup = radeon_crtc_mode_fixup,
1062
	.mode_set = radeon_crtc_mode_set,
1063
	.mode_set_base = radeon_crtc_set_base,
1963 serge 1064
	.mode_set_base_atomic = radeon_crtc_set_base_atomic,
1123 serge 1065
	.prepare = radeon_crtc_prepare,
1066
	.commit = radeon_crtc_commit,
1221 serge 1067
	.load_lut = radeon_crtc_load_lut,
1123 serge 1068
};
1069
 
1070
 
1071
void radeon_legacy_init_crtc(struct drm_device *dev,
1072
			       struct radeon_crtc *radeon_crtc)
1073
{
1074
	if (radeon_crtc->crtc_id == 1)
1075
		radeon_crtc->crtc_offset = RADEON_CRTC2_H_TOTAL_DISP - RADEON_CRTC_H_TOTAL_DISP;
1076
	drm_crtc_helper_add(&radeon_crtc->base, &legacy_helper_funcs);
1077
}