legacy_crtc.c revision 51b40f85
1/* 2 * Copyright 2000 ATI Technologies Inc., Markham, Ontario, and 3 * VA Linux Systems Inc., Fremont, California. 4 * 5 * All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining 8 * a copy of this software and associated documentation files (the 9 * "Software"), to deal in the Software without restriction, including 10 * without limitation on the rights to use, copy, modify, merge, 11 * publish, distribute, sublicense, and/or sell copies of the Software, 12 * and to permit persons to whom the Software is furnished to do so, 13 * subject to the following conditions: 14 * 15 * The above copyright notice and this permission notice (including the 16 * next paragraph) shall be included in all copies or substantial 17 * portions of the Software. 18 * 19 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 20 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 21 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 22 * NON-INFRINGEMENT. IN NO EVENT SHALL ATI, VA LINUX SYSTEMS AND/OR 23 * THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 24 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 25 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26 * DEALINGS IN THE SOFTWARE. 27 */ 28 29#ifdef HAVE_CONFIG_H 30#include "config.h" 31#endif 32 33#include <string.h> 34#include <stdio.h> 35 36/* X and server generic header files */ 37#include "xf86.h" 38#include "xf86_OSproc.h" 39#include "vgaHW.h" 40#include "xf86Modes.h" 41 42/* Driver data structures */ 43#include "radeon.h" 44#include "radeon_reg.h" 45#include "radeon_macros.h" 46#include "radeon_probe.h" 47#include "radeon_version.h" 48#include "radeon_atombios.h" 49 50#ifdef XF86DRI 51#define _XF86DRI_SERVER_ 52#include "radeon_drm.h" 53#include "sarea.h" 54#ifdef DRM_IOCTL_MODESET_CTL 55#include <sys/ioctl.h> 56#endif 57#endif 58 59/* Write common registers */ 60void 61RADEONRestoreCommonRegisters(ScrnInfoPtr pScrn, 62 RADEONSavePtr restore) 63{ 64 RADEONInfoPtr info = RADEONPTR(pScrn); 65 RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); 66 unsigned char *RADEONMMIO = info->MMIO; 67 68 if (info->IsSecondary) 69 return; 70 71 OUTREG(RADEON_OVR_CLR, restore->ovr_clr); 72 OUTREG(RADEON_OVR_WID_LEFT_RIGHT, restore->ovr_wid_left_right); 73 OUTREG(RADEON_OVR_WID_TOP_BOTTOM, restore->ovr_wid_top_bottom); 74 OUTREG(RADEON_OV0_SCALE_CNTL, restore->ov0_scale_cntl); 75 OUTREG(RADEON_SUBPIC_CNTL, restore->subpic_cntl); 76 OUTREG(RADEON_VIPH_CONTROL, restore->viph_control); 77 OUTREG(RADEON_I2C_CNTL_1, restore->i2c_cntl_1); 78 OUTREG(RADEON_GEN_INT_CNTL, restore->gen_int_cntl); 79 OUTREG(RADEON_CAP0_TRIG_CNTL, restore->cap0_trig_cntl); 80 OUTREG(RADEON_CAP1_TRIG_CNTL, restore->cap1_trig_cntl); 81 OUTREG(RADEON_BUS_CNTL, restore->bus_cntl); 82 OUTREG(RADEON_SURFACE_CNTL, restore->surface_cntl); 83 84 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 85 (info->ChipFamily == CHIP_FAMILY_RS480)) { 86 OUTREG(RS400_DISP2_REQ_CNTL1, restore->disp2_req_cntl1); 87 OUTREG(RS400_DISP2_REQ_CNTL2, restore->disp2_req_cntl2); 88 OUTREG(RS400_DMIF_MEM_CNTL1, restore->dmif_mem_cntl1); 89 OUTREG(RS400_DISP1_REQ_CNTL1, restore->disp1_req_cntl1); 90 } 91 92 /* Workaround for the VT switching problem in dual-head mode. This 93 * problem only occurs on RV style chips, typically when a FP and 94 * CRT are connected. 95 */ 96 if (pRADEONEnt->HasCRTC2 && 97 info->ChipFamily != CHIP_FAMILY_R200 && 98 !IS_R300_VARIANT) { 99 uint32_t tmp; 100 101 tmp = INREG(RADEON_DAC_CNTL2); 102 OUTREG(RADEON_DAC_CNTL2, tmp & ~RADEON_DAC2_DAC_CLK_SEL); 103 usleep(100000); 104 } 105} 106 107void 108RADEONRestoreCrtcBase(ScrnInfoPtr pScrn, 109 RADEONSavePtr restore) 110{ 111 RADEONInfoPtr info = RADEONPTR(pScrn); 112 unsigned char *RADEONMMIO = info->MMIO; 113 114 if (IS_R300_VARIANT) 115 OUTREG(R300_CRTC_TILE_X0_Y0, restore->crtc_tile_x0_y0); 116 OUTREG(RADEON_CRTC_OFFSET_CNTL, restore->crtc_offset_cntl); 117 OUTREG(RADEON_CRTC_OFFSET, restore->crtc_offset); 118} 119 120void 121RADEONRestoreCrtc2Base(ScrnInfoPtr pScrn, 122 RADEONSavePtr restore) 123{ 124 RADEONInfoPtr info = RADEONPTR(pScrn); 125 unsigned char *RADEONMMIO = info->MMIO; 126 127 if (IS_R300_VARIANT) 128 OUTREG(R300_CRTC2_TILE_X0_Y0, restore->crtc2_tile_x0_y0); 129 OUTREG(RADEON_CRTC2_OFFSET_CNTL, restore->crtc2_offset_cntl); 130 OUTREG(RADEON_CRTC2_OFFSET, restore->crtc2_offset); 131} 132 133/* Write CRTC registers */ 134void 135RADEONRestoreCrtcRegisters(ScrnInfoPtr pScrn, 136 RADEONSavePtr restore) 137{ 138 RADEONInfoPtr info = RADEONPTR(pScrn); 139 unsigned char *RADEONMMIO = info->MMIO; 140 141 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 142 "Programming CRTC1, offset: 0x%08x\n", 143 (unsigned)restore->crtc_offset); 144 145 /* We prevent the CRTC from hitting the memory controller until 146 * fully programmed 147 */ 148 OUTREG(RADEON_CRTC_GEN_CNTL, restore->crtc_gen_cntl | 149 RADEON_CRTC_DISP_REQ_EN_B); 150 151 OUTREGP(RADEON_CRTC_EXT_CNTL, 152 restore->crtc_ext_cntl, 153 RADEON_CRTC_VSYNC_DIS | 154 RADEON_CRTC_HSYNC_DIS | 155 RADEON_CRTC_DISPLAY_DIS); 156 157 OUTREG(RADEON_CRTC_H_TOTAL_DISP, restore->crtc_h_total_disp); 158 OUTREG(RADEON_CRTC_H_SYNC_STRT_WID, restore->crtc_h_sync_strt_wid); 159 OUTREG(RADEON_CRTC_V_TOTAL_DISP, restore->crtc_v_total_disp); 160 OUTREG(RADEON_CRTC_V_SYNC_STRT_WID, restore->crtc_v_sync_strt_wid); 161 162 RADEONRestoreCrtcBase(pScrn, restore); 163 164 OUTREG(RADEON_CRTC_PITCH, restore->crtc_pitch); 165 OUTREG(RADEON_DISP_MERGE_CNTL, restore->disp_merge_cntl); 166 167 if (info->IsDellServer) { 168 OUTREG(RADEON_TV_DAC_CNTL, restore->tv_dac_cntl); 169 OUTREG(RADEON_DISP_HW_DEBUG, restore->disp_hw_debug); 170 OUTREG(RADEON_DAC_CNTL2, restore->dac2_cntl); 171 OUTREG(RADEON_CRTC2_GEN_CNTL, restore->crtc2_gen_cntl); 172 } 173 174 OUTREG(RADEON_CRTC_GEN_CNTL, restore->crtc_gen_cntl); 175} 176 177/* Write CRTC2 registers */ 178void 179RADEONRestoreCrtc2Registers(ScrnInfoPtr pScrn, 180 RADEONSavePtr restore) 181{ 182 RADEONInfoPtr info = RADEONPTR(pScrn); 183 unsigned char *RADEONMMIO = info->MMIO; 184 /* uint32_t crtc2_gen_cntl;*/ 185 186 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 187 "Programming CRTC2, offset: 0x%08x\n", 188 (unsigned)restore->crtc2_offset); 189 190 /* We prevent the CRTC from hitting the memory controller until 191 * fully programmed 192 */ 193 OUTREG(RADEON_CRTC2_GEN_CNTL, 194 restore->crtc2_gen_cntl | RADEON_CRTC2_VSYNC_DIS | 195 RADEON_CRTC2_HSYNC_DIS | RADEON_CRTC2_DISP_DIS | 196 RADEON_CRTC2_DISP_REQ_EN_B); 197 198 OUTREG(RADEON_CRTC2_H_TOTAL_DISP, restore->crtc2_h_total_disp); 199 OUTREG(RADEON_CRTC2_H_SYNC_STRT_WID, restore->crtc2_h_sync_strt_wid); 200 OUTREG(RADEON_CRTC2_V_TOTAL_DISP, restore->crtc2_v_total_disp); 201 OUTREG(RADEON_CRTC2_V_SYNC_STRT_WID, restore->crtc2_v_sync_strt_wid); 202 203 OUTREG(RADEON_FP_H2_SYNC_STRT_WID, restore->fp_h2_sync_strt_wid); 204 OUTREG(RADEON_FP_V2_SYNC_STRT_WID, restore->fp_v2_sync_strt_wid); 205 206 RADEONRestoreCrtc2Base(pScrn, restore); 207 208 OUTREG(RADEON_CRTC2_PITCH, restore->crtc2_pitch); 209 OUTREG(RADEON_DISP2_MERGE_CNTL, restore->disp2_merge_cntl); 210 211 OUTREG(RADEON_CRTC2_GEN_CNTL, restore->crtc2_gen_cntl); 212 213} 214 215static void 216RADEONPLLWaitForReadUpdateComplete(ScrnInfoPtr pScrn) 217{ 218 int i = 0; 219 220 /* FIXME: Certain revisions of R300 can't recover here. Not sure of 221 the cause yet, but this workaround will mask the problem for now. 222 Other chips usually will pass at the very first test, so the 223 workaround shouldn't have any effect on them. */ 224 for (i = 0; 225 (i < 10000 && 226 INPLL(pScrn, RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R); 227 i++); 228} 229 230static void 231RADEONPLLWriteUpdate(ScrnInfoPtr pScrn) 232{ 233 while (INPLL(pScrn, RADEON_PPLL_REF_DIV) & RADEON_PPLL_ATOMIC_UPDATE_R); 234 235 OUTPLLP(pScrn, RADEON_PPLL_REF_DIV, 236 RADEON_PPLL_ATOMIC_UPDATE_W, 237 ~(RADEON_PPLL_ATOMIC_UPDATE_W)); 238} 239 240static void 241RADEONPLL2WaitForReadUpdateComplete(ScrnInfoPtr pScrn) 242{ 243 int i = 0; 244 245 /* FIXME: Certain revisions of R300 can't recover here. Not sure of 246 the cause yet, but this workaround will mask the problem for now. 247 Other chips usually will pass at the very first test, so the 248 workaround shouldn't have any effect on them. */ 249 for (i = 0; 250 (i < 10000 && 251 INPLL(pScrn, RADEON_P2PLL_REF_DIV) & RADEON_P2PLL_ATOMIC_UPDATE_R); 252 i++); 253} 254 255static void 256RADEONPLL2WriteUpdate(ScrnInfoPtr pScrn) 257{ 258 while (INPLL(pScrn, RADEON_P2PLL_REF_DIV) & RADEON_P2PLL_ATOMIC_UPDATE_R); 259 260 OUTPLLP(pScrn, RADEON_P2PLL_REF_DIV, 261 RADEON_P2PLL_ATOMIC_UPDATE_W, 262 ~(RADEON_P2PLL_ATOMIC_UPDATE_W)); 263} 264 265static uint8_t 266RADEONComputePLLGain(uint16_t reference_freq, uint16_t ref_div, 267 uint16_t fb_div) 268{ 269 unsigned vcoFreq; 270 271 if (!ref_div) 272 return 1; 273 274 vcoFreq = ((unsigned)reference_freq * fb_div) / ref_div; 275 276 /* 277 * This is horribly crude: the VCO frequency range is divided into 278 * 3 parts, each part having a fixed PLL gain value. 279 */ 280 if (vcoFreq >= 30000) 281 /* 282 * [300..max] MHz : 7 283 */ 284 return 7; 285 else if (vcoFreq >= 18000) 286 /* 287 * [180..300) MHz : 4 288 */ 289 return 4; 290 else 291 /* 292 * [0..180) MHz : 1 293 */ 294 return 1; 295} 296 297/* Write PLL registers */ 298void 299RADEONRestorePLLRegisters(ScrnInfoPtr pScrn, 300 RADEONSavePtr restore) 301{ 302 RADEONInfoPtr info = RADEONPTR(pScrn); 303 unsigned char *RADEONMMIO = info->MMIO; 304 uint8_t pllGain; 305 306#if defined(__powerpc__) 307 /* apparently restoring the pll causes a hang??? */ 308 if ((info->MacModel == RADEON_MAC_IBOOK) || 309 (info->MacModel == RADEON_MAC_MINI_INTERNAL)) 310 return; 311#endif 312 313 pllGain = RADEONComputePLLGain(info->pll.reference_freq, 314 restore->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK, 315 restore->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK); 316 317 if (info->IsMobility) { 318 /* A temporal workaround for the occational blanking on certain laptop panels. 319 This appears to related to the PLL divider registers (fail to lock?). 320 It occurs even when all dividers are the same with their old settings. 321 In this case we really don't need to fiddle with PLL registers. 322 By doing this we can avoid the blanking problem with some panels. 323 */ 324 if ((restore->ppll_ref_div == (INPLL(pScrn, RADEON_PPLL_REF_DIV) & RADEON_PPLL_REF_DIV_MASK)) && 325 (restore->ppll_div_3 == (INPLL(pScrn, RADEON_PPLL_DIV_3) & 326 (RADEON_PPLL_POST3_DIV_MASK | RADEON_PPLL_FB3_DIV_MASK)))) { 327 OUTREGP(RADEON_CLOCK_CNTL_INDEX, 328 RADEON_PLL_DIV_SEL, 329 ~(RADEON_PLL_DIV_SEL)); 330 RADEONPllErrataAfterIndex(info); 331 return; 332 } 333 } 334 335 OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL, 336 RADEON_VCLK_SRC_SEL_CPUCLK, 337 ~(RADEON_VCLK_SRC_SEL_MASK)); 338 339 OUTPLLP(pScrn, 340 RADEON_PPLL_CNTL, 341 RADEON_PPLL_RESET 342 | RADEON_PPLL_ATOMIC_UPDATE_EN 343 | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN 344 | ((uint32_t)pllGain << RADEON_PPLL_PVG_SHIFT), 345 ~(RADEON_PPLL_RESET 346 | RADEON_PPLL_ATOMIC_UPDATE_EN 347 | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN 348 | RADEON_PPLL_PVG_MASK)); 349 350 OUTREGP(RADEON_CLOCK_CNTL_INDEX, 351 RADEON_PLL_DIV_SEL, 352 ~(RADEON_PLL_DIV_SEL)); 353 RADEONPllErrataAfterIndex(info); 354 355 if (IS_R300_VARIANT || 356 (info->ChipFamily == CHIP_FAMILY_RS300) || 357 (info->ChipFamily == CHIP_FAMILY_RS400) || 358 (info->ChipFamily == CHIP_FAMILY_RS480)) { 359 if (restore->ppll_ref_div & R300_PPLL_REF_DIV_ACC_MASK) { 360 /* When restoring console mode, use saved PPLL_REF_DIV 361 * setting. 362 */ 363 OUTPLLP(pScrn, RADEON_PPLL_REF_DIV, 364 restore->ppll_ref_div, 365 0); 366 } else { 367 /* R300 uses ref_div_acc field as real ref divider */ 368 OUTPLLP(pScrn, RADEON_PPLL_REF_DIV, 369 (restore->ppll_ref_div << R300_PPLL_REF_DIV_ACC_SHIFT), 370 ~R300_PPLL_REF_DIV_ACC_MASK); 371 } 372 } else { 373 OUTPLLP(pScrn, RADEON_PPLL_REF_DIV, 374 restore->ppll_ref_div, 375 ~RADEON_PPLL_REF_DIV_MASK); 376 } 377 378 OUTPLLP(pScrn, RADEON_PPLL_DIV_3, 379 restore->ppll_div_3, 380 ~RADEON_PPLL_FB3_DIV_MASK); 381 382 OUTPLLP(pScrn, RADEON_PPLL_DIV_3, 383 restore->ppll_div_3, 384 ~RADEON_PPLL_POST3_DIV_MASK); 385 386 RADEONPLLWriteUpdate(pScrn); 387 RADEONPLLWaitForReadUpdateComplete(pScrn); 388 389 OUTPLL(pScrn, RADEON_HTOTAL_CNTL, restore->htotal_cntl); 390 391 OUTPLLP(pScrn, RADEON_PPLL_CNTL, 392 0, 393 ~(RADEON_PPLL_RESET 394 | RADEON_PPLL_SLEEP 395 | RADEON_PPLL_ATOMIC_UPDATE_EN 396 | RADEON_PPLL_VGA_ATOMIC_UPDATE_EN)); 397 398 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 399 "Wrote: 0x%08x 0x%08x 0x%08x (0x%08x)\n", 400 restore->ppll_ref_div, 401 restore->ppll_div_3, 402 (unsigned)restore->htotal_cntl, 403 INPLL(pScrn, RADEON_PPLL_CNTL)); 404 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 405 "Wrote: rd=%d, fd=%d, pd=%d\n", 406 restore->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK, 407 restore->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK, 408 (restore->ppll_div_3 & RADEON_PPLL_POST3_DIV_MASK) >> 16); 409 410 usleep(50000); /* Let the clock to lock */ 411 412 OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL, 413 RADEON_VCLK_SRC_SEL_PPLLCLK, 414 ~(RADEON_VCLK_SRC_SEL_MASK)); 415 416 /*OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, restore->vclk_ecp_cntl);*/ 417 418 ErrorF("finished PLL1\n"); 419 420} 421 422/* Write PLL2 registers */ 423void 424RADEONRestorePLL2Registers(ScrnInfoPtr pScrn, 425 RADEONSavePtr restore) 426{ 427 RADEONInfoPtr info = RADEONPTR(pScrn); 428 uint8_t pllGain; 429 430 pllGain = RADEONComputePLLGain(info->pll.reference_freq, 431 restore->p2pll_ref_div & RADEON_P2PLL_REF_DIV_MASK, 432 restore->p2pll_div_0 & RADEON_P2PLL_FB0_DIV_MASK); 433 434 435 OUTPLLP(pScrn, RADEON_PIXCLKS_CNTL, 436 RADEON_PIX2CLK_SRC_SEL_CPUCLK, 437 ~(RADEON_PIX2CLK_SRC_SEL_MASK)); 438 439 OUTPLLP(pScrn, 440 RADEON_P2PLL_CNTL, 441 RADEON_P2PLL_RESET 442 | RADEON_P2PLL_ATOMIC_UPDATE_EN 443 | ((uint32_t)pllGain << RADEON_P2PLL_PVG_SHIFT), 444 ~(RADEON_P2PLL_RESET 445 | RADEON_P2PLL_ATOMIC_UPDATE_EN 446 | RADEON_P2PLL_PVG_MASK)); 447 448 449 OUTPLLP(pScrn, RADEON_P2PLL_REF_DIV, 450 restore->p2pll_ref_div, 451 ~RADEON_P2PLL_REF_DIV_MASK); 452 453 OUTPLLP(pScrn, RADEON_P2PLL_DIV_0, 454 restore->p2pll_div_0, 455 ~RADEON_P2PLL_FB0_DIV_MASK); 456 457 OUTPLLP(pScrn, RADEON_P2PLL_DIV_0, 458 restore->p2pll_div_0, 459 ~RADEON_P2PLL_POST0_DIV_MASK); 460 461 RADEONPLL2WriteUpdate(pScrn); 462 RADEONPLL2WaitForReadUpdateComplete(pScrn); 463 464 OUTPLL(pScrn, RADEON_HTOTAL2_CNTL, restore->htotal_cntl2); 465 466 OUTPLLP(pScrn, RADEON_P2PLL_CNTL, 467 0, 468 ~(RADEON_P2PLL_RESET 469 | RADEON_P2PLL_SLEEP 470 | RADEON_P2PLL_ATOMIC_UPDATE_EN)); 471 472 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 473 "Wrote2: 0x%08x 0x%08x 0x%08x (0x%08x)\n", 474 (unsigned)restore->p2pll_ref_div, 475 (unsigned)restore->p2pll_div_0, 476 (unsigned)restore->htotal_cntl2, 477 INPLL(pScrn, RADEON_P2PLL_CNTL)); 478 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 479 "Wrote2: rd=%u, fd=%u, pd=%u\n", 480 (unsigned)restore->p2pll_ref_div & RADEON_P2PLL_REF_DIV_MASK, 481 (unsigned)restore->p2pll_div_0 & RADEON_P2PLL_FB0_DIV_MASK, 482 (unsigned)((restore->p2pll_div_0 & 483 RADEON_P2PLL_POST0_DIV_MASK) >>16)); 484 485 usleep(5000); /* Let the clock to lock */ 486 487 OUTPLLP(pScrn, RADEON_PIXCLKS_CNTL, 488 RADEON_PIX2CLK_SRC_SEL_P2PLLCLK, 489 ~(RADEON_PIX2CLK_SRC_SEL_MASK)); 490 491 OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, restore->pixclks_cntl); 492 493 ErrorF("finished PLL2\n"); 494 495} 496 497/* Read common registers */ 498void 499RADEONSaveCommonRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) 500{ 501 RADEONInfoPtr info = RADEONPTR(pScrn); 502 unsigned char *RADEONMMIO = info->MMIO; 503 504 save->ovr_clr = INREG(RADEON_OVR_CLR); 505 save->ovr_wid_left_right = INREG(RADEON_OVR_WID_LEFT_RIGHT); 506 save->ovr_wid_top_bottom = INREG(RADEON_OVR_WID_TOP_BOTTOM); 507 save->ov0_scale_cntl = INREG(RADEON_OV0_SCALE_CNTL); 508 save->subpic_cntl = INREG(RADEON_SUBPIC_CNTL); 509 save->viph_control = INREG(RADEON_VIPH_CONTROL); 510 save->i2c_cntl_1 = INREG(RADEON_I2C_CNTL_1); 511 save->gen_int_cntl = INREG(RADEON_GEN_INT_CNTL); 512 save->cap0_trig_cntl = INREG(RADEON_CAP0_TRIG_CNTL); 513 save->cap1_trig_cntl = INREG(RADEON_CAP1_TRIG_CNTL); 514 save->bus_cntl = INREG(RADEON_BUS_CNTL); 515 save->surface_cntl = INREG(RADEON_SURFACE_CNTL); 516 save->grph_buffer_cntl = INREG(RADEON_GRPH_BUFFER_CNTL); 517 save->grph2_buffer_cntl = INREG(RADEON_GRPH2_BUFFER_CNTL); 518 519 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 520 (info->ChipFamily == CHIP_FAMILY_RS480)) { 521 save->disp2_req_cntl1 = INREG(RS400_DISP2_REQ_CNTL1); 522 save->disp2_req_cntl2 = INREG(RS400_DISP2_REQ_CNTL2); 523 save->dmif_mem_cntl1 = INREG(RS400_DMIF_MEM_CNTL1); 524 save->disp1_req_cntl1 = INREG(RS400_DISP1_REQ_CNTL1); 525 } 526} 527 528/* Read CRTC registers */ 529void 530RADEONSaveCrtcRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) 531{ 532 RADEONInfoPtr info = RADEONPTR(pScrn); 533 unsigned char *RADEONMMIO = info->MMIO; 534 535 save->crtc_gen_cntl = INREG(RADEON_CRTC_GEN_CNTL); 536 save->crtc_ext_cntl = INREG(RADEON_CRTC_EXT_CNTL); 537 save->crtc_h_total_disp = INREG(RADEON_CRTC_H_TOTAL_DISP); 538 save->crtc_h_sync_strt_wid = INREG(RADEON_CRTC_H_SYNC_STRT_WID); 539 save->crtc_v_total_disp = INREG(RADEON_CRTC_V_TOTAL_DISP); 540 save->crtc_v_sync_strt_wid = INREG(RADEON_CRTC_V_SYNC_STRT_WID); 541 542 save->crtc_offset = INREG(RADEON_CRTC_OFFSET); 543 save->crtc_offset_cntl = INREG(RADEON_CRTC_OFFSET_CNTL); 544 save->crtc_pitch = INREG(RADEON_CRTC_PITCH); 545 save->disp_merge_cntl = INREG(RADEON_DISP_MERGE_CNTL); 546 547 if (IS_R300_VARIANT) 548 save->crtc_tile_x0_y0 = INREG(R300_CRTC_TILE_X0_Y0); 549 550 if (info->IsDellServer) { 551 save->tv_dac_cntl = INREG(RADEON_TV_DAC_CNTL); 552 save->dac2_cntl = INREG(RADEON_DAC_CNTL2); 553 save->disp_hw_debug = INREG (RADEON_DISP_HW_DEBUG); 554 save->crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL); 555 } 556 557 /* track if the crtc is enabled for text restore */ 558 if (save->crtc_ext_cntl & RADEON_CRTC_DISPLAY_DIS) 559 info->crtc_on = FALSE; 560 else 561 info->crtc_on = TRUE; 562 563} 564 565/* Read CRTC2 registers */ 566void 567RADEONSaveCrtc2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save) 568{ 569 RADEONInfoPtr info = RADEONPTR(pScrn); 570 unsigned char *RADEONMMIO = info->MMIO; 571 572 save->crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL); 573 save->crtc2_h_total_disp = INREG(RADEON_CRTC2_H_TOTAL_DISP); 574 save->crtc2_h_sync_strt_wid = INREG(RADEON_CRTC2_H_SYNC_STRT_WID); 575 save->crtc2_v_total_disp = INREG(RADEON_CRTC2_V_TOTAL_DISP); 576 save->crtc2_v_sync_strt_wid = INREG(RADEON_CRTC2_V_SYNC_STRT_WID); 577 578 save->crtc2_offset = INREG(RADEON_CRTC2_OFFSET); 579 save->crtc2_offset_cntl = INREG(RADEON_CRTC2_OFFSET_CNTL); 580 save->crtc2_pitch = INREG(RADEON_CRTC2_PITCH); 581 582 if (IS_R300_VARIANT) 583 save->crtc2_tile_x0_y0 = INREG(R300_CRTC2_TILE_X0_Y0); 584 585 save->fp_h2_sync_strt_wid = INREG (RADEON_FP_H2_SYNC_STRT_WID); 586 save->fp_v2_sync_strt_wid = INREG (RADEON_FP_V2_SYNC_STRT_WID); 587 588 save->disp2_merge_cntl = INREG(RADEON_DISP2_MERGE_CNTL); 589 590 /* track if the crtc is enabled for text restore */ 591 if (save->crtc2_gen_cntl & RADEON_CRTC2_DISP_DIS) 592 info->crtc2_on = FALSE; 593 else 594 info->crtc2_on = TRUE; 595 596} 597 598/* Read PLL registers */ 599void 600RADEONSavePLLRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) 601{ 602 save->ppll_ref_div = INPLL(pScrn, RADEON_PPLL_REF_DIV); 603 save->ppll_div_3 = INPLL(pScrn, RADEON_PPLL_DIV_3); 604 save->htotal_cntl = INPLL(pScrn, RADEON_HTOTAL_CNTL); 605 save->vclk_ecp_cntl = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); 606 607 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 608 "Read: 0x%08x 0x%08x 0x%08x\n", 609 save->ppll_ref_div, 610 save->ppll_div_3, 611 (unsigned)save->htotal_cntl); 612 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 613 "Read: rd=%d, fd=%d, pd=%d\n", 614 save->ppll_ref_div & RADEON_PPLL_REF_DIV_MASK, 615 save->ppll_div_3 & RADEON_PPLL_FB3_DIV_MASK, 616 (save->ppll_div_3 & RADEON_PPLL_POST3_DIV_MASK) >> 16); 617} 618 619/* Read PLL registers */ 620void 621RADEONSavePLL2Registers(ScrnInfoPtr pScrn, RADEONSavePtr save) 622{ 623 save->p2pll_ref_div = INPLL(pScrn, RADEON_P2PLL_REF_DIV); 624 save->p2pll_div_0 = INPLL(pScrn, RADEON_P2PLL_DIV_0); 625 save->htotal_cntl2 = INPLL(pScrn, RADEON_HTOTAL2_CNTL); 626 save->pixclks_cntl = INPLL(pScrn, RADEON_PIXCLKS_CNTL); 627 628 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 629 "Read: 0x%08x 0x%08x 0x%08x\n", 630 (unsigned)save->p2pll_ref_div, 631 (unsigned)save->p2pll_div_0, 632 (unsigned)save->htotal_cntl2); 633 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 634 "Read: rd=%u, fd=%u, pd=%u\n", 635 (unsigned)(save->p2pll_ref_div & RADEON_P2PLL_REF_DIV_MASK), 636 (unsigned)(save->p2pll_div_0 & RADEON_P2PLL_FB0_DIV_MASK), 637 (unsigned)((save->p2pll_div_0 & RADEON_P2PLL_POST0_DIV_MASK) 638 >> 16)); 639} 640 641void 642radeon_crtc_modeset_ioctl(xf86CrtcPtr crtc, Bool post) 643{ 644#if defined(XF86DRI) && defined(DRM_IOCTL_MODESET_CTL) 645 RADEONInfoPtr info = RADEONPTR(crtc->scrn); 646 RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; 647 struct drm_modeset_ctl modeset; 648 unsigned char *RADEONMMIO = info->MMIO; 649 650 if (!info->directRenderingEnabled) 651 return; 652 653 if (info->ChipFamily >= CHIP_FAMILY_R600) 654 return; 655 656 modeset.crtc = radeon_crtc->crtc_id; 657 modeset.cmd = post ? _DRM_POST_MODESET : _DRM_PRE_MODESET; 658 659 ioctl(info->dri->drmFD, DRM_IOCTL_MODESET_CTL, &modeset); 660 661 info->ModeReg->gen_int_cntl = INREG( RADEON_GEN_INT_CNTL ); 662#endif 663} 664 665void 666legacy_crtc_dpms(xf86CrtcPtr crtc, int mode) 667{ 668 uint32_t mask; 669 RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; 670 RADEONEntPtr pRADEONEnt = RADEONEntPriv(crtc->scrn); 671 unsigned char *RADEONMMIO = pRADEONEnt->MMIO; 672 673 if (radeon_crtc->crtc_id) 674 mask = (RADEON_CRTC2_DISP_DIS | 675 RADEON_CRTC2_VSYNC_DIS | 676 RADEON_CRTC2_HSYNC_DIS | 677 RADEON_CRTC2_DISP_REQ_EN_B); 678 else 679 mask = (RADEON_CRTC_DISPLAY_DIS | 680 RADEON_CRTC_HSYNC_DIS | 681 RADEON_CRTC_VSYNC_DIS); 682 683 switch(mode) { 684 case DPMSModeOn: 685 if (radeon_crtc->crtc_id) { 686 OUTREGP(RADEON_CRTC2_GEN_CNTL, RADEON_CRTC2_EN, ~(RADEON_CRTC2_EN | mask)); 687 } else { 688 OUTREGP(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_EN, ~(RADEON_CRTC_EN | RADEON_CRTC_DISP_REQ_EN_B)); 689 OUTREGP(RADEON_CRTC_EXT_CNTL, 0, ~mask); 690 } 691 break; 692 case DPMSModeStandby: 693 case DPMSModeSuspend: 694 case DPMSModeOff: 695 if (radeon_crtc->crtc_id) { 696 OUTREGP(RADEON_CRTC2_GEN_CNTL, mask, ~(RADEON_CRTC2_EN | mask)); 697 } else { 698 OUTREGP(RADEON_CRTC_GEN_CNTL, RADEON_CRTC_DISP_REQ_EN_B, ~(RADEON_CRTC_EN | RADEON_CRTC_DISP_REQ_EN_B)); 699 OUTREGP(RADEON_CRTC_EXT_CNTL, mask, ~mask); 700 } 701 break; 702 } 703} 704 705 706/* Define common registers for requested video mode */ 707void 708RADEONInitCommonRegisters(RADEONSavePtr save, RADEONInfoPtr info) 709{ 710 save->ovr_clr = 0; 711 save->ovr_wid_left_right = 0; 712 save->ovr_wid_top_bottom = 0; 713 save->ov0_scale_cntl = 0; 714 save->subpic_cntl = 0; 715 save->viph_control = 0; 716 save->i2c_cntl_1 = 0; 717 save->rbbm_soft_reset = 0; 718 save->cap0_trig_cntl = 0; 719 save->cap1_trig_cntl = 0; 720 save->bus_cntl = info->BusCntl; 721 722 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 723 (info->ChipFamily == CHIP_FAMILY_RS480)) { 724 save->disp2_req_cntl1 = info->SavedReg->disp2_req_cntl1; 725 save->disp2_req_cntl2 = info->SavedReg->disp2_req_cntl2; 726 save->dmif_mem_cntl1 = info->SavedReg->dmif_mem_cntl1; 727 save->disp1_req_cntl1 = info->SavedReg->disp1_req_cntl1; 728 } 729 730 /* 731 * If bursts are enabled, turn on discards 732 * Radeon doesn't have write bursts 733 */ 734 if (save->bus_cntl & (RADEON_BUS_READ_BURST)) 735 save->bus_cntl |= RADEON_BUS_RD_DISCARD_EN; 736} 737 738void 739RADEONInitSurfaceCntl(xf86CrtcPtr crtc, RADEONSavePtr save) 740{ 741 save->surface_cntl = 0; 742 743#if X_BYTE_ORDER == X_BIG_ENDIAN 744 /* We must set both apertures as they can be both used to map the entire 745 * video memory. -BenH. 746 */ 747 switch (crtc->scrn->bitsPerPixel) { 748 case 16: 749 save->surface_cntl |= RADEON_NONSURF_AP0_SWP_16BPP; 750 save->surface_cntl |= RADEON_NONSURF_AP1_SWP_16BPP; 751 break; 752 753 case 32: 754 save->surface_cntl |= RADEON_NONSURF_AP0_SWP_32BPP; 755 save->surface_cntl |= RADEON_NONSURF_AP1_SWP_32BPP; 756 break; 757 } 758#endif 759 760} 761 762void 763RADEONInitCrtcBase(xf86CrtcPtr crtc, RADEONSavePtr save, 764 int x, int y) 765{ 766 ScrnInfoPtr pScrn = crtc->scrn; 767 RADEONInfoPtr info = RADEONPTR(pScrn); 768 int Base; 769#ifdef XF86DRI 770 drm_radeon_sarea_t *pSAREAPriv; 771 XF86DRISAREAPtr pSAREA; 772#endif 773 774 save->crtc_offset = pScrn->fbOffset; 775#ifdef XF86DRI 776 if (info->dri && info->dri->allowPageFlip) 777 save->crtc_offset_cntl = RADEON_CRTC_OFFSET_FLIP_CNTL; 778 else 779#endif 780 save->crtc_offset_cntl = 0; 781 782 if (info->tilingEnabled && (crtc->rotatedData == NULL)) { 783 if (IS_R300_VARIANT) 784 save->crtc_offset_cntl |= (R300_CRTC_X_Y_MODE_EN | 785 R300_CRTC_MICRO_TILE_BUFFER_DIS | 786 R300_CRTC_MACRO_TILE_EN); 787 else 788 save->crtc_offset_cntl |= RADEON_CRTC_TILE_EN; 789 } 790 else { 791 if (IS_R300_VARIANT) 792 save->crtc_offset_cntl &= ~(R300_CRTC_X_Y_MODE_EN | 793 R300_CRTC_MICRO_TILE_BUFFER_DIS | 794 R300_CRTC_MACRO_TILE_EN); 795 else 796 save->crtc_offset_cntl &= ~RADEON_CRTC_TILE_EN; 797 } 798 799 Base = pScrn->fbOffset; 800 801 if (info->tilingEnabled && (crtc->rotatedData == NULL)) { 802 if (IS_R300_VARIANT) { 803 /* On r300/r400 when tiling is enabled crtc_offset is set to the address of 804 * the surface. the x/y offsets are handled by the X_Y tile reg for each crtc 805 * Makes tiling MUCH easier. 806 */ 807 save->crtc_tile_x0_y0 = x | (y << 16); 808 Base &= ~0x7ff; 809 } else { 810 /* note we cannot really simply use the info->ModeReg.crtc_offset_cntl value, since the 811 drm might have set FLIP_CNTL since we wrote that. Unfortunately FLIP_CNTL causes 812 flickering when scrolling vertically in a virtual screen, possibly because crtc will 813 pick up the new offset value at the end of each scanline, but the new offset_cntl value 814 only after a vsync. We'd probably need to wait (in drm) for vsync and only then update 815 OFFSET and OFFSET_CNTL, if the y coord has changed. Seems hard to fix. */ 816 /*save->crtc_offset_cntl = INREG(RADEON_CRTC_OFFSET_CNTL) & ~0xf;*/ 817#if 0 818 /* try to get rid of flickering when scrolling at least for 2d */ 819#ifdef XF86DRI 820 if (!info->have3DWindows) 821#endif 822 save->crtc_offset_cntl &= ~RADEON_CRTC_OFFSET_FLIP_CNTL; 823#endif 824 825 int byteshift = info->CurrentLayout.bitsPerPixel >> 4; 826 /* crtc uses 256(bytes)x8 "half-tile" start addresses? */ 827 int tile_addr = (((y >> 3) * info->CurrentLayout.displayWidth + x) >> (8 - byteshift)) << 11; 828 Base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8); 829 save->crtc_offset_cntl = save->crtc_offset_cntl | (y % 16); 830 } 831 } 832 else { 833 int offset = y * info->CurrentLayout.displayWidth + x; 834 switch (info->CurrentLayout.pixel_code) { 835 case 15: 836 case 16: offset *= 2; break; 837 case 24: offset *= 3; break; 838 case 32: offset *= 4; break; 839 } 840 Base += offset; 841 } 842 843 if (crtc->rotatedData != NULL) { 844 Base = pScrn->fbOffset + (char *)crtc->rotatedData - (char *)info->FB; 845 } 846 847 Base &= ~7; /* 3 lower bits are always 0 */ 848 849 850#ifdef XF86DRI 851 if (info->directRenderingInited) { 852 /* note cannot use pScrn->pScreen since this is unitialized when called from 853 RADEONScreenInit, and we need to call from there to get mergedfb + pageflip working */ 854 /*** NOTE: r3/4xx will need sarea and drm pageflip updates to handle the xytile regs for 855 *** pageflipping! 856 ***/ 857 pSAREAPriv = DRIGetSAREAPrivate(screenInfo.screens[pScrn->scrnIndex]); 858 /* can't get at sarea in a semi-sane way? */ 859 pSAREA = (void *)((char*)pSAREAPriv - sizeof(XF86DRISAREARec)); 860 861 pSAREA->frame.x = (Base / info->CurrentLayout.pixel_bytes) 862 % info->CurrentLayout.displayWidth; 863 pSAREA->frame.y = (Base / info->CurrentLayout.pixel_bytes) 864 / info->CurrentLayout.displayWidth; 865 pSAREA->frame.width = pScrn->frameX1 - x + 1; 866 pSAREA->frame.height = pScrn->frameY1 - y + 1; 867 868 if (pSAREAPriv->pfCurrentPage == 1) { 869 Base += info->dri->backOffset - info->dri->frontOffset; 870 } 871 } 872#endif 873 save->crtc_offset = Base; 874 875} 876 877/* Define CRTC registers for requested video mode */ 878static Bool 879RADEONInitCrtcRegisters(xf86CrtcPtr crtc, RADEONSavePtr save, 880 DisplayModePtr mode) 881{ 882 ScrnInfoPtr pScrn = crtc->scrn; 883 RADEONInfoPtr info = RADEONPTR(pScrn); 884 int format; 885 int hsync_start; 886 int hsync_wid; 887 int vsync_wid; 888 889 switch (info->CurrentLayout.pixel_code) { 890 case 4: format = 1; break; 891 case 8: format = 2; break; 892 case 15: format = 3; break; /* 555 */ 893 case 16: format = 4; break; /* 565 */ 894 case 24: format = 5; break; /* RGB */ 895 case 32: format = 6; break; /* xRGB */ 896 default: 897 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 898 "Unsupported pixel depth (%d)\n", 899 info->CurrentLayout.bitsPerPixel); 900 return FALSE; 901 } 902 903 /*save->bios_4_scratch = info->SavedReg->bios_4_scratch;*/ 904 save->crtc_gen_cntl = (RADEON_CRTC_EXT_DISP_EN 905 | (format << 8) 906 | ((mode->Flags & V_DBLSCAN) 907 ? RADEON_CRTC_DBL_SCAN_EN 908 : 0) 909 | ((mode->Flags & V_CSYNC) 910 ? RADEON_CRTC_CSYNC_EN 911 : 0) 912 | ((mode->Flags & V_INTERLACE) 913 ? RADEON_CRTC_INTERLACE_EN 914 : 0)); 915 916 /* 200M freezes on VT switch sometimes if CRTC is disabled */ 917 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 918 (info->ChipFamily == CHIP_FAMILY_RS480)) 919 save->crtc_gen_cntl |= RADEON_CRTC_EN; 920 921 save->crtc_ext_cntl |= (RADEON_XCRT_CNT_EN| 922 RADEON_CRTC_VSYNC_DIS | 923 RADEON_CRTC_HSYNC_DIS | 924 RADEON_CRTC_DISPLAY_DIS); 925 926 save->disp_merge_cntl = info->SavedReg->disp_merge_cntl; 927 save->disp_merge_cntl &= ~RADEON_DISP_RGB_OFFSET_EN; 928 929 save->crtc_h_total_disp = ((((mode->CrtcHTotal / 8) - 1) & 0x3ff) 930 | ((((mode->CrtcHDisplay / 8) - 1) & 0x1ff) 931 << 16)); 932 933 hsync_wid = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 8; 934 if (!hsync_wid) hsync_wid = 1; 935 hsync_start = mode->CrtcHSyncStart - 8; 936 937 save->crtc_h_sync_strt_wid = ((hsync_start & 0x1fff) 938 | ((hsync_wid & 0x3f) << 16) 939 | ((mode->Flags & V_NHSYNC) 940 ? RADEON_CRTC_H_SYNC_POL 941 : 0)); 942 943 /* This works for double scan mode. */ 944 save->crtc_v_total_disp = (((mode->CrtcVTotal - 1) & 0xffff) 945 | ((mode->CrtcVDisplay - 1) << 16)); 946 947 vsync_wid = mode->CrtcVSyncEnd - mode->CrtcVSyncStart; 948 if (!vsync_wid) vsync_wid = 1; 949 950 save->crtc_v_sync_strt_wid = (((mode->CrtcVSyncStart - 1) & 0xfff) 951 | ((vsync_wid & 0x1f) << 16) 952 | ((mode->Flags & V_NVSYNC) 953 ? RADEON_CRTC_V_SYNC_POL 954 : 0)); 955 956 save->crtc_pitch = (((pScrn->displayWidth * pScrn->bitsPerPixel) + 957 ((pScrn->bitsPerPixel * 8) -1)) / 958 (pScrn->bitsPerPixel * 8)); 959 save->crtc_pitch |= save->crtc_pitch << 16; 960 961 if (info->IsDellServer) { 962 save->dac2_cntl = info->SavedReg->dac2_cntl; 963 save->tv_dac_cntl = info->SavedReg->tv_dac_cntl; 964 save->crtc2_gen_cntl = info->SavedReg->crtc2_gen_cntl; 965 save->disp_hw_debug = info->SavedReg->disp_hw_debug; 966 967 save->dac2_cntl &= ~RADEON_DAC2_DAC_CLK_SEL; 968 save->dac2_cntl |= RADEON_DAC2_DAC2_CLK_SEL; 969 970 /* For CRT on DAC2, don't turn it on if BIOS didn't 971 enable it, even it's detected. 972 */ 973 save->disp_hw_debug |= RADEON_CRT2_DISP1_SEL; 974 save->tv_dac_cntl &= ~((1<<2) | (3<<8) | (7<<24) | (0xff<<16)); 975 save->tv_dac_cntl |= (0x03 | (2<<8) | (0x58<<16)); 976 } 977 978 return TRUE; 979} 980 981 982void 983RADEONInitCrtc2Base(xf86CrtcPtr crtc, RADEONSavePtr save, 984 int x, int y) 985{ 986 ScrnInfoPtr pScrn = crtc->scrn; 987 RADEONInfoPtr info = RADEONPTR(pScrn); 988 int Base; 989#ifdef XF86DRI 990 drm_radeon_sarea_t *pSAREAPriv; 991 XF86DRISAREAPtr pSAREA; 992#endif 993 994 /* It seems all fancy options apart from pflip can be safely disabled 995 */ 996 save->crtc2_offset = pScrn->fbOffset; 997#ifdef XF86DRI 998 if (info->dri && info->dri->allowPageFlip) 999 save->crtc2_offset_cntl = RADEON_CRTC_OFFSET_FLIP_CNTL; 1000 else 1001#endif 1002 save->crtc2_offset_cntl = 0; 1003 1004 if (info->tilingEnabled && (crtc->rotatedData == NULL)) { 1005 if (IS_R300_VARIANT) 1006 save->crtc2_offset_cntl |= (R300_CRTC_X_Y_MODE_EN | 1007 R300_CRTC_MICRO_TILE_BUFFER_DIS | 1008 R300_CRTC_MACRO_TILE_EN); 1009 else 1010 save->crtc2_offset_cntl |= RADEON_CRTC_TILE_EN; 1011 } 1012 else { 1013 if (IS_R300_VARIANT) 1014 save->crtc2_offset_cntl &= ~(R300_CRTC_X_Y_MODE_EN | 1015 R300_CRTC_MICRO_TILE_BUFFER_DIS | 1016 R300_CRTC_MACRO_TILE_EN); 1017 else 1018 save->crtc2_offset_cntl &= ~RADEON_CRTC_TILE_EN; 1019 } 1020 1021 Base = pScrn->fbOffset; 1022 1023 if (info->tilingEnabled && (crtc->rotatedData == NULL)) { 1024 if (IS_R300_VARIANT) { 1025 /* On r300/r400 when tiling is enabled crtc_offset is set to the address of 1026 * the surface. the x/y offsets are handled by the X_Y tile reg for each crtc 1027 * Makes tiling MUCH easier. 1028 */ 1029 save->crtc2_tile_x0_y0 = x | (y << 16); 1030 Base &= ~0x7ff; 1031 } else { 1032 /* note we cannot really simply use the info->ModeReg.crtc_offset_cntl value, since the 1033 drm might have set FLIP_CNTL since we wrote that. Unfortunately FLIP_CNTL causes 1034 flickering when scrolling vertically in a virtual screen, possibly because crtc will 1035 pick up the new offset value at the end of each scanline, but the new offset_cntl value 1036 only after a vsync. We'd probably need to wait (in drm) for vsync and only then update 1037 OFFSET and OFFSET_CNTL, if the y coord has changed. Seems hard to fix. */ 1038 /*save->crtc2_offset_cntl = INREG(RADEON_CRTC2_OFFSET_CNTL) & ~0xf;*/ 1039#if 0 1040 /* try to get rid of flickering when scrolling at least for 2d */ 1041#ifdef XF86DRI 1042 if (!info->have3DWindows) 1043#endif 1044 save->crtc2_offset_cntl &= ~RADEON_CRTC_OFFSET_FLIP_CNTL; 1045#endif 1046 1047 int byteshift = info->CurrentLayout.bitsPerPixel >> 4; 1048 /* crtc uses 256(bytes)x8 "half-tile" start addresses? */ 1049 int tile_addr = (((y >> 3) * info->CurrentLayout.displayWidth + x) >> (8 - byteshift)) << 11; 1050 Base += tile_addr + ((x << byteshift) % 256) + ((y % 8) << 8); 1051 save->crtc2_offset_cntl = save->crtc_offset_cntl | (y % 16); 1052 } 1053 } 1054 else { 1055 int offset = y * info->CurrentLayout.displayWidth + x; 1056 switch (info->CurrentLayout.pixel_code) { 1057 case 15: 1058 case 16: offset *= 2; break; 1059 case 24: offset *= 3; break; 1060 case 32: offset *= 4; break; 1061 } 1062 Base += offset; 1063 } 1064 1065 if (crtc->rotatedData != NULL) { 1066 Base = pScrn->fbOffset + (char *)crtc->rotatedData - (char *)info->FB; 1067 } 1068 1069 Base &= ~7; /* 3 lower bits are always 0 */ 1070 1071#ifdef XF86DRI 1072 if (info->directRenderingInited) { 1073 /* note cannot use pScrn->pScreen since this is unitialized when called from 1074 RADEONScreenInit, and we need to call from there to get mergedfb + pageflip working */ 1075 /*** NOTE: r3/4xx will need sarea and drm pageflip updates to handle the xytile regs for 1076 *** pageflipping! 1077 ***/ 1078 pSAREAPriv = DRIGetSAREAPrivate(screenInfo.screens[pScrn->scrnIndex]); 1079 /* can't get at sarea in a semi-sane way? */ 1080 pSAREA = (void *)((char*)pSAREAPriv - sizeof(XF86DRISAREARec)); 1081 1082 pSAREAPriv->crtc2_base = Base; 1083 1084 if (pSAREAPriv->pfCurrentPage == 1) { 1085 Base += info->dri->backOffset - info->dri->frontOffset; 1086 } 1087 } 1088#endif 1089 save->crtc2_offset = Base; 1090 1091} 1092 1093 1094/* Define CRTC2 registers for requested video mode */ 1095static Bool 1096RADEONInitCrtc2Registers(xf86CrtcPtr crtc, RADEONSavePtr save, 1097 DisplayModePtr mode) 1098{ 1099 ScrnInfoPtr pScrn = crtc->scrn; 1100 RADEONInfoPtr info = RADEONPTR(pScrn); 1101 int format; 1102 int hsync_start; 1103 int hsync_wid; 1104 int vsync_wid; 1105 1106 switch (info->CurrentLayout.pixel_code) { 1107 case 4: format = 1; break; 1108 case 8: format = 2; break; 1109 case 15: format = 3; break; /* 555 */ 1110 case 16: format = 4; break; /* 565 */ 1111 case 24: format = 5; break; /* RGB */ 1112 case 32: format = 6; break; /* xRGB */ 1113 default: 1114 xf86DrvMsg(pScrn->scrnIndex, X_ERROR, 1115 "Unsupported pixel depth (%d)\n", 1116 info->CurrentLayout.bitsPerPixel); 1117 return FALSE; 1118 } 1119 1120 save->crtc2_h_total_disp = 1121 ((((mode->CrtcHTotal / 8) - 1) & 0x3ff) 1122 | ((((mode->CrtcHDisplay / 8) - 1) & 0x1ff) << 16)); 1123 1124 hsync_wid = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 8; 1125 if (!hsync_wid) hsync_wid = 1; 1126 hsync_start = mode->CrtcHSyncStart - 8; 1127 1128 save->crtc2_h_sync_strt_wid = ((hsync_start & 0x1fff) 1129 | ((hsync_wid & 0x3f) << 16) 1130 | ((mode->Flags & V_NHSYNC) 1131 ? RADEON_CRTC_H_SYNC_POL 1132 : 0)); 1133 1134 /* This works for double scan mode. */ 1135 save->crtc2_v_total_disp = (((mode->CrtcVTotal - 1) & 0xffff) 1136 | ((mode->CrtcVDisplay - 1) << 16)); 1137 1138 vsync_wid = mode->CrtcVSyncEnd - mode->CrtcVSyncStart; 1139 if (!vsync_wid) vsync_wid = 1; 1140 1141 save->crtc2_v_sync_strt_wid = (((mode->CrtcVSyncStart - 1) & 0xfff) 1142 | ((vsync_wid & 0x1f) << 16) 1143 | ((mode->Flags & V_NVSYNC) 1144 ? RADEON_CRTC2_V_SYNC_POL 1145 : 0)); 1146 1147 save->crtc2_pitch = ((pScrn->displayWidth * pScrn->bitsPerPixel) + 1148 ((pScrn->bitsPerPixel * 8) -1)) / (pScrn->bitsPerPixel * 8); 1149 save->crtc2_pitch |= save->crtc2_pitch << 16; 1150 1151 /* check to see if TV DAC is enabled for another crtc and keep it enabled */ 1152 if (save->crtc2_gen_cntl & RADEON_CRTC2_CRT2_ON) 1153 save->crtc2_gen_cntl = RADEON_CRTC2_CRT2_ON; 1154 else 1155 save->crtc2_gen_cntl = 0; 1156 1157 save->crtc2_gen_cntl |= ((format << 8) 1158 | RADEON_CRTC2_VSYNC_DIS 1159 | RADEON_CRTC2_HSYNC_DIS 1160 | RADEON_CRTC2_DISP_DIS 1161 | ((mode->Flags & V_DBLSCAN) 1162 ? RADEON_CRTC2_DBL_SCAN_EN 1163 : 0) 1164 | ((mode->Flags & V_CSYNC) 1165 ? RADEON_CRTC2_CSYNC_EN 1166 : 0) 1167 | ((mode->Flags & V_INTERLACE) 1168 ? RADEON_CRTC2_INTERLACE_EN 1169 : 0)); 1170 1171 /* 200M freezes on VT switch sometimes if CRTC is disabled */ 1172 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 1173 (info->ChipFamily == CHIP_FAMILY_RS480)) 1174 save->crtc2_gen_cntl |= RADEON_CRTC2_EN; 1175 1176 save->disp2_merge_cntl = info->SavedReg->disp2_merge_cntl; 1177 save->disp2_merge_cntl &= ~(RADEON_DISP2_RGB_OFFSET_EN); 1178 1179 save->fp_h2_sync_strt_wid = save->crtc2_h_sync_strt_wid; 1180 save->fp_v2_sync_strt_wid = save->crtc2_v_sync_strt_wid; 1181 1182 return TRUE; 1183} 1184 1185 1186/* Define PLL registers for requested video mode */ 1187static void 1188RADEONInitPLLRegisters(xf86CrtcPtr crtc, RADEONSavePtr save, 1189 RADEONPLLPtr pll, DisplayModePtr mode, 1190 int flags) 1191{ 1192 RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; 1193 ScrnInfoPtr pScrn = crtc->scrn; 1194 RADEONInfoPtr info = RADEONPTR(pScrn); 1195 uint32_t feedback_div = 0; 1196 uint32_t frac_fb_div = 0; 1197 uint32_t reference_div = 0; 1198 uint32_t post_divider = 0; 1199 uint32_t freq = 0; 1200 1201 struct { 1202 int divider; 1203 int bitvalue; 1204 } *post_div, post_divs[] = { 1205 /* From RAGE 128 VR/RAGE 128 GL Register 1206 * Reference Manual (Technical Reference 1207 * Manual P/N RRG-G04100-C Rev. 0.04), page 1208 * 3-17 (PLL_DIV_[3:0]). 1209 */ 1210 { 1, 0 }, /* VCLK_SRC */ 1211 { 2, 1 }, /* VCLK_SRC/2 */ 1212 { 4, 2 }, /* VCLK_SRC/4 */ 1213 { 8, 3 }, /* VCLK_SRC/8 */ 1214 { 3, 4 }, /* VCLK_SRC/3 */ 1215 { 16, 5 }, /* VCLK_SRC/16 */ 1216 { 6, 6 }, /* VCLK_SRC/6 */ 1217 { 12, 7 }, /* VCLK_SRC/12 */ 1218 { 0, 0 } 1219 }; 1220 1221 1222 if ((flags & RADEON_PLL_USE_BIOS_DIVS) && info->UseBiosDividers) { 1223 save->ppll_ref_div = info->RefDivider; 1224 save->ppll_div_3 = info->FeedbackDivider | (info->PostDivider << 16); 1225 save->htotal_cntl = 0; 1226 return; 1227 } 1228 1229 if (xf86ReturnOptValBool(info->Options, OPTION_NEW_PLL, FALSE)) 1230 radeon_crtc->pll_algo = RADEON_PLL_NEW; 1231 else 1232 radeon_crtc->pll_algo = RADEON_PLL_OLD; 1233 1234 RADEONComputePLL(crtc, pll, mode->Clock, &freq, 1235 &feedback_div, &frac_fb_div, &reference_div, &post_divider, flags); 1236 1237 for (post_div = &post_divs[0]; post_div->divider; ++post_div) { 1238 if (post_div->divider == post_divider) 1239 break; 1240 } 1241 1242 if (!post_div->divider) { 1243 save->pll_output_freq = freq; 1244 post_div = &post_divs[0]; 1245 } 1246 1247 save->dot_clock_freq = freq; 1248 save->feedback_div = feedback_div; 1249 save->reference_div = reference_div; 1250 save->post_div = post_divider; 1251 1252 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 1253 "dc=%u, of=%u, fd=%d, rd=%d, pd=%d\n", 1254 (unsigned)save->dot_clock_freq, 1255 (unsigned)save->pll_output_freq, 1256 save->feedback_div, 1257 save->reference_div, 1258 save->post_div); 1259 1260 save->ppll_ref_div = save->reference_div; 1261 1262#if defined(__powerpc__) 1263 /* apparently programming this otherwise causes a hang??? */ 1264 if ((info->MacModel == RADEON_MAC_IBOOK) || 1265 (info->MacModel == RADEON_MAC_MINI_INTERNAL)) 1266 save->ppll_div_3 = 0x000600ad; 1267 else 1268#endif 1269 save->ppll_div_3 = (save->feedback_div | (post_div->bitvalue << 16)); 1270 1271 save->htotal_cntl = mode->HTotal & 0x7; 1272 1273 save->vclk_ecp_cntl = (info->SavedReg->vclk_ecp_cntl & 1274 ~RADEON_VCLK_SRC_SEL_MASK) | RADEON_VCLK_SRC_SEL_PPLLCLK; 1275} 1276 1277/* Define PLL2 registers for requested video mode */ 1278static void 1279RADEONInitPLL2Registers(xf86CrtcPtr crtc, RADEONSavePtr save, 1280 RADEONPLLPtr pll, DisplayModePtr mode, 1281 int flags) 1282{ 1283 RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; 1284 ScrnInfoPtr pScrn = crtc->scrn; 1285 RADEONInfoPtr info = RADEONPTR(pScrn); 1286 uint32_t feedback_div = 0; 1287 uint32_t frac_fb_div = 0; 1288 uint32_t reference_div = 0; 1289 uint32_t post_divider = 0; 1290 uint32_t freq = 0; 1291 1292 struct { 1293 int divider; 1294 int bitvalue; 1295 } *post_div, post_divs[] = { 1296 /* From RAGE 128 VR/RAGE 128 GL Register 1297 * Reference Manual (Technical Reference 1298 * Manual P/N RRG-G04100-C Rev. 0.04), page 1299 * 3-17 (PLL_DIV_[3:0]). 1300 */ 1301 { 1, 0 }, /* VCLK_SRC */ 1302 { 2, 1 }, /* VCLK_SRC/2 */ 1303 { 4, 2 }, /* VCLK_SRC/4 */ 1304 { 8, 3 }, /* VCLK_SRC/8 */ 1305 { 3, 4 }, /* VCLK_SRC/3 */ 1306 { 6, 6 }, /* VCLK_SRC/6 */ 1307 { 12, 7 }, /* VCLK_SRC/12 */ 1308 { 0, 0 } 1309 }; 1310 1311 if ((flags & RADEON_PLL_USE_BIOS_DIVS) && info->UseBiosDividers) { 1312 save->p2pll_ref_div = info->RefDivider; 1313 save->p2pll_div_0 = info->FeedbackDivider | (info->PostDivider << 16); 1314 save->htotal_cntl2 = 0; 1315 return; 1316 } 1317 1318 if (xf86ReturnOptValBool(info->Options, OPTION_NEW_PLL, FALSE)) 1319 radeon_crtc->pll_algo = RADEON_PLL_NEW; 1320 else 1321 radeon_crtc->pll_algo = RADEON_PLL_OLD; 1322 1323 RADEONComputePLL(crtc, pll, mode->Clock, &freq, 1324 &feedback_div, &frac_fb_div, &reference_div, &post_divider, flags); 1325 1326 for (post_div = &post_divs[0]; post_div->divider; ++post_div) { 1327 if (post_div->divider == post_divider) 1328 break; 1329 } 1330 1331 if (!post_div->divider) { 1332 save->pll_output_freq_2 = freq; 1333 post_div = &post_divs[0]; 1334 } 1335 1336 save->dot_clock_freq_2 = freq; 1337 save->feedback_div_2 = feedback_div; 1338 save->reference_div_2 = reference_div; 1339 save->post_div_2 = post_divider; 1340 1341 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 1342 "dc=%u, of=%u, fd=%d, rd=%d, pd=%d\n", 1343 (unsigned)save->dot_clock_freq_2, 1344 (unsigned)save->pll_output_freq_2, 1345 save->feedback_div_2, 1346 save->reference_div_2, 1347 save->post_div_2); 1348 1349 save->p2pll_ref_div = save->reference_div_2; 1350 1351 save->p2pll_div_0 = (save->feedback_div_2 | 1352 (post_div->bitvalue << 16)); 1353 1354 save->htotal_cntl2 = mode->HTotal & 0x7; 1355 1356 save->pixclks_cntl = ((info->SavedReg->pixclks_cntl & 1357 ~(RADEON_PIX2CLK_SRC_SEL_MASK)) | 1358 RADEON_PIX2CLK_SRC_SEL_P2PLLCLK); 1359} 1360 1361static void 1362radeon_update_tv_routing(ScrnInfoPtr pScrn, RADEONSavePtr restore) 1363{ 1364 /* pixclks_cntl controls tv clock routing */ 1365 OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, restore->pixclks_cntl); 1366} 1367 1368/* Calculate display buffer watermark to prevent buffer underflow */ 1369void 1370RADEONInitDispBandwidthLegacy(ScrnInfoPtr pScrn, 1371 DisplayModePtr mode1, int pixel_bytes1, 1372 DisplayModePtr mode2, int pixel_bytes2) 1373{ 1374 RADEONInfoPtr info = RADEONPTR(pScrn); 1375 RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); 1376 unsigned char *RADEONMMIO = info->MMIO; 1377 1378 uint32_t temp, data, mem_trcd, mem_trp, mem_tras, mem_trbs=0; 1379 float mem_tcas; 1380 int k1, c; 1381 1382 float MemTcas[8] = {0, 1, 2, 3, 0, 1.5, 2.5, 0.0}; 1383 float MemTcas_rs480[8] = {0, 1, 2, 3, 0, 1.5, 2.5, 3.5}; 1384 float MemTcas2[8] = {0, 1, 2, 3, 4, 5, 6, 7}; 1385 float MemTrbs[8] = {1, 1.5, 2, 2.5, 3, 3.5, 4, 4.5}; 1386 float MemTrbs_r4xx[8] = {4, 5, 6, 7, 8, 9, 10, 11}; 1387 1388 float mem_bw, peak_disp_bw; 1389 float min_mem_eff = 0.8; 1390 float sclk_eff, sclk_delay; 1391 float mc_latency_mclk, mc_latency_sclk, cur_latency_mclk, cur_latency_sclk; 1392 float disp_latency, disp_latency_overhead, disp_drain_rate = 0, disp_drain_rate2; 1393 float pix_clk, pix_clk2; /* in MHz */ 1394 int cur_size = 16; /* in octawords */ 1395 int critical_point = 0, critical_point2; 1396 int stop_req, max_stop_req; 1397 float read_return_rate, time_disp1_drop_priority; 1398 1399 /* 1400 * Set display0/1 priority up on r3/4xx in the memory controller for 1401 * high res modes if the user specifies HIGH for displaypriority 1402 * option. 1403 */ 1404 if ((info->DispPriority == 2) && IS_R300_VARIANT) { 1405 uint32_t mc_init_misc_lat_timer = INREG(R300_MC_INIT_MISC_LAT_TIMER); 1406 mc_init_misc_lat_timer &= ~(R300_MC_DISP1R_INIT_LAT_MASK << R300_MC_DISP1R_INIT_LAT_SHIFT); 1407 mc_init_misc_lat_timer &= ~(R300_MC_DISP0R_INIT_LAT_MASK << R300_MC_DISP0R_INIT_LAT_SHIFT); 1408 if (pRADEONEnt->pCrtc[1]->enabled) 1409 mc_init_misc_lat_timer |= (1 << R300_MC_DISP1R_INIT_LAT_SHIFT); /* display 1 */ 1410 if (pRADEONEnt->pCrtc[0]->enabled) 1411 mc_init_misc_lat_timer |= (1 << R300_MC_DISP0R_INIT_LAT_SHIFT); /* display 0 */ 1412 OUTREG(R300_MC_INIT_MISC_LAT_TIMER, mc_init_misc_lat_timer); 1413 } 1414 1415 /* 1416 * Determine if there is enough bandwidth for current display mode 1417 */ 1418 mem_bw = info->mclk * (info->RamWidth / 8) * (info->IsDDR ? 2 : 1); 1419 1420 pix_clk = 0; 1421 pix_clk2 = 0; 1422 peak_disp_bw = 0; 1423 if (mode1) { 1424 pix_clk = mode1->Clock/1000.0; 1425 peak_disp_bw += (pix_clk * pixel_bytes1); 1426 } 1427 if (mode2) { 1428 pix_clk2 = mode2->Clock/1000.0; 1429 peak_disp_bw += (pix_clk2 * pixel_bytes2); 1430 } 1431 1432 if (peak_disp_bw >= mem_bw * min_mem_eff) { 1433 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 1434 "You may not have enough display bandwidth for current mode\n" 1435 "If you have flickering problem, try to lower resolution, refresh rate, or color depth\n"); 1436 } 1437 1438 /* Get values from the EXT_MEM_CNTL register...converting its contents. */ 1439 temp = INREG(RADEON_MEM_TIMING_CNTL); 1440 if ((info->ChipFamily == CHIP_FAMILY_RV100) || info->IsIGP) { /* RV100, M6, IGPs */ 1441 mem_trcd = ((temp >> 2) & 0x3) + 1; 1442 mem_trp = ((temp & 0x3)) + 1; 1443 mem_tras = ((temp & 0x70) >> 4) + 1; 1444 } else if (info->ChipFamily == CHIP_FAMILY_R300 || 1445 info->ChipFamily == CHIP_FAMILY_R350) { /* r300, r350 */ 1446 mem_trcd = (temp & 0x7) + 1; 1447 mem_trp = ((temp >> 8) & 0x7) + 1; 1448 mem_tras = ((temp >> 11) & 0xf) + 4; 1449 } else if (info->ChipFamily == CHIP_FAMILY_RV350 || 1450 info->ChipFamily <= CHIP_FAMILY_RV380) { 1451 /* rv3x0 */ 1452 mem_trcd = (temp & 0x7) + 3; 1453 mem_trp = ((temp >> 8) & 0x7) + 3; 1454 mem_tras = ((temp >> 11) & 0xf) + 6; 1455 } else if (info->ChipFamily == CHIP_FAMILY_R420 || 1456 info->ChipFamily == CHIP_FAMILY_RV410) { 1457 /* r4xx */ 1458 mem_trcd = (temp & 0xf) + 3; 1459 if (mem_trcd > 15) 1460 mem_trcd = 15; 1461 mem_trp = ((temp >> 8) & 0xf) + 3; 1462 if (mem_trp > 15) 1463 mem_trp = 15; 1464 mem_tras = ((temp >> 12) & 0x1f) + 6; 1465 if (mem_tras > 31) 1466 mem_tras = 31; 1467 } else { /* RV200, R200 */ 1468 mem_trcd = (temp & 0x7) + 1; 1469 mem_trp = ((temp >> 8) & 0x7) + 1; 1470 mem_tras = ((temp >> 12) & 0xf) + 4; 1471 } 1472 1473 /* Get values from the MEM_SDRAM_MODE_REG register...converting its */ 1474 temp = INREG(RADEON_MEM_SDRAM_MODE_REG); 1475 data = (temp & (7<<20)) >> 20; 1476 if ((info->ChipFamily == CHIP_FAMILY_RV100) || info->IsIGP) { /* RV100, M6, IGPs */ 1477 if (info->ChipFamily == CHIP_FAMILY_RS480) /* don't think rs400 */ 1478 mem_tcas = MemTcas_rs480[data]; 1479 else 1480 mem_tcas = MemTcas[data]; 1481 } else { 1482 mem_tcas = MemTcas2 [data]; 1483 } 1484 if (info->ChipFamily == CHIP_FAMILY_RS400 || 1485 info->ChipFamily == CHIP_FAMILY_RS480) { 1486 /* extra cas latency stored in bits 23-25 0-4 clocks */ 1487 data = (temp >> 23) & 0x7; 1488 if (data < 5) 1489 mem_tcas += data; 1490 } 1491 1492 if (IS_R300_VARIANT && !info->IsIGP) { 1493 /* on the R300, Tcas is included in Trbs. 1494 */ 1495 temp = INREG(RADEON_MEM_CNTL); 1496 data = (R300_MEM_NUM_CHANNELS_MASK & temp); 1497 if (data == 1) { 1498 if (R300_MEM_USE_CD_CH_ONLY & temp) { 1499 temp = INREG(R300_MC_IND_INDEX); 1500 temp &= ~R300_MC_IND_ADDR_MASK; 1501 temp |= R300_MC_READ_CNTL_CD_mcind; 1502 OUTREG(R300_MC_IND_INDEX, temp); 1503 temp = INREG(R300_MC_IND_DATA); 1504 data = (R300_MEM_RBS_POSITION_C_MASK & temp); 1505 } else { 1506 temp = INREG(R300_MC_READ_CNTL_AB); 1507 data = (R300_MEM_RBS_POSITION_A_MASK & temp); 1508 } 1509 } else { 1510 temp = INREG(R300_MC_READ_CNTL_AB); 1511 data = (R300_MEM_RBS_POSITION_A_MASK & temp); 1512 } 1513 1514 if (info->ChipFamily == CHIP_FAMILY_RV410 || 1515 info->ChipFamily == CHIP_FAMILY_R420) 1516 mem_trbs = MemTrbs_r4xx[data]; 1517 else 1518 mem_trbs = MemTrbs[data]; 1519 mem_tcas += mem_trbs; 1520 } 1521 1522 if ((info->ChipFamily == CHIP_FAMILY_RV100) || info->IsIGP) { /* RV100, M6, IGPs */ 1523 /* DDR64 SCLK_EFF = SCLK for analysis */ 1524 sclk_eff = info->sclk; 1525 } else { 1526#ifdef XF86DRI 1527 if (info->directRenderingEnabled) 1528 sclk_eff = info->sclk - (info->dri->agpMode * 50.0 / 3.0); 1529 else 1530#endif 1531 sclk_eff = info->sclk; 1532 } 1533 1534 /* 1535 Find the memory controller latency for the display client. 1536 */ 1537 if (IS_R300_VARIANT) { 1538 /*not enough for R350 ???*/ 1539 /* 1540 if (!mode2) sclk_delay = 150; 1541 else { 1542 if (info->RamWidth == 256) sclk_delay = 87; 1543 else sclk_delay = 97; 1544 } 1545 */ 1546 sclk_delay = 250; 1547 } else { 1548 if ((info->ChipFamily == CHIP_FAMILY_RV100) || 1549 info->IsIGP) { 1550 if (info->IsDDR) sclk_delay = 41; 1551 else sclk_delay = 33; 1552 } else { 1553 if (info->RamWidth == 128) sclk_delay = 57; 1554 else sclk_delay = 41; 1555 } 1556 } 1557 1558 mc_latency_sclk = sclk_delay / sclk_eff; 1559 1560 if (info->IsDDR) { 1561 if (info->RamWidth == 32) { 1562 k1 = 40; 1563 c = 3; 1564 } else { 1565 k1 = 20; 1566 c = 1; 1567 } 1568 } else { 1569 k1 = 40; 1570 c = 3; 1571 } 1572 mc_latency_mclk = ((2.0*mem_trcd + mem_tcas*c + 4.0*mem_tras + 4.0*mem_trp + k1) / 1573 info->mclk) + (4.0 / sclk_eff); 1574 1575 /* 1576 HW cursor time assuming worst case of full size colour cursor. 1577 */ 1578 cur_latency_mclk = (mem_trp + MAX(mem_tras, (mem_trcd + 2*(cur_size - (info->IsDDR+1))))) / info->mclk; 1579 cur_latency_sclk = cur_size / sclk_eff; 1580 1581 /* 1582 Find the total latency for the display data. 1583 */ 1584 disp_latency_overhead = 8.0 / info->sclk; 1585 mc_latency_mclk = mc_latency_mclk + disp_latency_overhead + cur_latency_mclk; 1586 mc_latency_sclk = mc_latency_sclk + disp_latency_overhead + cur_latency_sclk; 1587 disp_latency = MAX(mc_latency_mclk, mc_latency_sclk); 1588 1589 /* setup Max GRPH_STOP_REQ default value */ 1590 if (IS_RV100_VARIANT) 1591 max_stop_req = 0x5c; 1592 else 1593 max_stop_req = 0x7c; 1594 1595 if (mode1) { 1596 /* CRTC1 1597 Set GRPH_BUFFER_CNTL register using h/w defined optimal values. 1598 GRPH_STOP_REQ <= MIN[ 0x7C, (CRTC_H_DISP + 1) * (bit depth) / 0x10 ] 1599 */ 1600 stop_req = mode1->HDisplay * pixel_bytes1 / 16; 1601 1602 if (stop_req > max_stop_req) 1603 stop_req = max_stop_req; 1604 1605 /* 1606 Find the drain rate of the display buffer. 1607 */ 1608 disp_drain_rate = pix_clk / (16.0/pixel_bytes1); 1609 1610 /* 1611 Find the critical point of the display buffer. 1612 */ 1613 critical_point= (uint32_t)(disp_drain_rate * disp_latency + 0.5); 1614 1615 /* ???? */ 1616 /* 1617 temp = (info->SavedReg.grph_buffer_cntl & RADEON_GRPH_CRITICAL_POINT_MASK) >> RADEON_GRPH_CRITICAL_POINT_SHIFT; 1618 if (critical_point < temp) critical_point = temp; 1619 */ 1620 if (info->DispPriority == 2) { 1621 critical_point = 0; 1622 } 1623 1624 /* 1625 The critical point should never be above max_stop_req-4. Setting 1626 GRPH_CRITICAL_CNTL = 0 will thus force high priority all the time. 1627 */ 1628 if (max_stop_req - critical_point < 4) critical_point = 0; 1629 1630 if (critical_point == 0 && mode2 && info->ChipFamily == CHIP_FAMILY_R300) { 1631 /* some R300 cards have problem with this set to 0, when CRTC2 is enabled.*/ 1632 critical_point = 0x10; 1633 } 1634 1635 temp = info->SavedReg->grph_buffer_cntl; 1636 temp &= ~(RADEON_GRPH_STOP_REQ_MASK); 1637 temp |= (stop_req << RADEON_GRPH_STOP_REQ_SHIFT); 1638 temp &= ~(RADEON_GRPH_START_REQ_MASK); 1639 if ((info->ChipFamily == CHIP_FAMILY_R350) && 1640 (stop_req > 0x15)) { 1641 stop_req -= 0x10; 1642 } 1643 temp |= (stop_req << RADEON_GRPH_START_REQ_SHIFT); 1644 1645 temp |= RADEON_GRPH_BUFFER_SIZE; 1646 temp &= ~(RADEON_GRPH_CRITICAL_CNTL | 1647 RADEON_GRPH_CRITICAL_AT_SOF | 1648 RADEON_GRPH_STOP_CNTL); 1649 /* 1650 Write the result into the register. 1651 */ 1652 OUTREG(RADEON_GRPH_BUFFER_CNTL, ((temp & ~RADEON_GRPH_CRITICAL_POINT_MASK) | 1653 (critical_point << RADEON_GRPH_CRITICAL_POINT_SHIFT))); 1654 1655#if 0 1656 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 1657 (info->ChipFamily == CHIP_FAMILY_RS480)) { 1658 /* attempt to program RS400 disp regs correctly ??? */ 1659 temp = info->SavedReg->disp1_req_cntl1; 1660 temp &= ~(RS400_DISP1_START_REQ_LEVEL_MASK | 1661 RS400_DISP1_STOP_REQ_LEVEL_MASK); 1662 OUTREG(RS400_DISP1_REQ_CNTL1, (temp | 1663 (critical_point << RS400_DISP1_START_REQ_LEVEL_SHIFT) | 1664 (critical_point << RS400_DISP1_STOP_REQ_LEVEL_SHIFT))); 1665 temp = info->SavedReg->dmif_mem_cntl1; 1666 temp &= ~(RS400_DISP1_CRITICAL_POINT_START_MASK | 1667 RS400_DISP1_CRITICAL_POINT_STOP_MASK); 1668 OUTREG(RS400_DMIF_MEM_CNTL1, (temp | 1669 (critical_point << RS400_DISP1_CRITICAL_POINT_START_SHIFT) | 1670 (critical_point << RS400_DISP1_CRITICAL_POINT_STOP_SHIFT))); 1671 } 1672#endif 1673 1674 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 1675 "GRPH_BUFFER_CNTL from %x to %x\n", 1676 (unsigned int)info->SavedReg->grph_buffer_cntl, 1677 (unsigned int)INREG(RADEON_GRPH_BUFFER_CNTL)); 1678 } 1679 1680 if (mode2) { 1681 stop_req = mode2->HDisplay * pixel_bytes2 / 16; 1682 1683 if (stop_req > max_stop_req) stop_req = max_stop_req; 1684 1685 /* 1686 Find the drain rate of the display buffer. 1687 */ 1688 disp_drain_rate2 = pix_clk2 / (16.0/pixel_bytes2); 1689 1690 temp = info->SavedReg->grph2_buffer_cntl; 1691 temp &= ~(RADEON_GRPH_STOP_REQ_MASK); 1692 temp |= (stop_req << RADEON_GRPH_STOP_REQ_SHIFT); 1693 temp &= ~(RADEON_GRPH_START_REQ_MASK); 1694 if ((info->ChipFamily == CHIP_FAMILY_R350) && 1695 (stop_req > 0x15)) { 1696 stop_req -= 0x10; 1697 } 1698 temp |= (stop_req << RADEON_GRPH_START_REQ_SHIFT); 1699 temp |= RADEON_GRPH_BUFFER_SIZE; 1700 temp &= ~(RADEON_GRPH_CRITICAL_CNTL | 1701 RADEON_GRPH_CRITICAL_AT_SOF | 1702 RADEON_GRPH_STOP_CNTL); 1703 1704 if ((info->ChipFamily == CHIP_FAMILY_RS100) || 1705 (info->ChipFamily == CHIP_FAMILY_RS200)) 1706 critical_point2 = 0; 1707 else { 1708 read_return_rate = MIN(info->sclk, info->mclk*(info->RamWidth*(info->IsDDR+1)/128)); 1709 if (mode1) 1710 time_disp1_drop_priority = critical_point / (read_return_rate - disp_drain_rate); 1711 else 1712 time_disp1_drop_priority = 0; 1713 1714 critical_point2 = (uint32_t)((disp_latency + time_disp1_drop_priority + 1715 disp_latency) * disp_drain_rate2 + 0.5); 1716 1717 if (info->DispPriority == 2) { 1718 critical_point2 = 0; 1719 } 1720 1721 if (max_stop_req - critical_point2 < 4) critical_point2 = 0; 1722 1723 } 1724 1725 if (critical_point2 == 0 && info->ChipFamily == CHIP_FAMILY_R300) { 1726 /* some R300 cards have problem with this set to 0 */ 1727 critical_point2 = 0x10; 1728 } 1729 1730 OUTREG(RADEON_GRPH2_BUFFER_CNTL, ((temp & ~RADEON_GRPH_CRITICAL_POINT_MASK) | 1731 (critical_point2 << RADEON_GRPH_CRITICAL_POINT_SHIFT))); 1732 1733 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 1734 (info->ChipFamily == CHIP_FAMILY_RS480)) { 1735#if 0 1736 /* attempt to program RS400 disp2 regs correctly ??? */ 1737 temp = info->SavedReg->disp2_req_cntl1; 1738 temp &= ~(RS400_DISP2_START_REQ_LEVEL_MASK | 1739 RS400_DISP2_STOP_REQ_LEVEL_MASK); 1740 OUTREG(RS400_DISP2_REQ_CNTL1, (temp | 1741 (critical_point2 << RS400_DISP1_START_REQ_LEVEL_SHIFT) | 1742 (critical_point2 << RS400_DISP1_STOP_REQ_LEVEL_SHIFT))); 1743 temp = info->SavedReg->disp2_req_cntl2; 1744 temp &= ~(RS400_DISP2_CRITICAL_POINT_START_MASK | 1745 RS400_DISP2_CRITICAL_POINT_STOP_MASK); 1746 OUTREG(RS400_DISP2_REQ_CNTL2, (temp | 1747 (critical_point2 << RS400_DISP2_CRITICAL_POINT_START_SHIFT) | 1748 (critical_point2 << RS400_DISP2_CRITICAL_POINT_STOP_SHIFT))); 1749#endif 1750 OUTREG(RS400_DISP2_REQ_CNTL1, 0x105DC1CC); 1751 OUTREG(RS400_DISP2_REQ_CNTL2, 0x2749D000); 1752 OUTREG(RS400_DMIF_MEM_CNTL1, 0x29CA71DC); 1753 OUTREG(RS400_DISP1_REQ_CNTL1, 0x28FBC3AC); 1754 } 1755 1756 xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, RADEON_LOGLEVEL_DEBUG, 1757 "GRPH2_BUFFER_CNTL from %x to %x\n", 1758 (unsigned int)info->SavedReg->grph2_buffer_cntl, 1759 (unsigned int)INREG(RADEON_GRPH2_BUFFER_CNTL)); 1760 } 1761} 1762 1763void 1764legacy_crtc_mode_set(xf86CrtcPtr crtc, DisplayModePtr mode, 1765 DisplayModePtr adjusted_mode, int x, int y) 1766{ 1767 ScrnInfoPtr pScrn = crtc->scrn; 1768 xf86CrtcConfigPtr xf86_config = XF86_CRTC_CONFIG_PTR(pScrn); 1769 RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; 1770 RADEONInfoPtr info = RADEONPTR(pScrn); 1771 int i = 0; 1772 double dot_clock = 0; 1773 int pll_flags = RADEON_PLL_LEGACY; 1774 Bool update_tv_routing = FALSE; 1775 Bool tilingChanged = FALSE; 1776 1777 if (adjusted_mode->Clock > 200000) /* range limits??? */ 1778 pll_flags |= RADEON_PLL_PREFER_HIGH_FB_DIV; 1779 else 1780 pll_flags |= RADEON_PLL_PREFER_LOW_REF_DIV; 1781 1782 if (info->allowColorTiling) { 1783 radeon_crtc->can_tile = (adjusted_mode->Flags & (V_DBLSCAN | V_INTERLACE)) ? FALSE : TRUE; 1784 tilingChanged = RADEONSetTiling(pScrn); 1785 } 1786 1787 for (i = 0; i < xf86_config->num_output; i++) { 1788 xf86OutputPtr output = xf86_config->output[i]; 1789 RADEONOutputPrivatePtr radeon_output = output->driver_private; 1790 1791 if (output->crtc == crtc) { 1792 if (radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT | 1793 ATOM_DEVICE_DFP_SUPPORT)) 1794 pll_flags |= RADEON_PLL_NO_ODD_POST_DIV; 1795 if (radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT)) 1796 pll_flags |= (RADEON_PLL_USE_BIOS_DIVS | RADEON_PLL_USE_REF_DIV); 1797 } 1798 } 1799 1800 1801 ErrorF("init memmap\n"); 1802 RADEONInitMemMapRegisters(pScrn, info->ModeReg, info); 1803 ErrorF("init common\n"); 1804 RADEONInitCommonRegisters(info->ModeReg, info); 1805 1806 RADEONInitSurfaceCntl(crtc, info->ModeReg); 1807 1808 switch (radeon_crtc->crtc_id) { 1809 case 0: 1810 ErrorF("init crtc1\n"); 1811 RADEONInitCrtcRegisters(crtc, info->ModeReg, adjusted_mode); 1812 RADEONInitCrtcBase(crtc, info->ModeReg, x, y); 1813 dot_clock = adjusted_mode->Clock / 1000.0; 1814 if (dot_clock) { 1815 ErrorF("init pll1\n"); 1816 RADEONInitPLLRegisters(crtc, info->ModeReg, &info->pll, adjusted_mode, pll_flags); 1817 } else { 1818 info->ModeReg->ppll_ref_div = info->SavedReg->ppll_ref_div; 1819 info->ModeReg->ppll_div_3 = info->SavedReg->ppll_div_3; 1820 info->ModeReg->htotal_cntl = info->SavedReg->htotal_cntl; 1821 } 1822 break; 1823 case 1: 1824 ErrorF("init crtc2\n"); 1825 RADEONInitCrtc2Registers(crtc, info->ModeReg, adjusted_mode); 1826 RADEONInitCrtc2Base(crtc, info->ModeReg, x, y); 1827 dot_clock = adjusted_mode->Clock / 1000.0; 1828 if (dot_clock) { 1829 ErrorF("init pll2\n"); 1830 RADEONInitPLL2Registers(crtc, info->ModeReg, &info->pll, adjusted_mode, pll_flags); 1831 } 1832 break; 1833 } 1834 1835 for (i = 0; i < xf86_config->num_output; i++) { 1836 xf86OutputPtr output = xf86_config->output[i]; 1837 RADEONOutputPrivatePtr radeon_output = output->driver_private; 1838 1839 if (output->crtc == crtc) { 1840 if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) { 1841 switch (radeon_crtc->crtc_id) { 1842 case 0: 1843 RADEONAdjustCrtcRegistersForTV(pScrn, info->ModeReg, adjusted_mode, output); 1844 RADEONAdjustPLLRegistersForTV(pScrn, info->ModeReg, adjusted_mode, output); 1845 update_tv_routing = TRUE; 1846 break; 1847 case 1: 1848 RADEONAdjustCrtc2RegistersForTV(pScrn, info->ModeReg, adjusted_mode, output); 1849 RADEONAdjustPLL2RegistersForTV(pScrn, info->ModeReg, adjusted_mode, output); 1850 break; 1851 } 1852 } 1853 } 1854 } 1855 1856 ErrorF("restore memmap\n"); 1857 RADEONRestoreMemMapRegisters(pScrn, info->ModeReg); 1858 ErrorF("restore common\n"); 1859 RADEONRestoreCommonRegisters(pScrn, info->ModeReg); 1860 1861 switch (radeon_crtc->crtc_id) { 1862 case 0: 1863 ErrorF("restore crtc1\n"); 1864 RADEONRestoreCrtcRegisters(pScrn, info->ModeReg); 1865 ErrorF("restore pll1\n"); 1866 RADEONRestorePLLRegisters(pScrn, info->ModeReg); 1867 break; 1868 case 1: 1869 ErrorF("restore crtc2\n"); 1870 RADEONRestoreCrtc2Registers(pScrn, info->ModeReg); 1871 ErrorF("restore pll2\n"); 1872 RADEONRestorePLL2Registers(pScrn, info->ModeReg); 1873 break; 1874 } 1875 1876 /* pixclks_cntl handles tv-out clock routing */ 1877 if (update_tv_routing) 1878 radeon_update_tv_routing(pScrn, info->ModeReg); 1879 1880 if (info->DispPriority) 1881 RADEONInitDispBandwidth(pScrn); 1882 1883 radeon_crtc->initialized = TRUE; 1884 1885 if (tilingChanged) { 1886 /* need to redraw front buffer, I guess this can be considered a hack ? */ 1887 /* if this is called during ScreenInit() we don't have pScrn->pScreen yet */ 1888 if (pScrn->pScreen) 1889 xf86EnableDisableFBAccess(pScrn->scrnIndex, FALSE); 1890 RADEONChangeSurfaces(pScrn); 1891 if (pScrn->pScreen) 1892 xf86EnableDisableFBAccess(pScrn->scrnIndex, TRUE); 1893 /* xf86SetRootClip would do, but can't access that here */ 1894 } 1895 1896 /* reset ecp_div for Xv */ 1897 info->ecp_div = -1; 1898 1899} 1900 1901