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