1 /* 2 * Copyright 2007-8 Advanced Micro Devices, Inc. 3 * Copyright 2008 Red Hat Inc. 4 * 5 * Permission is hereby granted, free of charge, to any person obtaining a 6 * copy of this software and associated documentation files (the "Software"), 7 * to deal in the Software without restriction, including without limitation 8 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 9 * and/or sell copies of the Software, and to permit persons to whom the 10 * Software is furnished to do so, subject to the following conditions: 11 * 12 * The above copyright notice and this permission notice shall be included in 13 * all copies or substantial portions of the Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 21 * OTHER DEALINGS IN THE SOFTWARE. 22 * 23 * Authors: Dave Airlie 24 * Alex Deucher 25 */ 26 #include <drm/drmP.h> 27 #include <drm/drm_crtc_helper.h> 28 #include <drm/radeon_drm.h> 29 #include "radeon.h" 30 #include "radeon_asic.h" 31 #include "atom.h" 32 #include <linux/delay.h> 33 34 static void radeon_legacy_encoder_disable(struct drm_encoder *encoder) 35 { 36 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 37 const struct drm_encoder_helper_funcs *encoder_funcs; 38 39 encoder_funcs = encoder->helper_private; 40 encoder_funcs->dpms(encoder, DRM_MODE_DPMS_OFF); 41 radeon_encoder->active_device = 0; 42 } 43 44 static void radeon_legacy_lvds_update(struct drm_encoder *encoder, int mode) 45 { 46 struct drm_device *dev = encoder->dev; 47 struct radeon_device *rdev = dev->dev_private; 48 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 49 uint32_t lvds_gen_cntl, lvds_pll_cntl, pixclks_cntl, disp_pwr_man; 50 int panel_pwr_delay = 2000; 51 bool is_mac = false; 52 uint8_t backlight_level; 53 DRM_DEBUG_KMS("\n"); 54 55 lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL); 56 backlight_level = (lvds_gen_cntl >> RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; 57 58 if (radeon_encoder->enc_priv) { 59 if (rdev->is_atom_bios) { 60 struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; 61 panel_pwr_delay = lvds->panel_pwr_delay; 62 if (lvds->bl_dev) 63 backlight_level = lvds->backlight_level; 64 } else { 65 struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; 66 panel_pwr_delay = lvds->panel_pwr_delay; 67 if (lvds->bl_dev) 68 backlight_level = lvds->backlight_level; 69 } 70 } 71 72 /* macs (and possibly some x86 oem systems?) wire up LVDS strangely 73 * Taken from radeonfb. 74 */ 75 if ((rdev->mode_info.connector_table == CT_IBOOK) || 76 (rdev->mode_info.connector_table == CT_POWERBOOK_EXTERNAL) || 77 (rdev->mode_info.connector_table == CT_POWERBOOK_INTERNAL) || 78 (rdev->mode_info.connector_table == CT_POWERBOOK_VGA)) 79 is_mac = true; 80 81 switch (mode) { 82 case DRM_MODE_DPMS_ON: 83 disp_pwr_man = RREG32(RADEON_DISP_PWR_MAN); 84 disp_pwr_man |= RADEON_AUTO_PWRUP_EN; 85 WREG32(RADEON_DISP_PWR_MAN, disp_pwr_man); 86 lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL); 87 lvds_pll_cntl |= RADEON_LVDS_PLL_EN; 88 WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl); 89 mdelay(1); 90 91 lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL); 92 lvds_pll_cntl &= ~RADEON_LVDS_PLL_RESET; 93 WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl); 94 95 lvds_gen_cntl &= ~(RADEON_LVDS_DISPLAY_DIS | 96 RADEON_LVDS_BL_MOD_LEVEL_MASK); 97 lvds_gen_cntl |= (RADEON_LVDS_ON | RADEON_LVDS_EN | 98 RADEON_LVDS_DIGON | RADEON_LVDS_BLON | 99 (backlight_level << RADEON_LVDS_BL_MOD_LEVEL_SHIFT)); 100 if (is_mac) 101 lvds_gen_cntl |= RADEON_LVDS_BL_MOD_EN; 102 mdelay(panel_pwr_delay); 103 WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); 104 break; 105 case DRM_MODE_DPMS_STANDBY: 106 case DRM_MODE_DPMS_SUSPEND: 107 case DRM_MODE_DPMS_OFF: 108 pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL); 109 WREG32_PLL_P(RADEON_PIXCLKS_CNTL, 0, ~RADEON_PIXCLK_LVDS_ALWAYS_ONb); 110 lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS; 111 if (is_mac) { 112 lvds_gen_cntl &= ~RADEON_LVDS_BL_MOD_EN; 113 WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); 114 lvds_gen_cntl &= ~(RADEON_LVDS_ON | RADEON_LVDS_EN); 115 } else { 116 WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); 117 lvds_gen_cntl &= ~(RADEON_LVDS_ON | RADEON_LVDS_BLON | RADEON_LVDS_EN | RADEON_LVDS_DIGON); 118 } 119 mdelay(panel_pwr_delay); 120 WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); 121 WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl); 122 mdelay(panel_pwr_delay); 123 break; 124 } 125 126 if (rdev->is_atom_bios) 127 radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); 128 else 129 radeon_combios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); 130 131 } 132 133 static void radeon_legacy_lvds_dpms(struct drm_encoder *encoder, int mode) 134 { 135 struct radeon_device *rdev = encoder->dev->dev_private; 136 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 137 DRM_DEBUG("\n"); 138 139 if (radeon_encoder->enc_priv) { 140 if (rdev->is_atom_bios) { 141 struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; 142 lvds->dpms_mode = mode; 143 } else { 144 struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; 145 lvds->dpms_mode = mode; 146 } 147 } 148 149 radeon_legacy_lvds_update(encoder, mode); 150 } 151 152 static void radeon_legacy_lvds_prepare(struct drm_encoder *encoder) 153 { 154 struct radeon_device *rdev = encoder->dev->dev_private; 155 156 if (rdev->is_atom_bios) 157 radeon_atom_output_lock(encoder, true); 158 else 159 radeon_combios_output_lock(encoder, true); 160 radeon_legacy_lvds_dpms(encoder, DRM_MODE_DPMS_OFF); 161 } 162 163 static void radeon_legacy_lvds_commit(struct drm_encoder *encoder) 164 { 165 struct radeon_device *rdev = encoder->dev->dev_private; 166 167 radeon_legacy_lvds_dpms(encoder, DRM_MODE_DPMS_ON); 168 if (rdev->is_atom_bios) 169 radeon_atom_output_lock(encoder, false); 170 else 171 radeon_combios_output_lock(encoder, false); 172 } 173 174 static void radeon_legacy_lvds_mode_set(struct drm_encoder *encoder, 175 struct drm_display_mode *mode, 176 struct drm_display_mode *adjusted_mode) 177 { 178 struct drm_device *dev = encoder->dev; 179 struct radeon_device *rdev = dev->dev_private; 180 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 181 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 182 uint32_t lvds_pll_cntl, lvds_gen_cntl, lvds_ss_gen_cntl; 183 184 DRM_DEBUG_KMS("\n"); 185 186 lvds_pll_cntl = RREG32(RADEON_LVDS_PLL_CNTL); 187 lvds_pll_cntl &= ~RADEON_LVDS_PLL_EN; 188 189 lvds_ss_gen_cntl = RREG32(RADEON_LVDS_SS_GEN_CNTL); 190 if (rdev->is_atom_bios) { 191 /* LVDS_GEN_CNTL parameters are computed in LVDSEncoderControl 192 * need to call that on resume to set up the reg properly. 193 */ 194 radeon_encoder->pixel_clock = adjusted_mode->clock; 195 atombios_digital_setup(encoder, PANEL_ENCODER_ACTION_ENABLE); 196 lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL); 197 } else { 198 struct radeon_encoder_lvds *lvds = (struct radeon_encoder_lvds *)radeon_encoder->enc_priv; 199 if (lvds) { 200 DRM_DEBUG_KMS("bios LVDS_GEN_CNTL: 0x%x\n", lvds->lvds_gen_cntl); 201 lvds_gen_cntl = lvds->lvds_gen_cntl; 202 lvds_ss_gen_cntl &= ~((0xf << RADEON_LVDS_PWRSEQ_DELAY1_SHIFT) | 203 (0xf << RADEON_LVDS_PWRSEQ_DELAY2_SHIFT)); 204 lvds_ss_gen_cntl |= ((lvds->panel_digon_delay << RADEON_LVDS_PWRSEQ_DELAY1_SHIFT) | 205 (lvds->panel_blon_delay << RADEON_LVDS_PWRSEQ_DELAY2_SHIFT)); 206 } else 207 lvds_gen_cntl = RREG32(RADEON_LVDS_GEN_CNTL); 208 } 209 lvds_gen_cntl |= RADEON_LVDS_DISPLAY_DIS; 210 lvds_gen_cntl &= ~(RADEON_LVDS_ON | 211 RADEON_LVDS_BLON | 212 RADEON_LVDS_EN | 213 RADEON_LVDS_RST_FM); 214 215 if (ASIC_IS_R300(rdev)) 216 lvds_pll_cntl &= ~(R300_LVDS_SRC_SEL_MASK); 217 218 if (radeon_crtc->crtc_id == 0) { 219 if (ASIC_IS_R300(rdev)) { 220 if (radeon_encoder->rmx_type != RMX_OFF) 221 lvds_pll_cntl |= R300_LVDS_SRC_SEL_RMX; 222 } else 223 lvds_gen_cntl &= ~RADEON_LVDS_SEL_CRTC2; 224 } else { 225 if (ASIC_IS_R300(rdev)) 226 lvds_pll_cntl |= R300_LVDS_SRC_SEL_CRTC2; 227 else 228 lvds_gen_cntl |= RADEON_LVDS_SEL_CRTC2; 229 } 230 231 WREG32(RADEON_LVDS_GEN_CNTL, lvds_gen_cntl); 232 WREG32(RADEON_LVDS_PLL_CNTL, lvds_pll_cntl); 233 WREG32(RADEON_LVDS_SS_GEN_CNTL, lvds_ss_gen_cntl); 234 235 if (rdev->family == CHIP_RV410) 236 WREG32(RADEON_CLOCK_CNTL_INDEX, 0); 237 238 if (rdev->is_atom_bios) 239 radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); 240 else 241 radeon_combios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); 242 } 243 244 static bool radeon_legacy_mode_fixup(struct drm_encoder *encoder, 245 const struct drm_display_mode *mode, 246 struct drm_display_mode *adjusted_mode) 247 { 248 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 249 250 /* set the active encoder to connector routing */ 251 radeon_encoder_set_active_device(encoder); 252 drm_mode_set_crtcinfo(adjusted_mode, 0); 253 254 /* get the native mode for LVDS */ 255 if (radeon_encoder->active_device & (ATOM_DEVICE_LCD_SUPPORT)) 256 radeon_panel_mode_fixup(encoder, adjusted_mode); 257 258 return true; 259 } 260 261 static const struct drm_encoder_helper_funcs radeon_legacy_lvds_helper_funcs = { 262 .dpms = radeon_legacy_lvds_dpms, 263 .mode_fixup = radeon_legacy_mode_fixup, 264 .prepare = radeon_legacy_lvds_prepare, 265 .mode_set = radeon_legacy_lvds_mode_set, 266 .commit = radeon_legacy_lvds_commit, 267 .disable = radeon_legacy_encoder_disable, 268 }; 269 270 u8 271 radeon_legacy_get_backlight_level(struct radeon_encoder *radeon_encoder) 272 { 273 struct drm_device *dev = radeon_encoder->base.dev; 274 struct radeon_device *rdev = dev->dev_private; 275 u8 backlight_level; 276 277 backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> 278 RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; 279 280 return backlight_level; 281 } 282 283 void 284 radeon_legacy_set_backlight_level(struct radeon_encoder *radeon_encoder, u8 level) 285 { 286 struct drm_device *dev = radeon_encoder->base.dev; 287 struct radeon_device *rdev = dev->dev_private; 288 int dpms_mode = DRM_MODE_DPMS_ON; 289 290 if (radeon_encoder->enc_priv) { 291 if (rdev->is_atom_bios) { 292 struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; 293 if (lvds->backlight_level > 0) 294 dpms_mode = lvds->dpms_mode; 295 else 296 dpms_mode = DRM_MODE_DPMS_OFF; 297 lvds->backlight_level = level; 298 } else { 299 struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; 300 if (lvds->backlight_level > 0) 301 dpms_mode = lvds->dpms_mode; 302 else 303 dpms_mode = DRM_MODE_DPMS_OFF; 304 lvds->backlight_level = level; 305 } 306 } 307 308 radeon_legacy_lvds_update(&radeon_encoder->base, dpms_mode); 309 } 310 311 #if defined(CONFIG_BACKLIGHT_CLASS_DEVICE) || defined(CONFIG_BACKLIGHT_CLASS_DEVICE_MODULE) 312 313 #if 0 314 static uint8_t radeon_legacy_lvds_level(struct backlight_device *bd) 315 { 316 struct radeon_backlight_privdata *pdata = bl_get_data(bd); 317 uint8_t level; 318 319 /* Convert brightness to hardware level */ 320 if (bd->props.brightness < 0) 321 level = 0; 322 else if (bd->props.brightness > RADEON_MAX_BL_LEVEL) 323 level = RADEON_MAX_BL_LEVEL; 324 else 325 level = bd->props.brightness; 326 327 if (pdata->negative) 328 level = RADEON_MAX_BL_LEVEL - level; 329 330 return level; 331 } 332 333 static int radeon_legacy_backlight_update_status(struct backlight_device *bd) 334 { 335 struct radeon_backlight_privdata *pdata = bl_get_data(bd); 336 struct radeon_encoder *radeon_encoder = pdata->encoder; 337 338 radeon_legacy_set_backlight_level(radeon_encoder, 339 radeon_legacy_lvds_level(bd)); 340 341 return 0; 342 } 343 344 static int radeon_legacy_backlight_get_brightness(struct backlight_device *bd) 345 { 346 struct radeon_backlight_privdata *pdata = bl_get_data(bd); 347 struct radeon_encoder *radeon_encoder = pdata->encoder; 348 struct drm_device *dev = radeon_encoder->base.dev; 349 struct radeon_device *rdev = dev->dev_private; 350 uint8_t backlight_level; 351 352 backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> 353 RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; 354 355 return pdata->negative ? RADEON_MAX_BL_LEVEL - backlight_level : backlight_level; 356 } 357 358 static const struct backlight_ops radeon_backlight_ops = { 359 .get_brightness = radeon_legacy_backlight_get_brightness, 360 .update_status = radeon_legacy_backlight_update_status, 361 }; 362 #endif 363 364 void radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder, 365 struct drm_connector *drm_connector) 366 { 367 #if 0 368 struct drm_device *dev = radeon_encoder->base.dev; 369 struct radeon_device *rdev = dev->dev_private; 370 struct backlight_device *bd; 371 struct backlight_properties props; 372 struct radeon_backlight_privdata *pdata; 373 uint8_t backlight_level; 374 char bl_name[16]; 375 376 if (!radeon_encoder->enc_priv) 377 return; 378 379 #ifdef CONFIG_PMAC_BACKLIGHT 380 if (!pmac_has_backlight_type("ati") && 381 !pmac_has_backlight_type("mnca")) 382 return; 383 #endif 384 385 pdata = kmalloc(sizeof(struct radeon_backlight_privdata), 386 M_DRM, M_WAITOK); 387 if (!pdata) { 388 DRM_ERROR("Memory allocation failed\n"); 389 goto error; 390 } 391 392 memset(&props, 0, sizeof(props)); 393 props.max_brightness = RADEON_MAX_BL_LEVEL; 394 props.type = BACKLIGHT_RAW; 395 ksnprintf(bl_name, sizeof(bl_name), 396 "radeon_bl%d", dev->primary->index); 397 bd = backlight_device_register(bl_name, drm_connector->kdev, 398 pdata, &radeon_backlight_ops, &props); 399 if (IS_ERR(bd)) { 400 DRM_ERROR("Backlight registration failed\n"); 401 goto error; 402 } 403 404 pdata->encoder = radeon_encoder; 405 406 backlight_level = (RREG32(RADEON_LVDS_GEN_CNTL) >> 407 RADEON_LVDS_BL_MOD_LEVEL_SHIFT) & 0xff; 408 409 /* First, try to detect backlight level sense based on the assumption 410 * that firmware set it up at full brightness 411 */ 412 if (backlight_level == 0) 413 pdata->negative = true; 414 else if (backlight_level == 0xff) 415 pdata->negative = false; 416 else { 417 /* XXX hack... maybe some day we can figure out in what direction 418 * backlight should work on a given panel? 419 */ 420 pdata->negative = (rdev->family != CHIP_RV200 && 421 rdev->family != CHIP_RV250 && 422 rdev->family != CHIP_RV280 && 423 rdev->family != CHIP_RV350); 424 425 #ifdef CONFIG_PMAC_BACKLIGHT 426 pdata->negative = (pdata->negative || 427 of_machine_is_compatible("PowerBook4,3") || 428 of_machine_is_compatible("PowerBook6,3") || 429 of_machine_is_compatible("PowerBook6,5")); 430 #endif 431 } 432 433 if (rdev->is_atom_bios) { 434 struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; 435 lvds->bl_dev = bd; 436 } else { 437 struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; 438 lvds->bl_dev = bd; 439 } 440 441 bd->props.brightness = radeon_legacy_backlight_get_brightness(bd); 442 bd->props.power = FB_BLANK_UNBLANK; 443 backlight_update_status(bd); 444 445 DRM_INFO("radeon legacy LVDS backlight initialized\n"); 446 447 return; 448 449 error: 450 kfree(pdata); 451 return; 452 #endif 453 } 454 455 static void radeon_legacy_backlight_exit(struct radeon_encoder *radeon_encoder) 456 { 457 #if 0 458 struct drm_device *dev = radeon_encoder->base.dev; 459 struct radeon_device *rdev = dev->dev_private; 460 struct backlight_device *bd = NULL; 461 462 if (!radeon_encoder->enc_priv) 463 return; 464 465 if (rdev->is_atom_bios) { 466 struct radeon_encoder_atom_dig *lvds = radeon_encoder->enc_priv; 467 bd = lvds->bl_dev; 468 lvds->bl_dev = NULL; 469 } else { 470 struct radeon_encoder_lvds *lvds = radeon_encoder->enc_priv; 471 bd = lvds->bl_dev; 472 lvds->bl_dev = NULL; 473 } 474 475 if (bd) { 476 struct radeon_backlight_privdata *pdata; 477 478 pdata = bl_get_data(bd); 479 backlight_device_unregister(bd); 480 kfree(pdata); 481 482 DRM_INFO("radeon legacy LVDS backlight unloaded\n"); 483 } 484 #endif 485 } 486 487 #else /* !CONFIG_BACKLIGHT_CLASS_DEVICE */ 488 489 void radeon_legacy_backlight_init(struct radeon_encoder *encoder, 490 struct drm_connector *drm_connector) 491 { 492 } 493 494 static void radeon_legacy_backlight_exit(struct radeon_encoder *encoder) 495 { 496 } 497 498 #endif 499 500 501 static void radeon_lvds_enc_destroy(struct drm_encoder *encoder) 502 { 503 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 504 505 if (radeon_encoder->enc_priv) { 506 radeon_legacy_backlight_exit(radeon_encoder); 507 kfree(radeon_encoder->enc_priv); 508 } 509 drm_encoder_cleanup(encoder); 510 kfree(radeon_encoder); 511 } 512 513 static const struct drm_encoder_funcs radeon_legacy_lvds_enc_funcs = { 514 .destroy = radeon_lvds_enc_destroy, 515 }; 516 517 static void radeon_legacy_primary_dac_dpms(struct drm_encoder *encoder, int mode) 518 { 519 struct drm_device *dev = encoder->dev; 520 struct radeon_device *rdev = dev->dev_private; 521 uint32_t crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL); 522 uint32_t dac_cntl = RREG32(RADEON_DAC_CNTL); 523 uint32_t dac_macro_cntl = RREG32(RADEON_DAC_MACRO_CNTL); 524 525 DRM_DEBUG_KMS("\n"); 526 527 switch (mode) { 528 case DRM_MODE_DPMS_ON: 529 crtc_ext_cntl |= RADEON_CRTC_CRT_ON; 530 dac_cntl &= ~RADEON_DAC_PDWN; 531 dac_macro_cntl &= ~(RADEON_DAC_PDWN_R | 532 RADEON_DAC_PDWN_G | 533 RADEON_DAC_PDWN_B); 534 break; 535 case DRM_MODE_DPMS_STANDBY: 536 case DRM_MODE_DPMS_SUSPEND: 537 case DRM_MODE_DPMS_OFF: 538 crtc_ext_cntl &= ~RADEON_CRTC_CRT_ON; 539 dac_cntl |= RADEON_DAC_PDWN; 540 dac_macro_cntl |= (RADEON_DAC_PDWN_R | 541 RADEON_DAC_PDWN_G | 542 RADEON_DAC_PDWN_B); 543 break; 544 } 545 546 /* handled in radeon_crtc_dpms() */ 547 if (!(rdev->flags & RADEON_SINGLE_CRTC)) 548 WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl); 549 WREG32(RADEON_DAC_CNTL, dac_cntl); 550 WREG32(RADEON_DAC_MACRO_CNTL, dac_macro_cntl); 551 552 if (rdev->is_atom_bios) 553 radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); 554 else 555 radeon_combios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); 556 557 } 558 559 static void radeon_legacy_primary_dac_prepare(struct drm_encoder *encoder) 560 { 561 struct radeon_device *rdev = encoder->dev->dev_private; 562 563 if (rdev->is_atom_bios) 564 radeon_atom_output_lock(encoder, true); 565 else 566 radeon_combios_output_lock(encoder, true); 567 radeon_legacy_primary_dac_dpms(encoder, DRM_MODE_DPMS_OFF); 568 } 569 570 static void radeon_legacy_primary_dac_commit(struct drm_encoder *encoder) 571 { 572 struct radeon_device *rdev = encoder->dev->dev_private; 573 574 radeon_legacy_primary_dac_dpms(encoder, DRM_MODE_DPMS_ON); 575 576 if (rdev->is_atom_bios) 577 radeon_atom_output_lock(encoder, false); 578 else 579 radeon_combios_output_lock(encoder, false); 580 } 581 582 static void radeon_legacy_primary_dac_mode_set(struct drm_encoder *encoder, 583 struct drm_display_mode *mode, 584 struct drm_display_mode *adjusted_mode) 585 { 586 struct drm_device *dev = encoder->dev; 587 struct radeon_device *rdev = dev->dev_private; 588 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 589 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 590 uint32_t disp_output_cntl, dac_cntl, dac2_cntl, dac_macro_cntl; 591 592 DRM_DEBUG_KMS("\n"); 593 594 if (radeon_crtc->crtc_id == 0) { 595 if (rdev->family == CHIP_R200 || ASIC_IS_R300(rdev)) { 596 disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL) & 597 ~(RADEON_DISP_DAC_SOURCE_MASK); 598 WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); 599 } else { 600 dac2_cntl = RREG32(RADEON_DAC_CNTL2) & ~(RADEON_DAC2_DAC_CLK_SEL); 601 WREG32(RADEON_DAC_CNTL2, dac2_cntl); 602 } 603 } else { 604 if (rdev->family == CHIP_R200 || ASIC_IS_R300(rdev)) { 605 disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL) & 606 ~(RADEON_DISP_DAC_SOURCE_MASK); 607 disp_output_cntl |= RADEON_DISP_DAC_SOURCE_CRTC2; 608 WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); 609 } else { 610 dac2_cntl = RREG32(RADEON_DAC_CNTL2) | RADEON_DAC2_DAC_CLK_SEL; 611 WREG32(RADEON_DAC_CNTL2, dac2_cntl); 612 } 613 } 614 615 dac_cntl = (RADEON_DAC_MASK_ALL | 616 RADEON_DAC_VGA_ADR_EN | 617 /* TODO 6-bits */ 618 RADEON_DAC_8BIT_EN); 619 620 WREG32_P(RADEON_DAC_CNTL, 621 dac_cntl, 622 RADEON_DAC_RANGE_CNTL | 623 RADEON_DAC_BLANKING); 624 625 if (radeon_encoder->enc_priv) { 626 struct radeon_encoder_primary_dac *p_dac = (struct radeon_encoder_primary_dac *)radeon_encoder->enc_priv; 627 dac_macro_cntl = p_dac->ps2_pdac_adj; 628 } else 629 dac_macro_cntl = RREG32(RADEON_DAC_MACRO_CNTL); 630 dac_macro_cntl |= RADEON_DAC_PDWN_R | RADEON_DAC_PDWN_G | RADEON_DAC_PDWN_B; 631 WREG32(RADEON_DAC_MACRO_CNTL, dac_macro_cntl); 632 633 if (rdev->is_atom_bios) 634 radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); 635 else 636 radeon_combios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); 637 } 638 639 static enum drm_connector_status radeon_legacy_primary_dac_detect(struct drm_encoder *encoder, 640 struct drm_connector *connector) 641 { 642 struct drm_device *dev = encoder->dev; 643 struct radeon_device *rdev = dev->dev_private; 644 uint32_t vclk_ecp_cntl, crtc_ext_cntl; 645 uint32_t dac_ext_cntl, dac_cntl, dac_macro_cntl, tmp; 646 enum drm_connector_status found = connector_status_disconnected; 647 bool color = true; 648 649 /* just don't bother on RN50 those chip are often connected to remoting 650 * console hw and often we get failure to load detect those. So to make 651 * everyone happy report the encoder as always connected. 652 */ 653 if (ASIC_IS_RN50(rdev)) { 654 return connector_status_connected; 655 } 656 657 /* save the regs we need */ 658 vclk_ecp_cntl = RREG32_PLL(RADEON_VCLK_ECP_CNTL); 659 crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL); 660 dac_ext_cntl = RREG32(RADEON_DAC_EXT_CNTL); 661 dac_cntl = RREG32(RADEON_DAC_CNTL); 662 dac_macro_cntl = RREG32(RADEON_DAC_MACRO_CNTL); 663 664 tmp = vclk_ecp_cntl & 665 ~(RADEON_PIXCLK_ALWAYS_ONb | RADEON_PIXCLK_DAC_ALWAYS_ONb); 666 WREG32_PLL(RADEON_VCLK_ECP_CNTL, tmp); 667 668 tmp = crtc_ext_cntl | RADEON_CRTC_CRT_ON; 669 WREG32(RADEON_CRTC_EXT_CNTL, tmp); 670 671 tmp = RADEON_DAC_FORCE_BLANK_OFF_EN | 672 RADEON_DAC_FORCE_DATA_EN; 673 674 if (color) 675 tmp |= RADEON_DAC_FORCE_DATA_SEL_RGB; 676 else 677 tmp |= RADEON_DAC_FORCE_DATA_SEL_G; 678 679 if (ASIC_IS_R300(rdev)) 680 tmp |= (0x1b6 << RADEON_DAC_FORCE_DATA_SHIFT); 681 else if (ASIC_IS_RV100(rdev)) 682 tmp |= (0x1ac << RADEON_DAC_FORCE_DATA_SHIFT); 683 else 684 tmp |= (0x180 << RADEON_DAC_FORCE_DATA_SHIFT); 685 686 WREG32(RADEON_DAC_EXT_CNTL, tmp); 687 688 tmp = dac_cntl & ~(RADEON_DAC_RANGE_CNTL_MASK | RADEON_DAC_PDWN); 689 tmp |= RADEON_DAC_RANGE_CNTL_PS2 | RADEON_DAC_CMP_EN; 690 WREG32(RADEON_DAC_CNTL, tmp); 691 692 tmp = dac_macro_cntl; 693 tmp &= ~(RADEON_DAC_PDWN_R | 694 RADEON_DAC_PDWN_G | 695 RADEON_DAC_PDWN_B); 696 697 WREG32(RADEON_DAC_MACRO_CNTL, tmp); 698 699 mdelay(2); 700 701 if (RREG32(RADEON_DAC_CNTL) & RADEON_DAC_CMP_OUTPUT) 702 found = connector_status_connected; 703 704 /* restore the regs we used */ 705 WREG32(RADEON_DAC_CNTL, dac_cntl); 706 WREG32(RADEON_DAC_MACRO_CNTL, dac_macro_cntl); 707 WREG32(RADEON_DAC_EXT_CNTL, dac_ext_cntl); 708 WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl); 709 WREG32_PLL(RADEON_VCLK_ECP_CNTL, vclk_ecp_cntl); 710 711 return found; 712 } 713 714 static const struct drm_encoder_helper_funcs radeon_legacy_primary_dac_helper_funcs = { 715 .dpms = radeon_legacy_primary_dac_dpms, 716 .mode_fixup = radeon_legacy_mode_fixup, 717 .prepare = radeon_legacy_primary_dac_prepare, 718 .mode_set = radeon_legacy_primary_dac_mode_set, 719 .commit = radeon_legacy_primary_dac_commit, 720 .detect = radeon_legacy_primary_dac_detect, 721 .disable = radeon_legacy_encoder_disable, 722 }; 723 724 725 static const struct drm_encoder_funcs radeon_legacy_primary_dac_enc_funcs = { 726 .destroy = radeon_enc_destroy, 727 }; 728 729 static void radeon_legacy_tmds_int_dpms(struct drm_encoder *encoder, int mode) 730 { 731 struct drm_device *dev = encoder->dev; 732 struct radeon_device *rdev = dev->dev_private; 733 uint32_t fp_gen_cntl = RREG32(RADEON_FP_GEN_CNTL); 734 DRM_DEBUG_KMS("\n"); 735 736 switch (mode) { 737 case DRM_MODE_DPMS_ON: 738 fp_gen_cntl |= (RADEON_FP_FPON | RADEON_FP_TMDS_EN); 739 break; 740 case DRM_MODE_DPMS_STANDBY: 741 case DRM_MODE_DPMS_SUSPEND: 742 case DRM_MODE_DPMS_OFF: 743 fp_gen_cntl &= ~(RADEON_FP_FPON | RADEON_FP_TMDS_EN); 744 break; 745 } 746 747 WREG32(RADEON_FP_GEN_CNTL, fp_gen_cntl); 748 749 if (rdev->is_atom_bios) 750 radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); 751 else 752 radeon_combios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); 753 754 } 755 756 static void radeon_legacy_tmds_int_prepare(struct drm_encoder *encoder) 757 { 758 struct radeon_device *rdev = encoder->dev->dev_private; 759 760 if (rdev->is_atom_bios) 761 radeon_atom_output_lock(encoder, true); 762 else 763 radeon_combios_output_lock(encoder, true); 764 radeon_legacy_tmds_int_dpms(encoder, DRM_MODE_DPMS_OFF); 765 } 766 767 static void radeon_legacy_tmds_int_commit(struct drm_encoder *encoder) 768 { 769 struct radeon_device *rdev = encoder->dev->dev_private; 770 771 radeon_legacy_tmds_int_dpms(encoder, DRM_MODE_DPMS_ON); 772 773 if (rdev->is_atom_bios) 774 radeon_atom_output_lock(encoder, true); 775 else 776 radeon_combios_output_lock(encoder, true); 777 } 778 779 static void radeon_legacy_tmds_int_mode_set(struct drm_encoder *encoder, 780 struct drm_display_mode *mode, 781 struct drm_display_mode *adjusted_mode) 782 { 783 struct drm_device *dev = encoder->dev; 784 struct radeon_device *rdev = dev->dev_private; 785 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 786 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 787 uint32_t tmp, tmds_pll_cntl, tmds_transmitter_cntl, fp_gen_cntl; 788 int i; 789 790 DRM_DEBUG_KMS("\n"); 791 792 tmp = tmds_pll_cntl = RREG32(RADEON_TMDS_PLL_CNTL); 793 tmp &= 0xfffff; 794 if (rdev->family == CHIP_RV280) { 795 /* bit 22 of TMDS_PLL_CNTL is read-back inverted */ 796 tmp ^= (1 << 22); 797 tmds_pll_cntl ^= (1 << 22); 798 } 799 800 if (radeon_encoder->enc_priv) { 801 struct radeon_encoder_int_tmds *tmds = (struct radeon_encoder_int_tmds *)radeon_encoder->enc_priv; 802 803 for (i = 0; i < 4; i++) { 804 if (tmds->tmds_pll[i].freq == 0) 805 break; 806 if ((uint32_t)(mode->clock / 10) < tmds->tmds_pll[i].freq) { 807 tmp = tmds->tmds_pll[i].value ; 808 break; 809 } 810 } 811 } 812 813 if (ASIC_IS_R300(rdev) || (rdev->family == CHIP_RV280)) { 814 if (tmp & 0xfff00000) 815 tmds_pll_cntl = tmp; 816 else { 817 tmds_pll_cntl &= 0xfff00000; 818 tmds_pll_cntl |= tmp; 819 } 820 } else 821 tmds_pll_cntl = tmp; 822 823 tmds_transmitter_cntl = RREG32(RADEON_TMDS_TRANSMITTER_CNTL) & 824 ~(RADEON_TMDS_TRANSMITTER_PLLRST); 825 826 if (rdev->family == CHIP_R200 || 827 rdev->family == CHIP_R100 || 828 ASIC_IS_R300(rdev)) 829 tmds_transmitter_cntl &= ~(RADEON_TMDS_TRANSMITTER_PLLEN); 830 else /* RV chips got this bit reversed */ 831 tmds_transmitter_cntl |= RADEON_TMDS_TRANSMITTER_PLLEN; 832 833 fp_gen_cntl = (RREG32(RADEON_FP_GEN_CNTL) | 834 (RADEON_FP_CRTC_DONT_SHADOW_VPAR | 835 RADEON_FP_CRTC_DONT_SHADOW_HEND)); 836 837 fp_gen_cntl &= ~(RADEON_FP_FPON | RADEON_FP_TMDS_EN); 838 839 fp_gen_cntl &= ~(RADEON_FP_RMX_HVSYNC_CONTROL_EN | 840 RADEON_FP_DFP_SYNC_SEL | 841 RADEON_FP_CRT_SYNC_SEL | 842 RADEON_FP_CRTC_LOCK_8DOT | 843 RADEON_FP_USE_SHADOW_EN | 844 RADEON_FP_CRTC_USE_SHADOW_VEND | 845 RADEON_FP_CRT_SYNC_ALT); 846 847 if (1) /* FIXME rgbBits == 8 */ 848 fp_gen_cntl |= RADEON_FP_PANEL_FORMAT; /* 24 bit format */ 849 else 850 fp_gen_cntl &= ~RADEON_FP_PANEL_FORMAT;/* 18 bit format */ 851 852 if (radeon_crtc->crtc_id == 0) { 853 if (ASIC_IS_R300(rdev) || rdev->family == CHIP_R200) { 854 fp_gen_cntl &= ~R200_FP_SOURCE_SEL_MASK; 855 if (radeon_encoder->rmx_type != RMX_OFF) 856 fp_gen_cntl |= R200_FP_SOURCE_SEL_RMX; 857 else 858 fp_gen_cntl |= R200_FP_SOURCE_SEL_CRTC1; 859 } else 860 fp_gen_cntl &= ~RADEON_FP_SEL_CRTC2; 861 } else { 862 if (ASIC_IS_R300(rdev) || rdev->family == CHIP_R200) { 863 fp_gen_cntl &= ~R200_FP_SOURCE_SEL_MASK; 864 fp_gen_cntl |= R200_FP_SOURCE_SEL_CRTC2; 865 } else 866 fp_gen_cntl |= RADEON_FP_SEL_CRTC2; 867 } 868 869 WREG32(RADEON_TMDS_PLL_CNTL, tmds_pll_cntl); 870 WREG32(RADEON_TMDS_TRANSMITTER_CNTL, tmds_transmitter_cntl); 871 WREG32(RADEON_FP_GEN_CNTL, fp_gen_cntl); 872 873 if (rdev->is_atom_bios) 874 radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); 875 else 876 radeon_combios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); 877 } 878 879 static const struct drm_encoder_helper_funcs radeon_legacy_tmds_int_helper_funcs = { 880 .dpms = radeon_legacy_tmds_int_dpms, 881 .mode_fixup = radeon_legacy_mode_fixup, 882 .prepare = radeon_legacy_tmds_int_prepare, 883 .mode_set = radeon_legacy_tmds_int_mode_set, 884 .commit = radeon_legacy_tmds_int_commit, 885 .disable = radeon_legacy_encoder_disable, 886 }; 887 888 889 static const struct drm_encoder_funcs radeon_legacy_tmds_int_enc_funcs = { 890 .destroy = radeon_enc_destroy, 891 }; 892 893 static void radeon_legacy_tmds_ext_dpms(struct drm_encoder *encoder, int mode) 894 { 895 struct drm_device *dev = encoder->dev; 896 struct radeon_device *rdev = dev->dev_private; 897 uint32_t fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); 898 DRM_DEBUG_KMS("\n"); 899 900 switch (mode) { 901 case DRM_MODE_DPMS_ON: 902 fp2_gen_cntl &= ~RADEON_FP2_BLANK_EN; 903 fp2_gen_cntl |= (RADEON_FP2_ON | RADEON_FP2_DVO_EN); 904 break; 905 case DRM_MODE_DPMS_STANDBY: 906 case DRM_MODE_DPMS_SUSPEND: 907 case DRM_MODE_DPMS_OFF: 908 fp2_gen_cntl |= RADEON_FP2_BLANK_EN; 909 fp2_gen_cntl &= ~(RADEON_FP2_ON | RADEON_FP2_DVO_EN); 910 break; 911 } 912 913 WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); 914 915 if (rdev->is_atom_bios) 916 radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); 917 else 918 radeon_combios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); 919 920 } 921 922 static void radeon_legacy_tmds_ext_prepare(struct drm_encoder *encoder) 923 { 924 struct radeon_device *rdev = encoder->dev->dev_private; 925 926 if (rdev->is_atom_bios) 927 radeon_atom_output_lock(encoder, true); 928 else 929 radeon_combios_output_lock(encoder, true); 930 radeon_legacy_tmds_ext_dpms(encoder, DRM_MODE_DPMS_OFF); 931 } 932 933 static void radeon_legacy_tmds_ext_commit(struct drm_encoder *encoder) 934 { 935 struct radeon_device *rdev = encoder->dev->dev_private; 936 radeon_legacy_tmds_ext_dpms(encoder, DRM_MODE_DPMS_ON); 937 938 if (rdev->is_atom_bios) 939 radeon_atom_output_lock(encoder, false); 940 else 941 radeon_combios_output_lock(encoder, false); 942 } 943 944 static void radeon_legacy_tmds_ext_mode_set(struct drm_encoder *encoder, 945 struct drm_display_mode *mode, 946 struct drm_display_mode *adjusted_mode) 947 { 948 struct drm_device *dev = encoder->dev; 949 struct radeon_device *rdev = dev->dev_private; 950 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 951 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 952 uint32_t fp2_gen_cntl; 953 954 DRM_DEBUG_KMS("\n"); 955 956 if (rdev->is_atom_bios) { 957 radeon_encoder->pixel_clock = adjusted_mode->clock; 958 atombios_dvo_setup(encoder, ATOM_ENABLE); 959 fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); 960 } else { 961 fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); 962 963 if (1) /* FIXME rgbBits == 8 */ 964 fp2_gen_cntl |= RADEON_FP2_PANEL_FORMAT; /* 24 bit format, */ 965 else 966 fp2_gen_cntl &= ~RADEON_FP2_PANEL_FORMAT;/* 18 bit format, */ 967 968 fp2_gen_cntl &= ~(RADEON_FP2_ON | 969 RADEON_FP2_DVO_EN | 970 RADEON_FP2_DVO_RATE_SEL_SDR); 971 972 /* XXX: these are oem specific */ 973 if (ASIC_IS_R300(rdev)) { 974 if ((dev->pdev->device == 0x4850) && 975 (dev->pdev->subsystem_vendor == 0x1028) && 976 (dev->pdev->subsystem_device == 0x2001)) /* Dell Inspiron 8600 */ 977 fp2_gen_cntl |= R300_FP2_DVO_CLOCK_MODE_SINGLE; 978 else 979 fp2_gen_cntl |= RADEON_FP2_PAD_FLOP_EN | R300_FP2_DVO_CLOCK_MODE_SINGLE; 980 981 /*if (mode->clock > 165000) 982 fp2_gen_cntl |= R300_FP2_DVO_DUAL_CHANNEL_EN;*/ 983 } 984 if (!radeon_combios_external_tmds_setup(encoder)) 985 radeon_external_tmds_setup(encoder); 986 } 987 988 if (radeon_crtc->crtc_id == 0) { 989 if ((rdev->family == CHIP_R200) || ASIC_IS_R300(rdev)) { 990 fp2_gen_cntl &= ~R200_FP2_SOURCE_SEL_MASK; 991 if (radeon_encoder->rmx_type != RMX_OFF) 992 fp2_gen_cntl |= R200_FP2_SOURCE_SEL_RMX; 993 else 994 fp2_gen_cntl |= R200_FP2_SOURCE_SEL_CRTC1; 995 } else 996 fp2_gen_cntl &= ~RADEON_FP2_SRC_SEL_CRTC2; 997 } else { 998 if ((rdev->family == CHIP_R200) || ASIC_IS_R300(rdev)) { 999 fp2_gen_cntl &= ~R200_FP2_SOURCE_SEL_MASK; 1000 fp2_gen_cntl |= R200_FP2_SOURCE_SEL_CRTC2; 1001 } else 1002 fp2_gen_cntl |= RADEON_FP2_SRC_SEL_CRTC2; 1003 } 1004 1005 WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); 1006 1007 if (rdev->is_atom_bios) 1008 radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); 1009 else 1010 radeon_combios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); 1011 } 1012 1013 static void radeon_ext_tmds_enc_destroy(struct drm_encoder *encoder) 1014 { 1015 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1016 /* don't destroy the i2c bus record here, this will be done in radeon_i2c_fini */ 1017 kfree(radeon_encoder->enc_priv); 1018 drm_encoder_cleanup(encoder); 1019 kfree(radeon_encoder); 1020 } 1021 1022 static const struct drm_encoder_helper_funcs radeon_legacy_tmds_ext_helper_funcs = { 1023 .dpms = radeon_legacy_tmds_ext_dpms, 1024 .mode_fixup = radeon_legacy_mode_fixup, 1025 .prepare = radeon_legacy_tmds_ext_prepare, 1026 .mode_set = radeon_legacy_tmds_ext_mode_set, 1027 .commit = radeon_legacy_tmds_ext_commit, 1028 .disable = radeon_legacy_encoder_disable, 1029 }; 1030 1031 1032 static const struct drm_encoder_funcs radeon_legacy_tmds_ext_enc_funcs = { 1033 .destroy = radeon_ext_tmds_enc_destroy, 1034 }; 1035 1036 static void radeon_legacy_tv_dac_dpms(struct drm_encoder *encoder, int mode) 1037 { 1038 struct drm_device *dev = encoder->dev; 1039 struct radeon_device *rdev = dev->dev_private; 1040 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1041 uint32_t fp2_gen_cntl = 0, crtc2_gen_cntl = 0, tv_dac_cntl = 0; 1042 uint32_t tv_master_cntl = 0; 1043 bool is_tv; 1044 DRM_DEBUG_KMS("\n"); 1045 1046 is_tv = radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT ? true : false; 1047 1048 if (rdev->family == CHIP_R200) 1049 fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); 1050 else { 1051 if (is_tv) 1052 tv_master_cntl = RREG32(RADEON_TV_MASTER_CNTL); 1053 else 1054 crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL); 1055 tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL); 1056 } 1057 1058 switch (mode) { 1059 case DRM_MODE_DPMS_ON: 1060 if (rdev->family == CHIP_R200) { 1061 fp2_gen_cntl |= (RADEON_FP2_ON | RADEON_FP2_DVO_EN); 1062 } else { 1063 if (is_tv) 1064 tv_master_cntl |= RADEON_TV_ON; 1065 else 1066 crtc2_gen_cntl |= RADEON_CRTC2_CRT2_ON; 1067 1068 if (rdev->family == CHIP_R420 || 1069 rdev->family == CHIP_R423 || 1070 rdev->family == CHIP_RV410) 1071 tv_dac_cntl &= ~(R420_TV_DAC_RDACPD | 1072 R420_TV_DAC_GDACPD | 1073 R420_TV_DAC_BDACPD | 1074 RADEON_TV_DAC_BGSLEEP); 1075 else 1076 tv_dac_cntl &= ~(RADEON_TV_DAC_RDACPD | 1077 RADEON_TV_DAC_GDACPD | 1078 RADEON_TV_DAC_BDACPD | 1079 RADEON_TV_DAC_BGSLEEP); 1080 } 1081 break; 1082 case DRM_MODE_DPMS_STANDBY: 1083 case DRM_MODE_DPMS_SUSPEND: 1084 case DRM_MODE_DPMS_OFF: 1085 if (rdev->family == CHIP_R200) 1086 fp2_gen_cntl &= ~(RADEON_FP2_ON | RADEON_FP2_DVO_EN); 1087 else { 1088 if (is_tv) 1089 tv_master_cntl &= ~RADEON_TV_ON; 1090 else 1091 crtc2_gen_cntl &= ~RADEON_CRTC2_CRT2_ON; 1092 1093 if (rdev->family == CHIP_R420 || 1094 rdev->family == CHIP_R423 || 1095 rdev->family == CHIP_RV410) 1096 tv_dac_cntl |= (R420_TV_DAC_RDACPD | 1097 R420_TV_DAC_GDACPD | 1098 R420_TV_DAC_BDACPD | 1099 RADEON_TV_DAC_BGSLEEP); 1100 else 1101 tv_dac_cntl |= (RADEON_TV_DAC_RDACPD | 1102 RADEON_TV_DAC_GDACPD | 1103 RADEON_TV_DAC_BDACPD | 1104 RADEON_TV_DAC_BGSLEEP); 1105 } 1106 break; 1107 } 1108 1109 if (rdev->family == CHIP_R200) { 1110 WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); 1111 } else { 1112 if (is_tv) 1113 WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl); 1114 /* handled in radeon_crtc_dpms() */ 1115 else if (!(rdev->flags & RADEON_SINGLE_CRTC)) 1116 WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); 1117 WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); 1118 } 1119 1120 if (rdev->is_atom_bios) 1121 radeon_atombios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); 1122 else 1123 radeon_combios_encoder_dpms_scratch_regs(encoder, (mode == DRM_MODE_DPMS_ON) ? true : false); 1124 1125 } 1126 1127 static void radeon_legacy_tv_dac_prepare(struct drm_encoder *encoder) 1128 { 1129 struct radeon_device *rdev = encoder->dev->dev_private; 1130 1131 if (rdev->is_atom_bios) 1132 radeon_atom_output_lock(encoder, true); 1133 else 1134 radeon_combios_output_lock(encoder, true); 1135 radeon_legacy_tv_dac_dpms(encoder, DRM_MODE_DPMS_OFF); 1136 } 1137 1138 static void radeon_legacy_tv_dac_commit(struct drm_encoder *encoder) 1139 { 1140 struct radeon_device *rdev = encoder->dev->dev_private; 1141 1142 radeon_legacy_tv_dac_dpms(encoder, DRM_MODE_DPMS_ON); 1143 1144 if (rdev->is_atom_bios) 1145 radeon_atom_output_lock(encoder, true); 1146 else 1147 radeon_combios_output_lock(encoder, true); 1148 } 1149 1150 static void radeon_legacy_tv_dac_mode_set(struct drm_encoder *encoder, 1151 struct drm_display_mode *mode, 1152 struct drm_display_mode *adjusted_mode) 1153 { 1154 struct drm_device *dev = encoder->dev; 1155 struct radeon_device *rdev = dev->dev_private; 1156 struct radeon_crtc *radeon_crtc = to_radeon_crtc(encoder->crtc); 1157 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1158 struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv; 1159 uint32_t tv_dac_cntl, gpiopad_a = 0, dac2_cntl, disp_output_cntl = 0; 1160 uint32_t disp_hw_debug = 0, fp2_gen_cntl = 0, disp_tv_out_cntl = 0; 1161 bool is_tv = false; 1162 1163 DRM_DEBUG_KMS("\n"); 1164 1165 is_tv = radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT ? true : false; 1166 1167 if (rdev->family != CHIP_R200) { 1168 tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL); 1169 if (rdev->family == CHIP_R420 || 1170 rdev->family == CHIP_R423 || 1171 rdev->family == CHIP_RV410) { 1172 tv_dac_cntl &= ~(RADEON_TV_DAC_STD_MASK | 1173 RADEON_TV_DAC_BGADJ_MASK | 1174 R420_TV_DAC_DACADJ_MASK | 1175 R420_TV_DAC_RDACPD | 1176 R420_TV_DAC_GDACPD | 1177 R420_TV_DAC_BDACPD | 1178 R420_TV_DAC_TVENABLE); 1179 } else { 1180 tv_dac_cntl &= ~(RADEON_TV_DAC_STD_MASK | 1181 RADEON_TV_DAC_BGADJ_MASK | 1182 RADEON_TV_DAC_DACADJ_MASK | 1183 RADEON_TV_DAC_RDACPD | 1184 RADEON_TV_DAC_GDACPD | 1185 RADEON_TV_DAC_BDACPD); 1186 } 1187 1188 tv_dac_cntl |= RADEON_TV_DAC_NBLANK | RADEON_TV_DAC_NHOLD; 1189 1190 if (is_tv) { 1191 if (tv_dac->tv_std == TV_STD_NTSC || 1192 tv_dac->tv_std == TV_STD_NTSC_J || 1193 tv_dac->tv_std == TV_STD_PAL_M || 1194 tv_dac->tv_std == TV_STD_PAL_60) 1195 tv_dac_cntl |= tv_dac->ntsc_tvdac_adj; 1196 else 1197 tv_dac_cntl |= tv_dac->pal_tvdac_adj; 1198 1199 if (tv_dac->tv_std == TV_STD_NTSC || 1200 tv_dac->tv_std == TV_STD_NTSC_J) 1201 tv_dac_cntl |= RADEON_TV_DAC_STD_NTSC; 1202 else 1203 tv_dac_cntl |= RADEON_TV_DAC_STD_PAL; 1204 } else 1205 tv_dac_cntl |= (RADEON_TV_DAC_STD_PS2 | 1206 tv_dac->ps2_tvdac_adj); 1207 1208 WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); 1209 } 1210 1211 if (ASIC_IS_R300(rdev)) { 1212 gpiopad_a = RREG32(RADEON_GPIOPAD_A) | 1; 1213 disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL); 1214 } else if (rdev->family != CHIP_R200) 1215 disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG); 1216 else if (rdev->family == CHIP_R200) 1217 fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); 1218 1219 if (rdev->family >= CHIP_R200) 1220 disp_tv_out_cntl = RREG32(RADEON_DISP_TV_OUT_CNTL); 1221 1222 if (is_tv) { 1223 uint32_t dac_cntl; 1224 1225 dac_cntl = RREG32(RADEON_DAC_CNTL); 1226 dac_cntl &= ~RADEON_DAC_TVO_EN; 1227 WREG32(RADEON_DAC_CNTL, dac_cntl); 1228 1229 if (ASIC_IS_R300(rdev)) 1230 gpiopad_a = RREG32(RADEON_GPIOPAD_A) & ~1; 1231 1232 dac2_cntl = RREG32(RADEON_DAC_CNTL2) & ~RADEON_DAC2_DAC2_CLK_SEL; 1233 if (radeon_crtc->crtc_id == 0) { 1234 if (ASIC_IS_R300(rdev)) { 1235 disp_output_cntl &= ~RADEON_DISP_TVDAC_SOURCE_MASK; 1236 disp_output_cntl |= (RADEON_DISP_TVDAC_SOURCE_CRTC | 1237 RADEON_DISP_TV_SOURCE_CRTC); 1238 } 1239 if (rdev->family >= CHIP_R200) { 1240 disp_tv_out_cntl &= ~RADEON_DISP_TV_PATH_SRC_CRTC2; 1241 } else { 1242 disp_hw_debug |= RADEON_CRT2_DISP1_SEL; 1243 } 1244 } else { 1245 if (ASIC_IS_R300(rdev)) { 1246 disp_output_cntl &= ~RADEON_DISP_TVDAC_SOURCE_MASK; 1247 disp_output_cntl |= RADEON_DISP_TV_SOURCE_CRTC; 1248 } 1249 if (rdev->family >= CHIP_R200) { 1250 disp_tv_out_cntl |= RADEON_DISP_TV_PATH_SRC_CRTC2; 1251 } else { 1252 disp_hw_debug &= ~RADEON_CRT2_DISP1_SEL; 1253 } 1254 } 1255 WREG32(RADEON_DAC_CNTL2, dac2_cntl); 1256 } else { 1257 1258 dac2_cntl = RREG32(RADEON_DAC_CNTL2) | RADEON_DAC2_DAC2_CLK_SEL; 1259 1260 if (radeon_crtc->crtc_id == 0) { 1261 if (ASIC_IS_R300(rdev)) { 1262 disp_output_cntl &= ~RADEON_DISP_TVDAC_SOURCE_MASK; 1263 disp_output_cntl |= RADEON_DISP_TVDAC_SOURCE_CRTC; 1264 } else if (rdev->family == CHIP_R200) { 1265 fp2_gen_cntl &= ~(R200_FP2_SOURCE_SEL_MASK | 1266 RADEON_FP2_DVO_RATE_SEL_SDR); 1267 } else 1268 disp_hw_debug |= RADEON_CRT2_DISP1_SEL; 1269 } else { 1270 if (ASIC_IS_R300(rdev)) { 1271 disp_output_cntl &= ~RADEON_DISP_TVDAC_SOURCE_MASK; 1272 disp_output_cntl |= RADEON_DISP_TVDAC_SOURCE_CRTC2; 1273 } else if (rdev->family == CHIP_R200) { 1274 fp2_gen_cntl &= ~(R200_FP2_SOURCE_SEL_MASK | 1275 RADEON_FP2_DVO_RATE_SEL_SDR); 1276 fp2_gen_cntl |= R200_FP2_SOURCE_SEL_CRTC2; 1277 } else 1278 disp_hw_debug &= ~RADEON_CRT2_DISP1_SEL; 1279 } 1280 WREG32(RADEON_DAC_CNTL2, dac2_cntl); 1281 } 1282 1283 if (ASIC_IS_R300(rdev)) { 1284 WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1); 1285 WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); 1286 } else if (rdev->family != CHIP_R200) 1287 WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug); 1288 else if (rdev->family == CHIP_R200) 1289 WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); 1290 1291 if (rdev->family >= CHIP_R200) 1292 WREG32(RADEON_DISP_TV_OUT_CNTL, disp_tv_out_cntl); 1293 1294 if (is_tv) 1295 radeon_legacy_tv_mode_set(encoder, mode, adjusted_mode); 1296 1297 if (rdev->is_atom_bios) 1298 radeon_atombios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); 1299 else 1300 radeon_combios_encoder_crtc_scratch_regs(encoder, radeon_crtc->crtc_id); 1301 1302 } 1303 1304 static bool r300_legacy_tv_detect(struct drm_encoder *encoder, 1305 struct drm_connector *connector) 1306 { 1307 struct drm_device *dev = encoder->dev; 1308 struct radeon_device *rdev = dev->dev_private; 1309 uint32_t crtc2_gen_cntl, tv_dac_cntl, dac_cntl2, dac_ext_cntl; 1310 uint32_t disp_output_cntl, gpiopad_a, tmp; 1311 bool found = false; 1312 1313 /* save regs needed */ 1314 gpiopad_a = RREG32(RADEON_GPIOPAD_A); 1315 dac_cntl2 = RREG32(RADEON_DAC_CNTL2); 1316 crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL); 1317 dac_ext_cntl = RREG32(RADEON_DAC_EXT_CNTL); 1318 tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL); 1319 disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL); 1320 1321 WREG32_P(RADEON_GPIOPAD_A, 0, ~1); 1322 1323 WREG32(RADEON_DAC_CNTL2, RADEON_DAC2_DAC2_CLK_SEL); 1324 1325 WREG32(RADEON_CRTC2_GEN_CNTL, 1326 RADEON_CRTC2_CRT2_ON | RADEON_CRTC2_VSYNC_TRISTAT); 1327 1328 tmp = disp_output_cntl & ~RADEON_DISP_TVDAC_SOURCE_MASK; 1329 tmp |= RADEON_DISP_TVDAC_SOURCE_CRTC2; 1330 WREG32(RADEON_DISP_OUTPUT_CNTL, tmp); 1331 1332 WREG32(RADEON_DAC_EXT_CNTL, 1333 RADEON_DAC2_FORCE_BLANK_OFF_EN | 1334 RADEON_DAC2_FORCE_DATA_EN | 1335 RADEON_DAC_FORCE_DATA_SEL_RGB | 1336 (0xec << RADEON_DAC_FORCE_DATA_SHIFT)); 1337 1338 WREG32(RADEON_TV_DAC_CNTL, 1339 RADEON_TV_DAC_STD_NTSC | 1340 (8 << RADEON_TV_DAC_BGADJ_SHIFT) | 1341 (6 << RADEON_TV_DAC_DACADJ_SHIFT)); 1342 1343 RREG32(RADEON_TV_DAC_CNTL); 1344 mdelay(4); 1345 1346 WREG32(RADEON_TV_DAC_CNTL, 1347 RADEON_TV_DAC_NBLANK | 1348 RADEON_TV_DAC_NHOLD | 1349 RADEON_TV_MONITOR_DETECT_EN | 1350 RADEON_TV_DAC_STD_NTSC | 1351 (8 << RADEON_TV_DAC_BGADJ_SHIFT) | 1352 (6 << RADEON_TV_DAC_DACADJ_SHIFT)); 1353 1354 RREG32(RADEON_TV_DAC_CNTL); 1355 mdelay(6); 1356 1357 tmp = RREG32(RADEON_TV_DAC_CNTL); 1358 if ((tmp & RADEON_TV_DAC_GDACDET) != 0) { 1359 found = true; 1360 DRM_DEBUG_KMS("S-video TV connection detected\n"); 1361 } else if ((tmp & RADEON_TV_DAC_BDACDET) != 0) { 1362 found = true; 1363 DRM_DEBUG_KMS("Composite TV connection detected\n"); 1364 } 1365 1366 WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); 1367 WREG32(RADEON_DAC_EXT_CNTL, dac_ext_cntl); 1368 WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); 1369 WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); 1370 WREG32(RADEON_DAC_CNTL2, dac_cntl2); 1371 WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1); 1372 return found; 1373 } 1374 1375 static bool radeon_legacy_tv_detect(struct drm_encoder *encoder, 1376 struct drm_connector *connector) 1377 { 1378 struct drm_device *dev = encoder->dev; 1379 struct radeon_device *rdev = dev->dev_private; 1380 uint32_t tv_dac_cntl, dac_cntl2; 1381 uint32_t config_cntl, tv_pre_dac_mux_cntl, tv_master_cntl, tmp; 1382 bool found = false; 1383 1384 if (ASIC_IS_R300(rdev)) 1385 return r300_legacy_tv_detect(encoder, connector); 1386 1387 dac_cntl2 = RREG32(RADEON_DAC_CNTL2); 1388 tv_master_cntl = RREG32(RADEON_TV_MASTER_CNTL); 1389 tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL); 1390 config_cntl = RREG32(RADEON_CONFIG_CNTL); 1391 tv_pre_dac_mux_cntl = RREG32(RADEON_TV_PRE_DAC_MUX_CNTL); 1392 1393 tmp = dac_cntl2 & ~RADEON_DAC2_DAC2_CLK_SEL; 1394 WREG32(RADEON_DAC_CNTL2, tmp); 1395 1396 tmp = tv_master_cntl | RADEON_TV_ON; 1397 tmp &= ~(RADEON_TV_ASYNC_RST | 1398 RADEON_RESTART_PHASE_FIX | 1399 RADEON_CRT_FIFO_CE_EN | 1400 RADEON_TV_FIFO_CE_EN | 1401 RADEON_RE_SYNC_NOW_SEL_MASK); 1402 tmp |= RADEON_TV_FIFO_ASYNC_RST | RADEON_CRT_ASYNC_RST; 1403 WREG32(RADEON_TV_MASTER_CNTL, tmp); 1404 1405 tmp = RADEON_TV_DAC_NBLANK | RADEON_TV_DAC_NHOLD | 1406 RADEON_TV_MONITOR_DETECT_EN | RADEON_TV_DAC_STD_NTSC | 1407 (8 << RADEON_TV_DAC_BGADJ_SHIFT); 1408 1409 if (config_cntl & RADEON_CFG_ATI_REV_ID_MASK) 1410 tmp |= (4 << RADEON_TV_DAC_DACADJ_SHIFT); 1411 else 1412 tmp |= (8 << RADEON_TV_DAC_DACADJ_SHIFT); 1413 WREG32(RADEON_TV_DAC_CNTL, tmp); 1414 1415 tmp = RADEON_C_GRN_EN | RADEON_CMP_BLU_EN | 1416 RADEON_RED_MX_FORCE_DAC_DATA | 1417 RADEON_GRN_MX_FORCE_DAC_DATA | 1418 RADEON_BLU_MX_FORCE_DAC_DATA | 1419 (0x109 << RADEON_TV_FORCE_DAC_DATA_SHIFT); 1420 WREG32(RADEON_TV_PRE_DAC_MUX_CNTL, tmp); 1421 1422 mdelay(3); 1423 tmp = RREG32(RADEON_TV_DAC_CNTL); 1424 if (tmp & RADEON_TV_DAC_GDACDET) { 1425 found = true; 1426 DRM_DEBUG_KMS("S-video TV connection detected\n"); 1427 } else if ((tmp & RADEON_TV_DAC_BDACDET) != 0) { 1428 found = true; 1429 DRM_DEBUG_KMS("Composite TV connection detected\n"); 1430 } 1431 1432 WREG32(RADEON_TV_PRE_DAC_MUX_CNTL, tv_pre_dac_mux_cntl); 1433 WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); 1434 WREG32(RADEON_TV_MASTER_CNTL, tv_master_cntl); 1435 WREG32(RADEON_DAC_CNTL2, dac_cntl2); 1436 return found; 1437 } 1438 1439 static bool radeon_legacy_ext_dac_detect(struct drm_encoder *encoder, 1440 struct drm_connector *connector) 1441 { 1442 struct drm_device *dev = encoder->dev; 1443 struct radeon_device *rdev = dev->dev_private; 1444 uint32_t gpio_monid, fp2_gen_cntl, disp_output_cntl, crtc2_gen_cntl; 1445 uint32_t disp_lin_trans_grph_a, disp_lin_trans_grph_b, disp_lin_trans_grph_c; 1446 uint32_t disp_lin_trans_grph_d, disp_lin_trans_grph_e, disp_lin_trans_grph_f; 1447 uint32_t tmp, crtc2_h_total_disp, crtc2_v_total_disp; 1448 uint32_t crtc2_h_sync_strt_wid, crtc2_v_sync_strt_wid; 1449 bool found = false; 1450 int i; 1451 1452 /* save the regs we need */ 1453 gpio_monid = RREG32(RADEON_GPIO_MONID); 1454 fp2_gen_cntl = RREG32(RADEON_FP2_GEN_CNTL); 1455 disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL); 1456 crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL); 1457 disp_lin_trans_grph_a = RREG32(RADEON_DISP_LIN_TRANS_GRPH_A); 1458 disp_lin_trans_grph_b = RREG32(RADEON_DISP_LIN_TRANS_GRPH_B); 1459 disp_lin_trans_grph_c = RREG32(RADEON_DISP_LIN_TRANS_GRPH_C); 1460 disp_lin_trans_grph_d = RREG32(RADEON_DISP_LIN_TRANS_GRPH_D); 1461 disp_lin_trans_grph_e = RREG32(RADEON_DISP_LIN_TRANS_GRPH_E); 1462 disp_lin_trans_grph_f = RREG32(RADEON_DISP_LIN_TRANS_GRPH_F); 1463 crtc2_h_total_disp = RREG32(RADEON_CRTC2_H_TOTAL_DISP); 1464 crtc2_v_total_disp = RREG32(RADEON_CRTC2_V_TOTAL_DISP); 1465 crtc2_h_sync_strt_wid = RREG32(RADEON_CRTC2_H_SYNC_STRT_WID); 1466 crtc2_v_sync_strt_wid = RREG32(RADEON_CRTC2_V_SYNC_STRT_WID); 1467 1468 tmp = RREG32(RADEON_GPIO_MONID); 1469 tmp &= ~RADEON_GPIO_A_0; 1470 WREG32(RADEON_GPIO_MONID, tmp); 1471 1472 WREG32(RADEON_FP2_GEN_CNTL, (RADEON_FP2_ON | 1473 RADEON_FP2_PANEL_FORMAT | 1474 R200_FP2_SOURCE_SEL_TRANS_UNIT | 1475 RADEON_FP2_DVO_EN | 1476 R200_FP2_DVO_RATE_SEL_SDR)); 1477 1478 WREG32(RADEON_DISP_OUTPUT_CNTL, (RADEON_DISP_DAC_SOURCE_RMX | 1479 RADEON_DISP_TRANS_MATRIX_GRAPHICS)); 1480 1481 WREG32(RADEON_CRTC2_GEN_CNTL, (RADEON_CRTC2_EN | 1482 RADEON_CRTC2_DISP_REQ_EN_B)); 1483 1484 WREG32(RADEON_DISP_LIN_TRANS_GRPH_A, 0x00000000); 1485 WREG32(RADEON_DISP_LIN_TRANS_GRPH_B, 0x000003f0); 1486 WREG32(RADEON_DISP_LIN_TRANS_GRPH_C, 0x00000000); 1487 WREG32(RADEON_DISP_LIN_TRANS_GRPH_D, 0x000003f0); 1488 WREG32(RADEON_DISP_LIN_TRANS_GRPH_E, 0x00000000); 1489 WREG32(RADEON_DISP_LIN_TRANS_GRPH_F, 0x000003f0); 1490 1491 WREG32(RADEON_CRTC2_H_TOTAL_DISP, 0x01000008); 1492 WREG32(RADEON_CRTC2_H_SYNC_STRT_WID, 0x00000800); 1493 WREG32(RADEON_CRTC2_V_TOTAL_DISP, 0x00080001); 1494 WREG32(RADEON_CRTC2_V_SYNC_STRT_WID, 0x00000080); 1495 1496 for (i = 0; i < 200; i++) { 1497 tmp = RREG32(RADEON_GPIO_MONID); 1498 if (tmp & RADEON_GPIO_Y_0) 1499 found = true; 1500 1501 if (found) 1502 break; 1503 1504 mdelay(1); 1505 if (!drm_can_sleep()) 1506 mdelay(1); 1507 else 1508 msleep(1); 1509 } 1510 1511 /* restore the regs we used */ 1512 WREG32(RADEON_DISP_LIN_TRANS_GRPH_A, disp_lin_trans_grph_a); 1513 WREG32(RADEON_DISP_LIN_TRANS_GRPH_B, disp_lin_trans_grph_b); 1514 WREG32(RADEON_DISP_LIN_TRANS_GRPH_C, disp_lin_trans_grph_c); 1515 WREG32(RADEON_DISP_LIN_TRANS_GRPH_D, disp_lin_trans_grph_d); 1516 WREG32(RADEON_DISP_LIN_TRANS_GRPH_E, disp_lin_trans_grph_e); 1517 WREG32(RADEON_DISP_LIN_TRANS_GRPH_F, disp_lin_trans_grph_f); 1518 WREG32(RADEON_CRTC2_H_TOTAL_DISP, crtc2_h_total_disp); 1519 WREG32(RADEON_CRTC2_V_TOTAL_DISP, crtc2_v_total_disp); 1520 WREG32(RADEON_CRTC2_H_SYNC_STRT_WID, crtc2_h_sync_strt_wid); 1521 WREG32(RADEON_CRTC2_V_SYNC_STRT_WID, crtc2_v_sync_strt_wid); 1522 WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); 1523 WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); 1524 WREG32(RADEON_FP2_GEN_CNTL, fp2_gen_cntl); 1525 WREG32(RADEON_GPIO_MONID, gpio_monid); 1526 1527 return found; 1528 } 1529 1530 static enum drm_connector_status radeon_legacy_tv_dac_detect(struct drm_encoder *encoder, 1531 struct drm_connector *connector) 1532 { 1533 struct drm_device *dev = encoder->dev; 1534 struct radeon_device *rdev = dev->dev_private; 1535 uint32_t crtc2_gen_cntl = 0, tv_dac_cntl, dac_cntl2, dac_ext_cntl; 1536 uint32_t gpiopad_a = 0, pixclks_cntl, tmp; 1537 uint32_t disp_output_cntl = 0, disp_hw_debug = 0, crtc_ext_cntl = 0; 1538 enum drm_connector_status found = connector_status_disconnected; 1539 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); 1540 struct radeon_encoder_tv_dac *tv_dac = radeon_encoder->enc_priv; 1541 bool color = true; 1542 struct drm_crtc *crtc; 1543 1544 /* find out if crtc2 is in use or if this encoder is using it */ 1545 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 1546 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); 1547 if ((radeon_crtc->crtc_id == 1) && crtc->enabled) { 1548 if (encoder->crtc != crtc) { 1549 return connector_status_disconnected; 1550 } 1551 } 1552 } 1553 1554 if (connector->connector_type == DRM_MODE_CONNECTOR_SVIDEO || 1555 connector->connector_type == DRM_MODE_CONNECTOR_Composite || 1556 connector->connector_type == DRM_MODE_CONNECTOR_9PinDIN) { 1557 bool tv_detect; 1558 1559 if (radeon_encoder->active_device && !(radeon_encoder->active_device & ATOM_DEVICE_TV_SUPPORT)) 1560 return connector_status_disconnected; 1561 1562 tv_detect = radeon_legacy_tv_detect(encoder, connector); 1563 if (tv_detect && tv_dac) 1564 found = connector_status_connected; 1565 return found; 1566 } 1567 1568 /* don't probe if the encoder is being used for something else not CRT related */ 1569 if (radeon_encoder->active_device && !(radeon_encoder->active_device & ATOM_DEVICE_CRT_SUPPORT)) { 1570 DRM_INFO("not detecting due to %08x\n", radeon_encoder->active_device); 1571 return connector_status_disconnected; 1572 } 1573 1574 /* R200 uses an external DAC for secondary DAC */ 1575 if (rdev->family == CHIP_R200) { 1576 if (radeon_legacy_ext_dac_detect(encoder, connector)) 1577 found = connector_status_connected; 1578 return found; 1579 } 1580 1581 /* save the regs we need */ 1582 pixclks_cntl = RREG32_PLL(RADEON_PIXCLKS_CNTL); 1583 1584 if (rdev->flags & RADEON_SINGLE_CRTC) { 1585 crtc_ext_cntl = RREG32(RADEON_CRTC_EXT_CNTL); 1586 } else { 1587 if (ASIC_IS_R300(rdev)) { 1588 gpiopad_a = RREG32(RADEON_GPIOPAD_A); 1589 disp_output_cntl = RREG32(RADEON_DISP_OUTPUT_CNTL); 1590 } else { 1591 disp_hw_debug = RREG32(RADEON_DISP_HW_DEBUG); 1592 } 1593 crtc2_gen_cntl = RREG32(RADEON_CRTC2_GEN_CNTL); 1594 } 1595 tv_dac_cntl = RREG32(RADEON_TV_DAC_CNTL); 1596 dac_ext_cntl = RREG32(RADEON_DAC_EXT_CNTL); 1597 dac_cntl2 = RREG32(RADEON_DAC_CNTL2); 1598 1599 tmp = pixclks_cntl & ~(RADEON_PIX2CLK_ALWAYS_ONb 1600 | RADEON_PIX2CLK_DAC_ALWAYS_ONb); 1601 WREG32_PLL(RADEON_PIXCLKS_CNTL, tmp); 1602 1603 if (rdev->flags & RADEON_SINGLE_CRTC) { 1604 tmp = crtc_ext_cntl | RADEON_CRTC_CRT_ON; 1605 WREG32(RADEON_CRTC_EXT_CNTL, tmp); 1606 } else { 1607 tmp = crtc2_gen_cntl & ~RADEON_CRTC2_PIX_WIDTH_MASK; 1608 tmp |= RADEON_CRTC2_CRT2_ON | 1609 (2 << RADEON_CRTC2_PIX_WIDTH_SHIFT); 1610 WREG32(RADEON_CRTC2_GEN_CNTL, tmp); 1611 1612 if (ASIC_IS_R300(rdev)) { 1613 WREG32_P(RADEON_GPIOPAD_A, 1, ~1); 1614 tmp = disp_output_cntl & ~RADEON_DISP_TVDAC_SOURCE_MASK; 1615 tmp |= RADEON_DISP_TVDAC_SOURCE_CRTC2; 1616 WREG32(RADEON_DISP_OUTPUT_CNTL, tmp); 1617 } else { 1618 tmp = disp_hw_debug & ~RADEON_CRT2_DISP1_SEL; 1619 WREG32(RADEON_DISP_HW_DEBUG, tmp); 1620 } 1621 } 1622 1623 tmp = RADEON_TV_DAC_NBLANK | 1624 RADEON_TV_DAC_NHOLD | 1625 RADEON_TV_MONITOR_DETECT_EN | 1626 RADEON_TV_DAC_STD_PS2; 1627 1628 WREG32(RADEON_TV_DAC_CNTL, tmp); 1629 1630 tmp = RADEON_DAC2_FORCE_BLANK_OFF_EN | 1631 RADEON_DAC2_FORCE_DATA_EN; 1632 1633 if (color) 1634 tmp |= RADEON_DAC_FORCE_DATA_SEL_RGB; 1635 else 1636 tmp |= RADEON_DAC_FORCE_DATA_SEL_G; 1637 1638 if (ASIC_IS_R300(rdev)) 1639 tmp |= (0x1b6 << RADEON_DAC_FORCE_DATA_SHIFT); 1640 else 1641 tmp |= (0x180 << RADEON_DAC_FORCE_DATA_SHIFT); 1642 1643 WREG32(RADEON_DAC_EXT_CNTL, tmp); 1644 1645 tmp = dac_cntl2 | RADEON_DAC2_DAC2_CLK_SEL | RADEON_DAC2_CMP_EN; 1646 WREG32(RADEON_DAC_CNTL2, tmp); 1647 1648 mdelay(10); 1649 1650 if (ASIC_IS_R300(rdev)) { 1651 if (RREG32(RADEON_DAC_CNTL2) & RADEON_DAC2_CMP_OUT_B) 1652 found = connector_status_connected; 1653 } else { 1654 if (RREG32(RADEON_DAC_CNTL2) & RADEON_DAC2_CMP_OUTPUT) 1655 found = connector_status_connected; 1656 } 1657 1658 /* restore regs we used */ 1659 WREG32(RADEON_DAC_CNTL2, dac_cntl2); 1660 WREG32(RADEON_DAC_EXT_CNTL, dac_ext_cntl); 1661 WREG32(RADEON_TV_DAC_CNTL, tv_dac_cntl); 1662 1663 if (rdev->flags & RADEON_SINGLE_CRTC) { 1664 WREG32(RADEON_CRTC_EXT_CNTL, crtc_ext_cntl); 1665 } else { 1666 WREG32(RADEON_CRTC2_GEN_CNTL, crtc2_gen_cntl); 1667 if (ASIC_IS_R300(rdev)) { 1668 WREG32(RADEON_DISP_OUTPUT_CNTL, disp_output_cntl); 1669 WREG32_P(RADEON_GPIOPAD_A, gpiopad_a, ~1); 1670 } else { 1671 WREG32(RADEON_DISP_HW_DEBUG, disp_hw_debug); 1672 } 1673 } 1674 1675 WREG32_PLL(RADEON_PIXCLKS_CNTL, pixclks_cntl); 1676 1677 return found; 1678 1679 } 1680 1681 static const struct drm_encoder_helper_funcs radeon_legacy_tv_dac_helper_funcs = { 1682 .dpms = radeon_legacy_tv_dac_dpms, 1683 .mode_fixup = radeon_legacy_mode_fixup, 1684 .prepare = radeon_legacy_tv_dac_prepare, 1685 .mode_set = radeon_legacy_tv_dac_mode_set, 1686 .commit = radeon_legacy_tv_dac_commit, 1687 .detect = radeon_legacy_tv_dac_detect, 1688 .disable = radeon_legacy_encoder_disable, 1689 }; 1690 1691 1692 static const struct drm_encoder_funcs radeon_legacy_tv_dac_enc_funcs = { 1693 .destroy = radeon_enc_destroy, 1694 }; 1695 1696 1697 static struct radeon_encoder_int_tmds *radeon_legacy_get_tmds_info(struct radeon_encoder *encoder) 1698 { 1699 struct drm_device *dev = encoder->base.dev; 1700 struct radeon_device *rdev = dev->dev_private; 1701 struct radeon_encoder_int_tmds *tmds = NULL; 1702 bool ret; 1703 1704 tmds = kzalloc(sizeof(struct radeon_encoder_int_tmds), GFP_KERNEL); 1705 1706 if (!tmds) 1707 return NULL; 1708 1709 if (rdev->is_atom_bios) 1710 ret = radeon_atombios_get_tmds_info(encoder, tmds); 1711 else 1712 ret = radeon_legacy_get_tmds_info_from_combios(encoder, tmds); 1713 1714 if (ret == false) 1715 radeon_legacy_get_tmds_info_from_table(encoder, tmds); 1716 1717 return tmds; 1718 } 1719 1720 static struct radeon_encoder_ext_tmds *radeon_legacy_get_ext_tmds_info(struct radeon_encoder *encoder) 1721 { 1722 struct drm_device *dev = encoder->base.dev; 1723 struct radeon_device *rdev = dev->dev_private; 1724 struct radeon_encoder_ext_tmds *tmds = NULL; 1725 bool ret; 1726 1727 if (rdev->is_atom_bios) 1728 return NULL; 1729 1730 tmds = kzalloc(sizeof(struct radeon_encoder_ext_tmds), GFP_KERNEL); 1731 1732 if (!tmds) 1733 return NULL; 1734 1735 ret = radeon_legacy_get_ext_tmds_info_from_combios(encoder, tmds); 1736 1737 if (ret == false) 1738 radeon_legacy_get_ext_tmds_info_from_table(encoder, tmds); 1739 1740 return tmds; 1741 } 1742 1743 void 1744 radeon_add_legacy_encoder(struct drm_device *dev, uint32_t encoder_enum, uint32_t supported_device) 1745 { 1746 struct radeon_device *rdev = dev->dev_private; 1747 struct drm_encoder *encoder; 1748 struct radeon_encoder *radeon_encoder; 1749 1750 /* see if we already added it */ 1751 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) { 1752 radeon_encoder = to_radeon_encoder(encoder); 1753 if (radeon_encoder->encoder_enum == encoder_enum) { 1754 radeon_encoder->devices |= supported_device; 1755 return; 1756 } 1757 1758 } 1759 1760 /* add a new one */ 1761 radeon_encoder = kzalloc(sizeof(struct radeon_encoder), GFP_KERNEL); 1762 if (!radeon_encoder) 1763 return; 1764 1765 encoder = &radeon_encoder->base; 1766 if (rdev->flags & RADEON_SINGLE_CRTC) 1767 encoder->possible_crtcs = 0x1; 1768 else 1769 encoder->possible_crtcs = 0x3; 1770 1771 radeon_encoder->enc_priv = NULL; 1772 1773 radeon_encoder->encoder_enum = encoder_enum; 1774 radeon_encoder->encoder_id = (encoder_enum & OBJECT_ID_MASK) >> OBJECT_ID_SHIFT; 1775 radeon_encoder->devices = supported_device; 1776 radeon_encoder->rmx_type = RMX_OFF; 1777 1778 switch (radeon_encoder->encoder_id) { 1779 case ENCODER_OBJECT_ID_INTERNAL_LVDS: 1780 encoder->possible_crtcs = 0x1; 1781 drm_encoder_init(dev, encoder, &radeon_legacy_lvds_enc_funcs, 1782 DRM_MODE_ENCODER_LVDS, NULL); 1783 drm_encoder_helper_add(encoder, &radeon_legacy_lvds_helper_funcs); 1784 if (rdev->is_atom_bios) 1785 radeon_encoder->enc_priv = radeon_atombios_get_lvds_info(radeon_encoder); 1786 else 1787 radeon_encoder->enc_priv = radeon_combios_get_lvds_info(radeon_encoder); 1788 radeon_encoder->rmx_type = RMX_FULL; 1789 break; 1790 case ENCODER_OBJECT_ID_INTERNAL_TMDS1: 1791 drm_encoder_init(dev, encoder, &radeon_legacy_tmds_int_enc_funcs, 1792 DRM_MODE_ENCODER_TMDS, NULL); 1793 drm_encoder_helper_add(encoder, &radeon_legacy_tmds_int_helper_funcs); 1794 radeon_encoder->enc_priv = radeon_legacy_get_tmds_info(radeon_encoder); 1795 break; 1796 case ENCODER_OBJECT_ID_INTERNAL_DAC1: 1797 drm_encoder_init(dev, encoder, &radeon_legacy_primary_dac_enc_funcs, 1798 DRM_MODE_ENCODER_DAC, NULL); 1799 drm_encoder_helper_add(encoder, &radeon_legacy_primary_dac_helper_funcs); 1800 if (rdev->is_atom_bios) 1801 radeon_encoder->enc_priv = radeon_atombios_get_primary_dac_info(radeon_encoder); 1802 else 1803 radeon_encoder->enc_priv = radeon_combios_get_primary_dac_info(radeon_encoder); 1804 break; 1805 case ENCODER_OBJECT_ID_INTERNAL_DAC2: 1806 drm_encoder_init(dev, encoder, &radeon_legacy_tv_dac_enc_funcs, 1807 DRM_MODE_ENCODER_TVDAC, NULL); 1808 drm_encoder_helper_add(encoder, &radeon_legacy_tv_dac_helper_funcs); 1809 if (rdev->is_atom_bios) 1810 radeon_encoder->enc_priv = radeon_atombios_get_tv_dac_info(radeon_encoder); 1811 else 1812 radeon_encoder->enc_priv = radeon_combios_get_tv_dac_info(radeon_encoder); 1813 break; 1814 case ENCODER_OBJECT_ID_INTERNAL_DVO1: 1815 drm_encoder_init(dev, encoder, &radeon_legacy_tmds_ext_enc_funcs, 1816 DRM_MODE_ENCODER_TMDS, NULL); 1817 drm_encoder_helper_add(encoder, &radeon_legacy_tmds_ext_helper_funcs); 1818 if (!rdev->is_atom_bios) 1819 radeon_encoder->enc_priv = radeon_legacy_get_ext_tmds_info(radeon_encoder); 1820 break; 1821 } 1822 } 1823