2545 lines · c
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 a6 * copy of this software and associated documentation files (the "Software"),7 * to deal in the Software without restriction, including without limitation8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,9 * and/or sell copies of the Software, and to permit persons to whom the10 * Software is furnished to do so, subject to the following conditions:11 *12 * The above copyright notice and this permission notice shall be included in13 * all copies or substantial portions of the Software.14 *15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR19 * 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 OR21 * OTHER DEALINGS IN THE SOFTWARE.22 *23 * Authors: Dave Airlie24 * Alex Deucher25 */26 27#include <drm/display/drm_dp_mst_helper.h>28#include <drm/drm_edid.h>29#include <drm/drm_crtc_helper.h>30#include <drm/drm_modeset_helper_vtables.h>31#include <drm/drm_probe_helper.h>32#include <drm/radeon_drm.h>33#include "radeon.h"34#include "radeon_audio.h"35#include "atom.h"36 37#include <linux/pm_runtime.h>38#include <linux/vga_switcheroo.h>39 40void radeon_connector_hotplug(struct drm_connector *connector)41{42 struct drm_device *dev = connector->dev;43 struct radeon_device *rdev = dev->dev_private;44 struct radeon_connector *radeon_connector = to_radeon_connector(connector);45 46 /* bail if the connector does not have hpd pin, e.g.,47 * VGA, TV, etc.48 */49 if (radeon_connector->hpd.hpd == RADEON_HPD_NONE)50 return;51 52 radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);53 54 /* if the connector is already off, don't turn it back on */55 /* FIXME: This access isn't protected by any locks. */56 if (connector->dpms != DRM_MODE_DPMS_ON)57 return;58 59 /* just deal with DP (not eDP) here. */60 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {61 struct radeon_connector_atom_dig *dig_connector =62 radeon_connector->con_priv;63 64 /* if existing sink type was not DP no need to retrain */65 if (dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_DISPLAYPORT)66 return;67 68 /* first get sink type as it may be reset after (un)plug */69 dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);70 /* don't do anything if sink is not display port, i.e.,71 * passive dp->(dvi|hdmi) adaptor72 */73 if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT &&74 radeon_hpd_sense(rdev, radeon_connector->hpd.hpd) &&75 radeon_dp_needs_link_train(radeon_connector)) {76 /* Don't start link training before we have the DPCD */77 if (!radeon_dp_getdpcd(radeon_connector))78 return;79 80 /* Turn the connector off and back on immediately, which81 * will trigger link training82 */83 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);84 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);85 }86 }87}88 89static void radeon_property_change_mode(struct drm_encoder *encoder)90{91 struct drm_crtc *crtc = encoder->crtc;92 93 if (crtc && crtc->enabled) {94 drm_crtc_helper_set_mode(crtc, &crtc->mode,95 crtc->x, crtc->y, crtc->primary->fb);96 }97}98 99int radeon_get_monitor_bpc(struct drm_connector *connector)100{101 struct drm_device *dev = connector->dev;102 struct radeon_device *rdev = dev->dev_private;103 struct radeon_connector *radeon_connector = to_radeon_connector(connector);104 struct radeon_connector_atom_dig *dig_connector;105 int bpc = 8;106 int mode_clock, max_tmds_clock;107 108 switch (connector->connector_type) {109 case DRM_MODE_CONNECTOR_DVII:110 case DRM_MODE_CONNECTOR_HDMIB:111 if (radeon_connector->use_digital) {112 if (connector->display_info.is_hdmi) {113 if (connector->display_info.bpc)114 bpc = connector->display_info.bpc;115 }116 }117 break;118 case DRM_MODE_CONNECTOR_DVID:119 case DRM_MODE_CONNECTOR_HDMIA:120 if (connector->display_info.is_hdmi) {121 if (connector->display_info.bpc)122 bpc = connector->display_info.bpc;123 }124 break;125 case DRM_MODE_CONNECTOR_DisplayPort:126 dig_connector = radeon_connector->con_priv;127 if ((dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||128 (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) ||129 connector->display_info.is_hdmi) {130 if (connector->display_info.bpc)131 bpc = connector->display_info.bpc;132 }133 break;134 case DRM_MODE_CONNECTOR_eDP:135 case DRM_MODE_CONNECTOR_LVDS:136 if (connector->display_info.bpc)137 bpc = connector->display_info.bpc;138 else if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) {139 const struct drm_connector_helper_funcs *connector_funcs =140 connector->helper_private;141 struct drm_encoder *encoder = connector_funcs->best_encoder(connector);142 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);143 struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv;144 145 if (dig->lcd_misc & ATOM_PANEL_MISC_V13_6BIT_PER_COLOR)146 bpc = 6;147 else if (dig->lcd_misc & ATOM_PANEL_MISC_V13_8BIT_PER_COLOR)148 bpc = 8;149 }150 break;151 }152 153 if (connector->display_info.is_hdmi) {154 /* hdmi deep color only implemented on DCE4+ */155 if ((bpc > 8) && !ASIC_IS_DCE4(rdev)) {156 DRM_DEBUG("%s: HDMI deep color %d bpc unsupported. Using 8 bpc.\n",157 connector->name, bpc);158 bpc = 8;159 }160 161 /*162 * Pre DCE-8 hw can't handle > 12 bpc, and more than 12 bpc doesn't make163 * much sense without support for > 12 bpc framebuffers. RGB 4:4:4 at164 * 12 bpc is always supported on hdmi deep color sinks, as this is165 * required by the HDMI-1.3 spec. Clamp to a safe 12 bpc maximum.166 */167 if (bpc > 12) {168 DRM_DEBUG("%s: HDMI deep color %d bpc unsupported. Using 12 bpc.\n",169 connector->name, bpc);170 bpc = 12;171 }172 173 /* Any defined maximum tmds clock limit we must not exceed? */174 if (connector->display_info.max_tmds_clock > 0) {175 /* mode_clock is clock in kHz for mode to be modeset on this connector */176 mode_clock = radeon_connector->pixelclock_for_modeset;177 178 /* Maximum allowable input clock in kHz */179 max_tmds_clock = connector->display_info.max_tmds_clock;180 181 DRM_DEBUG("%s: hdmi mode dotclock %d kHz, max tmds input clock %d kHz.\n",182 connector->name, mode_clock, max_tmds_clock);183 184 /* Check if bpc is within clock limit. Try to degrade gracefully otherwise */185 if ((bpc == 12) && (mode_clock * 3/2 > max_tmds_clock)) {186 if ((connector->display_info.edid_hdmi_rgb444_dc_modes & DRM_EDID_HDMI_DC_30) &&187 (mode_clock * 5/4 <= max_tmds_clock))188 bpc = 10;189 else190 bpc = 8;191 192 DRM_DEBUG("%s: HDMI deep color 12 bpc exceeds max tmds clock. Using %d bpc.\n",193 connector->name, bpc);194 }195 196 if ((bpc == 10) && (mode_clock * 5/4 > max_tmds_clock)) {197 bpc = 8;198 DRM_DEBUG("%s: HDMI deep color 10 bpc exceeds max tmds clock. Using %d bpc.\n",199 connector->name, bpc);200 }201 } else if (bpc > 8) {202 /* max_tmds_clock missing, but hdmi spec mandates it for deep color. */203 DRM_DEBUG("%s: Required max tmds clock for HDMI deep color missing. Using 8 bpc.\n",204 connector->name);205 bpc = 8;206 }207 }208 209 if ((radeon_deep_color == 0) && (bpc > 8)) {210 DRM_DEBUG("%s: Deep color disabled. Set radeon module param deep_color=1 to enable.\n",211 connector->name);212 bpc = 8;213 }214 215 DRM_DEBUG("%s: Display bpc=%d, returned bpc=%d\n",216 connector->name, connector->display_info.bpc, bpc);217 218 return bpc;219}220 221static void222radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status)223{224 struct drm_device *dev = connector->dev;225 struct radeon_device *rdev = dev->dev_private;226 struct drm_encoder *best_encoder;227 struct drm_encoder *encoder;228 const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;229 bool connected;230 231 best_encoder = connector_funcs->best_encoder(connector);232 233 drm_connector_for_each_possible_encoder(connector, encoder) {234 if ((encoder == best_encoder) && (status == connector_status_connected))235 connected = true;236 else237 connected = false;238 239 if (rdev->is_atom_bios)240 radeon_atombios_connected_scratch_regs(connector, encoder, connected);241 else242 radeon_combios_connected_scratch_regs(connector, encoder, connected);243 }244}245 246static struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type)247{248 struct drm_encoder *encoder;249 250 drm_connector_for_each_possible_encoder(connector, encoder) {251 if (encoder->encoder_type == encoder_type)252 return encoder;253 }254 255 return NULL;256}257 258static void radeon_connector_get_edid(struct drm_connector *connector)259{260 struct drm_device *dev = connector->dev;261 struct radeon_device *rdev = dev->dev_private;262 struct radeon_connector *radeon_connector = to_radeon_connector(connector);263 264 if (radeon_connector->edid)265 return;266 267 /* on hw with routers, select right port */268 if (radeon_connector->router.ddc_valid)269 radeon_router_select_ddc_port(radeon_connector);270 271 if ((radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=272 ENCODER_OBJECT_ID_NONE) &&273 radeon_connector->ddc_bus->has_aux) {274 radeon_connector->edid = drm_get_edid(connector,275 &radeon_connector->ddc_bus->aux.ddc);276 } else if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||277 (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {278 struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;279 280 if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ||281 dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) &&282 radeon_connector->ddc_bus->has_aux)283 radeon_connector->edid = drm_get_edid(&radeon_connector->base,284 &radeon_connector->ddc_bus->aux.ddc);285 else if (radeon_connector->ddc_bus)286 radeon_connector->edid = drm_get_edid(&radeon_connector->base,287 &radeon_connector->ddc_bus->adapter);288 } else if (vga_switcheroo_handler_flags() & VGA_SWITCHEROO_CAN_SWITCH_DDC &&289 connector->connector_type == DRM_MODE_CONNECTOR_LVDS &&290 radeon_connector->ddc_bus) {291 radeon_connector->edid = drm_get_edid_switcheroo(&radeon_connector->base,292 &radeon_connector->ddc_bus->adapter);293 } else if (radeon_connector->ddc_bus) {294 radeon_connector->edid = drm_get_edid(&radeon_connector->base,295 &radeon_connector->ddc_bus->adapter);296 }297 298 if (!radeon_connector->edid) {299 /* don't fetch the edid from the vbios if ddc fails and runpm is300 * enabled so we report disconnected.301 */302 if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0))303 return;304 305 if (rdev->is_atom_bios) {306 /* some laptops provide a hardcoded edid in rom for LCDs */307 if (((connector->connector_type == DRM_MODE_CONNECTOR_LVDS) ||308 (connector->connector_type == DRM_MODE_CONNECTOR_eDP)))309 radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);310 } else {311 /* some servers provide a hardcoded edid in rom for KVMs */312 radeon_connector->edid = radeon_bios_get_hardcoded_edid(rdev);313 }314 }315}316 317static void radeon_connector_free_edid(struct drm_connector *connector)318{319 struct radeon_connector *radeon_connector = to_radeon_connector(connector);320 321 kfree(radeon_connector->edid);322 radeon_connector->edid = NULL;323}324 325static int radeon_ddc_get_modes(struct drm_connector *connector)326{327 struct radeon_connector *radeon_connector = to_radeon_connector(connector);328 int ret;329 330 if (radeon_connector->edid) {331 drm_connector_update_edid_property(connector, radeon_connector->edid);332 ret = drm_add_edid_modes(connector, radeon_connector->edid);333 return ret;334 }335 drm_connector_update_edid_property(connector, NULL);336 return 0;337}338 339static struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)340{341 struct drm_encoder *encoder;342 343 /* pick the first one */344 drm_connector_for_each_possible_encoder(connector, encoder)345 return encoder;346 347 return NULL;348}349 350static void radeon_get_native_mode(struct drm_connector *connector)351{352 struct drm_encoder *encoder = radeon_best_single_encoder(connector);353 struct radeon_encoder *radeon_encoder;354 355 if (encoder == NULL)356 return;357 358 radeon_encoder = to_radeon_encoder(encoder);359 360 if (!list_empty(&connector->probed_modes)) {361 struct drm_display_mode *preferred_mode =362 list_first_entry(&connector->probed_modes,363 struct drm_display_mode, head);364 365 radeon_encoder->native_mode = *preferred_mode;366 } else {367 radeon_encoder->native_mode.clock = 0;368 }369}370 371/*372 * radeon_connector_analog_encoder_conflict_solve373 * - search for other connectors sharing this encoder374 * if priority is true, then set them disconnected if this is connected375 * if priority is false, set us disconnected if they are connected376 */377static enum drm_connector_status378radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,379 struct drm_encoder *encoder,380 enum drm_connector_status current_status,381 bool priority)382{383 struct drm_device *dev = connector->dev;384 struct drm_connector *conflict;385 struct radeon_connector *radeon_conflict;386 387 list_for_each_entry(conflict, &dev->mode_config.connector_list, head) {388 struct drm_encoder *enc;389 390 if (conflict == connector)391 continue;392 393 radeon_conflict = to_radeon_connector(conflict);394 395 drm_connector_for_each_possible_encoder(conflict, enc) {396 /* if the IDs match */397 if (enc == encoder) {398 if (conflict->status != connector_status_connected)399 continue;400 401 if (radeon_conflict->use_digital)402 continue;403 404 if (priority) {405 DRM_DEBUG_KMS("1: conflicting encoders switching off %s\n",406 conflict->name);407 DRM_DEBUG_KMS("in favor of %s\n",408 connector->name);409 conflict->status = connector_status_disconnected;410 radeon_connector_update_scratch_regs(conflict, connector_status_disconnected);411 } else {412 DRM_DEBUG_KMS("2: conflicting encoders switching off %s\n",413 connector->name);414 DRM_DEBUG_KMS("in favor of %s\n",415 conflict->name);416 current_status = connector_status_disconnected;417 }418 break;419 }420 }421 }422 return current_status;423 424}425 426static struct drm_display_mode *radeon_fp_native_mode(struct drm_encoder *encoder)427{428 struct drm_device *dev = encoder->dev;429 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);430 struct drm_display_mode *mode = NULL;431 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;432 433 if (native_mode->hdisplay != 0 &&434 native_mode->vdisplay != 0 &&435 native_mode->clock != 0) {436 mode = drm_mode_duplicate(dev, native_mode);437 if (!mode)438 return NULL;439 mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;440 drm_mode_set_name(mode);441 442 DRM_DEBUG_KMS("Adding native panel mode %s\n", mode->name);443 } else if (native_mode->hdisplay != 0 &&444 native_mode->vdisplay != 0) {445 /* mac laptops without an edid */446 /* Note that this is not necessarily the exact panel mode,447 * but an approximation based on the cvt formula. For these448 * systems we should ideally read the mode info out of the449 * registers or add a mode table, but this works and is much450 * simpler.451 */452 mode = drm_cvt_mode(dev, native_mode->hdisplay, native_mode->vdisplay, 60, true, false, false);453 if (!mode)454 return NULL;455 mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;456 DRM_DEBUG_KMS("Adding cvt approximation of native panel mode %s\n", mode->name);457 }458 return mode;459}460 461static void radeon_add_common_modes(struct drm_encoder *encoder, struct drm_connector *connector)462{463 struct drm_device *dev = encoder->dev;464 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);465 struct drm_display_mode *mode = NULL;466 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;467 int i;468 struct mode_size {469 int w;470 int h;471 } common_modes[17] = {472 { 640, 480},473 { 720, 480},474 { 800, 600},475 { 848, 480},476 {1024, 768},477 {1152, 768},478 {1280, 720},479 {1280, 800},480 {1280, 854},481 {1280, 960},482 {1280, 1024},483 {1440, 900},484 {1400, 1050},485 {1680, 1050},486 {1600, 1200},487 {1920, 1080},488 {1920, 1200}489 };490 491 for (i = 0; i < 17; i++) {492 if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT)) {493 if (common_modes[i].w > 1024 ||494 common_modes[i].h > 768)495 continue;496 }497 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {498 if (common_modes[i].w > native_mode->hdisplay ||499 common_modes[i].h > native_mode->vdisplay ||500 (common_modes[i].w == native_mode->hdisplay &&501 common_modes[i].h == native_mode->vdisplay))502 continue;503 }504 if (common_modes[i].w < 320 || common_modes[i].h < 200)505 continue;506 507 mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false, false);508 if (!mode)509 continue;510 511 drm_mode_probed_add(connector, mode);512 }513}514 515static int radeon_connector_set_property(struct drm_connector *connector, struct drm_property *property,516 uint64_t val)517{518 struct drm_device *dev = connector->dev;519 struct radeon_device *rdev = dev->dev_private;520 struct drm_encoder *encoder;521 struct radeon_encoder *radeon_encoder;522 523 if (property == rdev->mode_info.coherent_mode_property) {524 struct radeon_encoder_atom_dig *dig;525 bool new_coherent_mode;526 527 /* need to find digital encoder on connector */528 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);529 if (!encoder)530 return 0;531 532 radeon_encoder = to_radeon_encoder(encoder);533 534 if (!radeon_encoder->enc_priv)535 return 0;536 537 dig = radeon_encoder->enc_priv;538 new_coherent_mode = val ? true : false;539 if (dig->coherent_mode != new_coherent_mode) {540 dig->coherent_mode = new_coherent_mode;541 radeon_property_change_mode(&radeon_encoder->base);542 }543 }544 545 if (property == rdev->mode_info.audio_property) {546 struct radeon_connector *radeon_connector = to_radeon_connector(connector);547 /* need to find digital encoder on connector */548 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);549 if (!encoder)550 return 0;551 552 radeon_encoder = to_radeon_encoder(encoder);553 554 if (radeon_connector->audio != val) {555 radeon_connector->audio = val;556 radeon_property_change_mode(&radeon_encoder->base);557 }558 }559 560 if (property == rdev->mode_info.dither_property) {561 struct radeon_connector *radeon_connector = to_radeon_connector(connector);562 /* need to find digital encoder on connector */563 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);564 if (!encoder)565 return 0;566 567 radeon_encoder = to_radeon_encoder(encoder);568 569 if (radeon_connector->dither != val) {570 radeon_connector->dither = val;571 radeon_property_change_mode(&radeon_encoder->base);572 }573 }574 575 if (property == rdev->mode_info.underscan_property) {576 /* need to find digital encoder on connector */577 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);578 if (!encoder)579 return 0;580 581 radeon_encoder = to_radeon_encoder(encoder);582 583 if (radeon_encoder->underscan_type != val) {584 radeon_encoder->underscan_type = val;585 radeon_property_change_mode(&radeon_encoder->base);586 }587 }588 589 if (property == rdev->mode_info.underscan_hborder_property) {590 /* need to find digital encoder on connector */591 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);592 if (!encoder)593 return 0;594 595 radeon_encoder = to_radeon_encoder(encoder);596 597 if (radeon_encoder->underscan_hborder != val) {598 radeon_encoder->underscan_hborder = val;599 radeon_property_change_mode(&radeon_encoder->base);600 }601 }602 603 if (property == rdev->mode_info.underscan_vborder_property) {604 /* need to find digital encoder on connector */605 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);606 if (!encoder)607 return 0;608 609 radeon_encoder = to_radeon_encoder(encoder);610 611 if (radeon_encoder->underscan_vborder != val) {612 radeon_encoder->underscan_vborder = val;613 radeon_property_change_mode(&radeon_encoder->base);614 }615 }616 617 if (property == rdev->mode_info.tv_std_property) {618 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TVDAC);619 if (!encoder) {620 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_DAC);621 }622 623 if (!encoder)624 return 0;625 626 radeon_encoder = to_radeon_encoder(encoder);627 if (!radeon_encoder->enc_priv)628 return 0;629 if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom) {630 struct radeon_encoder_atom_dac *dac_int;631 dac_int = radeon_encoder->enc_priv;632 dac_int->tv_std = val;633 } else {634 struct radeon_encoder_tv_dac *dac_int;635 dac_int = radeon_encoder->enc_priv;636 dac_int->tv_std = val;637 }638 radeon_property_change_mode(&radeon_encoder->base);639 }640 641 if (property == rdev->mode_info.load_detect_property) {642 struct radeon_connector *radeon_connector =643 to_radeon_connector(connector);644 645 if (val == 0)646 radeon_connector->dac_load_detect = false;647 else648 radeon_connector->dac_load_detect = true;649 }650 651 if (property == rdev->mode_info.tmds_pll_property) {652 struct radeon_encoder_int_tmds *tmds = NULL;653 bool ret = false;654 /* need to find digital encoder on connector */655 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);656 if (!encoder)657 return 0;658 659 radeon_encoder = to_radeon_encoder(encoder);660 661 tmds = radeon_encoder->enc_priv;662 if (!tmds)663 return 0;664 665 if (val == 0) {666 if (rdev->is_atom_bios)667 ret = radeon_atombios_get_tmds_info(radeon_encoder, tmds);668 else669 ret = radeon_legacy_get_tmds_info_from_combios(radeon_encoder, tmds);670 }671 if (val == 1 || !ret)672 radeon_legacy_get_tmds_info_from_table(radeon_encoder, tmds);673 674 radeon_property_change_mode(&radeon_encoder->base);675 }676 677 if (property == dev->mode_config.scaling_mode_property) {678 enum radeon_rmx_type rmx_type;679 680 if (connector->encoder)681 radeon_encoder = to_radeon_encoder(connector->encoder);682 else {683 const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;684 radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));685 }686 687 switch (val) {688 default:689 case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;690 case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break;691 case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break;692 case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break;693 }694 if (radeon_encoder->rmx_type == rmx_type)695 return 0;696 697 if ((rmx_type != DRM_MODE_SCALE_NONE) &&698 (radeon_encoder->native_mode.clock == 0))699 return 0;700 701 radeon_encoder->rmx_type = rmx_type;702 703 radeon_property_change_mode(&radeon_encoder->base);704 }705 706 if (property == rdev->mode_info.output_csc_property) {707 if (connector->encoder)708 radeon_encoder = to_radeon_encoder(connector->encoder);709 else {710 const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;711 radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));712 }713 714 if (radeon_encoder->output_csc == val)715 return 0;716 717 radeon_encoder->output_csc = val;718 719 if (connector->encoder && connector->encoder->crtc) {720 struct drm_crtc *crtc = connector->encoder->crtc;721 struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc);722 723 radeon_crtc->output_csc = radeon_encoder->output_csc;724 725 /*726 * Our .gamma_set assumes the .gamma_store has been727 * prefilled and don't care about its arguments.728 */729 crtc->funcs->gamma_set(crtc, NULL, NULL, NULL, 0, NULL);730 }731 }732 733 return 0;734}735 736static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,737 struct drm_connector *connector)738{739 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);740 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;741 struct drm_display_mode *t, *mode;742 743 /* If the EDID preferred mode doesn't match the native mode, use it */744 list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {745 if (mode->type & DRM_MODE_TYPE_PREFERRED) {746 if (mode->hdisplay != native_mode->hdisplay ||747 mode->vdisplay != native_mode->vdisplay)748 drm_mode_copy(native_mode, mode);749 }750 }751 752 /* Try to get native mode details from EDID if necessary */753 if (!native_mode->clock) {754 list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {755 if (mode->hdisplay == native_mode->hdisplay &&756 mode->vdisplay == native_mode->vdisplay) {757 drm_mode_copy(native_mode, mode);758 drm_mode_set_crtcinfo(native_mode, CRTC_INTERLACE_HALVE_V);759 DRM_DEBUG_KMS("Determined LVDS native mode details from EDID\n");760 break;761 }762 }763 }764 765 if (!native_mode->clock) {766 DRM_DEBUG_KMS("No LVDS native mode details, disabling RMX\n");767 radeon_encoder->rmx_type = RMX_OFF;768 }769}770 771static int radeon_lvds_get_modes(struct drm_connector *connector)772{773 struct drm_encoder *encoder;774 int ret = 0;775 struct drm_display_mode *mode;776 777 radeon_connector_get_edid(connector);778 ret = radeon_ddc_get_modes(connector);779 if (ret > 0) {780 encoder = radeon_best_single_encoder(connector);781 if (encoder) {782 radeon_fixup_lvds_native_mode(encoder, connector);783 /* add scaled modes */784 radeon_add_common_modes(encoder, connector);785 }786 return ret;787 }788 789 encoder = radeon_best_single_encoder(connector);790 if (!encoder)791 return 0;792 793 /* we have no EDID modes */794 mode = radeon_fp_native_mode(encoder);795 if (mode) {796 ret = 1;797 drm_mode_probed_add(connector, mode);798 /* add the width/height from vbios tables if available */799 connector->display_info.width_mm = mode->width_mm;800 connector->display_info.height_mm = mode->height_mm;801 /* add scaled modes */802 radeon_add_common_modes(encoder, connector);803 }804 805 return ret;806}807 808static enum drm_mode_status radeon_lvds_mode_valid(struct drm_connector *connector,809 struct drm_display_mode *mode)810{811 struct drm_encoder *encoder = radeon_best_single_encoder(connector);812 813 if ((mode->hdisplay < 320) || (mode->vdisplay < 240))814 return MODE_PANEL;815 816 if (encoder) {817 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);818 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;819 820 /* AVIVO hardware supports downscaling modes larger than the panel821 * to the panel size, but I'm not sure this is desirable.822 */823 if ((mode->hdisplay > native_mode->hdisplay) ||824 (mode->vdisplay > native_mode->vdisplay))825 return MODE_PANEL;826 827 /* if scaling is disabled, block non-native modes */828 if (radeon_encoder->rmx_type == RMX_OFF) {829 if ((mode->hdisplay != native_mode->hdisplay) ||830 (mode->vdisplay != native_mode->vdisplay))831 return MODE_PANEL;832 }833 }834 835 return MODE_OK;836}837 838static enum drm_connector_status839radeon_lvds_detect(struct drm_connector *connector, bool force)840{841 struct drm_device *dev = connector->dev;842 struct radeon_device *rdev = dev->dev_private;843 struct radeon_connector *radeon_connector = to_radeon_connector(connector);844 struct drm_encoder *encoder = radeon_best_single_encoder(connector);845 enum drm_connector_status ret = connector_status_disconnected;846 int r;847 848 if (!drm_kms_helper_is_poll_worker()) {849 r = pm_runtime_get_sync(connector->dev->dev);850 if (r < 0) {851 pm_runtime_put_autosuspend(connector->dev->dev);852 return connector_status_disconnected;853 }854 }855 856 if (encoder) {857 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);858 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;859 860 /* check if panel is valid */861 if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)862 ret = connector_status_connected;863 /* don't fetch the edid from the vbios if ddc fails and runpm is864 * enabled so we report disconnected.865 */866 if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0))867 ret = connector_status_disconnected;868 }869 870 /* check for edid as well */871 radeon_connector_get_edid(connector);872 if (radeon_connector->edid)873 ret = connector_status_connected;874 /* check acpi lid status ??? */875 876 radeon_connector_update_scratch_regs(connector, ret);877 878 if (!drm_kms_helper_is_poll_worker()) {879 pm_runtime_mark_last_busy(connector->dev->dev);880 pm_runtime_put_autosuspend(connector->dev->dev);881 }882 883 return ret;884}885 886static void radeon_connector_unregister(struct drm_connector *connector)887{888 struct radeon_connector *radeon_connector = to_radeon_connector(connector);889 890 if (radeon_connector->ddc_bus && radeon_connector->ddc_bus->has_aux) {891 drm_dp_aux_unregister(&radeon_connector->ddc_bus->aux);892 radeon_connector->ddc_bus->has_aux = false;893 }894}895 896static void radeon_connector_destroy(struct drm_connector *connector)897{898 struct radeon_connector *radeon_connector = to_radeon_connector(connector);899 900 radeon_connector_free_edid(connector);901 kfree(radeon_connector->con_priv);902 drm_connector_unregister(connector);903 drm_connector_cleanup(connector);904 kfree(connector);905}906 907static int radeon_lvds_set_property(struct drm_connector *connector,908 struct drm_property *property,909 uint64_t value)910{911 struct drm_device *dev = connector->dev;912 struct radeon_encoder *radeon_encoder;913 enum radeon_rmx_type rmx_type;914 915 DRM_DEBUG_KMS("\n");916 if (property != dev->mode_config.scaling_mode_property)917 return 0;918 919 if (connector->encoder)920 radeon_encoder = to_radeon_encoder(connector->encoder);921 else {922 const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;923 radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));924 }925 926 switch (value) {927 case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;928 case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break;929 case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break;930 default:931 case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break;932 }933 if (radeon_encoder->rmx_type == rmx_type)934 return 0;935 936 radeon_encoder->rmx_type = rmx_type;937 938 radeon_property_change_mode(&radeon_encoder->base);939 return 0;940}941 942 943static const struct drm_connector_helper_funcs radeon_lvds_connector_helper_funcs = {944 .get_modes = radeon_lvds_get_modes,945 .mode_valid = radeon_lvds_mode_valid,946 .best_encoder = radeon_best_single_encoder,947};948 949static const struct drm_connector_funcs radeon_lvds_connector_funcs = {950 .dpms = drm_helper_connector_dpms,951 .detect = radeon_lvds_detect,952 .fill_modes = drm_helper_probe_single_connector_modes,953 .early_unregister = radeon_connector_unregister,954 .destroy = radeon_connector_destroy,955 .set_property = radeon_lvds_set_property,956};957 958static int radeon_vga_get_modes(struct drm_connector *connector)959{960 int ret;961 962 radeon_connector_get_edid(connector);963 ret = radeon_ddc_get_modes(connector);964 965 radeon_get_native_mode(connector);966 967 return ret;968}969 970static enum drm_mode_status radeon_vga_mode_valid(struct drm_connector *connector,971 struct drm_display_mode *mode)972{973 struct drm_device *dev = connector->dev;974 struct radeon_device *rdev = dev->dev_private;975 976 /* XXX check mode bandwidth */977 978 if ((mode->clock / 10) > rdev->clock.max_pixel_clock)979 return MODE_CLOCK_HIGH;980 981 return MODE_OK;982}983 984static enum drm_connector_status985radeon_vga_detect(struct drm_connector *connector, bool force)986{987 struct drm_device *dev = connector->dev;988 struct radeon_device *rdev = dev->dev_private;989 struct radeon_connector *radeon_connector = to_radeon_connector(connector);990 struct drm_encoder *encoder;991 const struct drm_encoder_helper_funcs *encoder_funcs;992 bool dret = false;993 enum drm_connector_status ret = connector_status_disconnected;994 int r;995 996 if (!drm_kms_helper_is_poll_worker()) {997 r = pm_runtime_get_sync(connector->dev->dev);998 if (r < 0) {999 pm_runtime_put_autosuspend(connector->dev->dev);1000 return connector_status_disconnected;1001 }1002 }1003 1004 encoder = radeon_best_single_encoder(connector);1005 if (!encoder)1006 ret = connector_status_disconnected;1007 1008 if (radeon_connector->ddc_bus)1009 dret = radeon_ddc_probe(radeon_connector, false);1010 if (dret) {1011 radeon_connector->detected_by_load = false;1012 radeon_connector_free_edid(connector);1013 radeon_connector_get_edid(connector);1014 1015 if (!radeon_connector->edid) {1016 DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",1017 connector->name);1018 ret = connector_status_connected;1019 } else {1020 radeon_connector->use_digital =1021 !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);1022 1023 /* some oems have boards with separate digital and analog connectors1024 * with a shared ddc line (often vga + hdmi)1025 */1026 if (radeon_connector->use_digital && radeon_connector->shared_ddc) {1027 radeon_connector_free_edid(connector);1028 ret = connector_status_disconnected;1029 } else {1030 ret = connector_status_connected;1031 }1032 }1033 } else {1034 1035 /* if we aren't forcing don't do destructive polling */1036 if (!force) {1037 /* only return the previous status if we last1038 * detected a monitor via load.1039 */1040 if (radeon_connector->detected_by_load)1041 ret = connector->status;1042 goto out;1043 }1044 1045 if (radeon_connector->dac_load_detect && encoder) {1046 encoder_funcs = encoder->helper_private;1047 ret = encoder_funcs->detect(encoder, connector);1048 if (ret != connector_status_disconnected)1049 radeon_connector->detected_by_load = true;1050 }1051 }1052 1053 if (ret == connector_status_connected)1054 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);1055 1056 /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the1057 * vbios to deal with KVMs. If we have one and are not able to detect a monitor1058 * by other means, assume the CRT is connected and use that EDID.1059 */1060 if ((!rdev->is_atom_bios) &&1061 (ret == connector_status_disconnected) &&1062 rdev->mode_info.bios_hardcoded_edid) {1063 ret = connector_status_connected;1064 }1065 1066 radeon_connector_update_scratch_regs(connector, ret);1067 1068out:1069 if (!drm_kms_helper_is_poll_worker()) {1070 pm_runtime_mark_last_busy(connector->dev->dev);1071 pm_runtime_put_autosuspend(connector->dev->dev);1072 }1073 1074 return ret;1075}1076 1077static const struct drm_connector_helper_funcs radeon_vga_connector_helper_funcs = {1078 .get_modes = radeon_vga_get_modes,1079 .mode_valid = radeon_vga_mode_valid,1080 .best_encoder = radeon_best_single_encoder,1081};1082 1083static const struct drm_connector_funcs radeon_vga_connector_funcs = {1084 .dpms = drm_helper_connector_dpms,1085 .detect = radeon_vga_detect,1086 .fill_modes = drm_helper_probe_single_connector_modes,1087 .early_unregister = radeon_connector_unregister,1088 .destroy = radeon_connector_destroy,1089 .set_property = radeon_connector_set_property,1090};1091 1092static int radeon_tv_get_modes(struct drm_connector *connector)1093{1094 struct drm_device *dev = connector->dev;1095 struct radeon_device *rdev = dev->dev_private;1096 struct drm_display_mode *tv_mode;1097 struct drm_encoder *encoder;1098 1099 encoder = radeon_best_single_encoder(connector);1100 if (!encoder)1101 return 0;1102 1103 /* avivo chips can scale any mode */1104 if (rdev->family >= CHIP_RS600)1105 /* add scaled modes */1106 radeon_add_common_modes(encoder, connector);1107 else {1108 /* only 800x600 is supported right now on pre-avivo chips */1109 tv_mode = drm_cvt_mode(dev, 800, 600, 60, false, false, false);1110 if (!tv_mode)1111 return 0;1112 tv_mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;1113 drm_mode_probed_add(connector, tv_mode);1114 }1115 return 1;1116}1117 1118static enum drm_mode_status radeon_tv_mode_valid(struct drm_connector *connector,1119 struct drm_display_mode *mode)1120{1121 if ((mode->hdisplay > 1024) || (mode->vdisplay > 768))1122 return MODE_CLOCK_RANGE;1123 return MODE_OK;1124}1125 1126static enum drm_connector_status1127radeon_tv_detect(struct drm_connector *connector, bool force)1128{1129 struct drm_encoder *encoder;1130 const struct drm_encoder_helper_funcs *encoder_funcs;1131 struct radeon_connector *radeon_connector = to_radeon_connector(connector);1132 enum drm_connector_status ret = connector_status_disconnected;1133 int r;1134 1135 if (!radeon_connector->dac_load_detect)1136 return ret;1137 1138 if (!drm_kms_helper_is_poll_worker()) {1139 r = pm_runtime_get_sync(connector->dev->dev);1140 if (r < 0) {1141 pm_runtime_put_autosuspend(connector->dev->dev);1142 return connector_status_disconnected;1143 }1144 }1145 1146 encoder = radeon_best_single_encoder(connector);1147 if (!encoder)1148 ret = connector_status_disconnected;1149 else {1150 encoder_funcs = encoder->helper_private;1151 ret = encoder_funcs->detect(encoder, connector);1152 }1153 if (ret == connector_status_connected)1154 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, false);1155 radeon_connector_update_scratch_regs(connector, ret);1156 1157 if (!drm_kms_helper_is_poll_worker()) {1158 pm_runtime_mark_last_busy(connector->dev->dev);1159 pm_runtime_put_autosuspend(connector->dev->dev);1160 }1161 1162 return ret;1163}1164 1165static const struct drm_connector_helper_funcs radeon_tv_connector_helper_funcs = {1166 .get_modes = radeon_tv_get_modes,1167 .mode_valid = radeon_tv_mode_valid,1168 .best_encoder = radeon_best_single_encoder,1169};1170 1171static const struct drm_connector_funcs radeon_tv_connector_funcs = {1172 .dpms = drm_helper_connector_dpms,1173 .detect = radeon_tv_detect,1174 .fill_modes = drm_helper_probe_single_connector_modes,1175 .early_unregister = radeon_connector_unregister,1176 .destroy = radeon_connector_destroy,1177 .set_property = radeon_connector_set_property,1178};1179 1180static bool radeon_check_hpd_status_unchanged(struct drm_connector *connector)1181{1182 struct drm_device *dev = connector->dev;1183 struct radeon_device *rdev = dev->dev_private;1184 struct radeon_connector *radeon_connector = to_radeon_connector(connector);1185 enum drm_connector_status status;1186 1187 /* We only trust HPD on R600 and newer ASICS. */1188 if (rdev->family >= CHIP_R6001189 && radeon_connector->hpd.hpd != RADEON_HPD_NONE) {1190 if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd))1191 status = connector_status_connected;1192 else1193 status = connector_status_disconnected;1194 if (connector->status == status)1195 return true;1196 }1197 1198 return false;1199}1200 1201/*1202 * DVI is complicated1203 * Do a DDC probe, if DDC probe passes, get the full EDID so1204 * we can do analog/digital monitor detection at this point.1205 * If the monitor is an analog monitor or we got no DDC,1206 * we need to find the DAC encoder object for this connector.1207 * If we got no DDC, we do load detection on the DAC encoder object.1208 * If we got analog DDC or load detection passes on the DAC encoder1209 * we have to check if this analog encoder is shared with anyone else (TV)1210 * if its shared we have to set the other connector to disconnected.1211 */1212static enum drm_connector_status1213radeon_dvi_detect(struct drm_connector *connector, bool force)1214{1215 struct drm_device *dev = connector->dev;1216 struct radeon_device *rdev = dev->dev_private;1217 struct radeon_connector *radeon_connector = to_radeon_connector(connector);1218 struct drm_encoder *encoder = NULL;1219 const struct drm_encoder_helper_funcs *encoder_funcs;1220 int r;1221 enum drm_connector_status ret = connector_status_disconnected;1222 bool dret = false, broken_edid = false;1223 1224 if (!drm_kms_helper_is_poll_worker()) {1225 r = pm_runtime_get_sync(connector->dev->dev);1226 if (r < 0) {1227 pm_runtime_put_autosuspend(connector->dev->dev);1228 return connector_status_disconnected;1229 }1230 }1231 1232 if (radeon_connector->detected_hpd_without_ddc) {1233 force = true;1234 radeon_connector->detected_hpd_without_ddc = false;1235 }1236 1237 if (!force && radeon_check_hpd_status_unchanged(connector)) {1238 ret = connector->status;1239 goto exit;1240 }1241 1242 if (radeon_connector->ddc_bus) {1243 dret = radeon_ddc_probe(radeon_connector, false);1244 1245 /* Sometimes the pins required for the DDC probe on DVI1246 * connectors don't make contact at the same time that the ones1247 * for HPD do. If the DDC probe fails even though we had an HPD1248 * signal, try again later */1249 if (!dret && !force &&1250 connector->status != connector_status_connected) {1251 DRM_DEBUG_KMS("hpd detected without ddc, retrying in 1 second\n");1252 radeon_connector->detected_hpd_without_ddc = true;1253 schedule_delayed_work(&rdev->hotplug_work,1254 msecs_to_jiffies(1000));1255 goto exit;1256 }1257 }1258 1259 if (dret && radeon_connector->hpd.hpd != RADEON_HPD_NONE &&1260 !radeon_hpd_sense(rdev, radeon_connector->hpd.hpd) &&1261 connector->connector_type == DRM_MODE_CONNECTOR_HDMIA) {1262 DRM_DEBUG_KMS("EDID is readable when HPD disconnected\n");1263 schedule_delayed_work(&rdev->hotplug_work, msecs_to_jiffies(1000));1264 ret = connector_status_disconnected;1265 goto exit;1266 }1267 1268 if (dret) {1269 radeon_connector->detected_by_load = false;1270 radeon_connector_free_edid(connector);1271 radeon_connector_get_edid(connector);1272 1273 if (!radeon_connector->edid) {1274 DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",1275 connector->name);1276 /* rs690 seems to have a problem with connectors not existing and always1277 * return a block of 0's. If we see this just stop polling on this output */1278 if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) &&1279 radeon_connector->base.null_edid_counter) {1280 ret = connector_status_disconnected;1281 DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n",1282 connector->name);1283 radeon_connector->ddc_bus = NULL;1284 } else {1285 ret = connector_status_connected;1286 broken_edid = true; /* defer use_digital to later */1287 }1288 } else {1289 radeon_connector->use_digital =1290 !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);1291 1292 /* some oems have boards with separate digital and analog connectors1293 * with a shared ddc line (often vga + hdmi)1294 */1295 if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) {1296 radeon_connector_free_edid(connector);1297 ret = connector_status_disconnected;1298 } else {1299 ret = connector_status_connected;1300 }1301 /* This gets complicated. We have boards with VGA + HDMI with a1302 * shared DDC line and we have boards with DVI-D + HDMI with a shared1303 * DDC line. The latter is more complex because with DVI<->HDMI adapters1304 * you don't really know what's connected to which port as both are digital.1305 */1306 if (radeon_connector->shared_ddc && (ret == connector_status_connected)) {1307 struct drm_connector *list_connector;1308 struct radeon_connector *list_radeon_connector;1309 list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) {1310 if (connector == list_connector)1311 continue;1312 list_radeon_connector = to_radeon_connector(list_connector);1313 if (list_radeon_connector->shared_ddc &&1314 (list_radeon_connector->ddc_bus->rec.i2c_id ==1315 radeon_connector->ddc_bus->rec.i2c_id)) {1316 /* cases where both connectors are digital */1317 if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) {1318 /* hpd is our only option in this case */1319 if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {1320 radeon_connector_free_edid(connector);1321 ret = connector_status_disconnected;1322 }1323 }1324 }1325 }1326 }1327 }1328 }1329 1330 if ((ret == connector_status_connected) && (radeon_connector->use_digital == true))1331 goto out;1332 1333 /* DVI-D and HDMI-A are digital only */1334 if ((connector->connector_type == DRM_MODE_CONNECTOR_DVID) ||1335 (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA))1336 goto out;1337 1338 /* if we aren't forcing don't do destructive polling */1339 if (!force) {1340 /* only return the previous status if we last1341 * detected a monitor via load.1342 */1343 if (radeon_connector->detected_by_load)1344 ret = connector->status;1345 goto out;1346 }1347 1348 /* find analog encoder */1349 if (radeon_connector->dac_load_detect) {1350 drm_connector_for_each_possible_encoder(connector, encoder) {1351 if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&1352 encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)1353 continue;1354 1355 encoder_funcs = encoder->helper_private;1356 if (encoder_funcs->detect) {1357 if (!broken_edid) {1358 if (ret != connector_status_connected) {1359 /* deal with analog monitors without DDC */1360 ret = encoder_funcs->detect(encoder, connector);1361 if (ret == connector_status_connected) {1362 radeon_connector->use_digital = false;1363 }1364 if (ret != connector_status_disconnected)1365 radeon_connector->detected_by_load = true;1366 }1367 } else {1368 enum drm_connector_status lret;1369 /* assume digital unless load detected otherwise */1370 radeon_connector->use_digital = true;1371 lret = encoder_funcs->detect(encoder, connector);1372 DRM_DEBUG_KMS("load_detect %x returned: %x\n", encoder->encoder_type, lret);1373 if (lret == connector_status_connected)1374 radeon_connector->use_digital = false;1375 }1376 break;1377 }1378 }1379 }1380 1381 if ((ret == connector_status_connected) && (radeon_connector->use_digital == false) &&1382 encoder) {1383 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);1384 }1385 1386 /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the1387 * vbios to deal with KVMs. If we have one and are not able to detect a monitor1388 * by other means, assume the DFP is connected and use that EDID. In most1389 * cases the DVI port is actually a virtual KVM port connected to the service1390 * processor.1391 */1392out:1393 if ((!rdev->is_atom_bios) &&1394 (ret == connector_status_disconnected) &&1395 rdev->mode_info.bios_hardcoded_edid) {1396 radeon_connector->use_digital = true;1397 ret = connector_status_connected;1398 }1399 1400 /* updated in get modes as well since we need to know if it's analog or digital */1401 radeon_connector_update_scratch_regs(connector, ret);1402 1403 if ((radeon_audio != 0) && radeon_connector->use_digital) {1404 const struct drm_connector_helper_funcs *connector_funcs =1405 connector->helper_private;1406 1407 encoder = connector_funcs->best_encoder(connector);1408 if (encoder && (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)) {1409 radeon_connector_get_edid(connector);1410 radeon_audio_detect(connector, encoder, ret);1411 }1412 }1413 1414exit:1415 if (!drm_kms_helper_is_poll_worker()) {1416 pm_runtime_mark_last_busy(connector->dev->dev);1417 pm_runtime_put_autosuspend(connector->dev->dev);1418 }1419 1420 return ret;1421}1422 1423/* okay need to be smart in here about which encoder to pick */1424static struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)1425{1426 struct radeon_connector *radeon_connector = to_radeon_connector(connector);1427 struct drm_encoder *encoder;1428 1429 drm_connector_for_each_possible_encoder(connector, encoder) {1430 if (radeon_connector->use_digital == true) {1431 if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)1432 return encoder;1433 } else {1434 if (encoder->encoder_type == DRM_MODE_ENCODER_DAC ||1435 encoder->encoder_type == DRM_MODE_ENCODER_TVDAC)1436 return encoder;1437 }1438 }1439 1440 /* see if we have a default encoder TODO */1441 1442 /* then check use digitial */1443 /* pick the first one */1444 drm_connector_for_each_possible_encoder(connector, encoder)1445 return encoder;1446 1447 return NULL;1448}1449 1450static void radeon_dvi_force(struct drm_connector *connector)1451{1452 struct radeon_connector *radeon_connector = to_radeon_connector(connector);1453 if (connector->force == DRM_FORCE_ON)1454 radeon_connector->use_digital = false;1455 if (connector->force == DRM_FORCE_ON_DIGITAL)1456 radeon_connector->use_digital = true;1457}1458 1459static enum drm_mode_status radeon_dvi_mode_valid(struct drm_connector *connector,1460 struct drm_display_mode *mode)1461{1462 struct drm_device *dev = connector->dev;1463 struct radeon_device *rdev = dev->dev_private;1464 struct radeon_connector *radeon_connector = to_radeon_connector(connector);1465 1466 /* XXX check mode bandwidth */1467 1468 /* clocks over 135 MHz have heat issues with DVI on RV100 */1469 if (radeon_connector->use_digital &&1470 (rdev->family == CHIP_RV100) &&1471 (mode->clock > 135000))1472 return MODE_CLOCK_HIGH;1473 1474 if (radeon_connector->use_digital && (mode->clock > 165000)) {1475 if ((radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I) ||1476 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||1477 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))1478 return MODE_OK;1479 else if (ASIC_IS_DCE6(rdev) && connector->display_info.is_hdmi) {1480 /* HDMI 1.3+ supports max clock of 340 Mhz */1481 if (mode->clock > 340000)1482 return MODE_CLOCK_HIGH;1483 else1484 return MODE_OK;1485 } else {1486 return MODE_CLOCK_HIGH;1487 }1488 }1489 1490 /* check against the max pixel clock */1491 if ((mode->clock / 10) > rdev->clock.max_pixel_clock)1492 return MODE_CLOCK_HIGH;1493 1494 return MODE_OK;1495}1496 1497static const struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = {1498 .get_modes = radeon_vga_get_modes,1499 .mode_valid = radeon_dvi_mode_valid,1500 .best_encoder = radeon_dvi_encoder,1501};1502 1503static const struct drm_connector_funcs radeon_dvi_connector_funcs = {1504 .dpms = drm_helper_connector_dpms,1505 .detect = radeon_dvi_detect,1506 .fill_modes = drm_helper_probe_single_connector_modes,1507 .set_property = radeon_connector_set_property,1508 .early_unregister = radeon_connector_unregister,1509 .destroy = radeon_connector_destroy,1510 .force = radeon_dvi_force,1511};1512 1513static int radeon_dp_get_modes(struct drm_connector *connector)1514{1515 struct radeon_connector *radeon_connector = to_radeon_connector(connector);1516 struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;1517 struct drm_encoder *encoder = radeon_best_single_encoder(connector);1518 int ret;1519 1520 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||1521 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {1522 struct drm_display_mode *mode;1523 1524 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {1525 if (!radeon_dig_connector->edp_on)1526 atombios_set_edp_panel_power(connector,1527 ATOM_TRANSMITTER_ACTION_POWER_ON);1528 radeon_connector_get_edid(connector);1529 ret = radeon_ddc_get_modes(connector);1530 if (!radeon_dig_connector->edp_on)1531 atombios_set_edp_panel_power(connector,1532 ATOM_TRANSMITTER_ACTION_POWER_OFF);1533 } else {1534 /* need to setup ddc on the bridge */1535 if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=1536 ENCODER_OBJECT_ID_NONE) {1537 if (encoder)1538 radeon_atom_ext_encoder_setup_ddc(encoder);1539 }1540 radeon_connector_get_edid(connector);1541 ret = radeon_ddc_get_modes(connector);1542 }1543 1544 if (ret > 0) {1545 if (encoder) {1546 radeon_fixup_lvds_native_mode(encoder, connector);1547 /* add scaled modes */1548 radeon_add_common_modes(encoder, connector);1549 }1550 return ret;1551 }1552 1553 if (!encoder)1554 return 0;1555 1556 /* we have no EDID modes */1557 mode = radeon_fp_native_mode(encoder);1558 if (mode) {1559 ret = 1;1560 drm_mode_probed_add(connector, mode);1561 /* add the width/height from vbios tables if available */1562 connector->display_info.width_mm = mode->width_mm;1563 connector->display_info.height_mm = mode->height_mm;1564 /* add scaled modes */1565 radeon_add_common_modes(encoder, connector);1566 }1567 } else {1568 /* need to setup ddc on the bridge */1569 if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=1570 ENCODER_OBJECT_ID_NONE) {1571 if (encoder)1572 radeon_atom_ext_encoder_setup_ddc(encoder);1573 }1574 radeon_connector_get_edid(connector);1575 ret = radeon_ddc_get_modes(connector);1576 1577 radeon_get_native_mode(connector);1578 }1579 1580 return ret;1581}1582 1583u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector)1584{1585 struct drm_encoder *encoder;1586 struct radeon_encoder *radeon_encoder;1587 1588 drm_connector_for_each_possible_encoder(connector, encoder) {1589 radeon_encoder = to_radeon_encoder(encoder);1590 1591 switch (radeon_encoder->encoder_id) {1592 case ENCODER_OBJECT_ID_TRAVIS:1593 case ENCODER_OBJECT_ID_NUTMEG:1594 return radeon_encoder->encoder_id;1595 default:1596 break;1597 }1598 }1599 1600 return ENCODER_OBJECT_ID_NONE;1601}1602 1603static bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)1604{1605 struct drm_encoder *encoder;1606 struct radeon_encoder *radeon_encoder;1607 bool found = false;1608 1609 drm_connector_for_each_possible_encoder(connector, encoder) {1610 radeon_encoder = to_radeon_encoder(encoder);1611 if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)1612 found = true;1613 }1614 1615 return found;1616}1617 1618bool radeon_connector_is_dp12_capable(struct drm_connector *connector)1619{1620 struct drm_device *dev = connector->dev;1621 struct radeon_device *rdev = dev->dev_private;1622 1623 if (ASIC_IS_DCE5(rdev) &&1624 (rdev->clock.default_dispclk >= 53900) &&1625 radeon_connector_encoder_is_hbr2(connector)) {1626 return true;1627 }1628 1629 return false;1630}1631 1632static enum drm_connector_status1633radeon_dp_detect(struct drm_connector *connector, bool force)1634{1635 struct drm_device *dev = connector->dev;1636 struct radeon_device *rdev = dev->dev_private;1637 struct radeon_connector *radeon_connector = to_radeon_connector(connector);1638 enum drm_connector_status ret = connector_status_disconnected;1639 struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;1640 struct drm_encoder *encoder = radeon_best_single_encoder(connector);1641 int r;1642 1643 if (!drm_kms_helper_is_poll_worker()) {1644 r = pm_runtime_get_sync(connector->dev->dev);1645 if (r < 0) {1646 pm_runtime_put_autosuspend(connector->dev->dev);1647 return connector_status_disconnected;1648 }1649 }1650 1651 if (!force && radeon_check_hpd_status_unchanged(connector)) {1652 ret = connector->status;1653 goto out;1654 }1655 1656 radeon_connector_free_edid(connector);1657 1658 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||1659 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {1660 if (encoder) {1661 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);1662 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;1663 1664 /* check if panel is valid */1665 if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)1666 ret = connector_status_connected;1667 /* don't fetch the edid from the vbios if ddc fails and runpm is1668 * enabled so we report disconnected.1669 */1670 if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0))1671 ret = connector_status_disconnected;1672 }1673 /* eDP is always DP */1674 radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;1675 if (!radeon_dig_connector->edp_on)1676 atombios_set_edp_panel_power(connector,1677 ATOM_TRANSMITTER_ACTION_POWER_ON);1678 if (radeon_dp_getdpcd(radeon_connector))1679 ret = connector_status_connected;1680 if (!radeon_dig_connector->edp_on)1681 atombios_set_edp_panel_power(connector,1682 ATOM_TRANSMITTER_ACTION_POWER_OFF);1683 } else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=1684 ENCODER_OBJECT_ID_NONE) {1685 /* DP bridges are always DP */1686 radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;1687 /* get the DPCD from the bridge */1688 radeon_dp_getdpcd(radeon_connector);1689 1690 if (encoder) {1691 /* setup ddc on the bridge */1692 radeon_atom_ext_encoder_setup_ddc(encoder);1693 /* bridge chips are always aux */1694 if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */1695 ret = connector_status_connected;1696 else if (radeon_connector->dac_load_detect) { /* try load detection */1697 const struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;1698 ret = encoder_funcs->detect(encoder, connector);1699 }1700 }1701 } else {1702 radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);1703 if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {1704 ret = connector_status_connected;1705 if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT)1706 radeon_dp_getdpcd(radeon_connector);1707 } else {1708 if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {1709 if (radeon_dp_getdpcd(radeon_connector))1710 ret = connector_status_connected;1711 } else {1712 /* try non-aux ddc (DP to DVI/HDMI/etc. adapter) */1713 if (radeon_ddc_probe(radeon_connector, false))1714 ret = connector_status_connected;1715 }1716 }1717 }1718 1719 radeon_connector_update_scratch_regs(connector, ret);1720 1721 if ((radeon_audio != 0) && encoder) {1722 radeon_connector_get_edid(connector);1723 radeon_audio_detect(connector, encoder, ret);1724 }1725 1726out:1727 if (!drm_kms_helper_is_poll_worker()) {1728 pm_runtime_mark_last_busy(connector->dev->dev);1729 pm_runtime_put_autosuspend(connector->dev->dev);1730 }1731 1732 return ret;1733}1734 1735static enum drm_mode_status radeon_dp_mode_valid(struct drm_connector *connector,1736 struct drm_display_mode *mode)1737{1738 struct drm_device *dev = connector->dev;1739 struct radeon_device *rdev = dev->dev_private;1740 struct radeon_connector *radeon_connector = to_radeon_connector(connector);1741 struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;1742 1743 /* XXX check mode bandwidth */1744 1745 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||1746 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {1747 struct drm_encoder *encoder = radeon_best_single_encoder(connector);1748 1749 if ((mode->hdisplay < 320) || (mode->vdisplay < 240))1750 return MODE_PANEL;1751 1752 if (encoder) {1753 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);1754 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;1755 1756 /* AVIVO hardware supports downscaling modes larger than the panel1757 * to the panel size, but I'm not sure this is desirable.1758 */1759 if ((mode->hdisplay > native_mode->hdisplay) ||1760 (mode->vdisplay > native_mode->vdisplay))1761 return MODE_PANEL;1762 1763 /* if scaling is disabled, block non-native modes */1764 if (radeon_encoder->rmx_type == RMX_OFF) {1765 if ((mode->hdisplay != native_mode->hdisplay) ||1766 (mode->vdisplay != native_mode->vdisplay))1767 return MODE_PANEL;1768 }1769 }1770 } else {1771 if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||1772 (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) {1773 return radeon_dp_mode_valid_helper(connector, mode);1774 } else {1775 if (ASIC_IS_DCE6(rdev) && connector->display_info.is_hdmi) {1776 /* HDMI 1.3+ supports max clock of 340 Mhz */1777 if (mode->clock > 340000)1778 return MODE_CLOCK_HIGH;1779 } else {1780 if (mode->clock > 165000)1781 return MODE_CLOCK_HIGH;1782 }1783 }1784 }1785 1786 return MODE_OK;1787}1788 1789static int1790radeon_connector_late_register(struct drm_connector *connector)1791{1792 struct radeon_connector *radeon_connector = to_radeon_connector(connector);1793 int r = 0;1794 1795 if (radeon_connector->ddc_bus->has_aux) {1796 radeon_connector->ddc_bus->aux.dev = radeon_connector->base.kdev;1797 r = drm_dp_aux_register(&radeon_connector->ddc_bus->aux);1798 }1799 1800 return r;1801}1802 1803static const struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = {1804 .get_modes = radeon_dp_get_modes,1805 .mode_valid = radeon_dp_mode_valid,1806 .best_encoder = radeon_dvi_encoder,1807};1808 1809static const struct drm_connector_funcs radeon_dp_connector_funcs = {1810 .dpms = drm_helper_connector_dpms,1811 .detect = radeon_dp_detect,1812 .fill_modes = drm_helper_probe_single_connector_modes,1813 .set_property = radeon_connector_set_property,1814 .early_unregister = radeon_connector_unregister,1815 .destroy = radeon_connector_destroy,1816 .force = radeon_dvi_force,1817 .late_register = radeon_connector_late_register,1818};1819 1820static const struct drm_connector_funcs radeon_edp_connector_funcs = {1821 .dpms = drm_helper_connector_dpms,1822 .detect = radeon_dp_detect,1823 .fill_modes = drm_helper_probe_single_connector_modes,1824 .set_property = radeon_lvds_set_property,1825 .early_unregister = radeon_connector_unregister,1826 .destroy = radeon_connector_destroy,1827 .force = radeon_dvi_force,1828 .late_register = radeon_connector_late_register,1829};1830 1831static const struct drm_connector_funcs radeon_lvds_bridge_connector_funcs = {1832 .dpms = drm_helper_connector_dpms,1833 .detect = radeon_dp_detect,1834 .fill_modes = drm_helper_probe_single_connector_modes,1835 .set_property = radeon_lvds_set_property,1836 .early_unregister = radeon_connector_unregister,1837 .destroy = radeon_connector_destroy,1838 .force = radeon_dvi_force,1839 .late_register = radeon_connector_late_register,1840};1841 1842void1843radeon_add_atom_connector(struct drm_device *dev,1844 uint32_t connector_id,1845 uint32_t supported_device,1846 int connector_type,1847 struct radeon_i2c_bus_rec *i2c_bus,1848 uint32_t igp_lane_info,1849 uint16_t connector_object_id,1850 struct radeon_hpd *hpd,1851 struct radeon_router *router)1852{1853 struct radeon_device *rdev = dev->dev_private;1854 struct drm_connector *connector;1855 struct radeon_connector *radeon_connector;1856 struct radeon_connector_atom_dig *radeon_dig_connector;1857 struct drm_encoder *encoder;1858 struct radeon_encoder *radeon_encoder;1859 struct i2c_adapter *ddc = NULL;1860 uint32_t subpixel_order = SubPixelNone;1861 bool shared_ddc = false;1862 bool is_dp_bridge = false;1863 bool has_aux = false;1864 1865 if (connector_type == DRM_MODE_CONNECTOR_Unknown)1866 return;1867 1868 /* if the user selected tv=0 don't try and add the connector */1869 if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||1870 (connector_type == DRM_MODE_CONNECTOR_Composite) ||1871 (connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&1872 (radeon_tv == 0))1873 return;1874 1875 /* see if we already added it */1876 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {1877 radeon_connector = to_radeon_connector(connector);1878 if (radeon_connector->connector_id == connector_id) {1879 radeon_connector->devices |= supported_device;1880 return;1881 }1882 if (radeon_connector->ddc_bus && i2c_bus->valid) {1883 if (radeon_connector->ddc_bus->rec.i2c_id == i2c_bus->i2c_id) {1884 radeon_connector->shared_ddc = true;1885 shared_ddc = true;1886 }1887 if (radeon_connector->router_bus && router->ddc_valid &&1888 (radeon_connector->router.router_id == router->router_id)) {1889 radeon_connector->shared_ddc = false;1890 shared_ddc = false;1891 }1892 }1893 }1894 1895 /* check if it's a dp bridge */1896 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {1897 radeon_encoder = to_radeon_encoder(encoder);1898 if (radeon_encoder->devices & supported_device) {1899 switch (radeon_encoder->encoder_id) {1900 case ENCODER_OBJECT_ID_TRAVIS:1901 case ENCODER_OBJECT_ID_NUTMEG:1902 is_dp_bridge = true;1903 break;1904 default:1905 break;1906 }1907 }1908 }1909 1910 radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);1911 if (!radeon_connector)1912 return;1913 1914 connector = &radeon_connector->base;1915 1916 radeon_connector->connector_id = connector_id;1917 radeon_connector->devices = supported_device;1918 radeon_connector->shared_ddc = shared_ddc;1919 radeon_connector->connector_object_id = connector_object_id;1920 radeon_connector->hpd = *hpd;1921 1922 radeon_connector->router = *router;1923 if (router->ddc_valid || router->cd_valid) {1924 radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info);1925 if (!radeon_connector->router_bus)1926 DRM_ERROR("Failed to assign router i2c bus! Check dmesg for i2c errors.\n");1927 }1928 1929 if (is_dp_bridge) {1930 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);1931 if (!radeon_dig_connector)1932 goto failed;1933 radeon_dig_connector->igp_lane_info = igp_lane_info;1934 radeon_connector->con_priv = radeon_dig_connector;1935 if (i2c_bus->valid) {1936 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);1937 if (radeon_connector->ddc_bus) {1938 has_aux = true;1939 ddc = &radeon_connector->ddc_bus->adapter;1940 } else {1941 DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");1942 }1943 }1944 switch (connector_type) {1945 case DRM_MODE_CONNECTOR_VGA:1946 case DRM_MODE_CONNECTOR_DVIA:1947 default:1948 drm_connector_init_with_ddc(dev, &radeon_connector->base,1949 &radeon_dp_connector_funcs,1950 connector_type,1951 ddc);1952 drm_connector_helper_add(&radeon_connector->base,1953 &radeon_dp_connector_helper_funcs);1954 connector->interlace_allowed = true;1955 connector->doublescan_allowed = true;1956 radeon_connector->dac_load_detect = true;1957 drm_object_attach_property(&radeon_connector->base.base,1958 rdev->mode_info.load_detect_property,1959 1);1960 drm_object_attach_property(&radeon_connector->base.base,1961 dev->mode_config.scaling_mode_property,1962 DRM_MODE_SCALE_NONE);1963 if (ASIC_IS_DCE5(rdev))1964 drm_object_attach_property(&radeon_connector->base.base,1965 rdev->mode_info.output_csc_property,1966 RADEON_OUTPUT_CSC_BYPASS);1967 break;1968 case DRM_MODE_CONNECTOR_DVII:1969 case DRM_MODE_CONNECTOR_DVID:1970 case DRM_MODE_CONNECTOR_HDMIA:1971 case DRM_MODE_CONNECTOR_HDMIB:1972 case DRM_MODE_CONNECTOR_DisplayPort:1973 drm_connector_init_with_ddc(dev, &radeon_connector->base,1974 &radeon_dp_connector_funcs,1975 connector_type,1976 ddc);1977 drm_connector_helper_add(&radeon_connector->base,1978 &radeon_dp_connector_helper_funcs);1979 drm_object_attach_property(&radeon_connector->base.base,1980 rdev->mode_info.underscan_property,1981 UNDERSCAN_OFF);1982 drm_object_attach_property(&radeon_connector->base.base,1983 rdev->mode_info.underscan_hborder_property,1984 0);1985 drm_object_attach_property(&radeon_connector->base.base,1986 rdev->mode_info.underscan_vborder_property,1987 0);1988 1989 drm_object_attach_property(&radeon_connector->base.base,1990 dev->mode_config.scaling_mode_property,1991 DRM_MODE_SCALE_NONE);1992 1993 drm_object_attach_property(&radeon_connector->base.base,1994 rdev->mode_info.dither_property,1995 RADEON_FMT_DITHER_DISABLE);1996 1997 if (radeon_audio != 0) {1998 drm_object_attach_property(&radeon_connector->base.base,1999 rdev->mode_info.audio_property,2000 RADEON_AUDIO_AUTO);2001 radeon_connector->audio = RADEON_AUDIO_AUTO;2002 }2003 if (ASIC_IS_DCE5(rdev))2004 drm_object_attach_property(&radeon_connector->base.base,2005 rdev->mode_info.output_csc_property,2006 RADEON_OUTPUT_CSC_BYPASS);2007 2008 subpixel_order = SubPixelHorizontalRGB;2009 connector->interlace_allowed = true;2010 if (connector_type == DRM_MODE_CONNECTOR_HDMIB)2011 connector->doublescan_allowed = true;2012 else2013 connector->doublescan_allowed = false;2014 if (connector_type == DRM_MODE_CONNECTOR_DVII) {2015 radeon_connector->dac_load_detect = true;2016 drm_object_attach_property(&radeon_connector->base.base,2017 rdev->mode_info.load_detect_property,2018 1);2019 }2020 break;2021 case DRM_MODE_CONNECTOR_LVDS:2022 case DRM_MODE_CONNECTOR_eDP:2023 drm_connector_init_with_ddc(dev, &radeon_connector->base,2024 &radeon_lvds_bridge_connector_funcs,2025 connector_type,2026 ddc);2027 drm_connector_helper_add(&radeon_connector->base,2028 &radeon_dp_connector_helper_funcs);2029 drm_object_attach_property(&radeon_connector->base.base,2030 dev->mode_config.scaling_mode_property,2031 DRM_MODE_SCALE_FULLSCREEN);2032 subpixel_order = SubPixelHorizontalRGB;2033 connector->interlace_allowed = false;2034 connector->doublescan_allowed = false;2035 break;2036 }2037 } else {2038 switch (connector_type) {2039 case DRM_MODE_CONNECTOR_VGA:2040 if (i2c_bus->valid) {2041 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);2042 if (!radeon_connector->ddc_bus)2043 DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");2044 else2045 ddc = &radeon_connector->ddc_bus->adapter;2046 }2047 drm_connector_init_with_ddc(dev, &radeon_connector->base,2048 &radeon_vga_connector_funcs,2049 connector_type,2050 ddc);2051 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);2052 radeon_connector->dac_load_detect = true;2053 drm_object_attach_property(&radeon_connector->base.base,2054 rdev->mode_info.load_detect_property,2055 1);2056 if (ASIC_IS_AVIVO(rdev))2057 drm_object_attach_property(&radeon_connector->base.base,2058 dev->mode_config.scaling_mode_property,2059 DRM_MODE_SCALE_NONE);2060 if (ASIC_IS_DCE5(rdev))2061 drm_object_attach_property(&radeon_connector->base.base,2062 rdev->mode_info.output_csc_property,2063 RADEON_OUTPUT_CSC_BYPASS);2064 /* no HPD on analog connectors */2065 radeon_connector->hpd.hpd = RADEON_HPD_NONE;2066 connector->interlace_allowed = true;2067 connector->doublescan_allowed = true;2068 break;2069 case DRM_MODE_CONNECTOR_DVIA:2070 if (i2c_bus->valid) {2071 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);2072 if (!radeon_connector->ddc_bus)2073 DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");2074 else2075 ddc = &radeon_connector->ddc_bus->adapter;2076 }2077 drm_connector_init_with_ddc(dev, &radeon_connector->base,2078 &radeon_vga_connector_funcs,2079 connector_type,2080 ddc);2081 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);2082 radeon_connector->dac_load_detect = true;2083 drm_object_attach_property(&radeon_connector->base.base,2084 rdev->mode_info.load_detect_property,2085 1);2086 if (ASIC_IS_AVIVO(rdev))2087 drm_object_attach_property(&radeon_connector->base.base,2088 dev->mode_config.scaling_mode_property,2089 DRM_MODE_SCALE_NONE);2090 if (ASIC_IS_DCE5(rdev))2091 drm_object_attach_property(&radeon_connector->base.base,2092 rdev->mode_info.output_csc_property,2093 RADEON_OUTPUT_CSC_BYPASS);2094 /* no HPD on analog connectors */2095 radeon_connector->hpd.hpd = RADEON_HPD_NONE;2096 connector->interlace_allowed = true;2097 connector->doublescan_allowed = true;2098 break;2099 case DRM_MODE_CONNECTOR_DVII:2100 case DRM_MODE_CONNECTOR_DVID:2101 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);2102 if (!radeon_dig_connector)2103 goto failed;2104 radeon_dig_connector->igp_lane_info = igp_lane_info;2105 radeon_connector->con_priv = radeon_dig_connector;2106 if (i2c_bus->valid) {2107 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);2108 if (!radeon_connector->ddc_bus)2109 DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");2110 else2111 ddc = &radeon_connector->ddc_bus->adapter;2112 }2113 drm_connector_init_with_ddc(dev, &radeon_connector->base,2114 &radeon_dvi_connector_funcs,2115 connector_type,2116 ddc);2117 drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);2118 subpixel_order = SubPixelHorizontalRGB;2119 drm_object_attach_property(&radeon_connector->base.base,2120 rdev->mode_info.coherent_mode_property,2121 1);2122 if (ASIC_IS_AVIVO(rdev)) {2123 drm_object_attach_property(&radeon_connector->base.base,2124 rdev->mode_info.underscan_property,2125 UNDERSCAN_OFF);2126 drm_object_attach_property(&radeon_connector->base.base,2127 rdev->mode_info.underscan_hborder_property,2128 0);2129 drm_object_attach_property(&radeon_connector->base.base,2130 rdev->mode_info.underscan_vborder_property,2131 0);2132 drm_object_attach_property(&radeon_connector->base.base,2133 rdev->mode_info.dither_property,2134 RADEON_FMT_DITHER_DISABLE);2135 drm_object_attach_property(&radeon_connector->base.base,2136 dev->mode_config.scaling_mode_property,2137 DRM_MODE_SCALE_NONE);2138 }2139 if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) {2140 drm_object_attach_property(&radeon_connector->base.base,2141 rdev->mode_info.audio_property,2142 RADEON_AUDIO_AUTO);2143 radeon_connector->audio = RADEON_AUDIO_AUTO;2144 }2145 if (connector_type == DRM_MODE_CONNECTOR_DVII) {2146 radeon_connector->dac_load_detect = true;2147 drm_object_attach_property(&radeon_connector->base.base,2148 rdev->mode_info.load_detect_property,2149 1);2150 }2151 if (ASIC_IS_DCE5(rdev))2152 drm_object_attach_property(&radeon_connector->base.base,2153 rdev->mode_info.output_csc_property,2154 RADEON_OUTPUT_CSC_BYPASS);2155 connector->interlace_allowed = true;2156 if (connector_type == DRM_MODE_CONNECTOR_DVII)2157 connector->doublescan_allowed = true;2158 else2159 connector->doublescan_allowed = false;2160 break;2161 case DRM_MODE_CONNECTOR_HDMIA:2162 case DRM_MODE_CONNECTOR_HDMIB:2163 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);2164 if (!radeon_dig_connector)2165 goto failed;2166 radeon_dig_connector->igp_lane_info = igp_lane_info;2167 radeon_connector->con_priv = radeon_dig_connector;2168 if (i2c_bus->valid) {2169 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);2170 if (!radeon_connector->ddc_bus)2171 DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");2172 else2173 ddc = &radeon_connector->ddc_bus->adapter;2174 }2175 drm_connector_init_with_ddc(dev, &radeon_connector->base,2176 &radeon_dvi_connector_funcs,2177 connector_type,2178 ddc);2179 drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);2180 drm_object_attach_property(&radeon_connector->base.base,2181 rdev->mode_info.coherent_mode_property,2182 1);2183 if (ASIC_IS_AVIVO(rdev)) {2184 drm_object_attach_property(&radeon_connector->base.base,2185 rdev->mode_info.underscan_property,2186 UNDERSCAN_OFF);2187 drm_object_attach_property(&radeon_connector->base.base,2188 rdev->mode_info.underscan_hborder_property,2189 0);2190 drm_object_attach_property(&radeon_connector->base.base,2191 rdev->mode_info.underscan_vborder_property,2192 0);2193 drm_object_attach_property(&radeon_connector->base.base,2194 rdev->mode_info.dither_property,2195 RADEON_FMT_DITHER_DISABLE);2196 drm_object_attach_property(&radeon_connector->base.base,2197 dev->mode_config.scaling_mode_property,2198 DRM_MODE_SCALE_NONE);2199 }2200 if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) {2201 drm_object_attach_property(&radeon_connector->base.base,2202 rdev->mode_info.audio_property,2203 RADEON_AUDIO_AUTO);2204 radeon_connector->audio = RADEON_AUDIO_AUTO;2205 }2206 if (ASIC_IS_DCE5(rdev))2207 drm_object_attach_property(&radeon_connector->base.base,2208 rdev->mode_info.output_csc_property,2209 RADEON_OUTPUT_CSC_BYPASS);2210 subpixel_order = SubPixelHorizontalRGB;2211 connector->interlace_allowed = true;2212 if (connector_type == DRM_MODE_CONNECTOR_HDMIB)2213 connector->doublescan_allowed = true;2214 else2215 connector->doublescan_allowed = false;2216 break;2217 case DRM_MODE_CONNECTOR_DisplayPort:2218 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);2219 if (!radeon_dig_connector)2220 goto failed;2221 radeon_dig_connector->igp_lane_info = igp_lane_info;2222 radeon_connector->con_priv = radeon_dig_connector;2223 if (i2c_bus->valid) {2224 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);2225 if (radeon_connector->ddc_bus) {2226 has_aux = true;2227 ddc = &radeon_connector->ddc_bus->adapter;2228 } else {2229 DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");2230 }2231 }2232 drm_connector_init_with_ddc(dev, &radeon_connector->base,2233 &radeon_dp_connector_funcs,2234 connector_type,2235 ddc);2236 drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);2237 subpixel_order = SubPixelHorizontalRGB;2238 drm_object_attach_property(&radeon_connector->base.base,2239 rdev->mode_info.coherent_mode_property,2240 1);2241 if (ASIC_IS_AVIVO(rdev)) {2242 drm_object_attach_property(&radeon_connector->base.base,2243 rdev->mode_info.underscan_property,2244 UNDERSCAN_OFF);2245 drm_object_attach_property(&radeon_connector->base.base,2246 rdev->mode_info.underscan_hborder_property,2247 0);2248 drm_object_attach_property(&radeon_connector->base.base,2249 rdev->mode_info.underscan_vborder_property,2250 0);2251 drm_object_attach_property(&radeon_connector->base.base,2252 rdev->mode_info.dither_property,2253 RADEON_FMT_DITHER_DISABLE);2254 drm_object_attach_property(&radeon_connector->base.base,2255 dev->mode_config.scaling_mode_property,2256 DRM_MODE_SCALE_NONE);2257 }2258 if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) {2259 drm_object_attach_property(&radeon_connector->base.base,2260 rdev->mode_info.audio_property,2261 RADEON_AUDIO_AUTO);2262 radeon_connector->audio = RADEON_AUDIO_AUTO;2263 }2264 if (ASIC_IS_DCE5(rdev))2265 drm_object_attach_property(&radeon_connector->base.base,2266 rdev->mode_info.output_csc_property,2267 RADEON_OUTPUT_CSC_BYPASS);2268 connector->interlace_allowed = true;2269 /* in theory with a DP to VGA converter... */2270 connector->doublescan_allowed = false;2271 break;2272 case DRM_MODE_CONNECTOR_eDP:2273 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);2274 if (!radeon_dig_connector)2275 goto failed;2276 radeon_dig_connector->igp_lane_info = igp_lane_info;2277 radeon_connector->con_priv = radeon_dig_connector;2278 if (i2c_bus->valid) {2279 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);2280 if (radeon_connector->ddc_bus) {2281 has_aux = true;2282 ddc = &radeon_connector->ddc_bus->adapter;2283 } else {2284 DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");2285 }2286 }2287 drm_connector_init_with_ddc(dev, &radeon_connector->base,2288 &radeon_edp_connector_funcs,2289 connector_type,2290 ddc);2291 drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);2292 drm_object_attach_property(&radeon_connector->base.base,2293 dev->mode_config.scaling_mode_property,2294 DRM_MODE_SCALE_FULLSCREEN);2295 subpixel_order = SubPixelHorizontalRGB;2296 connector->interlace_allowed = false;2297 connector->doublescan_allowed = false;2298 break;2299 case DRM_MODE_CONNECTOR_SVIDEO:2300 case DRM_MODE_CONNECTOR_Composite:2301 case DRM_MODE_CONNECTOR_9PinDIN:2302 drm_connector_init_with_ddc(dev, &radeon_connector->base,2303 &radeon_tv_connector_funcs,2304 connector_type,2305 ddc);2306 drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);2307 radeon_connector->dac_load_detect = true;2308 drm_object_attach_property(&radeon_connector->base.base,2309 rdev->mode_info.load_detect_property,2310 1);2311 drm_object_attach_property(&radeon_connector->base.base,2312 rdev->mode_info.tv_std_property,2313 radeon_atombios_get_tv_info(rdev));2314 /* no HPD on analog connectors */2315 radeon_connector->hpd.hpd = RADEON_HPD_NONE;2316 connector->interlace_allowed = false;2317 connector->doublescan_allowed = false;2318 break;2319 case DRM_MODE_CONNECTOR_LVDS:2320 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);2321 if (!radeon_dig_connector)2322 goto failed;2323 radeon_dig_connector->igp_lane_info = igp_lane_info;2324 radeon_connector->con_priv = radeon_dig_connector;2325 if (i2c_bus->valid) {2326 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);2327 if (!radeon_connector->ddc_bus)2328 DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");2329 else2330 ddc = &radeon_connector->ddc_bus->adapter;2331 }2332 drm_connector_init_with_ddc(dev, &radeon_connector->base,2333 &radeon_lvds_connector_funcs,2334 connector_type,2335 ddc);2336 drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);2337 drm_object_attach_property(&radeon_connector->base.base,2338 dev->mode_config.scaling_mode_property,2339 DRM_MODE_SCALE_FULLSCREEN);2340 subpixel_order = SubPixelHorizontalRGB;2341 connector->interlace_allowed = false;2342 connector->doublescan_allowed = false;2343 break;2344 }2345 }2346 2347 if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {2348 if (i2c_bus->valid) {2349 connector->polled = DRM_CONNECTOR_POLL_CONNECT |2350 DRM_CONNECTOR_POLL_DISCONNECT;2351 }2352 } else2353 connector->polled = DRM_CONNECTOR_POLL_HPD;2354 2355 connector->display_info.subpixel_order = subpixel_order;2356 drm_connector_register(connector);2357 2358 if (has_aux)2359 radeon_dp_aux_init(radeon_connector);2360 2361 return;2362 2363failed:2364 drm_connector_cleanup(connector);2365 kfree(connector);2366}2367 2368void2369radeon_add_legacy_connector(struct drm_device *dev,2370 uint32_t connector_id,2371 uint32_t supported_device,2372 int connector_type,2373 struct radeon_i2c_bus_rec *i2c_bus,2374 uint16_t connector_object_id,2375 struct radeon_hpd *hpd)2376{2377 struct radeon_device *rdev = dev->dev_private;2378 struct drm_connector *connector;2379 struct radeon_connector *radeon_connector;2380 struct i2c_adapter *ddc = NULL;2381 uint32_t subpixel_order = SubPixelNone;2382 2383 if (connector_type == DRM_MODE_CONNECTOR_Unknown)2384 return;2385 2386 /* if the user selected tv=0 don't try and add the connector */2387 if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||2388 (connector_type == DRM_MODE_CONNECTOR_Composite) ||2389 (connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&2390 (radeon_tv == 0))2391 return;2392 2393 /* see if we already added it */2394 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {2395 radeon_connector = to_radeon_connector(connector);2396 if (radeon_connector->connector_id == connector_id) {2397 radeon_connector->devices |= supported_device;2398 return;2399 }2400 }2401 2402 radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);2403 if (!radeon_connector)2404 return;2405 2406 connector = &radeon_connector->base;2407 2408 radeon_connector->connector_id = connector_id;2409 radeon_connector->devices = supported_device;2410 radeon_connector->connector_object_id = connector_object_id;2411 radeon_connector->hpd = *hpd;2412 2413 switch (connector_type) {2414 case DRM_MODE_CONNECTOR_VGA:2415 if (i2c_bus->valid) {2416 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);2417 if (!radeon_connector->ddc_bus)2418 DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");2419 else2420 ddc = &radeon_connector->ddc_bus->adapter;2421 }2422 drm_connector_init_with_ddc(dev, &radeon_connector->base,2423 &radeon_vga_connector_funcs,2424 connector_type,2425 ddc);2426 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);2427 radeon_connector->dac_load_detect = true;2428 drm_object_attach_property(&radeon_connector->base.base,2429 rdev->mode_info.load_detect_property,2430 1);2431 /* no HPD on analog connectors */2432 radeon_connector->hpd.hpd = RADEON_HPD_NONE;2433 connector->interlace_allowed = true;2434 connector->doublescan_allowed = true;2435 break;2436 case DRM_MODE_CONNECTOR_DVIA:2437 if (i2c_bus->valid) {2438 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);2439 if (!radeon_connector->ddc_bus)2440 DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");2441 else2442 ddc = &radeon_connector->ddc_bus->adapter;2443 }2444 drm_connector_init_with_ddc(dev, &radeon_connector->base,2445 &radeon_vga_connector_funcs,2446 connector_type,2447 ddc);2448 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);2449 radeon_connector->dac_load_detect = true;2450 drm_object_attach_property(&radeon_connector->base.base,2451 rdev->mode_info.load_detect_property,2452 1);2453 /* no HPD on analog connectors */2454 radeon_connector->hpd.hpd = RADEON_HPD_NONE;2455 connector->interlace_allowed = true;2456 connector->doublescan_allowed = true;2457 break;2458 case DRM_MODE_CONNECTOR_DVII:2459 case DRM_MODE_CONNECTOR_DVID:2460 if (i2c_bus->valid) {2461 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);2462 if (!radeon_connector->ddc_bus)2463 DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");2464 else2465 ddc = &radeon_connector->ddc_bus->adapter;2466 }2467 drm_connector_init_with_ddc(dev, &radeon_connector->base,2468 &radeon_dvi_connector_funcs,2469 connector_type,2470 ddc);2471 drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);2472 if (connector_type == DRM_MODE_CONNECTOR_DVII) {2473 radeon_connector->dac_load_detect = true;2474 drm_object_attach_property(&radeon_connector->base.base,2475 rdev->mode_info.load_detect_property,2476 1);2477 }2478 subpixel_order = SubPixelHorizontalRGB;2479 connector->interlace_allowed = true;2480 if (connector_type == DRM_MODE_CONNECTOR_DVII)2481 connector->doublescan_allowed = true;2482 else2483 connector->doublescan_allowed = false;2484 break;2485 case DRM_MODE_CONNECTOR_SVIDEO:2486 case DRM_MODE_CONNECTOR_Composite:2487 case DRM_MODE_CONNECTOR_9PinDIN:2488 drm_connector_init_with_ddc(dev, &radeon_connector->base,2489 &radeon_tv_connector_funcs,2490 connector_type,2491 ddc);2492 drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);2493 radeon_connector->dac_load_detect = true;2494 /* RS400,RC410,RS480 chipset seems to report a lot2495 * of false positive on load detect, we haven't yet2496 * found a way to make load detect reliable on those2497 * chipset, thus just disable it for TV.2498 */2499 if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480)2500 radeon_connector->dac_load_detect = false;2501 drm_object_attach_property(&radeon_connector->base.base,2502 rdev->mode_info.load_detect_property,2503 radeon_connector->dac_load_detect);2504 drm_object_attach_property(&radeon_connector->base.base,2505 rdev->mode_info.tv_std_property,2506 radeon_combios_get_tv_info(rdev));2507 /* no HPD on analog connectors */2508 radeon_connector->hpd.hpd = RADEON_HPD_NONE;2509 connector->interlace_allowed = false;2510 connector->doublescan_allowed = false;2511 break;2512 case DRM_MODE_CONNECTOR_LVDS:2513 if (i2c_bus->valid) {2514 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);2515 if (!radeon_connector->ddc_bus)2516 DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");2517 else2518 ddc = &radeon_connector->ddc_bus->adapter;2519 }2520 drm_connector_init_with_ddc(dev, &radeon_connector->base,2521 &radeon_lvds_connector_funcs,2522 connector_type,2523 ddc);2524 drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);2525 drm_object_attach_property(&radeon_connector->base.base,2526 dev->mode_config.scaling_mode_property,2527 DRM_MODE_SCALE_FULLSCREEN);2528 subpixel_order = SubPixelHorizontalRGB;2529 connector->interlace_allowed = false;2530 connector->doublescan_allowed = false;2531 break;2532 }2533 2534 if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {2535 if (i2c_bus->valid) {2536 connector->polled = DRM_CONNECTOR_POLL_CONNECT |2537 DRM_CONNECTOR_POLL_DISCONNECT;2538 }2539 } else2540 connector->polled = DRM_CONNECTOR_POLL_HPD;2541 2542 connector->display_info.subpixel_order = subpixel_order;2543 drm_connector_register(connector);2544}2545