Home | History | Annotate | Line # | Download | only in radeon
radeon_legacy_crtc.c revision 1.2.16.1
      1 /*	$NetBSD: radeon_legacy_crtc.c,v 1.2.16.1 2018/09/06 06:56:32 pgoyette 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.2.16.1 2018/09/06 06:56:32 pgoyette 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 	if (atomic) {
    433 		/*
    434 		 * If you want to do this in atomic, better have it
    435 		 * pinned ahead of time.
    436 		 */
    437 		BUG_ON(rbo->pin_count == 0);
    438 		base = radeon_bo_gpu_offset(rbo);
    439 		tiling_flags = 0;
    440 		goto pinned;
    441 	}
    442 retry:
    443 	r = radeon_bo_reserve(rbo, false);
    444 	if (unlikely(r != 0))
    445 		return r;
    446 	/* Only 27 bit offset for legacy CRTC */
    447 	r = radeon_bo_pin_restricted(rbo, RADEON_GEM_DOMAIN_VRAM, 1 << 27,
    448 				     &base);
    449 	if (unlikely(r != 0)) {
    450 		radeon_bo_unreserve(rbo);
    451 
    452 		/* On old GPU like RN50 with little vram pining can fails because
    453 		 * current fb is taking all space needed. So instead of unpining
    454 		 * the old buffer after pining the new one, first unpin old one
    455 		 * and then retry pining new one.
    456 		 *
    457 		 * As only master can set mode only master can pin and it is
    458 		 * unlikely the master client will race with itself especialy
    459 		 * on those old gpu with single crtc.
    460 		 *
    461 		 * We don't shutdown the display controller because new buffer
    462 		 * will end up in same spot.
    463 		 */
    464 		if (fb && fb != crtc->primary->fb) {
    465 			struct radeon_bo *old_rbo;
    466 			unsigned long nsize, osize;
    467 
    468 			old_rbo = gem_to_radeon_bo(to_radeon_framebuffer(fb)->obj);
    469 			osize = radeon_bo_size(old_rbo);
    470 			nsize = radeon_bo_size(rbo);
    471 			if (nsize <= osize && !radeon_bo_reserve(old_rbo, false)) {
    472 				radeon_bo_unpin(old_rbo);
    473 				radeon_bo_unreserve(old_rbo);
    474 				fb = NULL;
    475 				goto retry;
    476 			}
    477 		}
    478 		return -EINVAL;
    479 	}
    480 	radeon_bo_get_tiling_flags(rbo, &tiling_flags, NULL);
    481 	radeon_bo_unreserve(rbo);
    482 pinned:
    483 	if (tiling_flags & RADEON_TILING_MICRO)
    484 		DRM_ERROR("trying to scanout microtiled buffer\n");
    485 
    486 	/* if scanout was in GTT this really wouldn't work */
    487 	/* crtc offset is from display base addr not FB location */
    488 	radeon_crtc->legacy_display_base_addr = rdev->mc.vram_start;
    489 
    490 	base -= radeon_crtc->legacy_display_base_addr;
    491 
    492 	crtc_offset_cntl = 0;
    493 
    494 	pitch_pixels = target_fb->pitches[0] / (target_fb->bits_per_pixel / 8);
    495 	crtc_pitch  = (((pitch_pixels * target_fb->bits_per_pixel) +
    496 			((target_fb->bits_per_pixel * 8) - 1)) /
    497 		       (target_fb->bits_per_pixel * 8));
    498 	crtc_pitch |= crtc_pitch << 16;
    499 
    500 	crtc_offset_cntl |= RADEON_CRTC_GUI_TRIG_OFFSET_LEFT_EN;
    501 	if (tiling_flags & RADEON_TILING_MACRO) {
    502 		if (ASIC_IS_R300(rdev))
    503 			crtc_offset_cntl |= (R300_CRTC_X_Y_MODE_EN |
    504 					     R300_CRTC_MICRO_TILE_BUFFER_DIS |
    505 					     R300_CRTC_MACRO_TILE_EN);
    506 		else
    507 			crtc_offset_cntl |= RADEON_CRTC_TILE_EN;
    508 	} else {
    509 		if (ASIC_IS_R300(rdev))
    510 			crtc_offset_cntl &= ~(R300_CRTC_X_Y_MODE_EN |
    511 					      R300_CRTC_MICRO_TILE_BUFFER_DIS |
    512 					      R300_CRTC_MACRO_TILE_EN);
    513 		else
    514 			crtc_offset_cntl &= ~RADEON_CRTC_TILE_EN;
    515 	}
    516 
    517 	if (tiling_flags & RADEON_TILING_MACRO) {
    518 		if (ASIC_IS_R300(rdev)) {
    519 			crtc_tile_x0_y0 = x | (y << 16);
    520 			base &= ~0x7ff;
    521 		} else {
    522 			int byteshift = target_fb->bits_per_pixel >> 4;
    523 			int tile_addr = (((y >> 3) * pitch_pixels +  x) >> (8 - byteshift)) << 11;
    524 			base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8);
    525 			crtc_offset_cntl |= (y % 16);
    526 		}
    527 	} else {
    528 		int offset = y * pitch_pixels + x;
    529 		switch (target_fb->bits_per_pixel) {
    530 		case 8:
    531 			offset *= 1;
    532 			break;
    533 		case 15:
    534 		case 16:
    535 			offset *= 2;
    536 			break;
    537 		case 24:
    538 			offset *= 3;
    539 			break;
    540 		case 32:
    541 			offset *= 4;
    542 			break;
    543 		default:
    544 			return false;
    545 		}
    546 		base += offset;
    547 	}
    548 
    549 	base &= ~7;
    550 
    551 	if (radeon_crtc->crtc_id == 1)
    552 		gen_cntl_reg = RADEON_CRTC2_GEN_CNTL;
    553 	else
    554 		gen_cntl_reg = RADEON_CRTC_GEN_CNTL;
    555 
    556 	gen_cntl_val = RREG32(gen_cntl_reg);
    557 	gen_cntl_val &= ~(0xf << 8);
    558 	gen_cntl_val |= (format << 8);
    559 	gen_cntl_val &= ~RADEON_CRTC_VSTAT_MODE_MASK;
    560 	WREG32(gen_cntl_reg, gen_cntl_val);
    561 
    562 	crtc_offset = (u32)base;
    563 
    564 	WREG32(RADEON_DISPLAY_BASE_ADDR + radeon_crtc->crtc_offset, radeon_crtc->legacy_display_base_addr);
    565 
    566 	if (ASIC_IS_R300(rdev)) {
    567 		if (radeon_crtc->crtc_id)
    568 			WREG32(R300_CRTC2_TILE_X0_Y0, crtc_tile_x0_y0);
    569 		else
    570 			WREG32(R300_CRTC_TILE_X0_Y0, crtc_tile_x0_y0);
    571 	}
    572 	WREG32(RADEON_CRTC_OFFSET_CNTL + radeon_crtc->crtc_offset, crtc_offset_cntl);
    573 	WREG32(RADEON_CRTC_OFFSET + radeon_crtc->crtc_offset, crtc_offset);
    574 	WREG32(RADEON_CRTC_PITCH + radeon_crtc->crtc_offset, crtc_pitch);
    575 
    576 	if (!atomic && fb && fb != crtc->primary->fb) {
    577 		radeon_fb = to_radeon_framebuffer(fb);
    578 		rbo = gem_to_radeon_bo(radeon_fb->obj);
    579 		r = radeon_bo_reserve(rbo, false);
    580 		if (unlikely(r != 0))
    581 			return r;
    582 		radeon_bo_unpin(rbo);
    583 		radeon_bo_unreserve(rbo);
    584 	}
    585 
    586 	/* Bytes per pixel may have changed */
    587 	radeon_bandwidth_update(rdev);
    588 
    589 	return 0;
    590 }
    591 
    592 static bool radeon_set_crtc_timing(struct drm_crtc *crtc, struct drm_display_mode *mode)
    593 {
    594 	struct drm_device *dev = crtc->dev;
    595 	struct radeon_device *rdev = dev->dev_private;
    596 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
    597 	struct drm_encoder *encoder;
    598 	int format;
    599 	int hsync_start;
    600 	int hsync_wid;
    601 	int vsync_wid;
    602 	uint32_t crtc_h_total_disp;
    603 	uint32_t crtc_h_sync_strt_wid;
    604 	uint32_t crtc_v_total_disp;
    605 	uint32_t crtc_v_sync_strt_wid;
    606 	bool is_tv = false;
    607 
    608 	DRM_DEBUG_KMS("\n");
    609 	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
    610 		if (encoder->crtc == crtc) {
    611 			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
    612 			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
    613 				is_tv = true;
    614 				DRM_INFO("crtc %d is connected to a TV\n", radeon_crtc->crtc_id);
    615 				break;
    616 			}
    617 		}
    618 	}
    619 
    620 	switch (crtc->primary->fb->bits_per_pixel) {
    621 	case 8:
    622 		format = 2;
    623 		break;
    624 	case 15:      /*  555 */
    625 		format = 3;
    626 		break;
    627 	case 16:      /*  565 */
    628 		format = 4;
    629 		break;
    630 	case 24:      /*  RGB */
    631 		format = 5;
    632 		break;
    633 	case 32:      /* xRGB */
    634 		format = 6;
    635 		break;
    636 	default:
    637 		return false;
    638 	}
    639 
    640 	crtc_h_total_disp = ((((mode->crtc_htotal / 8) - 1) & 0x3ff)
    641 			     | ((((mode->crtc_hdisplay / 8) - 1) & 0x1ff) << 16));
    642 
    643 	hsync_wid = (mode->crtc_hsync_end - mode->crtc_hsync_start) / 8;
    644 	if (!hsync_wid)
    645 		hsync_wid = 1;
    646 	hsync_start = mode->crtc_hsync_start - 8;
    647 
    648 	crtc_h_sync_strt_wid = ((hsync_start & 0x1fff)
    649 				| ((hsync_wid & 0x3f) << 16)
    650 				| ((mode->flags & DRM_MODE_FLAG_NHSYNC)
    651 				   ? RADEON_CRTC_H_SYNC_POL
    652 				   : 0));
    653 
    654 	/* This works for double scan mode. */
    655 	crtc_v_total_disp = (((mode->crtc_vtotal - 1) & 0xffff)
    656 			     | ((mode->crtc_vdisplay - 1) << 16));
    657 
    658 	vsync_wid = mode->crtc_vsync_end - mode->crtc_vsync_start;
    659 	if (!vsync_wid)
    660 		vsync_wid = 1;
    661 
    662 	crtc_v_sync_strt_wid = (((mode->crtc_vsync_start - 1) & 0xfff)
    663 				| ((vsync_wid & 0x1f) << 16)
    664 				| ((mode->flags & DRM_MODE_FLAG_NVSYNC)
    665 				   ? RADEON_CRTC_V_SYNC_POL
    666 				   : 0));
    667 
    668 	if (radeon_crtc->crtc_id) {
    669 		uint32_t crtc2_gen_cntl;
    670 		uint32_t disp2_merge_cntl;
    671 
    672 		/* if TV DAC is enabled for another crtc and keep it enabled */
    673 		crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL) & 0x00718080;
    674 		crtc2_gen_cntl |= ((format << 8)
    675 				   | RADEON_CRTC2_VSYNC_DIS
    676 				   | RADEON_CRTC2_HSYNC_DIS
    677 				   | RADEON_CRTC2_DISP_DIS
    678 				   | RADEON_CRTC2_DISP_REQ_EN_B
    679 				   | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
    680 				      ? RADEON_CRTC2_DBL_SCAN_EN
    681 				      : 0)
    682 				   | ((mode->flags & DRM_MODE_FLAG_CSYNC)
    683 				      ? RADEON_CRTC2_CSYNC_EN
    684 				      : 0)
    685 				   | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
    686 				      ? RADEON_CRTC2_INTERLACE_EN
    687 				      : 0));
    688 
    689 		/* rs4xx chips seem to like to have the crtc enabled when the timing is set */
    690 		if ((rdev->family == CHIP_RS400) || (rdev->family == CHIP_RS480))
    691 			crtc2_gen_cntl |= RADEON_CRTC2_EN;
    692 
    693 		disp2_merge_cntl = RREG32(RADEON_DISP2_MERGE_CNTL);
    694 		disp2_merge_cntl &= ~RADEON_DISP2_RGB_OFFSET_EN;
    695 
    696 		WREG32(RADEON_DISP2_MERGE_CNTL, disp2_merge_cntl);
    697 		WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl);
    698 
    699 		WREG32(RADEON_FP_H2_SYNC_STRT_WID, crtc_h_sync_strt_wid);
    700 		WREG32(RADEON_FP_V2_SYNC_STRT_WID, crtc_v_sync_strt_wid);
    701 	} else {
    702 		uint32_t crtc_gen_cntl;
    703 		uint32_t crtc_ext_cntl;
    704 		uint32_t disp_merge_cntl;
    705 
    706 		crtc_gen_cntl = RREG32(RADEON_CRTC_GEN_CNTL) & 0x00718000;
    707 		crtc_gen_cntl |= (RADEON_CRTC_EXT_DISP_EN
    708 				 | (format << 8)
    709 				 | RADEON_CRTC_DISP_REQ_EN_B
    710 				 | ((mode->flags & DRM_MODE_FLAG_DBLSCAN)
    711 				    ? RADEON_CRTC_DBL_SCAN_EN
    712 				    : 0)
    713 				 | ((mode->flags & DRM_MODE_FLAG_CSYNC)
    714 				    ? RADEON_CRTC_CSYNC_EN
    715 				    : 0)
    716 				 | ((mode->flags & DRM_MODE_FLAG_INTERLACE)
    717 				    ? RADEON_CRTC_INTERLACE_EN
    718 				    : 0));
    719 
    720 		/* rs4xx chips seem to like to have the crtc enabled when the timing is set */
    721 		if ((rdev->family == CHIP_RS400) || (rdev->family == CHIP_RS480))
    722 			crtc_gen_cntl |= RADEON_CRTC_EN;
    723 
    724 		crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL);
    725 		crtc_ext_cntl |= (RADEON_XCRT_CNT_EN |
    726 				  RADEON_CRTC_VSYNC_DIS |
    727 				  RADEON_CRTC_HSYNC_DIS |
    728 				  RADEON_CRTC_DISPLAY_DIS);
    729 
    730 		disp_merge_cntl = RREG32(RADEON_DISP_MERGE_CNTL);
    731 		disp_merge_cntl &= ~RADEON_DISP_RGB_OFFSET_EN;
    732 
    733 		WREG32(RADEON_DISP_MERGE_CNTL, disp_merge_cntl);
    734 		WREG32(RADEON_CRTC_GEN_CNTL, crtc_gen_cntl);
    735 		WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl);
    736 	}
    737 
    738 	if (is_tv)
    739 		radeon_legacy_tv_adjust_crtc_reg(encoder, &crtc_h_total_disp,
    740 						 &crtc_h_sync_strt_wid, &crtc_v_total_disp,
    741 						 &crtc_v_sync_strt_wid);
    742 
    743 	WREG32(RADEON_CRTC_H_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_h_total_disp);
    744 	WREG32(RADEON_CRTC_H_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_h_sync_strt_wid);
    745 	WREG32(RADEON_CRTC_V_TOTAL_DISP + radeon_crtc->crtc_offset, crtc_v_total_disp);
    746 	WREG32(RADEON_CRTC_V_SYNC_STRT_WID + radeon_crtc->crtc_offset, crtc_v_sync_strt_wid);
    747 
    748 	return true;
    749 }
    750 
    751 static void radeon_set_pll(struct drm_crtc *crtc, struct drm_display_mode *mode)
    752 {
    753 	struct drm_device *dev = crtc->dev;
    754 	struct radeon_device *rdev = dev->dev_private;
    755 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
    756 	struct drm_encoder *encoder;
    757 	uint32_t feedback_div = 0;
    758 	uint32_t frac_fb_div = 0;
    759 	uint32_t reference_div = 0;
    760 	uint32_t post_divider = 0;
    761 	uint32_t freq = 0;
    762 	uint8_t pll_gain;
    763 	bool use_bios_divs = false;
    764 	/* PLL registers */
    765 	uint32_t pll_ref_div = 0;
    766 	uint32_t pll_fb_post_div = 0;
    767 	uint32_t htotal_cntl = 0;
    768 	bool is_tv = false;
    769 	struct radeon_pll *pll;
    770 
    771 	struct {
    772 		int divider;
    773 		int bitvalue;
    774 	} *post_div, post_divs[]   = {
    775 		/* From RAGE 128 VR/RAGE 128 GL Register
    776 		 * Reference Manual (Technical Reference
    777 		 * Manual P/N RRG-G04100-C Rev. 0.04), page
    778 		 * 3-17 (PLL_DIV_[3:0]).
    779 		 */
    780 		{  1, 0 },              /* VCLK_SRC                 */
    781 		{  2, 1 },              /* VCLK_SRC/2               */
    782 		{  4, 2 },              /* VCLK_SRC/4               */
    783 		{  8, 3 },              /* VCLK_SRC/8               */
    784 		{  3, 4 },              /* VCLK_SRC/3               */
    785 		{ 16, 5 },              /* VCLK_SRC/16              */
    786 		{  6, 6 },              /* VCLK_SRC/6               */
    787 		{ 12, 7 },              /* VCLK_SRC/12              */
    788 		{  0, 0 }
    789 	};
    790 
    791 	if (radeon_crtc->crtc_id)
    792 		pll = &rdev->clock.p2pll;
    793 	else
    794 		pll = &rdev->clock.p1pll;
    795 
    796 	pll->flags = RADEON_PLL_LEGACY;
    797 
    798 	if (mode->clock > 200000) /* range limits??? */
    799 		pll->flags |= RADEON_PLL_PREFER_HIGH_FB_DIV;
    800 	else
    801 		pll->flags |= RADEON_PLL_PREFER_LOW_REF_DIV;
    802 
    803 	list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
    804 		if (encoder->crtc == crtc) {
    805 			struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
    806 
    807 			if (radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT) {
    808 				is_tv = true;
    809 				break;
    810 			}
    811 
    812 			if (encoder->encoder_type != DRM_MODE_ENCODER_DAC)
    813 				pll->flags |= RADEON_PLL_NO_ODD_POST_DIV;
    814 			if (encoder->encoder_type == DRM_MODE_ENCODER_LVDS) {
    815 				if (!rdev->is_atom_bios) {
    816 					struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
    817 					struct radeon_encoder_lvds *lvds = (struct radeon_encoder_lvds *)radeon_encoder->enc_priv;
    818 					if (lvds) {
    819 						if (lvds->use_bios_dividers) {
    820 							pll_ref_div = lvds->panel_ref_divider;
    821 							pll_fb_post_div   = (lvds->panel_fb_divider |
    822 									     (lvds->panel_post_divider << 16));
    823 							htotal_cntl  = 0;
    824 							use_bios_divs = true;
    825 						}
    826 					}
    827 				}
    828 				pll->flags |= RADEON_PLL_USE_REF_DIV;
    829 			}
    830 		}
    831 	}
    832 
    833 	DRM_DEBUG_KMS("\n");
    834 
    835 	if (!use_bios_divs) {
    836 		radeon_compute_pll_legacy(pll, mode->clock,
    837 					  &freq, &feedback_div, &frac_fb_div,
    838 					  &reference_div, &post_divider);
    839 
    840 		for (post_div = &post_divs[0]; post_div->divider; ++post_div) {
    841 			if (post_div->divider == post_divider)
    842 				break;
    843 		}
    844 
    845 		if (!post_div->divider)
    846 			post_div = &post_divs[0];
    847 
    848 		DRM_DEBUG_KMS("dc=%u, fd=%d, rd=%d, pd=%d\n",
    849 			  (unsigned)freq,
    850 			  feedback_div,
    851 			  reference_div,
    852 			  post_divider);
    853 
    854 		pll_ref_div   = reference_div;
    855 #if defined(__powerpc__) && (0) /* TODO */
    856 		/* apparently programming this otherwise causes a hang??? */
    857 		if (info->MacModel == RADEON_MAC_IBOOK)
    858 			pll_fb_post_div = 0x000600ad;
    859 		else
    860 #endif
    861 			pll_fb_post_div     = (feedback_div | (post_div->bitvalue << 16));
    862 
    863 		htotal_cntl    = mode->htotal & 0x7;
    864 
    865 	}
    866 
    867 	pll_gain = radeon_compute_pll_gain(pll->reference_freq,
    868 					   pll_ref_div & 0x3ff,
    869 					   pll_fb_post_div & 0x7ff);
    870 
    871 	if (radeon_crtc->crtc_id) {
    872 		uint32_t pixclks_cntl = ((RREG32_PLL(RADEON_PIXCLKS_CNTL) &
    873 					  ~(RADEON_PIX2CLK_SRC_SEL_MASK)) |
    874 					 RADEON_PIX2CLK_SRC_SEL_P2PLLCLK);
    875 
    876 		if (is_tv) {
    877 			radeon_legacy_tv_adjust_pll2(encoder, &htotal_cntl,
    878 						     &pll_ref_div, &pll_fb_post_div,
    879 						     &pixclks_cntl);
    880 		}
    881 
    882 		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
    883 			     RADEON_PIX2CLK_SRC_SEL_CPUCLK,
    884 			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
    885 
    886 		WREG32_PLL_P(RADEON_P2PLL_CNTL,
    887 			     RADEON_P2PLL_RESET
    888 			     | RADEON_P2PLL_ATOMIC_UPDATE_EN
    889 			     | ((uint32_t)pll_gain << RADEON_P2PLL_PVG_SHIFT),
    890 			     ~(RADEON_P2PLL_RESET
    891 			       | RADEON_P2PLL_ATOMIC_UPDATE_EN
    892 			       | RADEON_P2PLL_PVG_MASK));
    893 
    894 		WREG32_PLL_P(RADEON_P2PLL_REF_DIV,
    895 			     pll_ref_div,
    896 			     ~RADEON_P2PLL_REF_DIV_MASK);
    897 
    898 		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
    899 			     pll_fb_post_div,
    900 			     ~RADEON_P2PLL_FB0_DIV_MASK);
    901 
    902 		WREG32_PLL_P(RADEON_P2PLL_DIV_0,
    903 			     pll_fb_post_div,
    904 			     ~RADEON_P2PLL_POST0_DIV_MASK);
    905 
    906 		radeon_pll2_write_update(dev);
    907 		radeon_pll2_wait_for_read_update_complete(dev);
    908 
    909 		WREG32_PLL(RADEON_HTOTAL2_CNTL, htotal_cntl);
    910 
    911 		WREG32_PLL_P(RADEON_P2PLL_CNTL,
    912 			     0,
    913 			     ~(RADEON_P2PLL_RESET
    914 			       | RADEON_P2PLL_SLEEP
    915 			       | RADEON_P2PLL_ATOMIC_UPDATE_EN));
    916 
    917 		DRM_DEBUG_KMS("Wrote2: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
    918 			  (unsigned)pll_ref_div,
    919 			  (unsigned)pll_fb_post_div,
    920 			  (unsigned)htotal_cntl,
    921 			  RREG32_PLL(RADEON_P2PLL_CNTL));
    922 		DRM_DEBUG_KMS("Wrote2: rd=%u, fd=%u, pd=%u\n",
    923 			  (unsigned)pll_ref_div & RADEON_P2PLL_REF_DIV_MASK,
    924 			  (unsigned)pll_fb_post_div & RADEON_P2PLL_FB0_DIV_MASK,
    925 			  (unsigned)((pll_fb_post_div &
    926 				      RADEON_P2PLL_POST0_DIV_MASK) >> 16));
    927 
    928 		mdelay(50); /* Let the clock to lock */
    929 
    930 		WREG32_PLL_P(RADEON_PIXCLKS_CNTL,
    931 			     RADEON_PIX2CLK_SRC_SEL_P2PLLCLK,
    932 			     ~(RADEON_PIX2CLK_SRC_SEL_MASK));
    933 
    934 		WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
    935 	} else {
    936 		uint32_t pixclks_cntl;
    937 
    938 
    939 		if (is_tv) {
    940 			pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL);
    941 			radeon_legacy_tv_adjust_pll1(encoder, &htotal_cntl, &pll_ref_div,
    942 						     &pll_fb_post_div, &pixclks_cntl);
    943 		}
    944 
    945 		if (rdev->flags & RADEON_IS_MOBILITY) {
    946 			/* A temporal workaround for the occasional blanking on certain laptop panels.
    947 			   This appears to related to the PLL divider registers (fail to lock?).
    948 			   It occurs even when all dividers are the same with their old settings.
    949 			   In this case we really don't need to fiddle with PLL registers.
    950 			   By doing this we can avoid the blanking problem with some panels.
    951 			*/
    952 			if ((pll_ref_div == (RREG32_PLL(RADEON_PPLL_REF_DIV) & RADEON_PPLL_REF_DIV_MASK)) &&
    953 			    (pll_fb_post_div == (RREG32_PLL(RADEON_PPLL_DIV_3) &
    954 						 (RADEON_PPLL_POST3_DIV_MASK | RADEON_PPLL_FB3_DIV_MASK)))) {
    955 				WREG32_P(RADEON_CLOCK_CNTL_INDEX,
    956 					 RADEON_PLL_DIV_SEL,
    957 					 ~(RADEON_PLL_DIV_SEL));
    958 				r100_pll_errata_after_index(rdev);
    959 				return;
    960 			}
    961 		}
    962 
    963 		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
    964 			     RADEON_VCLK_SRC_SEL_CPUCLK,
    965 			     ~(RADEON_VCLK_SRC_SEL_MASK));
    966 		WREG32_PLL_P(RADEON_PPLL_CNTL,
    967 			     RADEON_PPLL_RESET
    968 			     | RADEON_PPLL_ATOMIC_UPDATE_EN
    969 			     | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
    970 			     | ((uint32_t)pll_gain << RADEON_PPLL_PVG_SHIFT),
    971 			     ~(RADEON_PPLL_RESET
    972 			       | RADEON_PPLL_ATOMIC_UPDATE_EN
    973 			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN
    974 			       | RADEON_PPLL_PVG_MASK));
    975 
    976 		WREG32_P(RADEON_CLOCK_CNTL_INDEX,
    977 			 RADEON_PLL_DIV_SEL,
    978 			 ~(RADEON_PLL_DIV_SEL));
    979 		r100_pll_errata_after_index(rdev);
    980 
    981 		if (ASIC_IS_R300(rdev) ||
    982 		    (rdev->family == CHIP_RS300) ||
    983 		    (rdev->family == CHIP_RS400) ||
    984 		    (rdev->family == CHIP_RS480)) {
    985 			if (pll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) {
    986 				/* When restoring console mode, use saved PPLL_REF_DIV
    987 				 * setting.
    988 				 */
    989 				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
    990 					     pll_ref_div,
    991 					     0);
    992 			} else {
    993 				/* R300 uses ref_div_acc field as real ref divider */
    994 				WREG32_PLL_P(RADEON_PPLL_REF_DIV,
    995 					     (pll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT),
    996 					     ~R300_PPLL_REF_DIV_ACC_MASK);
    997 			}
    998 		} else
    999 			WREG32_PLL_P(RADEON_PPLL_REF_DIV,
   1000 				     pll_ref_div,
   1001 				     ~RADEON_PPLL_REF_DIV_MASK);
   1002 
   1003 		WREG32_PLL_P(RADEON_PPLL_DIV_3,
   1004 			     pll_fb_post_div,
   1005 			     ~RADEON_PPLL_FB3_DIV_MASK);
   1006 
   1007 		WREG32_PLL_P(RADEON_PPLL_DIV_3,
   1008 			     pll_fb_post_div,
   1009 			     ~RADEON_PPLL_POST3_DIV_MASK);
   1010 
   1011 		radeon_pll_write_update(dev);
   1012 		radeon_pll_wait_for_read_update_complete(dev);
   1013 
   1014 		WREG32_PLL(RADEON_HTOTAL_CNTL, htotal_cntl);
   1015 
   1016 		WREG32_PLL_P(RADEON_PPLL_CNTL,
   1017 			     0,
   1018 			     ~(RADEON_PPLL_RESET
   1019 			       | RADEON_PPLL_SLEEP
   1020 			       | RADEON_PPLL_ATOMIC_UPDATE_EN
   1021 			       | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN));
   1022 
   1023 		DRM_DEBUG_KMS("Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n",
   1024 			  pll_ref_div,
   1025 			  pll_fb_post_div,
   1026 			  (unsigned)htotal_cntl,
   1027 			  RREG32_PLL(RADEON_PPLL_CNTL));
   1028 		DRM_DEBUG_KMS("Wrote: rd=%d, fd=%d, pd=%d\n",
   1029 			  pll_ref_div & RADEON_PPLL_REF_DIV_MASK,
   1030 			  pll_fb_post_div & RADEON_PPLL_FB3_DIV_MASK,
   1031 			  (pll_fb_post_div & RADEON_PPLL_POST3_DIV_MASK) >> 16);
   1032 
   1033 		mdelay(50); /* Let the clock to lock */
   1034 
   1035 		WREG32_PLL_P(RADEON_VCLK_ECP_CNTL,
   1036 			     RADEON_VCLK_SRC_SEL_PPLLCLK,
   1037 			     ~(RADEON_VCLK_SRC_SEL_MASK));
   1038 
   1039 		if (is_tv)
   1040 			WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl);
   1041 	}
   1042 }
   1043 
   1044 static bool radeon_crtc_mode_fixup(struct drm_crtc *crtc,
   1045 				   const struct drm_display_mode *mode,
   1046 				   struct drm_display_mode *adjusted_mode)
   1047 {
   1048 	if (!radeon_crtc_scaling_mode_fixup(crtc, mode, adjusted_mode))
   1049 		return false;
   1050 	return true;
   1051 }
   1052 
   1053 static int radeon_crtc_mode_set(struct drm_crtc *crtc,
   1054 				 struct drm_display_mode *mode,
   1055 				 struct drm_display_mode *adjusted_mode,
   1056 				 int x, int y, struct drm_framebuffer *old_fb)
   1057 {
   1058 	struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);
   1059 
   1060 	/* TODO TV */
   1061 	radeon_crtc_set_base(crtc, x, y, old_fb);
   1062 	radeon_set_crtc_timing(crtc, adjusted_mode);
   1063 	radeon_set_pll(crtc, adjusted_mode);
   1064 	radeon_overscan_setup(crtc, adjusted_mode);
   1065 	if (radeon_crtc->crtc_id == 0) {
   1066 		radeon_legacy_rmx_mode_set(crtc, adjusted_mode);
   1067 	} else {
   1068 		if (radeon_crtc->rmx_type != RMX_OFF) {
   1069 			/* FIXME: only first crtc has rmx what should we
   1070 			 * do ?
   1071 			 */
   1072 			DRM_ERROR("Mode need scaling but only first crtc can do that.\n");
   1073 		}
   1074 	}
   1075 	radeon_cursor_reset(crtc);
   1076 	return 0;
   1077 }
   1078 
   1079 static void radeon_crtc_prepare(struct drm_crtc *crtc)
   1080 {
   1081 	struct drm_device *dev = crtc->dev;
   1082 	struct drm_crtc *crtci;
   1083 
   1084 	/*
   1085 	* The hardware wedges sometimes if you reconfigure one CRTC
   1086 	* whilst another is running (see fdo bug #24611).
   1087 	*/
   1088 	list_for_each_entry(crtci, &dev->mode_config.crtc_list, head)
   1089 		radeon_crtc_dpms(crtci, DRM_MODE_DPMS_OFF);
   1090 }
   1091 
   1092 static void radeon_crtc_commit(struct drm_crtc *crtc)
   1093 {
   1094 	struct drm_device *dev = crtc->dev;
   1095 	struct drm_crtc *crtci;
   1096 
   1097 	/*
   1098 	* Reenable the CRTCs that should be running.
   1099 	*/
   1100 	list_for_each_entry(crtci, &dev->mode_config.crtc_list, head) {
   1101 		if (crtci->enabled)
   1102 			radeon_crtc_dpms(crtci, DRM_MODE_DPMS_ON);
   1103 	}
   1104 }
   1105 
   1106 static void radeon_crtc_disable(struct drm_crtc *crtc)
   1107 {
   1108 	radeon_crtc_dpms(crtc, DRM_MODE_DPMS_OFF);
   1109 	if (crtc->primary->fb) {
   1110 		int r;
   1111 		struct radeon_framebuffer *radeon_fb;
   1112 		struct radeon_bo *rbo;
   1113 
   1114 		radeon_fb = to_radeon_framebuffer(crtc->primary->fb);
   1115 		rbo = gem_to_radeon_bo(radeon_fb->obj);
   1116 		r = radeon_bo_reserve(rbo, false);
   1117 		if (unlikely(r))
   1118 			DRM_ERROR("failed to reserve rbo before unpin\n");
   1119 		else {
   1120 			radeon_bo_unpin(rbo);
   1121 			radeon_bo_unreserve(rbo);
   1122 		}
   1123 	}
   1124 }
   1125 
   1126 static const struct drm_crtc_helper_funcs legacy_helper_funcs = {
   1127 	.dpms = radeon_crtc_dpms,
   1128 	.mode_fixup = radeon_crtc_mode_fixup,
   1129 	.mode_set = radeon_crtc_mode_set,
   1130 	.mode_set_base = radeon_crtc_set_base,
   1131 	.mode_set_base_atomic = radeon_crtc_set_base_atomic,
   1132 	.prepare = radeon_crtc_prepare,
   1133 	.commit = radeon_crtc_commit,
   1134 	.load_lut = radeon_crtc_load_lut,
   1135 	.disable = radeon_crtc_disable
   1136 };
   1137 
   1138 
   1139 void radeon_legacy_init_crtc(struct drm_device *dev,
   1140 			       struct radeon_crtc *radeon_crtc)
   1141 {
   1142 	if (radeon_crtc->crtc_id == 1)
   1143 		radeon_crtc->crtc_offset = RADEON_CRTC2_H_TOTAL_DISP - RADEON_CRTC_H_TOTAL_DISP;
   1144 	drm_crtc_helper_add(&radeon_crtc->base, &legacy_helper_funcs);
   1145 }
   1146