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_tv.h" 49 #include "radeon_atombios.h" 50 51 #include "ati_pciids_gen.h" 52 53 static RADEONMonitorType radeon_detect_tv(ScrnInfoPtr pScrn); 54 static RADEONMonitorType radeon_detect_primary_dac(ScrnInfoPtr pScrn, Bool color); 55 static RADEONMonitorType radeon_detect_tv_dac(ScrnInfoPtr pScrn, Bool color); 56 static RADEONMonitorType radeon_detect_ext_dac(ScrnInfoPtr pScrn); 57 58 extern Bool 59 RADEONI2CInit(ScrnInfoPtr pScrn, I2CBusPtr *bus_ptr, char *name, RADEONI2CBusPtr pRADEONI2CBus); 60 61 static const RADEONTMDSPll default_tmds_pll[CHIP_FAMILY_LAST][4] = 62 { 63 {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_UNKNOW*/ 64 {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_LEGACY*/ 65 {{12000, 0xa1b}, {0xffffffff, 0xa3f}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RADEON*/ 66 {{12000, 0xa1b}, {0xffffffff, 0xa3f}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RV100*/ 67 {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RS100*/ 68 {{15000, 0xa1b}, {0xffffffff, 0xa3f}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RV200*/ 69 {{12000, 0xa1b}, {0xffffffff, 0xa3f}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RS200*/ 70 {{15000, 0xa1b}, {0xffffffff, 0xa3f}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_R200*/ 71 {{15500, 0x81b}, {0xffffffff, 0x83f}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RV250*/ 72 {{0, 0}, {0, 0}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RS300*/ 73 {{13000, 0x400f4}, {15000, 0x400f7}, {0xffffffff, 0x40111}, {0, 0}}, /*CHIP_FAMILY_RV280*/ 74 {{0xffffffff, 0xb01cb}, {0, 0}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_R300*/ 75 {{0xffffffff, 0xb01cb}, {0, 0}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_R350*/ 76 {{15000, 0xb0155}, {0xffffffff, 0xb01cb}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RV350*/ 77 {{15000, 0xb0155}, {0xffffffff, 0xb01cb}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RV380*/ 78 {{0xffffffff, 0xb01cb}, {0, 0}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_R420*/ 79 {{0xffffffff, 0xb01cb}, {0, 0}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RV410*/ /* FIXME: just values from r420 used... */ 80 {{15000, 0xb0155}, {0xffffffff, 0xb01cb}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RS400*/ /* FIXME: just values from rv380 used... */ 81 {{15000, 0xb0155}, {0xffffffff, 0xb01cb}, {0, 0}, {0, 0}}, /*CHIP_FAMILY_RS480*/ /* FIXME: just values from rv380 used... */ 82 }; 83 84 static const uint32_t default_tvdac_adj [CHIP_FAMILY_LAST] = 85 { 86 0x00000000, /* unknown */ 87 0x00000000, /* legacy */ 88 0x00000000, /* r100 */ 89 0x00280000, /* rv100 */ 90 0x00000000, /* rs100 */ 91 0x00880000, /* rv200 */ 92 0x00000000, /* rs200 */ 93 0x00000000, /* r200 */ 94 0x00770000, /* rv250 */ 95 0x00290000, /* rs300 */ 96 0x00560000, /* rv280 */ 97 0x00780000, /* r300 */ 98 0x00770000, /* r350 */ 99 0x00780000, /* rv350 */ 100 0x00780000, /* rv380 */ 101 0x01080000, /* r420 */ 102 0x01080000, /* rv410 */ /* FIXME: just values from r420 used... */ 103 0x00780000, /* rs400 */ /* FIXME: just values from rv380 used... */ 104 0x00780000, /* rs480 */ /* FIXME: just values from rv380 used... */ 105 }; 106 107 void 108 RADEONGetTVDacAdjInfo(ScrnInfoPtr pScrn, radeon_tvdac_ptr tvdac) 109 { 110 RADEONInfoPtr info = RADEONPTR(pScrn); 111 112 if (!RADEONGetDAC2InfoFromBIOS(pScrn, tvdac)) { 113 tvdac->ps2_tvdac_adj = default_tvdac_adj[info->ChipFamily]; 114 if (info->IsMobility) { /* some mobility chips may different */ 115 if (info->ChipFamily == CHIP_FAMILY_RV250) 116 tvdac->ps2_tvdac_adj = 0x00880000; 117 } 118 tvdac->pal_tvdac_adj = tvdac->ps2_tvdac_adj; 119 tvdac->ntsc_tvdac_adj = tvdac->ps2_tvdac_adj; 120 } 121 } 122 123 void 124 RADEONGetTMDSInfoFromTable(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds) 125 { 126 RADEONInfoPtr info = RADEONPTR(pScrn); 127 int i; 128 129 for (i = 0; i < 4; i++) { 130 tmds->tmds_pll[i].value = default_tmds_pll[info->ChipFamily][i].value; 131 tmds->tmds_pll[i].freq = default_tmds_pll[info->ChipFamily][i].freq; 132 } 133 } 134 135 void 136 RADEONGetTMDSInfo(ScrnInfoPtr pScrn, radeon_tmds_ptr tmds) 137 { 138 int i; 139 140 for (i = 0; i < 4; i++) { 141 tmds->tmds_pll[i].value = 0; 142 tmds->tmds_pll[i].freq = 0; 143 } 144 145 if (!RADEONGetTMDSInfoFromBIOS(pScrn, tmds)) 146 RADEONGetTMDSInfoFromTable(pScrn, tmds); 147 } 148 149 void 150 RADEONGetExtTMDSInfo(ScrnInfoPtr pScrn, radeon_dvo_ptr dvo) 151 { 152 RADEONInfoPtr info = RADEONPTR(pScrn); 153 154 if (!info->IsAtomBios) { 155 #if defined(__powerpc__) 156 dvo->dvo_i2c = legacy_setup_i2c_bus(RADEON_GPIO_MONID); 157 dvo->dvo_i2c_slave_addr = 0x70; 158 #else 159 if (!RADEONGetExtTMDSInfoFromBIOS(pScrn, dvo)) { 160 dvo->dvo_i2c = legacy_setup_i2c_bus(RADEON_GPIO_CRT2_DDC); 161 dvo->dvo_i2c_slave_addr = 0x70; 162 } 163 #endif 164 if (RADEONI2CInit(pScrn, &dvo->pI2CBus, "DVO", &dvo->dvo_i2c)) { 165 dvo->DVOChip = 166 RADEONDVODeviceInit(dvo->pI2CBus, dvo->dvo_i2c_slave_addr); 167 if (!dvo->DVOChip) 168 free(dvo->pI2CBus); 169 } 170 } 171 } 172 173 static void 174 RADEONGetPanelInfoFromReg (ScrnInfoPtr pScrn, radeon_lvds_ptr lvds) 175 { 176 RADEONInfoPtr info = RADEONPTR(pScrn); 177 unsigned char *RADEONMMIO = info->MMIO; 178 radeon_native_mode_ptr native_mode = &lvds->native_mode; 179 uint32_t fp_vert_stretch = INREG(RADEON_FP_VERT_STRETCH); 180 uint32_t fp_horz_stretch = INREG(RADEON_FP_HORZ_STRETCH); 181 182 lvds->PanelPwrDly = 200; 183 if (fp_vert_stretch & RADEON_VERT_STRETCH_ENABLE) { 184 native_mode->PanelYRes = ((fp_vert_stretch & RADEON_VERT_PANEL_SIZE) >> 185 RADEON_VERT_PANEL_SHIFT) + 1; 186 } else { 187 native_mode->PanelYRes = (INREG(RADEON_CRTC_V_TOTAL_DISP)>>16) + 1; 188 } 189 if (fp_horz_stretch & RADEON_HORZ_STRETCH_ENABLE) { 190 native_mode->PanelXRes = (((fp_horz_stretch & RADEON_HORZ_PANEL_SIZE) >> 191 RADEON_HORZ_PANEL_SHIFT) + 1) * 8; 192 } else { 193 native_mode->PanelXRes = ((INREG(RADEON_CRTC_H_TOTAL_DISP)>>16) + 1) * 8; 194 } 195 196 if ((native_mode->PanelXRes < 640) || (native_mode->PanelYRes < 480)) { 197 native_mode->PanelXRes = 640; 198 native_mode->PanelYRes = 480; 199 } 200 201 // move this to crtc function 202 if (xf86ReturnOptValBool(info->Options, OPTION_LVDS_PROBE_PLL, TRUE)) { 203 uint32_t ppll_div_sel, ppll_val; 204 205 ppll_div_sel = INREG8(RADEON_CLOCK_CNTL_INDEX + 1) & 0x3; 206 RADEONPllErrataAfterIndex(info); 207 ppll_val = INPLL(pScrn, RADEON_PPLL_DIV_0 + ppll_div_sel); 208 if ((ppll_val & 0x000707ff) == 0x1bb) 209 goto noprobe; 210 info->FeedbackDivider = ppll_val & 0x7ff; 211 info->PostDivider = (ppll_val >> 16) & 0x7; 212 info->RefDivider = info->pll.reference_div; 213 info->UseBiosDividers = TRUE; 214 215 xf86DrvMsg(pScrn->scrnIndex, X_INFO, 216 "Existing panel PLL dividers will be used.\n"); 217 } 218 noprobe: 219 220 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, 221 "Panel size %dx%d is derived, this may not be correct.\n" 222 "If not, use PanelSize option to overwrite this setting\n", 223 native_mode->PanelXRes, native_mode->PanelYRes); 224 } 225 226 void 227 RADEONGetLVDSInfo (ScrnInfoPtr pScrn, radeon_lvds_ptr lvds) 228 { 229 RADEONInfoPtr info = RADEONPTR(pScrn); 230 radeon_native_mode_ptr native_mode = &lvds->native_mode; 231 const char* s; 232 233 if (!RADEONGetLVDSInfoFromBIOS(pScrn, lvds)) 234 RADEONGetPanelInfoFromReg(pScrn, lvds); 235 236 if ((s = xf86GetOptValString(info->Options, OPTION_PANEL_SIZE))) { 237 lvds->PanelPwrDly = 200; 238 if (sscanf (s, "%dx%d", &native_mode->PanelXRes, &native_mode->PanelYRes) != 2) { 239 xf86DrvMsg(pScrn->scrnIndex, X_WARNING, "Invalid PanelSize option: %s\n", s); 240 RADEONGetPanelInfoFromReg(pScrn, lvds); 241 } 242 } 243 } 244 245 void 246 RADEONRestoreDACRegisters(ScrnInfoPtr pScrn, 247 RADEONSavePtr restore) 248 { 249 RADEONInfoPtr info = RADEONPTR(pScrn); 250 unsigned char *RADEONMMIO = info->MMIO; 251 252 if (IS_R300_VARIANT) 253 OUTREGP(RADEON_GPIOPAD_A, restore->gpiopad_a, ~1); 254 255 OUTREGP(RADEON_DAC_CNTL, 256 restore->dac_cntl, 257 RADEON_DAC_RANGE_CNTL | 258 RADEON_DAC_BLANKING); 259 260 OUTREG(RADEON_DAC_CNTL2, restore->dac2_cntl); 261 262 if ((info->ChipFamily != CHIP_FAMILY_RADEON) && 263 (info->ChipFamily != CHIP_FAMILY_R200)) 264 OUTREG (RADEON_TV_DAC_CNTL, restore->tv_dac_cntl); 265 266 OUTREG(RADEON_DISP_OUTPUT_CNTL, restore->disp_output_cntl); 267 268 if ((info->ChipFamily == CHIP_FAMILY_R200) || 269 IS_R300_VARIANT) { 270 OUTREG(RADEON_DISP_TV_OUT_CNTL, restore->disp_tv_out_cntl); 271 } else { 272 OUTREG(RADEON_DISP_HW_DEBUG, restore->disp_hw_debug); 273 } 274 275 OUTREG(RADEON_DAC_MACRO_CNTL, restore->dac_macro_cntl); 276 277 /* R200 DAC connected via DVO */ 278 if (info->ChipFamily == CHIP_FAMILY_R200) 279 OUTREG(RADEON_FP2_GEN_CNTL, restore->fp2_gen_cntl); 280 } 281 282 283 /* Write TMDS registers */ 284 void 285 RADEONRestoreFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore) 286 { 287 RADEONInfoPtr info = RADEONPTR(pScrn); 288 RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); 289 unsigned char *RADEONMMIO = info->MMIO; 290 291 OUTREG(RADEON_TMDS_PLL_CNTL, restore->tmds_pll_cntl); 292 OUTREG(RADEON_TMDS_TRANSMITTER_CNTL,restore->tmds_transmitter_cntl); 293 OUTREG(RADEON_FP_GEN_CNTL, restore->fp_gen_cntl); 294 295 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 296 (info->ChipFamily == CHIP_FAMILY_RS480)) { 297 OUTREG(RS400_FP_2ND_GEN_CNTL, restore->fp_2nd_gen_cntl); 298 /*OUTREG(RS400_TMDS2_CNTL, restore->tmds2_cntl);*/ 299 OUTREG(RS400_TMDS2_TRANSMITTER_CNTL, restore->tmds2_transmitter_cntl); 300 } 301 302 /* old AIW Radeon has some BIOS initialization problem 303 * with display buffer underflow, only occurs to DFP 304 */ 305 if (!pRADEONEnt->HasCRTC2) 306 OUTREG(RADEON_GRPH_BUFFER_CNTL, 307 INREG(RADEON_GRPH_BUFFER_CNTL) & ~0x7f0000); 308 309 } 310 311 /* Write FP2 registers */ 312 void 313 RADEONRestoreFP2Registers(ScrnInfoPtr pScrn, RADEONSavePtr restore) 314 { 315 RADEONInfoPtr info = RADEONPTR(pScrn); 316 unsigned char *RADEONMMIO = info->MMIO; 317 318 OUTREG(RADEON_FP2_GEN_CNTL, restore->fp2_gen_cntl); 319 320 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 321 (info->ChipFamily == CHIP_FAMILY_RS480)) 322 OUTREG(RS400_FP2_2_GEN_CNTL, restore->fp2_2_gen_cntl); 323 } 324 325 /* Write RMX registers */ 326 void 327 RADEONRestoreRMXRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore) 328 { 329 RADEONInfoPtr info = RADEONPTR(pScrn); 330 unsigned char *RADEONMMIO = info->MMIO; 331 332 OUTREG(RADEON_FP_HORZ_STRETCH, restore->fp_horz_stretch); 333 OUTREG(RADEON_FP_VERT_STRETCH, restore->fp_vert_stretch); 334 OUTREG(RADEON_CRTC_MORE_CNTL, restore->crtc_more_cntl); 335 OUTREG(RADEON_FP_HORZ_VERT_ACTIVE, restore->fp_horz_vert_active); 336 OUTREG(RADEON_FP_H_SYNC_STRT_WID, restore->fp_h_sync_strt_wid); 337 OUTREG(RADEON_FP_V_SYNC_STRT_WID, restore->fp_v_sync_strt_wid); 338 OUTREG(RADEON_FP_CRTC_H_TOTAL_DISP, restore->fp_crtc_h_total_disp); 339 OUTREG(RADEON_FP_CRTC_V_TOTAL_DISP, restore->fp_crtc_v_total_disp); 340 341 } 342 343 /* Write LVDS registers */ 344 void 345 RADEONRestoreLVDSRegisters(ScrnInfoPtr pScrn, RADEONSavePtr restore) 346 { 347 RADEONInfoPtr info = RADEONPTR(pScrn); 348 unsigned char *RADEONMMIO = info->MMIO; 349 350 if (info->IsMobility) { 351 OUTREG(RADEON_LVDS_GEN_CNTL, restore->lvds_gen_cntl); 352 /*OUTREG(RADEON_LVDS_PLL_CNTL, restore->lvds_pll_cntl);*/ 353 354 if (info->ChipFamily == CHIP_FAMILY_RV410) { 355 OUTREG(RADEON_CLOCK_CNTL_INDEX, 0); 356 } 357 } 358 359 } 360 361 void 362 RADEONSaveDACRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) 363 { 364 RADEONInfoPtr info = RADEONPTR(pScrn); 365 unsigned char *RADEONMMIO = info->MMIO; 366 367 save->dac_cntl = INREG(RADEON_DAC_CNTL); 368 save->dac2_cntl = INREG(RADEON_DAC_CNTL2); 369 save->tv_dac_cntl = INREG(RADEON_TV_DAC_CNTL); 370 save->disp_output_cntl = INREG(RADEON_DISP_OUTPUT_CNTL); 371 save->disp_tv_out_cntl = INREG(RADEON_DISP_TV_OUT_CNTL); 372 save->disp_hw_debug = INREG(RADEON_DISP_HW_DEBUG); 373 save->dac_macro_cntl = INREG(RADEON_DAC_MACRO_CNTL); 374 save->gpiopad_a = INREG(RADEON_GPIOPAD_A); 375 376 } 377 378 /* Read flat panel registers */ 379 void 380 RADEONSaveFPRegisters(ScrnInfoPtr pScrn, RADEONSavePtr save) 381 { 382 RADEONInfoPtr info = RADEONPTR(pScrn); 383 unsigned char *RADEONMMIO = info->MMIO; 384 385 save->fp_gen_cntl = INREG(RADEON_FP_GEN_CNTL); 386 save->fp2_gen_cntl = INREG (RADEON_FP2_GEN_CNTL); 387 save->fp_horz_stretch = INREG(RADEON_FP_HORZ_STRETCH); 388 save->fp_vert_stretch = INREG(RADEON_FP_VERT_STRETCH); 389 save->fp_horz_vert_active = INREG(RADEON_FP_HORZ_VERT_ACTIVE); 390 save->crtc_more_cntl = INREG(RADEON_CRTC_MORE_CNTL); 391 save->lvds_gen_cntl = INREG(RADEON_LVDS_GEN_CNTL); 392 save->lvds_pll_cntl = INREG(RADEON_LVDS_PLL_CNTL); 393 save->tmds_pll_cntl = INREG(RADEON_TMDS_PLL_CNTL); 394 save->tmds_transmitter_cntl= INREG(RADEON_TMDS_TRANSMITTER_CNTL); 395 396 save->fp_h_sync_strt_wid = INREG(RADEON_FP_H_SYNC_STRT_WID); 397 save->fp_v_sync_strt_wid = INREG(RADEON_FP_V_SYNC_STRT_WID); 398 save->fp_crtc_h_total_disp = INREG(RADEON_FP_CRTC_H_TOTAL_DISP); 399 save->fp_crtc_v_total_disp = INREG(RADEON_FP_CRTC_V_TOTAL_DISP); 400 401 if (info->ChipFamily == CHIP_FAMILY_RV280) { 402 /* bit 22 of TMDS_PLL_CNTL is read-back inverted */ 403 save->tmds_pll_cntl ^= (1 << 22); 404 } 405 406 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 407 (info->ChipFamily == CHIP_FAMILY_RS480)) { 408 save->fp_2nd_gen_cntl = INREG(RS400_FP_2ND_GEN_CNTL); 409 save->fp2_2_gen_cntl = INREG(RS400_FP2_2_GEN_CNTL); 410 save->tmds2_cntl = INREG(RS400_TMDS2_CNTL); 411 save->tmds2_transmitter_cntl = INREG(RS400_TMDS2_TRANSMITTER_CNTL); 412 } 413 414 } 415 416 Bool 417 RADEONDVOReadByte(I2CDevPtr dvo, int addr, uint8_t *ch) 418 { 419 if (!xf86I2CReadByte(dvo, addr, ch)) { 420 xf86DrvMsg(dvo->pI2CBus->scrnIndex, X_ERROR, 421 "Unable to read from %s Slave %d.\n", 422 dvo->pI2CBus->BusName, dvo->SlaveAddr); 423 return FALSE; 424 } 425 return TRUE; 426 } 427 428 Bool 429 RADEONDVOWriteByte(I2CDevPtr dvo, int addr, uint8_t ch) 430 { 431 if (!xf86I2CWriteByte(dvo, addr, ch)) { 432 xf86DrvMsg(dvo->pI2CBus->scrnIndex, X_ERROR, 433 "Unable to write to %s Slave %d.\n", 434 dvo->pI2CBus->BusName, dvo->SlaveAddr); 435 return FALSE; 436 } 437 return TRUE; 438 } 439 440 I2CDevPtr 441 RADEONDVODeviceInit(I2CBusPtr b, I2CSlaveAddr addr) 442 { 443 I2CDevPtr dvo; 444 445 dvo = calloc(1, sizeof(I2CDevRec)); 446 if (dvo == NULL) 447 return NULL; 448 449 dvo->DevName = "RADEON DVO Controller"; 450 dvo->SlaveAddr = addr; 451 dvo->pI2CBus = b; 452 dvo->StartTimeout = b->StartTimeout; 453 dvo->BitTimeout = b->BitTimeout; 454 dvo->AcknTimeout = b->AcknTimeout; 455 dvo->ByteTimeout = b->ByteTimeout; 456 457 if (xf86I2CDevInit(dvo)) { 458 return dvo; 459 } 460 461 free(dvo); 462 return NULL; 463 } 464 465 static void 466 RADEONRestoreDVOChip(ScrnInfoPtr pScrn, xf86OutputPtr output) 467 { 468 RADEONInfoPtr info = RADEONPTR(pScrn); 469 radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output); 470 radeon_dvo_ptr dvo = NULL; 471 472 if (radeon_encoder == NULL) 473 return; 474 475 dvo = (radeon_dvo_ptr)radeon_encoder->dev_priv; 476 477 if (dvo == NULL) 478 return; 479 480 if (!dvo->DVOChip) 481 return; 482 483 RADEONI2CDoLock(output, dvo->pI2CBus, TRUE); 484 if (!RADEONInitExtTMDSInfoFromBIOS(output)) { 485 if (dvo->DVOChip) { 486 switch(info->ext_tmds_chip) { 487 case RADEON_SIL_164: 488 RADEONDVOWriteByte(dvo->DVOChip, 0x08, 0x30); 489 RADEONDVOWriteByte(dvo->DVOChip, 0x09, 0x00); 490 RADEONDVOWriteByte(dvo->DVOChip, 0x0a, 0x90); 491 RADEONDVOWriteByte(dvo->DVOChip, 0x0c, 0x89); 492 RADEONDVOWriteByte(dvo->DVOChip, 0x08, 0x3b); 493 break; 494 #if 0 495 /* needs work see bug 10418 */ 496 case RADEON_SIL_1178: 497 RADEONDVOWriteByte(dvo->DVOChip, 0x0f, 0x44); 498 RADEONDVOWriteByte(dvo->DVOChip, 0x0f, 0x4c); 499 RADEONDVOWriteByte(dvo->DVOChip, 0x0e, 0x01); 500 RADEONDVOWriteByte(dvo->DVOChip, 0x0a, 0x80); 501 RADEONDVOWriteByte(dvo->DVOChip, 0x09, 0x30); 502 RADEONDVOWriteByte(dvo->DVOChip, 0x0c, 0xc9); 503 RADEONDVOWriteByte(dvo->DVOChip, 0x0d, 0x70); 504 RADEONDVOWriteByte(dvo->DVOChip, 0x08, 0x32); 505 RADEONDVOWriteByte(dvo->DVOChip, 0x08, 0x33); 506 break; 507 #endif 508 default: 509 break; 510 } 511 } 512 } 513 RADEONI2CDoLock(output, dvo->pI2CBus, FALSE); 514 } 515 516 #if 0 517 static RADEONMonitorType 518 RADEONCrtIsPhysicallyConnected(ScrnInfoPtr pScrn, int IsCrtDac) 519 { 520 RADEONInfoPtr info = RADEONPTR(pScrn); 521 unsigned char *RADEONMMIO = info->MMIO; 522 int bConnected = 0; 523 524 /* the monitor either wasn't connected or it is a non-DDC CRT. 525 * try to probe it 526 */ 527 if(IsCrtDac) { 528 unsigned long ulOrigVCLK_ECP_CNTL; 529 unsigned long ulOrigDAC_CNTL; 530 unsigned long ulOrigDAC_MACRO_CNTL; 531 unsigned long ulOrigDAC_EXT_CNTL; 532 unsigned long ulOrigCRTC_EXT_CNTL; 533 unsigned long ulData; 534 unsigned long ulMask; 535 536 ulOrigVCLK_ECP_CNTL = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); 537 538 ulData = ulOrigVCLK_ECP_CNTL; 539 ulData &= ~(RADEON_PIXCLK_ALWAYS_ONb 540 | RADEON_PIXCLK_DAC_ALWAYS_ONb); 541 ulMask = ~(RADEON_PIXCLK_ALWAYS_ONb 542 |RADEON_PIXCLK_DAC_ALWAYS_ONb); 543 OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL, ulData, ulMask); 544 545 ulOrigCRTC_EXT_CNTL = INREG(RADEON_CRTC_EXT_CNTL); 546 ulData = ulOrigCRTC_EXT_CNTL; 547 ulData |= RADEON_CRTC_CRT_ON; 548 OUTREG(RADEON_CRTC_EXT_CNTL, ulData); 549 550 ulOrigDAC_EXT_CNTL = INREG(RADEON_DAC_EXT_CNTL); 551 ulData = ulOrigDAC_EXT_CNTL; 552 ulData &= ~RADEON_DAC_FORCE_DATA_MASK; 553 ulData |= (RADEON_DAC_FORCE_BLANK_OFF_EN 554 |RADEON_DAC_FORCE_DATA_EN 555 |RADEON_DAC_FORCE_DATA_SEL_MASK); 556 if ((info->ChipFamily == CHIP_FAMILY_RV250) || 557 (info->ChipFamily == CHIP_FAMILY_RV280)) 558 ulData |= (0x01b6 << RADEON_DAC_FORCE_DATA_SHIFT); 559 else 560 ulData |= (0x01ac << RADEON_DAC_FORCE_DATA_SHIFT); 561 562 OUTREG(RADEON_DAC_EXT_CNTL, ulData); 563 564 /* turn on power so testing can go through */ 565 ulOrigDAC_CNTL = INREG(RADEON_DAC_CNTL); 566 ulOrigDAC_CNTL &= ~RADEON_DAC_PDWN; 567 OUTREG(RADEON_DAC_CNTL, ulOrigDAC_CNTL); 568 569 ulOrigDAC_MACRO_CNTL = INREG(RADEON_DAC_MACRO_CNTL); 570 ulOrigDAC_MACRO_CNTL &= ~(RADEON_DAC_PDWN_R | RADEON_DAC_PDWN_G | 571 RADEON_DAC_PDWN_B); 572 OUTREG(RADEON_DAC_MACRO_CNTL, ulOrigDAC_MACRO_CNTL); 573 574 /* Enable comparators and set DAC range to PS2 (VGA) output level */ 575 ulData = ulOrigDAC_CNTL; 576 ulData |= RADEON_DAC_CMP_EN; 577 ulData &= ~RADEON_DAC_RANGE_CNTL_MASK; 578 ulData |= 0x2; 579 OUTREG(RADEON_DAC_CNTL, ulData); 580 581 /* Settle down */ 582 usleep(10000); 583 584 /* Read comparators */ 585 ulData = INREG(RADEON_DAC_CNTL); 586 bConnected = (RADEON_DAC_CMP_OUTPUT & ulData)?1:0; 587 588 /* Restore things */ 589 ulData = ulOrigVCLK_ECP_CNTL; 590 ulMask = 0xFFFFFFFFL; 591 OUTPLLP(pScrn, RADEON_VCLK_ECP_CNTL, ulData, ulMask); 592 593 OUTREG(RADEON_DAC_CNTL, ulOrigDAC_CNTL ); 594 OUTREG(RADEON_DAC_EXT_CNTL, ulOrigDAC_EXT_CNTL ); 595 OUTREG(RADEON_CRTC_EXT_CNTL, ulOrigCRTC_EXT_CNTL); 596 597 if (!bConnected) { 598 /* Power DAC down if CRT is not connected */ 599 ulOrigDAC_MACRO_CNTL = INREG(RADEON_DAC_MACRO_CNTL); 600 ulOrigDAC_MACRO_CNTL |= (RADEON_DAC_PDWN_R | RADEON_DAC_PDWN_G | 601 RADEON_DAC_PDWN_B); 602 OUTREG(RADEON_DAC_MACRO_CNTL, ulOrigDAC_MACRO_CNTL); 603 604 ulData = INREG(RADEON_DAC_CNTL); 605 ulData |= RADEON_DAC_PDWN; 606 OUTREG(RADEON_DAC_CNTL, ulData); 607 } 608 } else { /* TV DAC */ 609 610 /* This doesn't seem to work reliably (maybe worse on some OEM cards), 611 for now we always return false. If one wants to connected a 612 non-DDC monitor on the DVI port when CRT port is also connected, 613 he will need to explicitly tell the driver in the config file 614 with Option MonitorLayout. 615 */ 616 bConnected = FALSE; 617 618 #if 0 619 if (info->ChipFamily == CHIP_FAMILY_R200) { 620 unsigned long ulOrigGPIO_MONID; 621 unsigned long ulOrigFP2_GEN_CNTL; 622 unsigned long ulOrigDISP_OUTPUT_CNTL; 623 unsigned long ulOrigCRTC2_GEN_CNTL; 624 unsigned long ulOrigDISP_LIN_TRANS_GRPH_A; 625 unsigned long ulOrigDISP_LIN_TRANS_GRPH_B; 626 unsigned long ulOrigDISP_LIN_TRANS_GRPH_C; 627 unsigned long ulOrigDISP_LIN_TRANS_GRPH_D; 628 unsigned long ulOrigDISP_LIN_TRANS_GRPH_E; 629 unsigned long ulOrigDISP_LIN_TRANS_GRPH_F; 630 unsigned long ulOrigCRTC2_H_TOTAL_DISP; 631 unsigned long ulOrigCRTC2_V_TOTAL_DISP; 632 unsigned long ulOrigCRTC2_H_SYNC_STRT_WID; 633 unsigned long ulOrigCRTC2_V_SYNC_STRT_WID; 634 unsigned long ulData, i; 635 636 ulOrigGPIO_MONID = INREG(RADEON_GPIO_MONID); 637 ulOrigFP2_GEN_CNTL = INREG(RADEON_FP2_GEN_CNTL); 638 ulOrigDISP_OUTPUT_CNTL = INREG(RADEON_DISP_OUTPUT_CNTL); 639 ulOrigCRTC2_GEN_CNTL = INREG(RADEON_CRTC2_GEN_CNTL); 640 ulOrigDISP_LIN_TRANS_GRPH_A = INREG(RADEON_DISP_LIN_TRANS_GRPH_A); 641 ulOrigDISP_LIN_TRANS_GRPH_B = INREG(RADEON_DISP_LIN_TRANS_GRPH_B); 642 ulOrigDISP_LIN_TRANS_GRPH_C = INREG(RADEON_DISP_LIN_TRANS_GRPH_C); 643 ulOrigDISP_LIN_TRANS_GRPH_D = INREG(RADEON_DISP_LIN_TRANS_GRPH_D); 644 ulOrigDISP_LIN_TRANS_GRPH_E = INREG(RADEON_DISP_LIN_TRANS_GRPH_E); 645 ulOrigDISP_LIN_TRANS_GRPH_F = INREG(RADEON_DISP_LIN_TRANS_GRPH_F); 646 647 ulOrigCRTC2_H_TOTAL_DISP = INREG(RADEON_CRTC2_H_TOTAL_DISP); 648 ulOrigCRTC2_V_TOTAL_DISP = INREG(RADEON_CRTC2_V_TOTAL_DISP); 649 ulOrigCRTC2_H_SYNC_STRT_WID = INREG(RADEON_CRTC2_H_SYNC_STRT_WID); 650 ulOrigCRTC2_V_SYNC_STRT_WID = INREG(RADEON_CRTC2_V_SYNC_STRT_WID); 651 652 ulData = INREG(RADEON_GPIO_MONID); 653 ulData &= ~RADEON_GPIO_A_0; 654 OUTREG(RADEON_GPIO_MONID, ulData); 655 656 OUTREG(RADEON_FP2_GEN_CNTL, 0x0a000c0c); 657 658 OUTREG(RADEON_DISP_OUTPUT_CNTL, 0x00000012); 659 660 OUTREG(RADEON_CRTC2_GEN_CNTL, 0x06000000); 661 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_A, 0x00000000); 662 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_B, 0x000003f0); 663 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_C, 0x00000000); 664 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_D, 0x000003f0); 665 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_E, 0x00000000); 666 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_F, 0x000003f0); 667 OUTREG(RADEON_CRTC2_H_TOTAL_DISP, 0x01000008); 668 OUTREG(RADEON_CRTC2_H_SYNC_STRT_WID, 0x00000800); 669 OUTREG(RADEON_CRTC2_V_TOTAL_DISP, 0x00080001); 670 OUTREG(RADEON_CRTC2_V_SYNC_STRT_WID, 0x00000080); 671 672 for (i = 0; i < 200; i++) { 673 ulData = INREG(RADEON_GPIO_MONID); 674 bConnected = (ulData & RADEON_GPIO_Y_0)?1:0; 675 if (!bConnected) break; 676 677 usleep(1000); 678 } 679 680 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_A, ulOrigDISP_LIN_TRANS_GRPH_A); 681 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_B, ulOrigDISP_LIN_TRANS_GRPH_B); 682 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_C, ulOrigDISP_LIN_TRANS_GRPH_C); 683 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_D, ulOrigDISP_LIN_TRANS_GRPH_D); 684 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_E, ulOrigDISP_LIN_TRANS_GRPH_E); 685 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_F, ulOrigDISP_LIN_TRANS_GRPH_F); 686 OUTREG(RADEON_CRTC2_H_TOTAL_DISP, ulOrigCRTC2_H_TOTAL_DISP); 687 OUTREG(RADEON_CRTC2_V_TOTAL_DISP, ulOrigCRTC2_V_TOTAL_DISP); 688 OUTREG(RADEON_CRTC2_H_SYNC_STRT_WID, ulOrigCRTC2_H_SYNC_STRT_WID); 689 OUTREG(RADEON_CRTC2_V_SYNC_STRT_WID, ulOrigCRTC2_V_SYNC_STRT_WID); 690 OUTREG(RADEON_CRTC2_GEN_CNTL, ulOrigCRTC2_GEN_CNTL); 691 OUTREG(RADEON_DISP_OUTPUT_CNTL, ulOrigDISP_OUTPUT_CNTL); 692 OUTREG(RADEON_FP2_GEN_CNTL, ulOrigFP2_GEN_CNTL); 693 OUTREG(RADEON_GPIO_MONID, ulOrigGPIO_MONID); 694 } else { 695 unsigned long ulOrigPIXCLKSDATA; 696 unsigned long ulOrigTV_MASTER_CNTL; 697 unsigned long ulOrigTV_DAC_CNTL; 698 unsigned long ulOrigTV_PRE_DAC_MUX_CNTL; 699 unsigned long ulOrigDAC_CNTL2; 700 unsigned long ulData; 701 unsigned long ulMask; 702 703 ulOrigPIXCLKSDATA = INPLL(pScrn, RADEON_PIXCLKS_CNTL); 704 705 ulData = ulOrigPIXCLKSDATA; 706 ulData &= ~(RADEON_PIX2CLK_ALWAYS_ONb 707 | RADEON_PIX2CLK_DAC_ALWAYS_ONb); 708 ulMask = ~(RADEON_PIX2CLK_ALWAYS_ONb 709 | RADEON_PIX2CLK_DAC_ALWAYS_ONb); 710 OUTPLLP(pScrn, RADEON_PIXCLKS_CNTL, ulData, ulMask); 711 712 ulOrigTV_MASTER_CNTL = INREG(RADEON_TV_MASTER_CNTL); 713 ulData = ulOrigTV_MASTER_CNTL; 714 ulData &= ~RADEON_TVCLK_ALWAYS_ONb; 715 OUTREG(RADEON_TV_MASTER_CNTL, ulData); 716 717 ulOrigDAC_CNTL2 = INREG(RADEON_DAC_CNTL2); 718 ulData = ulOrigDAC_CNTL2; 719 ulData &= ~RADEON_DAC2_DAC2_CLK_SEL; 720 OUTREG(RADEON_DAC_CNTL2, ulData); 721 722 ulOrigTV_DAC_CNTL = INREG(RADEON_TV_DAC_CNTL); 723 724 ulData = 0x00880213; 725 OUTREG(RADEON_TV_DAC_CNTL, ulData); 726 727 ulOrigTV_PRE_DAC_MUX_CNTL = INREG(RADEON_TV_PRE_DAC_MUX_CNTL); 728 729 ulData = (RADEON_Y_RED_EN 730 | RADEON_C_GRN_EN 731 | RADEON_CMP_BLU_EN 732 | RADEON_RED_MX_FORCE_DAC_DATA 733 | RADEON_GRN_MX_FORCE_DAC_DATA 734 | RADEON_BLU_MX_FORCE_DAC_DATA); 735 if (IS_R300_VARIANT) 736 ulData |= 0x180 << RADEON_TV_FORCE_DAC_DATA_SHIFT; 737 else 738 ulData |= 0x1f5 << RADEON_TV_FORCE_DAC_DATA_SHIFT; 739 OUTREG(RADEON_TV_PRE_DAC_MUX_CNTL, ulData); 740 741 usleep(10000); 742 743 ulData = INREG(RADEON_TV_DAC_CNTL); 744 bConnected = (ulData & RADEON_TV_DAC_CMPOUT)?1:0; 745 746 ulData = ulOrigPIXCLKSDATA; 747 ulMask = 0xFFFFFFFFL; 748 OUTPLLP(pScrn, RADEON_PIXCLKS_CNTL, ulData, ulMask); 749 750 OUTREG(RADEON_TV_MASTER_CNTL, ulOrigTV_MASTER_CNTL); 751 OUTREG(RADEON_DAC_CNTL2, ulOrigDAC_CNTL2); 752 OUTREG(RADEON_TV_DAC_CNTL, ulOrigTV_DAC_CNTL); 753 OUTREG(RADEON_TV_PRE_DAC_MUX_CNTL, ulOrigTV_PRE_DAC_MUX_CNTL); 754 } 755 #endif 756 return MT_UNKNOWN; 757 } 758 759 return(bConnected ? MT_CRT : MT_NONE); 760 } 761 #endif 762 763 RADEONMonitorType 764 legacy_dac_detect(xf86OutputPtr output) 765 { 766 ScrnInfoPtr pScrn = output->scrn; 767 RADEONInfoPtr info = RADEONPTR(pScrn); 768 RADEONOutputPrivatePtr radeon_output = output->driver_private; 769 RADEONMonitorType found = MT_NONE; 770 771 if (radeon_output->devices & (ATOM_DEVICE_TV_SUPPORT)) { 772 if (xf86ReturnOptValBool(info->Options, OPTION_FORCE_TVOUT, FALSE)) { 773 if (radeon_output->ConnectorType == CONNECTOR_STV) 774 found = MT_STV; 775 else 776 found = MT_CTV; 777 } else { 778 if (radeon_output->load_detection) 779 found = radeon_detect_tv(pScrn); 780 } 781 } else if (radeon_output->devices & (ATOM_DEVICE_CRT2_SUPPORT)) { 782 if (info->encoders[ATOM_DEVICE_CRT2_INDEX] && 783 (info->encoders[ATOM_DEVICE_CRT2_INDEX]->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DAC1)) { 784 if (radeon_output->load_detection) 785 found = radeon_detect_primary_dac(pScrn, TRUE); 786 } else { 787 if (radeon_output->load_detection) { 788 if (info->ChipFamily == CHIP_FAMILY_R200) 789 found = radeon_detect_ext_dac(pScrn); 790 else 791 found = radeon_detect_tv_dac(pScrn, TRUE); 792 } 793 } 794 } else if (radeon_output->devices & (ATOM_DEVICE_CRT1_SUPPORT)) { 795 if (info->encoders[ATOM_DEVICE_CRT1_INDEX] && 796 (info->encoders[ATOM_DEVICE_CRT1_INDEX]->encoder_id == ENCODER_OBJECT_ID_INTERNAL_DAC1)) { 797 if (radeon_output->load_detection) 798 found = radeon_detect_primary_dac(pScrn, TRUE); 799 } else { 800 if (radeon_output->load_detection) { 801 if (info->ChipFamily == CHIP_FAMILY_R200) 802 found = radeon_detect_ext_dac(pScrn); 803 else 804 found = radeon_detect_tv_dac(pScrn, TRUE); 805 } 806 } 807 } 808 809 return found; 810 } 811 812 /* 813 * Powering done DAC, needed for DPMS problem with ViewSonic P817 (or its variant). 814 * 815 */ 816 static void 817 RADEONDacPowerSet(ScrnInfoPtr pScrn, Bool IsOn, Bool IsPrimaryDAC) 818 { 819 RADEONInfoPtr info = RADEONPTR(pScrn); 820 unsigned char *RADEONMMIO = info->MMIO; 821 822 if (IsPrimaryDAC) { 823 uint32_t dac_cntl; 824 uint32_t dac_macro_cntl = 0; 825 dac_cntl = INREG(RADEON_DAC_CNTL); 826 dac_macro_cntl = INREG(RADEON_DAC_MACRO_CNTL); 827 if (IsOn) { 828 dac_cntl &= ~RADEON_DAC_PDWN; 829 dac_macro_cntl &= ~(RADEON_DAC_PDWN_R | 830 RADEON_DAC_PDWN_G | 831 RADEON_DAC_PDWN_B); 832 } else { 833 dac_cntl |= RADEON_DAC_PDWN; 834 dac_macro_cntl |= (RADEON_DAC_PDWN_R | 835 RADEON_DAC_PDWN_G | 836 RADEON_DAC_PDWN_B); 837 } 838 OUTREG(RADEON_DAC_CNTL, dac_cntl); 839 OUTREG(RADEON_DAC_MACRO_CNTL, dac_macro_cntl); 840 } else { 841 uint32_t tv_dac_cntl; 842 uint32_t fp2_gen_cntl; 843 844 switch(info->ChipFamily) { 845 case CHIP_FAMILY_R420: 846 case CHIP_FAMILY_RV410: 847 tv_dac_cntl = INREG(RADEON_TV_DAC_CNTL); 848 if (IsOn) { 849 tv_dac_cntl &= ~(R420_TV_DAC_RDACPD | 850 R420_TV_DAC_GDACPD | 851 R420_TV_DAC_BDACPD | 852 RADEON_TV_DAC_BGSLEEP); 853 } else { 854 tv_dac_cntl |= (R420_TV_DAC_RDACPD | 855 R420_TV_DAC_GDACPD | 856 R420_TV_DAC_BDACPD | 857 RADEON_TV_DAC_BGSLEEP); 858 } 859 OUTREG(RADEON_TV_DAC_CNTL, tv_dac_cntl); 860 break; 861 case CHIP_FAMILY_R200: 862 fp2_gen_cntl = INREG(RADEON_FP2_GEN_CNTL); 863 if (IsOn) { 864 fp2_gen_cntl |= RADEON_FP2_DVO_EN; 865 } else { 866 fp2_gen_cntl &= ~RADEON_FP2_DVO_EN; 867 } 868 OUTREG(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); 869 break; 870 default: 871 tv_dac_cntl = INREG(RADEON_TV_DAC_CNTL); 872 if (IsOn) { 873 tv_dac_cntl &= ~(RADEON_TV_DAC_RDACPD | 874 RADEON_TV_DAC_GDACPD | 875 RADEON_TV_DAC_BDACPD | 876 RADEON_TV_DAC_BGSLEEP); 877 } else { 878 tv_dac_cntl |= (RADEON_TV_DAC_RDACPD | 879 RADEON_TV_DAC_GDACPD | 880 RADEON_TV_DAC_BDACPD | 881 RADEON_TV_DAC_BGSLEEP); 882 } 883 OUTREG(RADEON_TV_DAC_CNTL, tv_dac_cntl); 884 break; 885 } 886 } 887 } 888 889 void 890 legacy_output_dpms(xf86OutputPtr output, int mode) 891 { 892 ScrnInfoPtr pScrn = output->scrn; 893 RADEONInfoPtr info = RADEONPTR(pScrn); 894 RADEONSavePtr save = info->ModeReg; 895 unsigned char * RADEONMMIO = info->MMIO; 896 unsigned long tmp; 897 RADEONOutputPrivatePtr radeon_output = output->driver_private; 898 radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output); 899 900 if (radeon_encoder == NULL) 901 return; 902 903 switch(mode) { 904 case DPMSModeOn: 905 radeon_encoder->devices |= radeon_output->active_device; 906 switch (radeon_encoder->encoder_id) { 907 case ENCODER_OBJECT_ID_INTERNAL_LVDS: 908 { 909 radeon_lvds_ptr lvds = (radeon_lvds_ptr)radeon_encoder->dev_priv; 910 if (lvds == NULL) 911 return; 912 ErrorF("enable LVDS\n"); 913 tmp = INREG(RADEON_LVDS_GEN_CNTL); 914 tmp |= (RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN); 915 #if defined(__powerpc__) 916 /* not sure if this is needed on non-Macs */ 917 if (info->MacModel) 918 tmp |= RADEON_LVDS_BL_MOD_EN; 919 #endif 920 tmp &= ~(RADEON_LVDS_DISPLAY_DIS); 921 usleep (lvds->PanelPwrDly * 1000); 922 OUTREG(RADEON_LVDS_GEN_CNTL, tmp); 923 save->lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN); 924 save->lvds_gen_cntl &= ~(RADEON_LVDS_DISPLAY_DIS); 925 } 926 break; 927 case ENCODER_OBJECT_ID_INTERNAL_TMDS1: 928 ErrorF("enable FP1\n"); 929 tmp = INREG(RADEON_FP_GEN_CNTL); 930 tmp |= (RADEON_FP_FPON | RADEON_FP_TMDS_EN); 931 OUTREG(RADEON_FP_GEN_CNTL, tmp); 932 save->fp_gen_cntl |= (RADEON_FP_FPON | RADEON_FP_TMDS_EN); 933 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 934 (info->ChipFamily == CHIP_FAMILY_RS480)) { 935 tmp = INREG(RS400_FP_2ND_GEN_CNTL); 936 tmp |= (RS400_FP_2ND_ON | RS400_TMDS_2ND_EN); 937 OUTREG(RS400_FP_2ND_GEN_CNTL, tmp); 938 save->fp_2nd_gen_cntl |= (RS400_FP_2ND_ON | 939 RS400_TMDS_2ND_EN); 940 } 941 break; 942 case ENCODER_OBJECT_ID_INTERNAL_DVO1: 943 ErrorF("enable FP2\n"); 944 tmp = INREG(RADEON_FP2_GEN_CNTL); 945 tmp &= ~RADEON_FP2_BLANK_EN; 946 tmp |= (RADEON_FP2_ON | RADEON_FP2_DVO_EN); 947 OUTREG(RADEON_FP2_GEN_CNTL, tmp); 948 save->fp2_gen_cntl |= (RADEON_FP2_ON | RADEON_FP2_DVO_EN); 949 save->fp2_gen_cntl &= ~RADEON_FP2_BLANK_EN; 950 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 951 (info->ChipFamily == CHIP_FAMILY_RS480)) { 952 tmp = INREG(RS400_FP2_2_GEN_CNTL); 953 tmp &= ~RS400_FP2_2_BLANK_EN; 954 tmp |= (RS400_FP2_2_ON | RS400_FP2_2_DVO2_EN); 955 OUTREG(RS400_FP2_2_GEN_CNTL, tmp); 956 save->fp2_2_gen_cntl |= (RS400_FP2_2_ON | RS400_FP2_2_DVO2_EN); 957 save->fp2_2_gen_cntl &= ~RS400_FP2_2_BLANK_EN; 958 } 959 break; 960 case ENCODER_OBJECT_ID_INTERNAL_DAC1: 961 ErrorF("enable primary dac\n"); 962 tmp = INREG(RADEON_CRTC_EXT_CNTL); 963 tmp |= RADEON_CRTC_CRT_ON; 964 OUTREG(RADEON_CRTC_EXT_CNTL, tmp); 965 save->crtc_ext_cntl |= RADEON_CRTC_CRT_ON; 966 RADEONDacPowerSet(pScrn, TRUE, TRUE); 967 break; 968 case ENCODER_OBJECT_ID_INTERNAL_DAC2: 969 if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) { 970 ErrorF("enable TV\n"); 971 tmp = INREG(RADEON_TV_MASTER_CNTL); 972 tmp |= RADEON_TV_ON; 973 OUTREG(RADEON_TV_MASTER_CNTL, tmp); 974 radeon_output->tvout.tv_on = TRUE; 975 } else { 976 ErrorF("enable TVDAC\n"); 977 if (info->ChipFamily == CHIP_FAMILY_R200) { 978 tmp = INREG(RADEON_FP2_GEN_CNTL); 979 tmp |= (RADEON_FP2_ON | RADEON_FP2_DVO_EN); 980 OUTREG(RADEON_FP2_GEN_CNTL, tmp); 981 save->fp2_gen_cntl |= (RADEON_FP2_ON | RADEON_FP2_DVO_EN); 982 } else { 983 tmp = INREG(RADEON_CRTC2_GEN_CNTL); 984 tmp |= RADEON_CRTC2_CRT2_ON; 985 OUTREG(RADEON_CRTC2_GEN_CNTL, tmp); 986 save->crtc2_gen_cntl |= RADEON_CRTC2_CRT2_ON; 987 } 988 } 989 RADEONDacPowerSet(pScrn, TRUE, FALSE); 990 break; 991 } 992 break; 993 case DPMSModeOff: 994 case DPMSModeSuspend: 995 case DPMSModeStandby: 996 radeon_encoder->devices &= ~(radeon_output->active_device); 997 if (!radeon_encoder->devices) { 998 switch (radeon_encoder->encoder_id) { 999 case ENCODER_OBJECT_ID_INTERNAL_LVDS: 1000 { 1001 unsigned long tmpPixclksCntl = INPLL(pScrn, RADEON_PIXCLKS_CNTL); 1002 radeon_lvds_ptr lvds = (radeon_lvds_ptr)radeon_encoder->dev_priv; 1003 if (lvds == NULL) 1004 return; 1005 if (info->IsMobility || info->IsIGP) { 1006 /* Asic bug, when turning off LVDS_ON, we have to make sure 1007 RADEON_PIXCLK_LVDS_ALWAYS_ON bit is off 1008 */ 1009 OUTPLLP(pScrn, RADEON_PIXCLKS_CNTL, 0, ~RADEON_PIXCLK_LVDS_ALWAYS_ONb); 1010 } 1011 #if defined(__powerpc__) 1012 /* not sure if this is needed on non-Macs */ 1013 if (info->MacModel) { 1014 tmp = INREG(RADEON_LVDS_GEN_CNTL); 1015 tmp |= RADEON_LVDS_DISPLAY_DIS; 1016 tmp &= ~RADEON_LVDS_BL_MOD_EN; 1017 OUTREG(RADEON_LVDS_GEN_CNTL, tmp); 1018 usleep(100); 1019 tmp &= ~(RADEON_LVDS_ON | RADEON_LVDS_EN); 1020 OUTREG(RADEON_LVDS_GEN_CNTL, tmp); 1021 } else 1022 #endif 1023 { 1024 tmp = INREG(RADEON_LVDS_GEN_CNTL); 1025 tmp |= RADEON_LVDS_DISPLAY_DIS; 1026 tmp &= ~(RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN); 1027 OUTREG(RADEON_LVDS_GEN_CNTL, tmp); 1028 } 1029 save->lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS; 1030 save->lvds_gen_cntl &= ~(RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN); 1031 if (info->IsMobility || info->IsIGP) { 1032 OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmpPixclksCntl); 1033 } 1034 usleep (lvds->PanelPwrDly * 1000); 1035 } 1036 break; 1037 case ENCODER_OBJECT_ID_INTERNAL_TMDS1: 1038 ErrorF("disable FP1\n"); 1039 tmp = INREG(RADEON_FP_GEN_CNTL); 1040 tmp &= ~(RADEON_FP_FPON | RADEON_FP_TMDS_EN); 1041 OUTREG(RADEON_FP_GEN_CNTL, tmp); 1042 save->fp_gen_cntl &= ~(RADEON_FP_FPON | RADEON_FP_TMDS_EN); 1043 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 1044 (info->ChipFamily == CHIP_FAMILY_RS480)) { 1045 tmp = INREG(RS400_FP_2ND_GEN_CNTL); 1046 tmp &= ~(RS400_FP_2ND_ON | RS400_TMDS_2ND_EN); 1047 OUTREG(RS400_FP_2ND_GEN_CNTL, tmp); 1048 save->fp_2nd_gen_cntl &= ~(RS400_FP_2ND_ON | 1049 RS400_TMDS_2ND_EN); 1050 } 1051 break; 1052 case ENCODER_OBJECT_ID_INTERNAL_DVO1: 1053 ErrorF("disable FP2\n"); 1054 tmp = INREG(RADEON_FP2_GEN_CNTL); 1055 tmp |= RADEON_FP2_BLANK_EN; 1056 tmp &= ~(RADEON_FP2_ON | RADEON_FP2_DVO_EN); 1057 OUTREG(RADEON_FP2_GEN_CNTL, tmp); 1058 save->fp2_gen_cntl &= ~(RADEON_FP2_ON | RADEON_FP2_DVO_EN); 1059 save->fp2_gen_cntl |= RADEON_FP2_BLANK_EN; 1060 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 1061 (info->ChipFamily == CHIP_FAMILY_RS480)) { 1062 tmp = INREG(RS400_FP2_2_GEN_CNTL); 1063 tmp |= RS400_FP2_2_BLANK_EN; 1064 tmp &= ~(RS400_FP2_2_ON | RS400_FP2_2_DVO2_EN); 1065 OUTREG(RS400_FP2_2_GEN_CNTL, tmp); 1066 save->fp2_2_gen_cntl &= ~(RS400_FP2_2_ON | RS400_FP2_2_DVO2_EN); 1067 save->fp2_2_gen_cntl |= RS400_FP2_2_BLANK_EN; 1068 } 1069 break; 1070 case ENCODER_OBJECT_ID_INTERNAL_DAC1: 1071 ErrorF("disable primary dac\n"); 1072 tmp = INREG(RADEON_CRTC_EXT_CNTL); 1073 tmp &= ~RADEON_CRTC_CRT_ON; 1074 OUTREG(RADEON_CRTC_EXT_CNTL, tmp); 1075 save->crtc_ext_cntl &= ~RADEON_CRTC_CRT_ON; 1076 RADEONDacPowerSet(pScrn, FALSE, TRUE); 1077 break; 1078 case ENCODER_OBJECT_ID_INTERNAL_DAC2: 1079 if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) { 1080 ErrorF("disable TV\n"); 1081 tmp = INREG(RADEON_TV_MASTER_CNTL); 1082 tmp &= ~RADEON_TV_ON; 1083 OUTREG(RADEON_TV_MASTER_CNTL, tmp); 1084 radeon_output->tvout.tv_on = FALSE; 1085 } else { 1086 ErrorF("disable TVDAC\n"); 1087 if (info->ChipFamily == CHIP_FAMILY_R200) { 1088 tmp = INREG(RADEON_FP2_GEN_CNTL); 1089 tmp &= ~(RADEON_FP2_ON | RADEON_FP2_DVO_EN); 1090 OUTREG(RADEON_FP2_GEN_CNTL, tmp); 1091 save->fp2_gen_cntl &= ~(RADEON_FP2_ON | RADEON_FP2_DVO_EN); 1092 } else { 1093 tmp = INREG(RADEON_CRTC2_GEN_CNTL); 1094 tmp &= ~RADEON_CRTC2_CRT2_ON; 1095 OUTREG(RADEON_CRTC2_GEN_CNTL, tmp); 1096 save->crtc2_gen_cntl &= ~RADEON_CRTC2_CRT2_ON; 1097 } 1098 } 1099 RADEONDacPowerSet(pScrn, FALSE, FALSE); 1100 break; 1101 } 1102 } 1103 break; 1104 } 1105 } 1106 1107 static void 1108 RADEONInitFPRegisters(xf86OutputPtr output, RADEONSavePtr save, 1109 DisplayModePtr mode, BOOL IsPrimary) 1110 { 1111 ScrnInfoPtr pScrn = output->scrn; 1112 RADEONInfoPtr info = RADEONPTR(pScrn); 1113 RADEONEntPtr pRADEONEnt = RADEONEntPriv(pScrn); 1114 RADEONOutputPrivatePtr radeon_output = output->driver_private; 1115 radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output); 1116 radeon_tmds_ptr tmds = NULL; 1117 int i; 1118 uint32_t tmp = info->SavedReg->tmds_pll_cntl & 0xfffff; 1119 1120 if (radeon_encoder == NULL) 1121 return; 1122 1123 tmds = (radeon_tmds_ptr)radeon_encoder->dev_priv; 1124 1125 if (tmds == NULL) 1126 return; 1127 1128 for (i = 0; i < 4; i++) { 1129 if (tmds->tmds_pll[i].freq == 0) 1130 break; 1131 if ((uint32_t)(mode->Clock / 10) < tmds->tmds_pll[i].freq) { 1132 tmp = tmds->tmds_pll[i].value ; 1133 break; 1134 } 1135 } 1136 1137 if (IS_R300_VARIANT || (info->ChipFamily == CHIP_FAMILY_RV280)) { 1138 if (tmp & 0xfff00000) 1139 save->tmds_pll_cntl = tmp; 1140 else { 1141 save->tmds_pll_cntl = info->SavedReg->tmds_pll_cntl & 0xfff00000; 1142 save->tmds_pll_cntl |= tmp; 1143 } 1144 } else save->tmds_pll_cntl = tmp; 1145 1146 save->tmds_transmitter_cntl = info->SavedReg->tmds_transmitter_cntl & 1147 ~(RADEON_TMDS_TRANSMITTER_PLLRST); 1148 1149 if (IS_R300_VARIANT || (info->ChipFamily == CHIP_FAMILY_R200) || !pRADEONEnt->HasCRTC2) 1150 save->tmds_transmitter_cntl &= ~(RADEON_TMDS_TRANSMITTER_PLLEN); 1151 else /* weird, RV chips got this bit reversed? */ 1152 save->tmds_transmitter_cntl |= (RADEON_TMDS_TRANSMITTER_PLLEN); 1153 1154 save->fp_gen_cntl = info->SavedReg->fp_gen_cntl | 1155 (RADEON_FP_CRTC_DONT_SHADOW_VPAR | 1156 RADEON_FP_CRTC_DONT_SHADOW_HEND ); 1157 1158 save->fp_gen_cntl &= ~(RADEON_FP_FPON | RADEON_FP_TMDS_EN); 1159 1160 save->fp_gen_cntl &= ~(RADEON_FP_RMX_HVSYNC_CONTROL_EN | 1161 RADEON_FP_DFP_SYNC_SEL | 1162 RADEON_FP_CRT_SYNC_SEL | 1163 RADEON_FP_CRTC_LOCK_8DOT | 1164 RADEON_FP_USE_SHADOW_EN | 1165 RADEON_FP_CRTC_USE_SHADOW_VEND | 1166 RADEON_FP_CRT_SYNC_ALT); 1167 1168 if (pScrn->rgbBits == 8) 1169 save->fp_gen_cntl |= RADEON_FP_PANEL_FORMAT; /* 24 bit format */ 1170 else 1171 save->fp_gen_cntl &= ~RADEON_FP_PANEL_FORMAT;/* 18 bit format */ 1172 1173 if (IsPrimary) { 1174 if ((IS_R300_VARIANT) || (info->ChipFamily == CHIP_FAMILY_R200)) { 1175 save->fp_gen_cntl &= ~R200_FP_SOURCE_SEL_MASK; 1176 if (radeon_output->Flags & RADEON_USE_RMX) 1177 save->fp_gen_cntl |= R200_FP_SOURCE_SEL_RMX; 1178 else 1179 save->fp_gen_cntl |= R200_FP_SOURCE_SEL_CRTC1; 1180 } else 1181 save->fp_gen_cntl &= ~RADEON_FP_SEL_CRTC2; 1182 } else { 1183 if ((IS_R300_VARIANT) || (info->ChipFamily == CHIP_FAMILY_R200)) { 1184 save->fp_gen_cntl &= ~R200_FP_SOURCE_SEL_MASK; 1185 save->fp_gen_cntl |= R200_FP_SOURCE_SEL_CRTC2; 1186 } else 1187 save->fp_gen_cntl |= RADEON_FP_SEL_CRTC2; 1188 } 1189 1190 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 1191 (info->ChipFamily == CHIP_FAMILY_RS480)) { 1192 save->tmds2_transmitter_cntl = info->SavedReg->tmds2_transmitter_cntl & 1193 ~(RS400_TMDS2_PLLRST); 1194 save->tmds2_transmitter_cntl &= ~(RS400_TMDS2_PLLEN); 1195 1196 save->fp_2nd_gen_cntl = info->SavedReg->fp_2nd_gen_cntl; 1197 1198 if (pScrn->rgbBits == 8) 1199 save->fp_2nd_gen_cntl |= RS400_PANEL_FORMAT_2ND; /* 24 bit format */ 1200 else 1201 save->fp_2nd_gen_cntl &= ~RS400_PANEL_FORMAT_2ND;/* 18 bit format */ 1202 1203 save->fp_2nd_gen_cntl &= ~RS400_FP_2ND_SOURCE_SEL_MASK; 1204 1205 if (IsPrimary) { 1206 if (radeon_output->Flags & RADEON_USE_RMX) 1207 save->fp_2nd_gen_cntl |= RS400_FP_2ND_SOURCE_SEL_RMX; 1208 else 1209 save->fp_2nd_gen_cntl |= RS400_FP_2ND_SOURCE_SEL_CRTC1; 1210 } else 1211 save->fp_2nd_gen_cntl |= RS400_FP_2ND_SOURCE_SEL_CRTC2; 1212 } 1213 1214 } 1215 1216 static void 1217 RADEONInitFP2Registers(xf86OutputPtr output, RADEONSavePtr save, 1218 DisplayModePtr mode, BOOL IsPrimary) 1219 { 1220 ScrnInfoPtr pScrn = output->scrn; 1221 RADEONInfoPtr info = RADEONPTR(pScrn); 1222 RADEONOutputPrivatePtr radeon_output = output->driver_private; 1223 1224 if (pScrn->rgbBits == 8) 1225 save->fp2_gen_cntl = info->SavedReg->fp2_gen_cntl | 1226 RADEON_FP2_PANEL_FORMAT; /* 24 bit format, */ 1227 else 1228 save->fp2_gen_cntl = info->SavedReg->fp2_gen_cntl & 1229 ~RADEON_FP2_PANEL_FORMAT;/* 18 bit format, */ 1230 1231 save->fp2_gen_cntl &= ~(RADEON_FP2_ON | 1232 RADEON_FP2_DVO_EN | 1233 RADEON_FP2_DVO_RATE_SEL_SDR); 1234 1235 1236 /* XXX: these are oem specific */ 1237 if (IS_R300_VARIANT) { 1238 if ((info->Chipset == PCI_CHIP_RV350_NP) && 1239 (PCI_SUB_VENDOR_ID(info->PciInfo) == 0x1028) && 1240 (PCI_SUB_DEVICE_ID(info->PciInfo) == 0x2001)) 1241 save->fp2_gen_cntl |= R200_FP2_DVO_CLOCK_MODE_SINGLE; /* Dell Inspiron 8600 */ 1242 else 1243 save->fp2_gen_cntl |= RADEON_FP2_PAD_FLOP_EN | R200_FP2_DVO_CLOCK_MODE_SINGLE; 1244 } 1245 1246 #if 0 1247 /* DVO configurations: 1248 * SDR single channel (data rate 165 Mhz, port width 12 bits) 1249 * DDR single channel (data rate 330 Mhz, port width 12 bits) 1250 * SDR dual channel (data rate 330 Mhz, port width 24 bits) 1251 * - dual channel is only available on r3xx+ 1252 */ 1253 if (info->ChipFamily >= CHIP_FAMILY_R200) { 1254 if (sdr) 1255 save->fp2_gen_cntl |= R200_FP2_DVO_RATE_SEL_SDR; 1256 if (IS_R300_VARIANT && dual channel) 1257 save->fp2_gen_cntl |= R300_FP2_DVO_DUAL_CHANNEL_EN; 1258 } 1259 #endif 1260 1261 if (IsPrimary) { 1262 if ((info->ChipFamily == CHIP_FAMILY_R200) || IS_R300_VARIANT) { 1263 save->fp2_gen_cntl &= ~R200_FP2_SOURCE_SEL_MASK; 1264 if (radeon_output->Flags & RADEON_USE_RMX) 1265 save->fp2_gen_cntl |= R200_FP2_SOURCE_SEL_RMX; 1266 else 1267 save->fp2_gen_cntl |= R200_FP2_SOURCE_SEL_CRTC1; 1268 } else 1269 save->fp2_gen_cntl &= ~RADEON_FP2_SRC_SEL_CRTC2; 1270 } else { 1271 if ((info->ChipFamily == CHIP_FAMILY_R200) || IS_R300_VARIANT) { 1272 save->fp2_gen_cntl &= ~R200_FP2_SOURCE_SEL_MASK; 1273 save->fp2_gen_cntl |= R200_FP2_SOURCE_SEL_CRTC2; 1274 } else 1275 save->fp2_gen_cntl |= RADEON_FP2_SRC_SEL_CRTC2; 1276 } 1277 1278 if ((info->ChipFamily == CHIP_FAMILY_RS400) || 1279 (info->ChipFamily == CHIP_FAMILY_RS480)) { 1280 if (pScrn->rgbBits == 8) 1281 save->fp2_2_gen_cntl = info->SavedReg->fp2_2_gen_cntl | 1282 RS400_FP2_2_PANEL_FORMAT; /* 24 bit format, */ 1283 else 1284 save->fp2_2_gen_cntl = info->SavedReg->fp2_2_gen_cntl & 1285 ~RS400_FP2_2_PANEL_FORMAT;/* 18 bit format, */ 1286 1287 save->fp2_2_gen_cntl &= ~(RS400_FP2_2_ON | 1288 RS400_FP2_2_DVO2_EN | 1289 RS400_FP2_2_SOURCE_SEL_MASK); 1290 1291 if (IsPrimary) { 1292 if (radeon_output->Flags & RADEON_USE_RMX) 1293 save->fp2_2_gen_cntl |= RS400_FP2_2_SOURCE_SEL_RMX; 1294 else 1295 save->fp2_2_gen_cntl |= RS400_FP2_2_SOURCE_SEL_CRTC1; 1296 } else 1297 save->fp2_2_gen_cntl |= RS400_FP2_2_SOURCE_SEL_CRTC2; 1298 } 1299 1300 } 1301 1302 static void 1303 RADEONInitLVDSRegisters(xf86OutputPtr output, RADEONSavePtr save, 1304 DisplayModePtr mode, BOOL IsPrimary) 1305 { 1306 ScrnInfoPtr pScrn = output->scrn; 1307 RADEONInfoPtr info = RADEONPTR(pScrn); 1308 RADEONOutputPrivatePtr radeon_output = output->driver_private; 1309 1310 save->lvds_pll_cntl = (info->SavedReg->lvds_pll_cntl | 1311 RADEON_LVDS_PLL_EN); 1312 1313 save->lvds_pll_cntl &= ~RADEON_LVDS_PLL_RESET; 1314 1315 save->lvds_gen_cntl = info->SavedReg->lvds_gen_cntl; 1316 save->lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS; 1317 save->lvds_gen_cntl &= ~(RADEON_LVDS_ON | 1318 RADEON_LVDS_BLON | 1319 RADEON_LVDS_EN | 1320 RADEON_LVDS_RST_FM); 1321 1322 if (IS_R300_VARIANT) 1323 save->lvds_pll_cntl &= ~(R300_LVDS_SRC_SEL_MASK); 1324 1325 if (IsPrimary) { 1326 if (IS_R300_VARIANT) { 1327 if (radeon_output->Flags & RADEON_USE_RMX) 1328 save->lvds_pll_cntl |= R300_LVDS_SRC_SEL_RMX; 1329 } else 1330 save->lvds_gen_cntl &= ~RADEON_LVDS_SEL_CRTC2; 1331 } else { 1332 if (IS_R300_VARIANT) { 1333 save->lvds_pll_cntl |= R300_LVDS_SRC_SEL_CRTC2; 1334 } else 1335 save->lvds_gen_cntl |= RADEON_LVDS_SEL_CRTC2; 1336 } 1337 1338 } 1339 1340 static void 1341 RADEONInitRMXRegisters(xf86OutputPtr output, RADEONSavePtr save, 1342 DisplayModePtr mode) 1343 { 1344 ScrnInfoPtr pScrn = output->scrn; 1345 RADEONInfoPtr info = RADEONPTR(pScrn); 1346 RADEONOutputPrivatePtr radeon_output = output->driver_private; 1347 radeon_native_mode_ptr native_mode = &radeon_output->native_mode; 1348 int xres = mode->HDisplay; 1349 int yres = mode->VDisplay; 1350 Bool Hscale = TRUE, Vscale = TRUE; 1351 int hsync_wid; 1352 int vsync_wid; 1353 int hsync_start; 1354 1355 1356 save->fp_vert_stretch = info->SavedReg->fp_vert_stretch & 1357 (RADEON_VERT_STRETCH_RESERVED | 1358 RADEON_VERT_AUTO_RATIO_INC); 1359 save->fp_horz_stretch = info->SavedReg->fp_horz_stretch & 1360 (RADEON_HORZ_FP_LOOP_STRETCH | 1361 RADEON_HORZ_AUTO_RATIO_INC); 1362 1363 save->crtc_more_cntl = 0; 1364 if ((info->ChipFamily == CHIP_FAMILY_RS100) || 1365 (info->ChipFamily == CHIP_FAMILY_RS200)) { 1366 /* This is to workaround the asic bug for RMX, some versions 1367 of BIOS dosen't have this register initialized correctly. 1368 */ 1369 save->crtc_more_cntl |= RADEON_CRTC_H_CUTOFF_ACTIVE_EN; 1370 } 1371 1372 1373 save->fp_crtc_h_total_disp = ((((mode->CrtcHTotal / 8) - 1) & 0x3ff) 1374 | ((((mode->CrtcHDisplay / 8) - 1) & 0x1ff) 1375 << 16)); 1376 1377 hsync_wid = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 8; 1378 if (!hsync_wid) hsync_wid = 1; 1379 hsync_start = mode->CrtcHSyncStart - 8; 1380 1381 save->fp_h_sync_strt_wid = ((hsync_start & 0x1fff) 1382 | ((hsync_wid & 0x3f) << 16) 1383 | ((mode->Flags & V_NHSYNC) 1384 ? RADEON_CRTC_H_SYNC_POL 1385 : 0)); 1386 1387 save->fp_crtc_v_total_disp = (((mode->CrtcVTotal - 1) & 0xffff) 1388 | ((mode->CrtcVDisplay - 1) << 16)); 1389 1390 vsync_wid = mode->CrtcVSyncEnd - mode->CrtcVSyncStart; 1391 if (!vsync_wid) vsync_wid = 1; 1392 1393 save->fp_v_sync_strt_wid = (((mode->CrtcVSyncStart - 1) & 0xfff) 1394 | ((vsync_wid & 0x1f) << 16) 1395 | ((mode->Flags & V_NVSYNC) 1396 ? RADEON_CRTC_V_SYNC_POL 1397 : 0)); 1398 1399 save->fp_horz_vert_active = 0; 1400 1401 if ((radeon_output->active_device & (ATOM_DEVICE_LCD_SUPPORT)) || 1402 (radeon_output->active_device & (ATOM_DEVICE_DFP_SUPPORT))) { 1403 1404 if (native_mode->PanelXRes == 0 || native_mode->PanelYRes == 0) { 1405 Hscale = FALSE; 1406 Vscale = FALSE; 1407 } else { 1408 if (xres > native_mode->PanelXRes) 1409 xres = native_mode->PanelXRes; 1410 if (yres > native_mode->PanelYRes) 1411 yres = native_mode->PanelYRes; 1412 1413 if (xres == native_mode->PanelXRes) 1414 Hscale = FALSE; 1415 if (yres == native_mode->PanelYRes) 1416 Vscale = FALSE; 1417 } 1418 1419 if ((!Hscale) || (!(radeon_output->Flags & RADEON_USE_RMX)) || 1420 (radeon_output->rmx_type == RMX_CENTER)) { 1421 save->fp_horz_stretch |= ((xres/8-1)<<16); 1422 } else { 1423 uint32_t scale, inc; 1424 inc = (save->fp_horz_stretch & RADEON_HORZ_AUTO_RATIO_INC) ? 1 : 0; 1425 scale = ((xres + inc) * RADEON_HORZ_STRETCH_RATIO_MAX) 1426 / native_mode->PanelXRes + 1; 1427 save->fp_horz_stretch |= (((scale) & RADEON_HORZ_STRETCH_RATIO_MASK) | 1428 RADEON_HORZ_STRETCH_BLEND | 1429 RADEON_HORZ_STRETCH_ENABLE | 1430 ((native_mode->PanelXRes/8-1)<<16)); 1431 } 1432 1433 if ((!Vscale) || (!(radeon_output->Flags & RADEON_USE_RMX)) || 1434 (radeon_output->rmx_type == RMX_CENTER)) { 1435 save->fp_vert_stretch |= ((yres-1)<<12); 1436 } else { 1437 uint32_t scale, inc; 1438 inc = (save->fp_vert_stretch & RADEON_VERT_AUTO_RATIO_INC) ? 1 : 0; 1439 scale = ((yres + inc) * RADEON_VERT_STRETCH_RATIO_MAX) 1440 / native_mode->PanelYRes + 1; 1441 save->fp_vert_stretch |= (((scale) & RADEON_VERT_STRETCH_RATIO_MASK) | 1442 RADEON_VERT_STRETCH_ENABLE | 1443 RADEON_VERT_STRETCH_BLEND | 1444 ((native_mode->PanelYRes-1)<<12)); 1445 } 1446 1447 if ((radeon_output->rmx_type == RMX_CENTER) && 1448 (radeon_output->Flags & RADEON_USE_RMX)) { 1449 int blank_width; 1450 1451 save->crtc_more_cntl |= (RADEON_CRTC_AUTO_HORZ_CENTER_EN | 1452 RADEON_CRTC_AUTO_VERT_CENTER_EN); 1453 1454 blank_width = (mode->CrtcHBlankEnd - mode->CrtcHBlankStart) / 8; 1455 if (blank_width > 110) 1456 blank_width = 110; 1457 1458 save->fp_crtc_h_total_disp = (((blank_width) & 0x3ff) 1459 | ((((mode->CrtcHDisplay / 8) - 1) & 0x1ff) 1460 << 16)); 1461 1462 hsync_wid = (mode->CrtcHSyncEnd - mode->CrtcHSyncStart) / 8; 1463 if (!hsync_wid) 1464 hsync_wid = 1; 1465 1466 save->fp_h_sync_strt_wid = ((((mode->CrtcHSyncStart - mode->CrtcHBlankStart) / 8) & 0x1fff) 1467 | ((hsync_wid & 0x3f) << 16) 1468 | ((mode->Flags & V_NHSYNC) 1469 ? RADEON_CRTC_H_SYNC_POL 1470 : 0)); 1471 1472 save->fp_crtc_v_total_disp = (((mode->CrtcVBlankEnd - mode->CrtcVBlankStart) & 0xffff) 1473 | ((mode->CrtcVDisplay - 1) << 16)); 1474 1475 vsync_wid = mode->CrtcVSyncEnd - mode->CrtcVSyncStart; 1476 if (!vsync_wid) 1477 vsync_wid = 1; 1478 1479 save->fp_v_sync_strt_wid = ((((mode->CrtcVSyncStart - mode->CrtcVBlankStart) & 0xfff) 1480 | ((vsync_wid & 0x1f) << 16) 1481 | ((mode->Flags & V_NVSYNC) 1482 ? RADEON_CRTC_V_SYNC_POL 1483 : 0))); 1484 1485 save->fp_horz_vert_active = (((native_mode->PanelYRes) & 0xfff) | 1486 (((native_mode->PanelXRes / 8) & 0x1ff) << 16)); 1487 1488 } 1489 } 1490 } 1491 1492 static void 1493 RADEONInitDACRegisters(xf86OutputPtr output, RADEONSavePtr save, 1494 DisplayModePtr mode, BOOL IsPrimary) 1495 { 1496 ScrnInfoPtr pScrn = output->scrn; 1497 RADEONInfoPtr info = RADEONPTR(pScrn); 1498 1499 if (IsPrimary) { 1500 if ((info->ChipFamily == CHIP_FAMILY_R200) || IS_R300_VARIANT) { 1501 save->disp_output_cntl = info->SavedReg->disp_output_cntl & 1502 ~RADEON_DISP_DAC_SOURCE_MASK; 1503 } else { 1504 save->dac2_cntl = info->SavedReg->dac2_cntl & ~(RADEON_DAC2_DAC_CLK_SEL); 1505 } 1506 } else { 1507 if ((info->ChipFamily == CHIP_FAMILY_R200) || IS_R300_VARIANT) { 1508 save->disp_output_cntl = info->SavedReg->disp_output_cntl & 1509 ~RADEON_DISP_DAC_SOURCE_MASK; 1510 save->disp_output_cntl |= RADEON_DISP_DAC_SOURCE_CRTC2; 1511 } else { 1512 save->dac2_cntl = info->SavedReg->dac2_cntl | RADEON_DAC2_DAC_CLK_SEL; 1513 } 1514 } 1515 save->dac_cntl = (RADEON_DAC_MASK_ALL 1516 | RADEON_DAC_VGA_ADR_EN 1517 | (info->dac6bits ? 0 : RADEON_DAC_8BIT_EN)); 1518 1519 save->dac_macro_cntl = info->SavedReg->dac_macro_cntl; 1520 } 1521 1522 static void 1523 RADEONInitTvDacCntl(xf86OutputPtr output, RADEONSavePtr save) 1524 { 1525 ScrnInfoPtr pScrn = output->scrn; 1526 RADEONInfoPtr info = RADEONPTR(pScrn); 1527 radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output); 1528 radeon_tvdac_ptr tvdac = NULL; 1529 1530 if (radeon_encoder == NULL) 1531 return; 1532 1533 tvdac = (radeon_tvdac_ptr)radeon_encoder->dev_priv; 1534 1535 if (tvdac == NULL) 1536 return; 1537 1538 if (info->ChipFamily == CHIP_FAMILY_R420 || 1539 info->ChipFamily == CHIP_FAMILY_RV410) { 1540 save->tv_dac_cntl = info->SavedReg->tv_dac_cntl & 1541 ~(RADEON_TV_DAC_STD_MASK | 1542 RADEON_TV_DAC_BGADJ_MASK | 1543 R420_TV_DAC_DACADJ_MASK | 1544 R420_TV_DAC_RDACPD | 1545 R420_TV_DAC_GDACPD | 1546 R420_TV_DAC_BDACPD | 1547 R420_TV_DAC_TVENABLE); 1548 } else { 1549 save->tv_dac_cntl = info->SavedReg->tv_dac_cntl & 1550 ~(RADEON_TV_DAC_STD_MASK | 1551 RADEON_TV_DAC_BGADJ_MASK | 1552 RADEON_TV_DAC_DACADJ_MASK | 1553 RADEON_TV_DAC_RDACPD | 1554 RADEON_TV_DAC_GDACPD | 1555 RADEON_TV_DAC_BDACPD); 1556 } 1557 1558 save->tv_dac_cntl |= (RADEON_TV_DAC_NBLANK | 1559 RADEON_TV_DAC_NHOLD | 1560 RADEON_TV_DAC_STD_PS2 | 1561 tvdac->ps2_tvdac_adj); 1562 1563 } 1564 1565 static void 1566 RADEONInitDAC2Registers(xf86OutputPtr output, RADEONSavePtr save, 1567 DisplayModePtr mode, BOOL IsPrimary) 1568 { 1569 ScrnInfoPtr pScrn = output->scrn; 1570 RADEONInfoPtr info = RADEONPTR(pScrn); 1571 1572 /*0x0028023;*/ 1573 RADEONInitTvDacCntl(output, save); 1574 1575 if (IS_R300_VARIANT) 1576 save->gpiopad_a = info->SavedReg->gpiopad_a | 1; 1577 1578 save->dac2_cntl = info->SavedReg->dac2_cntl | RADEON_DAC2_DAC2_CLK_SEL; 1579 1580 if (IsPrimary) { 1581 if (IS_R300_VARIANT) { 1582 save->disp_output_cntl = info->SavedReg->disp_output_cntl & 1583 ~RADEON_DISP_TVDAC_SOURCE_MASK; 1584 save->disp_output_cntl |= RADEON_DISP_TVDAC_SOURCE_CRTC; 1585 } else if (info->ChipFamily == CHIP_FAMILY_R200) { 1586 save->fp2_gen_cntl = info->SavedReg->fp2_gen_cntl & 1587 ~(R200_FP2_SOURCE_SEL_MASK | 1588 RADEON_FP2_DVO_RATE_SEL_SDR); 1589 } else { 1590 save->disp_hw_debug = info->SavedReg->disp_hw_debug | RADEON_CRT2_DISP1_SEL; 1591 } 1592 } else { 1593 if (IS_R300_VARIANT) { 1594 save->disp_output_cntl = info->SavedReg->disp_output_cntl & 1595 ~RADEON_DISP_TVDAC_SOURCE_MASK; 1596 save->disp_output_cntl |= RADEON_DISP_TVDAC_SOURCE_CRTC2; 1597 } else if (info->ChipFamily == CHIP_FAMILY_R200) { 1598 save->fp2_gen_cntl = info->SavedReg->fp2_gen_cntl & 1599 ~(R200_FP2_SOURCE_SEL_MASK | 1600 RADEON_FP2_DVO_RATE_SEL_SDR); 1601 save->fp2_gen_cntl |= R200_FP2_SOURCE_SEL_CRTC2; 1602 } else { 1603 save->disp_hw_debug = info->SavedReg->disp_hw_debug & 1604 ~RADEON_CRT2_DISP1_SEL; 1605 } 1606 } 1607 } 1608 1609 void 1610 legacy_output_mode_set(xf86OutputPtr output, DisplayModePtr mode, 1611 DisplayModePtr adjusted_mode) 1612 { 1613 ScrnInfoPtr pScrn = output->scrn; 1614 RADEONInfoPtr info = RADEONPTR(pScrn); 1615 RADEONOutputPrivatePtr radeon_output = output->driver_private; 1616 xf86CrtcPtr crtc = output->crtc; 1617 RADEONCrtcPrivatePtr radeon_crtc = crtc->driver_private; 1618 radeon_encoder_ptr radeon_encoder = radeon_get_encoder(output); 1619 Bool is_primary = FALSE; 1620 1621 if (radeon_encoder == NULL) 1622 return; 1623 1624 radeon_output->pixel_clock = adjusted_mode->Clock; 1625 if (radeon_crtc->crtc_id == 0) { 1626 ErrorF("set RMX\n"); 1627 is_primary = TRUE; 1628 RADEONInitRMXRegisters(output, info->ModeReg, adjusted_mode); 1629 RADEONRestoreRMXRegisters(pScrn, info->ModeReg); 1630 } 1631 1632 switch (radeon_encoder->encoder_id) { 1633 case ENCODER_OBJECT_ID_INTERNAL_LVDS: 1634 ErrorF("set LVDS\n"); 1635 RADEONInitLVDSRegisters(output, info->ModeReg, adjusted_mode, is_primary); 1636 RADEONRestoreLVDSRegisters(pScrn, info->ModeReg); 1637 break; 1638 case ENCODER_OBJECT_ID_INTERNAL_TMDS1: 1639 ErrorF("set FP1\n"); 1640 RADEONInitFPRegisters(output, info->ModeReg, adjusted_mode, is_primary); 1641 RADEONRestoreFPRegisters(pScrn, info->ModeReg); 1642 break; 1643 case ENCODER_OBJECT_ID_INTERNAL_DVO1: 1644 ErrorF("set FP2\n"); 1645 RADEONInitFP2Registers(output, info->ModeReg, adjusted_mode, is_primary); 1646 if (info->IsAtomBios) { 1647 unsigned char *RADEONMMIO = info->MMIO; 1648 uint32_t fp2_gen_cntl; 1649 1650 atombios_external_tmds_setup(output, ATOM_ENABLE); 1651 fp2_gen_cntl = INREG(RADEON_FP2_GEN_CNTL) & ~R200_FP2_SOURCE_SEL_MASK; 1652 if (radeon_crtc->crtc_id == 1) 1653 fp2_gen_cntl |= R200_FP2_SOURCE_SEL_CRTC2; 1654 else { 1655 if (radeon_output->Flags & RADEON_USE_RMX) 1656 fp2_gen_cntl |= R200_FP2_SOURCE_SEL_RMX; 1657 else 1658 fp2_gen_cntl |= R200_FP2_SOURCE_SEL_CRTC1; 1659 } 1660 OUTREG(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); 1661 } else { 1662 RADEONRestoreFP2Registers(pScrn, info->ModeReg); 1663 RADEONRestoreDVOChip(pScrn, output); 1664 } 1665 break; 1666 case ENCODER_OBJECT_ID_INTERNAL_DAC1: 1667 ErrorF("set primary dac\n"); 1668 RADEONInitDACRegisters(output, info->ModeReg, adjusted_mode, is_primary); 1669 RADEONRestoreDACRegisters(pScrn, info->ModeReg); 1670 break; 1671 case ENCODER_OBJECT_ID_INTERNAL_DAC2: 1672 if (radeon_output->active_device & (ATOM_DEVICE_TV_SUPPORT)) { 1673 ErrorF("set TV\n"); 1674 RADEONInitTVRegisters(output, info->ModeReg, adjusted_mode, is_primary); 1675 RADEONRestoreDACRegisters(pScrn, info->ModeReg); 1676 RADEONRestoreTVRegisters(pScrn, info->ModeReg); 1677 } else { 1678 ErrorF("set TVDAC\n"); 1679 RADEONInitDAC2Registers(output, info->ModeReg, adjusted_mode, is_primary); 1680 RADEONRestoreDACRegisters(pScrn, info->ModeReg); 1681 } 1682 break; 1683 } 1684 1685 } 1686 1687 /* the following functions are based on the load detection code 1688 * in the beos radeon driver by Thomas Kurschel and the existing 1689 * load detection code in this driver. 1690 */ 1691 static RADEONMonitorType 1692 radeon_detect_primary_dac(ScrnInfoPtr pScrn, Bool color) 1693 { 1694 RADEONInfoPtr info = RADEONPTR(pScrn); 1695 unsigned char *RADEONMMIO = info->MMIO; 1696 uint32_t vclk_ecp_cntl, crtc_ext_cntl; 1697 uint32_t dac_ext_cntl, dac_cntl, dac_macro_cntl, tmp; 1698 RADEONMonitorType found = MT_NONE; 1699 1700 /* save the regs we need */ 1701 vclk_ecp_cntl = INPLL(pScrn, RADEON_VCLK_ECP_CNTL); 1702 crtc_ext_cntl = INREG(RADEON_CRTC_EXT_CNTL); 1703 dac_ext_cntl = INREG(RADEON_DAC_EXT_CNTL); 1704 dac_cntl = INREG(RADEON_DAC_CNTL); 1705 dac_macro_cntl = INREG(RADEON_DAC_MACRO_CNTL); 1706 1707 tmp = vclk_ecp_cntl & 1708 ~(RADEON_PIXCLK_ALWAYS_ONb | RADEON_PIXCLK_DAC_ALWAYS_ONb); 1709 OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, tmp); 1710 1711 tmp = crtc_ext_cntl | RADEON_CRTC_CRT_ON; 1712 OUTREG(RADEON_CRTC_EXT_CNTL, tmp); 1713 1714 tmp = RADEON_DAC_FORCE_BLANK_OFF_EN | 1715 RADEON_DAC_FORCE_DATA_EN; 1716 1717 if (color) 1718 tmp |= RADEON_DAC_FORCE_DATA_SEL_RGB; 1719 else 1720 tmp |= RADEON_DAC_FORCE_DATA_SEL_G; 1721 1722 if (IS_R300_VARIANT) 1723 tmp |= (0x1b6 << RADEON_DAC_FORCE_DATA_SHIFT); 1724 else 1725 tmp |= (0x180 << RADEON_DAC_FORCE_DATA_SHIFT); 1726 1727 OUTREG(RADEON_DAC_EXT_CNTL, tmp); 1728 1729 tmp = dac_cntl & ~(RADEON_DAC_RANGE_CNTL_MASK | RADEON_DAC_PDWN); 1730 tmp |= RADEON_DAC_RANGE_CNTL_PS2 | RADEON_DAC_CMP_EN; 1731 OUTREG(RADEON_DAC_CNTL, tmp); 1732 1733 tmp &= ~(RADEON_DAC_PDWN_R | 1734 RADEON_DAC_PDWN_G | 1735 RADEON_DAC_PDWN_B); 1736 1737 OUTREG(RADEON_DAC_MACRO_CNTL, tmp); 1738 1739 usleep(2000); 1740 1741 if (INREG(RADEON_DAC_CNTL) & RADEON_DAC_CMP_OUTPUT) { 1742 found = MT_CRT; 1743 xf86DrvMsg (pScrn->scrnIndex, X_INFO, 1744 "Found %s CRT connected to primary DAC\n", 1745 color ? "color" : "bw"); 1746 } 1747 1748 /* restore the regs we used */ 1749 OUTREG(RADEON_DAC_CNTL, dac_cntl); 1750 OUTREG(RADEON_DAC_MACRO_CNTL, dac_macro_cntl); 1751 OUTREG(RADEON_DAC_EXT_CNTL, dac_ext_cntl); 1752 OUTREG(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl); 1753 OUTPLL(pScrn, RADEON_VCLK_ECP_CNTL, vclk_ecp_cntl); 1754 1755 return found; 1756 } 1757 1758 static RADEONMonitorType 1759 radeon_detect_ext_dac(ScrnInfoPtr pScrn) 1760 { 1761 RADEONInfoPtr info = RADEONPTR(pScrn); 1762 unsigned char *RADEONMMIO = info->MMIO; 1763 uint32_t gpio_monid, fp2_gen_cntl, disp_output_cntl, crtc2_gen_cntl; 1764 uint32_t disp_lin_trans_grph_a, disp_lin_trans_grph_b, disp_lin_trans_grph_c; 1765 uint32_t disp_lin_trans_grph_d, disp_lin_trans_grph_e, disp_lin_trans_grph_f; 1766 uint32_t tmp, crtc2_h_total_disp, crtc2_v_total_disp; 1767 uint32_t crtc2_h_sync_strt_wid, crtc2_v_sync_strt_wid; 1768 RADEONMonitorType found = MT_NONE; 1769 int connected = 0; 1770 int i = 0; 1771 1772 /* save the regs we need */ 1773 gpio_monid = INREG(RADEON_GPIO_MONID); 1774 fp2_gen_cntl = INREG(RADEON_FP2_GEN_CNTL); 1775 disp_output_cntl = INREG(RADEON_DISP_OUTPUT_CNTL); 1776 crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL); 1777 disp_lin_trans_grph_a = INREG(RADEON_DISP_LIN_TRANS_GRPH_A); 1778 disp_lin_trans_grph_b = INREG(RADEON_DISP_LIN_TRANS_GRPH_B); 1779 disp_lin_trans_grph_c = INREG(RADEON_DISP_LIN_TRANS_GRPH_C); 1780 disp_lin_trans_grph_d = INREG(RADEON_DISP_LIN_TRANS_GRPH_D); 1781 disp_lin_trans_grph_e = INREG(RADEON_DISP_LIN_TRANS_GRPH_E); 1782 disp_lin_trans_grph_f = INREG(RADEON_DISP_LIN_TRANS_GRPH_F); 1783 crtc2_h_total_disp = INREG(RADEON_CRTC2_H_TOTAL_DISP); 1784 crtc2_v_total_disp = INREG(RADEON_CRTC2_V_TOTAL_DISP); 1785 crtc2_h_sync_strt_wid = INREG(RADEON_CRTC2_H_SYNC_STRT_WID); 1786 crtc2_v_sync_strt_wid = INREG(RADEON_CRTC2_V_SYNC_STRT_WID); 1787 1788 tmp = INREG(RADEON_GPIO_MONID); 1789 tmp &= ~RADEON_GPIO_A_0; 1790 OUTREG(RADEON_GPIO_MONID, tmp); 1791 1792 OUTREG(RADEON_FP2_GEN_CNTL, 1793 RADEON_FP2_ON | 1794 RADEON_FP2_PANEL_FORMAT | 1795 R200_FP2_SOURCE_SEL_TRANS_UNIT | 1796 RADEON_FP2_DVO_EN | 1797 R200_FP2_DVO_RATE_SEL_SDR); 1798 1799 OUTREG(RADEON_DISP_OUTPUT_CNTL, 1800 RADEON_DISP_DAC_SOURCE_RMX | 1801 RADEON_DISP_TRANS_MATRIX_GRAPHICS); 1802 1803 OUTREG(RADEON_CRTC2_GEN_CNTL, 1804 RADEON_CRTC2_EN | 1805 RADEON_CRTC2_DISP_REQ_EN_B); 1806 1807 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_A, 0x00000000); 1808 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_B, 0x000003f0); 1809 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_C, 0x00000000); 1810 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_D, 0x000003f0); 1811 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_E, 0x00000000); 1812 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_F, 0x000003f0); 1813 1814 OUTREG(RADEON_CRTC2_H_TOTAL_DISP, 0x01000008); 1815 OUTREG(RADEON_CRTC2_H_SYNC_STRT_WID, 0x00000800); 1816 OUTREG(RADEON_CRTC2_V_TOTAL_DISP, 0x00080001); 1817 OUTREG(RADEON_CRTC2_V_SYNC_STRT_WID, 0x00000080); 1818 1819 for (i = 0; i < 200; i++) { 1820 tmp = INREG(RADEON_GPIO_MONID); 1821 if (tmp & RADEON_GPIO_Y_0) 1822 connected = 1; 1823 else 1824 connected = 0; 1825 1826 if (!connected) 1827 break; 1828 1829 usleep(1000); 1830 } 1831 1832 if (connected) 1833 found = MT_CRT; 1834 1835 /* restore the regs we used */ 1836 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_A, disp_lin_trans_grph_a); 1837 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_B, disp_lin_trans_grph_b); 1838 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_C, disp_lin_trans_grph_c); 1839 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_D, disp_lin_trans_grph_d); 1840 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_E, disp_lin_trans_grph_e); 1841 OUTREG(RADEON_DISP_LIN_TRANS_GRPH_F, disp_lin_trans_grph_f); 1842 OUTREG(RADEON_CRTC2_H_TOTAL_DISP, crtc2_h_total_disp); 1843 OUTREG(RADEON_CRTC2_V_TOTAL_DISP, crtc2_v_total_disp); 1844 OUTREG(RADEON_CRTC2_H_SYNC_STRT_WID, crtc2_h_sync_strt_wid); 1845 OUTREG(RADEON_CRTC2_V_SYNC_STRT_WID, crtc2_v_sync_strt_wid); 1846 OUTREG(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); 1847 OUTREG(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); 1848 OUTREG(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); 1849 OUTREG(RADEON_GPIO_MONID, gpio_monid); 1850 1851 return found; 1852 } 1853 1854 static RADEONMonitorType 1855 radeon_detect_tv_dac(ScrnInfoPtr pScrn, Bool color) 1856 { 1857 RADEONInfoPtr info = RADEONPTR(pScrn); 1858 unsigned char *RADEONMMIO = info->MMIO; 1859 uint32_t crtc2_gen_cntl, tv_dac_cntl, dac_cntl2, dac_ext_cntl; 1860 uint32_t disp_hw_debug, disp_output_cntl, gpiopad_a, pixclks_cntl, tmp; 1861 RADEONMonitorType found = MT_NONE; 1862 1863 /* save the regs we need */ 1864 pixclks_cntl = INPLL(pScrn, RADEON_PIXCLKS_CNTL); 1865 gpiopad_a = IS_R300_VARIANT ? INREG(RADEON_GPIOPAD_A) : 0; 1866 disp_output_cntl = IS_R300_VARIANT ? INREG(RADEON_DISP_OUTPUT_CNTL) : 0; 1867 disp_hw_debug = !IS_R300_VARIANT ? INREG(RADEON_DISP_HW_DEBUG) : 0; 1868 crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL); 1869 tv_dac_cntl = INREG(RADEON_TV_DAC_CNTL); 1870 dac_ext_cntl = INREG(RADEON_DAC_EXT_CNTL); 1871 dac_cntl2 = INREG(RADEON_DAC_CNTL2); 1872 1873 tmp = pixclks_cntl & ~(RADEON_PIX2CLK_ALWAYS_ONb 1874 | RADEON_PIX2CLK_DAC_ALWAYS_ONb); 1875 OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, tmp); 1876 1877 if (IS_R300_VARIANT) { 1878 OUTREGP(RADEON_GPIOPAD_A, 1, ~1 ); 1879 } 1880 1881 tmp = crtc2_gen_cntl & ~RADEON_CRTC2_PIX_WIDTH_MASK; 1882 tmp |= RADEON_CRTC2_CRT2_ON | 1883 (2 << RADEON_CRTC2_PIX_WIDTH_SHIFT); 1884 1885 OUTREG(RADEON_CRTC2_GEN_CNTL, tmp); 1886 1887 if (IS_R300_VARIANT) { 1888 tmp = disp_output_cntl & ~RADEON_DISP_TVDAC_SOURCE_MASK; 1889 tmp |= RADEON_DISP_TVDAC_SOURCE_CRTC2; 1890 OUTREG(RADEON_DISP_OUTPUT_CNTL, tmp); 1891 } else { 1892 tmp = disp_hw_debug & ~RADEON_CRT2_DISP1_SEL; 1893 OUTREG(RADEON_DISP_HW_DEBUG, tmp); 1894 } 1895 1896 tmp = RADEON_TV_DAC_NBLANK | 1897 RADEON_TV_DAC_NHOLD | 1898 RADEON_TV_MONITOR_DETECT_EN | 1899 RADEON_TV_DAC_STD_PS2; 1900 1901 OUTREG(RADEON_TV_DAC_CNTL, tmp); 1902 1903 tmp = RADEON_DAC2_FORCE_BLANK_OFF_EN | 1904 RADEON_DAC2_FORCE_DATA_EN; 1905 1906 if (color) 1907 tmp |= RADEON_DAC_FORCE_DATA_SEL_RGB; 1908 else 1909 tmp |= RADEON_DAC_FORCE_DATA_SEL_G; 1910 1911 if (IS_R300_VARIANT) 1912 tmp |= (0x1b6 << RADEON_DAC_FORCE_DATA_SHIFT); 1913 else 1914 tmp |= (0x180 << RADEON_DAC_FORCE_DATA_SHIFT); 1915 1916 OUTREG(RADEON_DAC_EXT_CNTL, tmp); 1917 1918 tmp = dac_cntl2 | RADEON_DAC2_DAC2_CLK_SEL | RADEON_DAC2_CMP_EN; 1919 OUTREG(RADEON_DAC_CNTL2, tmp); 1920 1921 usleep(10000); 1922 1923 if (IS_R300_VARIANT) { 1924 if (INREG(RADEON_DAC_CNTL2) & RADEON_DAC2_CMP_OUT_B) { 1925 found = MT_CRT; 1926 xf86DrvMsg (pScrn->scrnIndex, X_INFO, 1927 "Found %s CRT connected to TV DAC\n", 1928 color ? "color" : "bw"); 1929 } 1930 } else { 1931 if (INREG(RADEON_DAC_CNTL2) & RADEON_DAC2_CMP_OUTPUT) { 1932 found = MT_CRT; 1933 xf86DrvMsg (pScrn->scrnIndex, X_INFO, 1934 "Found %s CRT connected to TV DAC\n", 1935 color ? "color" : "bw"); 1936 } 1937 } 1938 1939 /* restore regs we used */ 1940 OUTREG(RADEON_DAC_CNTL2, dac_cntl2); 1941 OUTREG(RADEON_DAC_EXT_CNTL, dac_ext_cntl); 1942 OUTREG(RADEON_TV_DAC_CNTL, tv_dac_cntl); 1943 OUTREG(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); 1944 1945 if (IS_R300_VARIANT) { 1946 OUTREG(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); 1947 OUTREGP(RADEON_GPIOPAD_A, gpiopad_a, ~1 ); 1948 } else { 1949 OUTREG(RADEON_DISP_HW_DEBUG, disp_hw_debug); 1950 } 1951 OUTPLL(pScrn, RADEON_PIXCLKS_CNTL, pixclks_cntl); 1952 1953 return found; 1954 } 1955 1956 static RADEONMonitorType 1957 r300_detect_tv(ScrnInfoPtr pScrn) 1958 { 1959 RADEONInfoPtr info = RADEONPTR(pScrn); 1960 unsigned char *RADEONMMIO = info->MMIO; 1961 uint32_t tmp, dac_cntl2, crtc2_gen_cntl, dac_ext_cntl, tv_dac_cntl; 1962 uint32_t gpiopad_a, disp_output_cntl; 1963 RADEONMonitorType found = MT_NONE; 1964 1965 /* save the regs we need */ 1966 gpiopad_a = INREG(RADEON_GPIOPAD_A); 1967 dac_cntl2 = INREG(RADEON_DAC_CNTL2); 1968 crtc2_gen_cntl = INREG(RADEON_CRTC2_GEN_CNTL); 1969 dac_ext_cntl = INREG(RADEON_DAC_EXT_CNTL); 1970 tv_dac_cntl = INREG(RADEON_TV_DAC_CNTL); 1971 disp_output_cntl = INREG(RADEON_DISP_OUTPUT_CNTL); 1972 1973 OUTREGP(RADEON_GPIOPAD_A, 0, ~1 ); 1974 1975 OUTREG(RADEON_DAC_CNTL2, RADEON_DAC2_DAC2_CLK_SEL ); 1976 1977 OUTREG(RADEON_CRTC2_GEN_CNTL, 1978 RADEON_CRTC2_CRT2_ON | RADEON_CRTC2_VSYNC_TRISTAT ); 1979 1980 tmp = disp_output_cntl & ~RADEON_DISP_TVDAC_SOURCE_MASK; 1981 tmp |= RADEON_DISP_TVDAC_SOURCE_CRTC2; 1982 OUTREG(RADEON_DISP_OUTPUT_CNTL, tmp); 1983 1984 OUTREG(RADEON_DAC_EXT_CNTL, 1985 RADEON_DAC2_FORCE_BLANK_OFF_EN | 1986 RADEON_DAC2_FORCE_DATA_EN | 1987 RADEON_DAC_FORCE_DATA_SEL_RGB | 1988 (0xec << RADEON_DAC_FORCE_DATA_SHIFT )); 1989 1990 OUTREG(RADEON_TV_DAC_CNTL, 1991 RADEON_TV_DAC_STD_NTSC | 1992 (8 << RADEON_TV_DAC_BGADJ_SHIFT) | 1993 (6 << RADEON_TV_DAC_DACADJ_SHIFT )); 1994 1995 INREG(RADEON_TV_DAC_CNTL); 1996 1997 usleep(4000); 1998 1999 OUTREG(RADEON_TV_DAC_CNTL, 2000 RADEON_TV_DAC_NBLANK | 2001 RADEON_TV_DAC_NHOLD | 2002 RADEON_TV_MONITOR_DETECT_EN | 2003 RADEON_TV_DAC_STD_NTSC | 2004 (8 << RADEON_TV_DAC_BGADJ_SHIFT) | 2005 (6 << RADEON_TV_DAC_DACADJ_SHIFT )); 2006 2007 INREG(RADEON_TV_DAC_CNTL); 2008 2009 usleep(6000); 2010 2011 tmp = INREG(RADEON_TV_DAC_CNTL); 2012 if ( (tmp & RADEON_TV_DAC_GDACDET) != 0 ) { 2013 found = MT_STV; 2014 xf86DrvMsg (pScrn->scrnIndex, X_INFO, 2015 "S-Video TV connection detected\n"); 2016 } else if ( (tmp & RADEON_TV_DAC_BDACDET) != 0 ) { 2017 found = MT_CTV; 2018 xf86DrvMsg (pScrn->scrnIndex, X_INFO, 2019 "Composite TV connection detected\n" ); 2020 } 2021 2022 OUTREG(RADEON_TV_DAC_CNTL, tv_dac_cntl ); 2023 OUTREG(RADEON_DAC_EXT_CNTL, dac_ext_cntl); 2024 OUTREG(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); 2025 OUTREG(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); 2026 OUTREG(RADEON_DAC_CNTL2, dac_cntl2); 2027 OUTREGP(RADEON_GPIOPAD_A, gpiopad_a, ~1); 2028 2029 return found; 2030 } 2031 2032 static RADEONMonitorType 2033 radeon_detect_tv(ScrnInfoPtr pScrn) 2034 { 2035 RADEONInfoPtr info = RADEONPTR(pScrn); 2036 unsigned char *RADEONMMIO = info->MMIO; 2037 uint32_t tmp, dac_cntl2, tv_master_cntl; 2038 uint32_t tv_dac_cntl, tv_pre_dac_mux_cntl, config_cntl; 2039 RADEONMonitorType found = MT_NONE; 2040 2041 if (IS_R300_VARIANT) 2042 return r300_detect_tv(pScrn); 2043 2044 /* save the regs we need */ 2045 dac_cntl2 = INREG(RADEON_DAC_CNTL2); 2046 tv_master_cntl = INREG(RADEON_TV_MASTER_CNTL); 2047 tv_dac_cntl = INREG(RADEON_TV_DAC_CNTL); 2048 config_cntl = INREG(RADEON_CONFIG_CNTL); 2049 tv_pre_dac_mux_cntl = INREG(RADEON_TV_PRE_DAC_MUX_CNTL); 2050 2051 tmp = dac_cntl2 & ~RADEON_DAC2_DAC2_CLK_SEL; 2052 OUTREG(RADEON_DAC_CNTL2, tmp); 2053 2054 tmp = tv_master_cntl | RADEON_TV_ON; 2055 tmp &= ~(RADEON_TV_ASYNC_RST | 2056 RADEON_RESTART_PHASE_FIX | 2057 RADEON_CRT_FIFO_CE_EN | 2058 RADEON_TV_FIFO_CE_EN | 2059 RADEON_RE_SYNC_NOW_SEL_MASK); 2060 tmp |= RADEON_TV_FIFO_ASYNC_RST | RADEON_CRT_ASYNC_RST; 2061 2062 OUTREG(RADEON_TV_MASTER_CNTL, tmp); 2063 2064 tmp = RADEON_TV_DAC_NBLANK | RADEON_TV_DAC_NHOLD | 2065 RADEON_TV_MONITOR_DETECT_EN | RADEON_TV_DAC_STD_NTSC | 2066 (8 << RADEON_TV_DAC_BGADJ_SHIFT); 2067 2068 if (config_cntl & RADEON_CFG_ATI_REV_ID_MASK) 2069 tmp |= (4 << RADEON_TV_DAC_DACADJ_SHIFT); 2070 else 2071 tmp |= (8 << RADEON_TV_DAC_DACADJ_SHIFT); 2072 2073 OUTREG(RADEON_TV_DAC_CNTL, tmp); 2074 2075 tmp = RADEON_C_GRN_EN | RADEON_CMP_BLU_EN | 2076 RADEON_RED_MX_FORCE_DAC_DATA | 2077 RADEON_GRN_MX_FORCE_DAC_DATA | 2078 RADEON_BLU_MX_FORCE_DAC_DATA | 2079 (0x109 << RADEON_TV_FORCE_DAC_DATA_SHIFT); 2080 2081 OUTREG(RADEON_TV_PRE_DAC_MUX_CNTL, tmp); 2082 2083 usleep(3000); 2084 2085 tmp = INREG(RADEON_TV_DAC_CNTL); 2086 if (tmp & RADEON_TV_DAC_GDACDET) { 2087 found = MT_STV; 2088 xf86DrvMsg (pScrn->scrnIndex, X_INFO, 2089 "S-Video TV connection detected\n"); 2090 } else if (tmp & RADEON_TV_DAC_BDACDET) { 2091 found = MT_CTV; 2092 xf86DrvMsg (pScrn->scrnIndex, X_INFO, 2093 "Composite TV connection detected\n" ); 2094 } 2095 2096 OUTREG(RADEON_TV_PRE_DAC_MUX_CNTL, tv_pre_dac_mux_cntl); 2097 OUTREG(RADEON_TV_DAC_CNTL, tv_dac_cntl); 2098 OUTREG(RADEON_TV_MASTER_CNTL, tv_master_cntl); 2099 OUTREG(RADEON_DAC_CNTL2, dac_cntl2); 2100 2101 return found; 2102 } 2103