Home | History | Annotate | Line # | Download | only in radeon
radeon_legacy_crtc.c revision 1.1.1.2
      1 /*	$NetBSD: radeon_legacy_crtc.c,v 1.1.1.2 2018/08/27 01:34:58 riastradh Exp $	*/
      2 
      3 /*
      4  * Copyright 2007-8 Advanced Micro Devices, Inc.
      5  * Copyright 2008 Red Hat Inc.
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a
      8  * copy of this software and associated documentation files (the "Software"),
      9  * to deal in the Software without restriction, including without limitation
     10  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  * and/or sell copies of the Software, and to permit persons to whom the
     12  * Software is furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included in
     15  * all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
     21  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
     22  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
     23  * OTHER DEALINGS IN THE SOFTWARE.
     24  *
     25  * Authors: Dave Airlie
     26  *          Alex Deucher
     27  */
     28 #include <sys/cdefs.h>
     29 __KERNEL_RCSID(0, "$NetBSD: radeon_legacy_crtc.c,v 1.1.1.2 2018/08/27 01:34:58 riastradh Exp $");
     30 
     31 #include <drm/drmP.h>
     32 #include <drm/drm_crtc_helper.h>
     33 #include <drm/radeon_drm.h>
     34 #include <drm/drm_fixed.h>
     35 #include "radeon.h"
     36 #include "atom.h"
     37 
     38 static void radeon_overscan_setup(struct drm_crtc *crtc,
     39 				  struct drm_display_mode *mode)
     40 {
     41 	struct drm_device *dev = crtc->dev;
     42 	struct radeon_device *rdev = dev->dev_private;
     43 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
     44 
     45 	WREG32(RADEON_OVR_CLR + radeon_crtc->crtc_offset, 0);
     46 	WREG32(RADEON_OVR_WID_LEFT_RIGHT + radeon_crtc->crtc_offset, 0);
     47 	WREG32(RADEON_OVR_WID_TOP_BOTTOM + radeon_crtc->crtc_offset, 0);
     48 }
     49 
     50 static void radeon_legacy_rmx_mode_set(struct drm_crtc *crtc,
     51 				       struct drm_display_mode *mode)
     52 {
     53 	struct drm_device *dev = crtc->dev;
     54 	struct radeon_device *rdev = dev->dev_private;
     55 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
     56 	int xres = mode->hdisplay;
     57 	int yres = mode->vdisplay;
     58 	bool hscale = true, vscale = true;
     59 	int hsync_wid;
     60 	int vsync_wid;
     61 	int hsync_start;
     62 	int blank_width;
     63 	u32 scale, inc, crtc_more_cntl;
     64 	u32 fp_horz_stretch, fp_vert_stretch, fp_horz_vert_active;
     65 	u32 fp_h_sync_strt_wid, fp_crtc_h_total_disp;
     66 	u32 fp_v_sync_strt_wid, fp_crtc_v_total_disp;
     67 	struct drm_display_mode *native_mode = &radeon_crtc->native_mode;
     68 
     69 	fp_vert_stretch = RREG32(RADEON_FP_VERT_STRETCH) &
     70 		(RADEON_VERT_STRETCH_RESERVED |
     71 		 RADEON_VERT_AUTO_RATIO_INC);
     72 	fp_horz_stretch = RREG32(RADEON_FP_HORZ_STRETCH) &
     73 		(RADEON_HORZ_FP_LOOP_STRETCH |
     74 		 RADEON_HORZ_AUTO_RATIO_INC);
     75 
     76 	crtc_more_cntl = 0;
     77 	if ((rdev->family == CHIP_RS100) ||
     78 	    (rdev->family == CHIP_RS200)) {
     79 		/* This is to workaround the asic bug for RMX, some versions
     80 		   of BIOS dosen't have this register initialized correctly. */
     81 		crtc_more_cntl |= RADEON_CRTC_H_CUTOFF_ACTIVE_EN;
     82 	}
     83 
     84 
     85 	fp_crtc_h_total_disp = ((((mode->crtc_htotal / 8) - 1) & 0x3ff)
     86 				| ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
     87 
     88 	hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
     89 	if (!hsync_wid)
     90 		hsync_wid = 1;
     91 	hsync_start = mode->crtc_hsync_start - 8;
     92 
     93 	fp_h_sync_strt_wid = ((hsync_start & 0x1fff)
     94 			      | ((hsync_wid & 0x3f) << 16)
     95 			      | ((mode->flags & DRM_MODE_FLAG_NHSYNC)
     96 				 ? RADEON_CRTC_H_SYNC_POL
     97 				 : 0));
     98 
     99 	fp_crtc_v_total_disp = (((mode->crtc_vtotal - 1) & 0xffff)
    100 				| ((mode->crtc_vdisplay - 1) << 16));
    101 
    102 	vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
    103 	if (!vsync_wid)
    104 		vsync_wid = 1;
    105 
    106 	fp_v_sync_strt_wid = (((mode->crtc_vsync_start - 1) & 0xfff)
    107 			      | ((vsync_wid & 0x1f) << 16)
    108 			      | ((mode->flags & DRM_MODE_FLAG_NVSYNC)
    109 				 ? RADEON_CRTC_V_SYNC_POL
    110 				 : 0));
    111 
    112 	fp_horz_vert_active = 0;
    113 
    114 	if (native_mode->hdisplay == 0 ||
    115 	    native_mode->vdisplay == 0) {
    116 		hscale = false;
    117 		vscale = false;
    118 	} else {
    119 		if (xres > native_mode->hdisplay)
    120 			xres = native_mode->hdisplay;
    121 		if (yres > native_mode->vdisplay)
    122 			yres = native_mode->vdisplay;
    123 
    124 		if (xres == native_mode->hdisplay)
    125 			hscale = false;
    126 		if (yres == native_mode->vdisplay)
    127 			vscale = false;
    128 	}
    129 
    130 	switch (radeon_crtc->rmx_type) {
    131 	case RMX_FULL:
    132 	case RMX_ASPECT:
    133 		if (!hscale)
    134 			fp_horz_stretch |= ((xres/8-1) << 16);
    135 		else {
    136 			inc = (fp_horz_stretch & RADEON_HORZ_AUTO_RATIO_INC) ? 1 : 0;
    137 			scale = ((xres + inc) * RADEON_HORZ_STRETCH_RATIO_MAX)
    138 				/ native_mode->hdisplay + 1;
    139 			fp_horz_stretch |= (((scale) & RADEON_HORZ_STRETCH_RATIO_MASK) |
    140 					RADEON_HORZ_STRETCH_BLEND |
    141 					RADEON_HORZ_STRETCH_ENABLE |
    142 					((native_mode->hdisplay/8-1) << 16));
    143 		}
    144 
    145 		if (!vscale)
    146 			fp_vert_stretch |= ((yres-1) << 12);
    147 		else {
    148 			inc = (fp_vert_stretch & RADEON_VERT_AUTO_RATIO_INC) ? 1 : 0;
    149 			scale = ((yres + inc) * RADEON_VERT_STRETCH_RATIO_MAX)
    150 				/ native_mode->vdisplay + 1;
    151 			fp_vert_stretch |= (((scale) & RADEON_VERT_STRETCH_RATIO_MASK) |
    152 					RADEON_VERT_STRETCH_ENABLE |
    153 					RADEON_VERT_STRETCH_BLEND |
    154 					((native_mode->vdisplay-1) << 12));
    155 		}
    156 		break;
    157 	case RMX_CENTER:
    158 		fp_horz_stretch |= ((xres/8-1) << 16);
    159 		fp_vert_stretch |= ((yres-1) << 12);
    160 
    161 		crtc_more_cntl |= (RADEON_CRTC_AUTO_HORZ_CENTER_EN |
    162 				RADEON_CRTC_AUTO_VERT_CENTER_EN);
    163 
    164 		blank_width = (mode->crtc_hblank_end - mode->crtc_hblank_start) / 8;
    165 		if (blank_width > 110)
    166 			blank_width = 110;
    167 
    168 		fp_crtc_h_total_disp = (((blank_width) & 0x3ff)
    169 				| ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
    170 
    171 		hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
    172 		if (!hsync_wid)
    173 			hsync_wid = 1;
    174 
    175 		fp_h_sync_strt_wid = ((((mode->crtc_hsync_start - mode->crtc_hblank_start) / 8) & 0x1fff)
    176 				| ((hsync_wid & 0x3f) << 16)
    177 				| ((mode->flags & DRM_MODE_FLAG_NHSYNC)
    178 					? RADEON_CRTC_H_SYNC_POL
    179 					: 0));
    180 
    181 		fp_crtc_v_total_disp = (((mode->crtc_vblank_end - mode->crtc_vblank_start) & 0xffff)
    182 				| ((mode->crtc_vdisplay - 1) << 16));
    183 
    184 		vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
    185 		if (!vsync_wid)
    186 			vsync_wid = 1;
    187 
    188 		fp_v_sync_strt_wid = ((((mode->crtc_vsync_start - mode->crtc_vblank_start) & 0xfff)
    189 					| ((vsync_wid & 0x1f) << 16)
    190 					| ((mode->flags & DRM_MODE_FLAG_NVSYNC)
    191 						? RADEON_CRTC_V_SYNC_POL
    192 						: 0)));
    193 
    194 		fp_horz_vert_active = (((native_mode->vdisplay) & 0xfff) |
    195 				(((native_mode->hdisplay / 8) & 0x1ff) << 16));
    196 		break;
    197 	case RMX_OFF:
    198 	default:
    199 		fp_horz_stretch |= ((xres/8-1) << 16);
    200 		fp_vert_stretch |= ((yres-1) << 12);
    201 		break;
    202 	}
    203 
    204 	WREG32(RADEON_FP_HORZ_STRETCH,      fp_horz_stretch);
    205 	WREG32(RADEON_FP_VERT_STRETCH,      fp_vert_stretch);
    206 	WREG32(RADEON_CRTC_MORE_CNTL,       crtc_more_cntl);
    207 	WREG32(RADEON_FP_HORZ_VERT_ACTIVE,  fp_horz_vert_active);
    208 	WREG32(RADEON_FP_H_SYNC_STRT_WID,   fp_h_sync_strt_wid);
    209 	WREG32(RADEON_FP_V_SYNC_STRT_WID,   fp_v_sync_strt_wid);
    210 	WREG32(RADEON_FP_CRTC_H_TOTAL_DISP, fp_crtc_h_total_disp);
    211 	WREG32(RADEON_FP_CRTC_V_TOTAL_DISP, fp_crtc_v_total_disp);
    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 static 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 crtc_ext_cntl = 0;
    304 	uint32_t mask;
    305 
    306 	if (radeon_crtc->crtc_id)
    307 		mask = (RADEON_CRTC2_DISP_DIS |
    308 			RADEON_CRTC2_VSYNC_DIS |
    309 			RADEON_CRTC2_HSYNC_DIS |
    310 			RADEON_CRTC2_DISP_REQ_EN_B);
    311 	else
    312 		mask = (RADEON_CRTC_DISPLAY_DIS |
    313 			RADEON_CRTC_VSYNC_DIS |
    314 			RADEON_CRTC_HSYNC_DIS);
    315 
    316 	/*
    317 	 * On all dual CRTC GPUs this bit controls the CRTC of the primary DAC.
    318 	 * Therefore it is set in the DAC DMPS function.
    319 	 * This is different for GPU's with a single CRTC but a primary and a
    320 	 * TV DAC: here it controls the single CRTC no matter where it is
    321 	 * routed. Therefore we set it here.
    322 	 */
    323 	if (rdev->flags & RADEON_SINGLE_CRTC)
    324 		crtc_ext_cntl = RADEON_CRTC_CRT_ON;
    325 
    326 	switch (mode) {
    327 	case DRM_MODE_DPMS_ON:
    328 		radeon_crtc->enabled = true;
    329 		/* adjust pm to dpms changes BEFORE enabling crtcs */
    330 		radeon_pm_compute_clocks(rdev);
    331 		if (radeon_crtc->crtc_id)
    332 			WREG32_P(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_EN, ~(RADEON_CRTC2_EN | mask));
    333 		else {
    334 			WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_EN, ~(RADEON_CRTC_EN |
    335 									 RADEON_CRTC_DISP_REQ_EN_B));
    336 			WREG32_P(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl, ~(mask | crtc_ext_cntl));
    337 		}
    338 		drm_vblank_post_modeset(dev, radeon_crtc->crtc_id);
    339 		/* Make sure vblank interrupt is still enabled if needed */
    340 		radeon_irq_set(rdev);
    341 		radeon_crtc_load_lut(crtc);
    342 		break;
    343 	case DRM_MODE_DPMS_STANDBY:
    344 	case DRM_MODE_DPMS_SUSPEND:
    345 	case DRM_MODE_DPMS_OFF:
    346 		drm_vblank_pre_modeset(dev, radeon_crtc->crtc_id);
    347 		if (radeon_crtc->crtc_id)
    348 			WREG32_P(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask));
    349 		else {
    350 			WREG32_P(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~(RADEON_CRTC_EN |
    351 										    RADEON_CRTC_DISP_REQ_EN_B));
    352 			WREG32_P(RADEON_CRTC_EXT_CNTL, mask, ~(mask | crtc_ext_cntl));
    353 		}
    354 		radeon_crtc->enabled = false;
    355 		/* adjust pm to dpms changes AFTER disabling crtcs */
    356 		radeon_pm_compute_clocks(rdev);
    357 		break;
    358 	}
    359 }
    360 
    361 int radeon_crtc_set_base(struct drm_crtc *crtc, int x, int y,
    362 			 struct drm_framebuffer *old_fb)
    363 {
    364 	return radeon_crtc_do_set_base(crtc, old_fb, x, y, 0);
    365 }
    366 
    367 int radeon_crtc_set_base_atomic(struct drm_crtc *crtc,
    368 				struct drm_framebuffer *fb,
    369 				int x, int y, enum mode_set_atomic state)
    370 {
    371 	return radeon_crtc_do_set_base(crtc, fb, x, y, 1);
    372 }
    373 
    374 int radeon_crtc_do_set_base(struct drm_crtc *crtc,
    375 			 struct drm_framebuffer *fb,
    376 			 int x, int y, int atomic)
    377 {
    378 	struct drm_device *dev = crtc->dev;
    379 	struct radeon_device *rdev = dev->dev_private;
    380 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
    381 	struct radeon_framebuffer *radeon_fb;
    382 	struct drm_framebuffer *target_fb;
    383 	struct drm_gem_object *obj;
    384 	struct radeon_bo *rbo;
    385 	uint64_t base;
    386 	uint32_t crtc_offset, crtc_offset_cntl, crtc_tile_x0_y0 = 0;
    387 	uint32_t crtc_pitch, pitch_pixels;
    388 	uint32_t tiling_flags;
    389 	int format;
    390 	uint32_t gen_cntl_reg, gen_cntl_val;
    391 	int r;
    392 
    393 	DRM_DEBUG_KMS("\n");
    394 	/* no fb bound */
    395 	if (!atomic && !crtc->primary->fb) {
    396 		DRM_DEBUG_KMS("No FB bound\n");
    397 		return 0;
    398 	}
    399 
    400 	if (atomic) {
    401 		radeon_fb = to_radeon_framebuffer(fb);
    402 		target_fb = fb;
    403 	}
    404 	else {
    405 		radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
    406 		target_fb = crtc->primary->fb;
    407 	}
    408 
    409 	switch (target_fb->bits_per_pixel) {
    410 	case 8:
    411 		format = 2;
    412 		break;
    413 	case 15:      /*  555 */
    414 		format = 3;
    415 		break;
    416 	case 16:      /*  565 */
    417 		format = 4;
    418 		break;
    419 	case 24:      /*  RGB */
    420 		format = 5;
    421 		break;
    422 	case 32:      /* xRGB */
    423 		format = 6;
    424 		break;
    425 	default:
    426 		return false;
    427 	}
    428 
    429 	/* Pin framebuffer & get tilling informations */
    430 	obj = radeon_fb->obj;
    431 	rbo = gem_to_radeon_bo(obj);
    432 retry:
    433 	r = radeon_bo_reserve(rbo, false);
    434 	if (unlikely(r != 0))
    435 		return r;
    436 	/* Only 27 bit offset for legacy CRTC */
    437 	r = radeon_bo_pin_restricted(rbo, RADEON_GEM_DOMAIN_VRAM, 1 << 27,
    438 				     &base);
    439 	if (unlikely(r != 0)) {
    440 		radeon_bo_unreserve(rbo);
    441 
    442 		/* On old GPU like RN50 with little vram pining can fails because
    443 		 * current fb is taking all space needed. So instead of unpining
    444 		 * the old buffer after pining the new one, first unpin old one
    445 		 * and then retry pining new one.
    446 		 *
    447 		 * As only master can set mode only master can pin and it is
    448 		 * unlikely the master client will race with itself especialy
    449 		 * on those old gpu with single crtc.
    450 		 *
    451 		 * We don't shutdown the display controller because new buffer
    452 		 * will end up in same spot.
    453 		 */
    454 		if (!atomic && fb && fb != crtc->primary->fb) {
    455 			struct radeon_bo *old_rbo;
    456 			unsigned long nsize, osize;
    457 
    458 			old_rbo = gem_to_radeon_bo(to_radeon_framebuffer(fb)->obj);
    459 			osize = radeon_bo_size(old_rbo);
    460 			nsize = radeon_bo_size(rbo);
    461 			if (nsize <= osize && !radeon_bo_reserve(old_rbo, false)) {
    462 				radeon_bo_unpin(old_rbo);
    463 				radeon_bo_unreserve(old_rbo);
    464 				fb = NULL;
    465 				goto retry;
    466 			}
    467 		}
    468 		return -EINVAL;
    469 	}
    470 	radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL);
    471 	radeon_bo_unreserve(rbo);
    472 	if (tiling_flags & RADEON_TILING_MICRO)
    473 		DRM_ERROR("trying to scanout microtiled buffer\n");
    474 
    475 	/* if scanout was in GTT this really wouldn't work */
    476 	/* crtc offset is from display base addr not FB location */
    477 	radeon_crtc->legacy_display_base_addr = rdev->mc.vram_start;
    478 
    479 	base -= radeon_crtc->legacy_display_base_addr;
    480 
    481 	crtc_offset_cntl = 0;
    482 
    483 	pitch_pixels = target_fb->pitches[0] / (target_fb->bits_per_pixel / 8);
    484 	crtc_pitch  = (((pitch_pixels * target_fb->bits_per_pixel) +
    485 			((target_fb->bits_per_pixel * 8) - 1)) /
    486 		       (target_fb->bits_per_pixel * 8));
    487 	crtc_pitch |= crtc_pitch << 16;
    488 
    489 	crtc_offset_cntl |= RADEON_CRTC_GUI_TRIG_OFFSET_LEFT_EN;
    490 	if (tiling_flags & RADEON_TILING_MACRO) {
    491 		if (ASIC_IS_R300(rdev))
    492 			crtc_offset_cntl |= (R300_CRTC_X_Y_MODE_EN |
    493 					     R300_CRTC_MICRO_TILE_BUFFER_DIS |
    494 					     R300_CRTC_MACRO_TILE_EN);
    495 		else
    496 			crtc_offset_cntl |= RADEON_CRTC_TILE_EN;
    497 	} else {
    498 		if (ASIC_IS_R300(rdev))
    499 			crtc_offset_cntl &= ~(R300_CRTC_X_Y_MODE_EN |
    500 					      R300_CRTC_MICRO_TILE_BUFFER_DIS |
    501 					      R300_CRTC_MACRO_TILE_EN);
    502 		else
    503 			crtc_offset_cntl &= ~RADEON_CRTC_TILE_EN;
    504 	}
    505 
    506 	if (tiling_flags & RADEON_TILING_MACRO) {
    507 		if (ASIC_IS_R300(rdev)) {
    508 			crtc_tile_x0_y0 = x | (y << 16);
    509 			base &= ~0x7ff;
    510 		} else {
    511 			int byteshift = target_fb->bits_per_pixel >> 4;
    512 			int tile_addr = (((y >> 3) * pitch_pixels +  x) >> (8 - byteshift)) << 11;
    513 			base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8);
    514 			crtc_offset_cntl |= (y % 16);
    515 		}
    516 	} else {
    517 		int offset = y * pitch_pixels + x;
    518 		switch (target_fb->bits_per_pixel) {
    519 		case 8:
    520 			offset *= 1;
    521 			break;
    522 		case 15:
    523 		case 16:
    524 			offset *= 2;
    525 			break;
    526 		case 24:
    527 			offset *= 3;
    528 			break;
    529 		case 32:
    530 			offset *= 4;
    531 			break;
    532 		default:
    533 			return false;
    534 		}
    535 		base += offset;
    536 	}
    537 
    538 	base &= ~7;
    539 
    540 	if (radeon_crtc->crtc_id == 1)
    541 		gen_cntl_reg = RADEON_CRTC2_GEN_CNTL;
    542 	else
    543 		gen_cntl_reg = RADEON_CRTC_GEN_CNTL;
    544 
    545 	gen_cntl_val = RREG32(gen_cntl_reg);
    546 	gen_cntl_val &= ~(0xf << 8);
    547 	gen_cntl_val |= (format << 8);
    548 	gen_cntl_val &= ~RADEON_CRTC_VSTAT_MODE_MASK;
    549 	WREG32(gen_cntl_reg, gen_cntl_val);
    550 
    551 	crtc_offset = (u32)base;
    552 
    553 	WREG32(RADEON_DISPLAY_BASE_ADDR + radeon_crtc->crtc_offset, radeon_crtc->legacy_display_base_addr);
    554 
    555 	if (ASIC_IS_R300(rdev)) {
    556 		if (radeon_crtc->crtc_id)
    557 			WREG32(R300_CRTC2_TILE_X0_Y0, crtc_tile_x0_y0);
    558 		else
    559 			WREG32(R300_CRTC_TILE_X0_Y0, crtc_tile_x0_y0);
    560 	}
    561 	WREG32(RADEON_CRTC_OFFSET_CNTL + radeon_crtc->crtc_offset, crtc_offset_cntl);
    562 	WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, crtc_offset);
    563 	WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
    564 
    565 	if (!atomic && fb && fb != crtc->primary->fb) {
    566 		radeon_fb = to_radeon_framebuffer(fb);
    567 		rbo = gem_to_radeon_bo(radeon_fb->obj);
    568 		r = radeon_bo_reserve(rbo, false);
    569 		if (unlikely(r != 0))
    570 			return r;
    571 		radeon_bo_unpin(rbo);
    572 		radeon_bo_unreserve(rbo);
    573 	}
    574 
    575 	/* Bytes per pixel may have changed */
    576 	radeon_bandwidth_update(rdev);
    577 
    578 	return 0;
    579 }
    580 
    581 static bool radeon_set_crtc_timing(struct drm_crtc *crtc, struct drm_display_mode *mode)
    582 {
    583 	struct drm_device *dev = crtc->dev;
    584 	struct radeon_device *rdev = dev->dev_private;
    585 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
    586 	struct drm_encoder *encoder;
    587 	int format;
    588 	int hsync_start;
    589 	int hsync_wid;
    590 	int vsync_wid;
    591 	uint32_t crtc_h_total_disp;
    592 	uint32_t crtc_h_sync_strt_wid;
    593 	uint32_t crtc_v_total_disp;
    594 	uint32_t crtc_v_sync_strt_wid;
    595 	bool is_tv = false;
    596 
    597 	DRM_DEBUG_KMS("\n");
    598 	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
    599 		if (encoder->crtc == crtc) {
    600 			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
    601 			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
    602 				is_tv = true;
    603 				DRM_INFO("crtc %d is connected to a TV\n", radeon_crtc->crtc_id);
    604 				break;
    605 			}
    606 		}
    607 	}
    608 
    609 	switch (crtc->primary->fb->bits_per_pixel) {
    610 	case 8:
    611 		format = 2;
    612 		break;
    613 	case 15:      /*  555 */
    614 		format = 3;
    615 		break;
    616 	case 16:      /*  565 */
    617 		format = 4;
    618 		break;
    619 	case 24:      /*  RGB */
    620 		format = 5;
    621 		break;
    622 	case 32:      /* xRGB */
    623 		format = 6;
    624 		break;
    625 	default:
    626 		return false;
    627 	}
    628 
    629 	crtc_h_total_disp = ((((mode->crtc_htotal / 8) - 1) & 0x3ff)
    630 			     | ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
    631 
    632 	hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
    633 	if (!hsync_wid)
    634 		hsync_wid = 1;
    635 	hsync_start = mode->crtc_hsync_start - 8;
    636 
    637 	crtc_h_sync_strt_wid = ((hsync_start & 0x1fff)
    638 				| ((hsync_wid & 0x3f) << 16)
    639 				| ((mode->flags & DRM_MODE_FLAG_NHSYNC)
    640 				   ? RADEON_CRTC_H_SYNC_POL
    641 				   : 0));
    642 
    643 	/* This works for double scan mode. */
    644 	crtc_v_total_disp = (((mode->crtc_vtotal - 1) & 0xffff)
    645 			     | ((mode->crtc_vdisplay - 1) << 16));
    646 
    647 	vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
    648 	if (!vsync_wid)
    649 		vsync_wid = 1;
    650 
    651 	crtc_v_sync_strt_wid = (((mode->crtc_vsync_start - 1) & 0xfff)
    652 				| ((vsync_wid & 0x1f) << 16)
    653 				| ((mode->flags & DRM_MODE_FLAG_NVSYNC)
    654 				   ? RADEON_CRTC_V_SYNC_POL
    655 				   : 0));
    656 
    657 	if (radeon_crtc->crtc_id) {
    658 		uint32_t crtc2_gen_cntl;
    659 		uint32_t disp2_merge_cntl;
    660 
    661 		/* if TV DAC is enabled for another crtc and keep it enabled */
    662 		crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL) & 0x00718080;
    663 		crtc2_gen_cntl |= ((format << 8)
    664 				   | RADEON_CRTC2_VSYNC_DIS
    665 				   | RADEON_CRTC2_HSYNC_DIS
    666 				   | RADEON_CRTC2_DISP_DIS
    667 				   | RADEON_CRTC2_DISP_REQ_EN_B
    668 				   | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
    669 				      ? RADEON_CRTC2_DBL_SCAN_EN
    670 				      : 0)
    671 				   | ((mode->flags & DRM_MODE_FLAG_CSYNC)
    672 				      ? RADEON_CRTC2_CSYNC_EN
    673 				      : 0)
    674 				   | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
    675 				      ? RADEON_CRTC2_INTERLACE_EN
    676 				      : 0));
    677 
    678 		/* rs4xx chips seem to like to have the crtc enabled when the timing is set */
    679 		if ((rdev->family == CHIP_RS400) || (rdev->family == CHIP_RS480))
    680 			crtc2_gen_cntl |= RADEON_CRTC2_EN;
    681 
    682 		disp2_merge_cntl = RREG32(RADEON_DISP2_MERGE_CNTL);
    683 		disp2_merge_cntl &= ~RADEON_DISP2_RGB_OFFSET_EN;
    684 
    685 		WREG32(RADEON_DISP2_MERGE_CNTL, disp2_merge_cntl);
    686 		WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
    687 
    688 		WREG32(RADEON_FP_H2_SYNC_STRT_WID, crtc_h_sync_strt_wid);
    689 		WREG32(RADEON_FP_V2_SYNC_STRT_WID, crtc_v_sync_strt_wid);
    690 	} else {
    691 		uint32_t crtc_gen_cntl;
    692 		uint32_t crtc_ext_cntl;
    693 		uint32_t disp_merge_cntl;
    694 
    695 		crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL) & 0x00718000;
    696 		crtc_gen_cntl |= (RADEON_CRTC_EXT_DISP_EN
    697 				 | (format << 8)
    698 				 | RADEON_CRTC_DISP_REQ_EN_B
    699 				 | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
    700 				    ? RADEON_CRTC_DBL_SCAN_EN
    701 				    : 0)
    702 				 | ((mode->flags & DRM_MODE_FLAG_CSYNC)
    703 				    ? RADEON_CRTC_CSYNC_EN
    704 				    : 0)
    705 				 | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
    706 				    ? RADEON_CRTC_INTERLACE_EN
    707 				    : 0));
    708 
    709 		/* rs4xx chips seem to like to have the crtc enabled when the timing is set */
    710 		if ((rdev->family == CHIP_RS400) || (rdev->family == CHIP_RS480))
    711 			crtc_gen_cntl |= RADEON_CRTC_EN;
    712 
    713 		crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
    714 		crtc_ext_cntl |= (RADEON_XCRT_CNT_EN |
    715 				  RADEON_CRTC_VSYNC_DIS |
    716 				  RADEON_CRTC_HSYNC_DIS |
    717 				  RADEON_CRTC_DISPLAY_DIS);
    718 
    719 		disp_merge_cntl = RREG32(RADEON_DISP_MERGE_CNTL);
    720 		disp_merge_cntl &= ~RADEON_DISP_RGB_OFFSET_EN;
    721 
    722 		WREG32(RADEON_DISP_MERGE_CNTL, disp_merge_cntl);
    723 		WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl);
    724 		WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
    725 	}
    726 
    727 	if (is_tv)
    728 		radeon_legacy_tv_adjust_crtc_reg(encoder, &crtc_h_total_disp,
    729 						 &crtc_h_sync_strt_wid, &crtc_v_total_disp,
    730 						 &crtc_v_sync_strt_wid);
    731 
    732 	WREG32(RADEON_CRTC_H_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_h_total_disp);
    733 	WREG32(RADEON_CRTC_H_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_h_sync_strt_wid);
    734 	WREG32(RADEON_CRTC_V_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_v_total_disp);
    735 	WREG32(RADEON_CRTC_V_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_v_sync_strt_wid);
    736 
    737 	return true;
    738 }
    739 
    740 static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
    741 {
    742 	struct drm_device *dev = crtc->dev;
    743 	struct radeon_device *rdev = dev->dev_private;
    744 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
    745 	struct drm_encoder *encoder;
    746 	uint32_t feedback_div = 0;
    747 	uint32_t frac_fb_div = 0;
    748 	uint32_t reference_div = 0;
    749 	uint32_t post_divider = 0;
    750 	uint32_t freq = 0;
    751 	uint8_t pll_gain;
    752 	bool use_bios_divs = false;
    753 	/* PLL registers */
    754 	uint32_t pll_ref_div = 0;
    755 	uint32_t pll_fb_post_div = 0;
    756 	uint32_t htotal_cntl = 0;
    757 	bool is_tv = false;
    758 	struct radeon_pll *pll;
    759 
    760 	struct {
    761 		int divider;
    762 		int bitvalue;
    763 	} *post_div, post_divs[]   = {
    764 		/* From RAGE 128 VR/RAGE 128 GL Register
    765 		 * Reference Manual (Technical Reference
    766 		 * Manual P/N RRG-G04100-C Rev. 0.04), page
    767 		 * 3-17 (PLL_DIV_[3:0]).
    768 		 */
    769 		{  1, 0 },              /* VCLK_SRC                 */
    770 		{  2, 1 },              /* VCLK_SRC/2               */
    771 		{  4, 2 },              /* VCLK_SRC/4               */
    772 		{  8, 3 },              /* VCLK_SRC/8               */
    773 		{  3, 4 },              /* VCLK_SRC/3               */
    774 		{ 16, 5 },              /* VCLK_SRC/16              */
    775 		{  6, 6 },              /* VCLK_SRC/6               */
    776 		{ 12, 7 },              /* VCLK_SRC/12              */
    777 		{  0, 0 }
    778 	};
    779 
    780 	if (radeon_crtc->crtc_id)
    781 		pll = &rdev->clock.p2pll;
    782 	else
    783 		pll = &rdev->clock.p1pll;
    784 
    785 	pll->flags = RADEON_PLL_LEGACY;
    786 
    787 	if (mode->clock > 200000) /* range limits??? */
    788 		pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
    789 	else
    790 		pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
    791 
    792 	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
    793 		if (encoder->crtc == crtc) {
    794 			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
    795 
    796 			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
    797 				is_tv = true;
    798 				break;
    799 			}
    800 
    801 			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC)
    802 				pll->flags |= RADEON_PLL_NO_ODD_POST_DIV;
    803 			if (encoder->encoder_type == DRM_MODE_ENCODER_LVDS) {
    804 				if (!rdev->is_atom_bios) {
    805 					struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
    806 					struct radeon_encoder_lvds *lvds = (struct radeon_encoder_lvds *)radeon_encoder->enc_priv;
    807 					if (lvds) {
    808 						if (lvds->use_bios_dividers) {
    809 							pll_ref_div = lvds->panel_ref_divider;
    810 							pll_fb_post_div   = (lvds->panel_fb_divider |
    811 									     (lvds->panel_post_divider << 16));
    812 							htotal_cntl  = 0;
    813 							use_bios_divs = true;
    814 						}
    815 					}
    816 				}
    817 				pll->flags |= RADEON_PLL_USE_REF_DIV;
    818 			}
    819 		}
    820 	}
    821 
    822 	DRM_DEBUG_KMS("\n");
    823 
    824 	if (!use_bios_divs) {
    825 		radeon_compute_pll_legacy(pll, mode->clock,
    826 					  &freq, &feedback_div, &frac_fb_div,
    827 					  &reference_div, &post_divider);
    828 
    829 		for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
    830 			if (post_div->divider == post_divider)
    831 				break;
    832 		}
    833 
    834 		if (!post_div->divider)
    835 			post_div = &post_divs[0];
    836 
    837 		DRM_DEBUG_KMS("dc=%u, fd=%d, rd=%d, pd=%d\n",
    838 			  (unsigned)freq,
    839 			  feedback_div,
    840 			  reference_div,
    841 			  post_divider);
    842 
    843 		pll_ref_div   = reference_div;
    844 #if defined(__powerpc__) && (0) /* TODO */
    845 		/* apparently programming this otherwise causes a hang??? */
    846 		if (info->MacModel == RADEON_MAC_IBOOK)
    847 			pll_fb_post_div = 0x000600ad;
    848 		else
    849 #endif
    850 			pll_fb_post_div     = (feedback_div | (post_div->bitvalue << 16));
    851 
    852 		htotal_cntl    = mode->htotal & 0x7;
    853 
    854 	}
    855 
    856 	pll_gain = radeon_compute_pll_gain(pll->reference_freq,
    857 					   pll_ref_div & 0x3ff,
    858 					   pll_fb_post_div & 0x7ff);
    859 
    860 	if (radeon_crtc->crtc_id) {
    861 		uint32_t pixclks_cntl = ((RREG32_PLL(RADEON_PIXCLKS_CNTL) &
    862 					  ~(RADEON_PIX2CLK_SRC_SEL_MASK)) |
    863 					 RADEON_PIX2CLK_SRC_SEL_P2PLLCLK);
    864 
    865 		if (is_tv) {
    866 			radeon_legacy_tv_adjust_pll2(encoder, &htotal_cntl,
    867 						     &pll_ref_div, &pll_fb_post_div,
    868 						     &pixclks_cntl);
    869 		}
    870 
    871 		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
    872 			     RADEON_PIX2CLK_SRC_SEL_CPUCLK,
    873 			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
    874 
    875 		WREG32_PLL_P(RADEON_P2PLL_CNTL,
    876 			     RADEON_P2PLL_RESET
    877 			     | RADEON_P2PLL_ATOMIC_UPDATE_EN
    878 			     | ((uint32_t)pll_gain << RADEON_P2PLL_PVG_SHIFT),
    879 			     ~(RADEON_P2PLL_RESET
    880 			       | RADEON_P2PLL_ATOMIC_UPDATE_EN
    881 			       | RADEON_P2PLL_PVG_MASK));
    882 
    883 		WREG32_PLL_P(RADEON_P2PLL_REF_DIV,
    884 			     pll_ref_div,
    885 			     ~RADEON_P2PLL_REF_DIV_MASK);
    886 
    887 		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
    888 			     pll_fb_post_div,
    889 			     ~RADEON_P2PLL_FB0_DIV_MASK);
    890 
    891 		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
    892 			     pll_fb_post_div,
    893 			     ~RADEON_P2PLL_POST0_DIV_MASK);
    894 
    895 		radeon_pll2_write_update(dev);
    896 		radeon_pll2_wait_for_read_update_complete(dev);
    897 
    898 		WREG32_PLL(RADEON_HTOTAL2_CNTL, htotal_cntl);
    899 
    900 		WREG32_PLL_P(RADEON_P2PLL_CNTL,
    901 			     0,
    902 			     ~(RADEON_P2PLL_RESET
    903 			       | RADEON_P2PLL_SLEEP
    904 			       | RADEON_P2PLL_ATOMIC_UPDATE_EN));
    905 
    906 		DRM_DEBUG_KMS("Wrote2: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
    907 			  (unsigned)pll_ref_div,
    908 			  (unsigned)pll_fb_post_div,
    909 			  (unsigned)htotal_cntl,
    910 			  RREG32_PLL(RADEON_P2PLL_CNTL));
    911 		DRM_DEBUG_KMS("Wrote2: rd=%u, fd=%u, pd=%u\n",
    912 			  (unsigned)pll_ref_div & RADEON_P2PLL_REF_DIV_MASK,
    913 			  (unsigned)pll_fb_post_div & RADEON_P2PLL_FB0_DIV_MASK,
    914 			  (unsigned)((pll_fb_post_div &
    915 				      RADEON_P2PLL_POST0_DIV_MASK) >> 16));
    916 
    917 		mdelay(50); /* Let the clock to lock */
    918 
    919 		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
    920 			     RADEON_PIX2CLK_SRC_SEL_P2PLLCLK,
    921 			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
    922 
    923 		WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
    924 	} else {
    925 		uint32_t pixclks_cntl;
    926 
    927 
    928 		if (is_tv) {
    929 			pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
    930 			radeon_legacy_tv_adjust_pll1(encoder, &htotal_cntl, &pll_ref_div,
    931 						     &pll_fb_post_div, &pixclks_cntl);
    932 		}
    933 
    934 		if (rdev->flags & RADEON_IS_MOBILITY) {
    935 			/* A temporal workaround for the occasional blanking on certain laptop panels.
    936 			   This appears to related to the PLL divider registers (fail to lock?).
    937 			   It occurs even when all dividers are the same with their old settings.
    938 			   In this case we really don't need to fiddle with PLL registers.
    939 			   By doing this we can avoid the blanking problem with some panels.
    940 			*/
    941 			if ((pll_ref_div == (RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_REF_DIV_MASK)) &&
    942 			    (pll_fb_post_div == (RREG32_PLL(RADEON_PPLL_DIV_3) &
    943 						 (RADEON_PPLL_POST3_DIV_MASK | RADEON_PPLL_FB3_DIV_MASK)))) {
    944 				WREG32_P(RADEON_CLOCK_CNTL_INDEX,
    945 					 RADEON_PLL_DIV_SEL,
    946 					 ~(RADEON_PLL_DIV_SEL));
    947 				r100_pll_errata_after_index(rdev);
    948 				return;
    949 			}
    950 		}
    951 
    952 		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
    953 			     RADEON_VCLK_SRC_SEL_CPUCLK,
    954 			     ~(RADEON_VCLK_SRC_SEL_MASK));
    955 		WREG32_PLL_P(RADEON_PPLL_CNTL,
    956 			     RADEON_PPLL_RESET
    957 			     | RADEON_PPLL_ATOMIC_UPDATE_EN
    958 			     | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
    959 			     | ((uint32_t)pll_gain << RADEON_PPLL_PVG_SHIFT),
    960 			     ~(RADEON_PPLL_RESET
    961 			       | RADEON_PPLL_ATOMIC_UPDATE_EN
    962 			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
    963 			       | RADEON_PPLL_PVG_MASK));
    964 
    965 		WREG32_P(RADEON_CLOCK_CNTL_INDEX,
    966 			 RADEON_PLL_DIV_SEL,
    967 			 ~(RADEON_PLL_DIV_SEL));
    968 		r100_pll_errata_after_index(rdev);
    969 
    970 		if (ASIC_IS_R300(rdev) ||
    971 		    (rdev->family == CHIP_RS300) ||
    972 		    (rdev->family == CHIP_RS400) ||
    973 		    (rdev->family == CHIP_RS480)) {
    974 			if (pll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) {
    975 				/* When restoring console mode, use saved PPLL_REF_DIV
    976 				 * setting.
    977 				 */
    978 				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
    979 					     pll_ref_div,
    980 					     0);
    981 			} else {
    982 				/* R300 uses ref_div_acc field as real ref divider */
    983 				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
    984 					     (pll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT),
    985 					     ~R300_PPLL_REF_DIV_ACC_MASK);
    986 			}
    987 		} else
    988 			WREG32_PLL_P(RADEON_PPLL_REF_DIV,
    989 				     pll_ref_div,
    990 				     ~RADEON_PPLL_REF_DIV_MASK);
    991 
    992 		WREG32_PLL_P(RADEON_PPLL_DIV_3,
    993 			     pll_fb_post_div,
    994 			     ~RADEON_PPLL_FB3_DIV_MASK);
    995 
    996 		WREG32_PLL_P(RADEON_PPLL_DIV_3,
    997 			     pll_fb_post_div,
    998 			     ~RADEON_PPLL_POST3_DIV_MASK);
    999 
   1000 		radeon_pll_write_update(dev);
   1001 		radeon_pll_wait_for_read_update_complete(dev);
   1002 
   1003 		WREG32_PLL(RADEON_HTOTAL_CNTL, htotal_cntl);
   1004 
   1005 		WREG32_PLL_P(RADEON_PPLL_CNTL,
   1006 			     0,
   1007 			     ~(RADEON_PPLL_RESET
   1008 			       | RADEON_PPLL_SLEEP
   1009 			       | RADEON_PPLL_ATOMIC_UPDATE_EN
   1010 			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN));
   1011 
   1012 		DRM_DEBUG_KMS("Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
   1013 			  pll_ref_div,
   1014 			  pll_fb_post_div,
   1015 			  (unsigned)htotal_cntl,
   1016 			  RREG32_PLL(RADEON_PPLL_CNTL));
   1017 		DRM_DEBUG_KMS("Wrote: rd=%d, fd=%d, pd=%d\n",
   1018 			  pll_ref_div & RADEON_PPLL_REF_DIV_MASK,
   1019 			  pll_fb_post_div & RADEON_PPLL_FB3_DIV_MASK,
   1020 			  (pll_fb_post_div & RADEON_PPLL_POST3_DIV_MASK) >> 16);
   1021 
   1022 		mdelay(50); /* Let the clock to lock */
   1023 
   1024 		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
   1025 			     RADEON_VCLK_SRC_SEL_PPLLCLK,
   1026 			     ~(RADEON_VCLK_SRC_SEL_MASK));
   1027 
   1028 		if (is_tv)
   1029 			WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
   1030 	}
   1031 }
   1032 
   1033 static bool radeon_crtc_mode_fixup(struct drm_crtc *crtc,
   1034 				   const struct drm_display_mode *mode,
   1035 				   struct drm_display_mode *adjusted_mode)
   1036 {
   1037 	if (!radeon_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode))
   1038 		return false;
   1039 	return true;
   1040 }
   1041 
   1042 static int radeon_crtc_mode_set(struct drm_crtc *crtc,
   1043 				 struct drm_display_mode *mode,
   1044 				 struct drm_display_mode *adjusted_mode,
   1045 				 int x, int y, struct drm_framebuffer *old_fb)
   1046 {
   1047 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
   1048 
   1049 	/* TODO TV */
   1050 	radeon_crtc_set_base(crtc, x, y, old_fb);
   1051 	radeon_set_crtc_timing(crtc, adjusted_mode);
   1052 	radeon_set_pll(crtc, adjusted_mode);
   1053 	radeon_overscan_setup(crtc, adjusted_mode);
   1054 	if (radeon_crtc->crtc_id == 0) {
   1055 		radeon_legacy_rmx_mode_set(crtc, adjusted_mode);
   1056 	} else {
   1057 		if (radeon_crtc->rmx_type != RMX_OFF) {
   1058 			/* FIXME: only first crtc has rmx what should we
   1059 			 * do ?
   1060 			 */
   1061 			DRM_ERROR("Mode need scaling but only first crtc can do that.\n");
   1062 		}
   1063 	}
   1064 	radeon_cursor_reset(crtc);
   1065 	return 0;
   1066 }
   1067 
   1068 static void radeon_crtc_prepare(struct drm_crtc *crtc)
   1069 {
   1070 	struct drm_device *dev = crtc->dev;
   1071 	struct drm_crtc *crtci;
   1072 
   1073 	/*
   1074 	* The hardware wedges sometimes if you reconfigure one CRTC
   1075 	* whilst another is running (see fdo bug #24611).
   1076 	*/
   1077 	list_for_each_entry(crtci, &dev->mode_config.crtc_list, head)
   1078 		radeon_crtc_dpms(crtci, DRM_MODE_DPMS_OFF);
   1079 }
   1080 
   1081 static void radeon_crtc_commit(struct drm_crtc *crtc)
   1082 {
   1083 	struct drm_device *dev = crtc->dev;
   1084 	struct drm_crtc *crtci;
   1085 
   1086 	/*
   1087 	* Reenable the CRTCs that should be running.
   1088 	*/
   1089 	list_for_each_entry(crtci, &dev->mode_config.crtc_list, head) {
   1090 		if (crtci->enabled)
   1091 			radeon_crtc_dpms(crtci, DRM_MODE_DPMS_ON);
   1092 	}
   1093 }
   1094 
   1095 static void radeon_crtc_disable(struct drm_crtc *crtc)
   1096 {
   1097 	radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
   1098 	if (crtc->primary->fb) {
   1099 		int r;
   1100 		struct radeon_framebuffer *radeon_fb;
   1101 		struct radeon_bo *rbo;
   1102 
   1103 		radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
   1104 		rbo = gem_to_radeon_bo(radeon_fb->obj);
   1105 		r = radeon_bo_reserve(rbo, false);
   1106 		if (unlikely(r))
   1107 			DRM_ERROR("failed to reserve rbo before unpin\n");
   1108 		else {
   1109 			radeon_bo_unpin(rbo);
   1110 			radeon_bo_unreserve(rbo);
   1111 		}
   1112 	}
   1113 }
   1114 
   1115 static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
   1116 	.dpms = radeon_crtc_dpms,
   1117 	.mode_fixup = radeon_crtc_mode_fixup,
   1118 	.mode_set = radeon_crtc_mode_set,
   1119 	.mode_set_base = radeon_crtc_set_base,
   1120 	.mode_set_base_atomic = radeon_crtc_set_base_atomic,
   1121 	.prepare = radeon_crtc_prepare,
   1122 	.commit = radeon_crtc_commit,
   1123 	.load_lut = radeon_crtc_load_lut,
   1124 	.disable = radeon_crtc_disable
   1125 };
   1126 
   1127 
   1128 void radeon_legacy_init_crtc(struct drm_device *dev,
   1129 			       struct radeon_crtc *radeon_crtc)
   1130 {
   1131 	if (radeon_crtc->crtc_id == 1)
   1132 		radeon_crtc->crtc_offset = RADEON_CRTC2_H_TOTAL_DISP - RADEON_CRTC_H_TOTAL_DISP;
   1133 	drm_crtc_helper_add(&radeon_crtc->base, &legacy_helper_funcs);
   1134 }
   1135