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