2 * Copyright 2007-8 Advanced Micro Devices, Inc.
3 * Copyright 2008 Red Hat Inc.
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:
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
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.
23 * Authors: Dave Airlie
28 #include "drm_crtc_helper.h"
29 #include "drm_fb_helper.h"
30 #include "radeon_drm.h"
35 radeon_combios_connected_scratch_regs(struct drm_connector *connector,
36 struct drm_encoder *encoder,
39 radeon_atombios_connected_scratch_regs(struct drm_connector *connector,
40 struct drm_encoder *encoder,
44 radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder,
45 struct drm_connector *drm_connector);
47 void radeon_connector_hotplug(struct drm_connector *connector)
49 struct drm_device *dev = connector->dev;
50 struct radeon_device *rdev = dev->dev_private;
51 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
53 /* bail if the connector does not have hpd pin, e.g.,
56 if (radeon_connector->hpd.hpd == RADEON_HPD_NONE)
59 radeon_hpd_set_polarity(rdev, radeon_connector->hpd.hpd);
61 /* if the connector is already off, don't turn it back on */
62 if (connector->dpms != DRM_MODE_DPMS_ON)
65 /* just deal with DP (not eDP) here. */
66 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
67 struct radeon_connector_atom_dig *dig_connector =
68 radeon_connector->con_priv;
70 /* if existing sink type was not DP no need to retrain */
71 if (dig_connector->dp_sink_type != CONNECTOR_OBJECT_ID_DISPLAYPORT)
74 /* first get sink type as it may be reset after (un)plug */
75 dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);
76 /* don't do anything if sink is not display port, i.e.,
77 * passive dp->(dvi|hdmi) adaptor
79 if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
80 int saved_dpms = connector->dpms;
81 /* Only turn off the display if it's physically disconnected */
82 if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd))
83 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF);
84 else if (radeon_dp_needs_link_train(radeon_connector))
85 drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON);
86 connector->dpms = saved_dpms;
91 static void radeon_property_change_mode(struct drm_encoder *encoder)
93 struct drm_crtc *crtc = encoder->crtc;
95 if (crtc && crtc->enabled) {
96 drm_crtc_helper_set_mode(crtc, &crtc->mode,
97 crtc->x, crtc->y, crtc->fb);
101 radeon_connector_update_scratch_regs(struct drm_connector *connector, enum drm_connector_status status)
103 struct drm_device *dev = connector->dev;
104 struct radeon_device *rdev = dev->dev_private;
105 struct drm_encoder *best_encoder = NULL;
106 struct drm_encoder *encoder = NULL;
107 struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
108 struct drm_mode_object *obj;
112 best_encoder = connector_funcs->best_encoder(connector);
114 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
115 if (connector->encoder_ids[i] == 0)
118 obj = drm_mode_object_find(connector->dev,
119 connector->encoder_ids[i],
120 DRM_MODE_OBJECT_ENCODER);
124 encoder = obj_to_encoder(obj);
126 if ((encoder == best_encoder) && (status == connector_status_connected))
131 if (rdev->is_atom_bios)
132 radeon_atombios_connected_scratch_regs(connector, encoder, connected);
134 radeon_combios_connected_scratch_regs(connector, encoder, connected);
139 struct drm_encoder *radeon_find_encoder(struct drm_connector *connector, int encoder_type)
141 struct drm_mode_object *obj;
142 struct drm_encoder *encoder;
145 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
146 if (connector->encoder_ids[i] == 0)
149 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
153 encoder = obj_to_encoder(obj);
154 if (encoder->encoder_type == encoder_type)
160 struct drm_encoder *radeon_best_single_encoder(struct drm_connector *connector)
162 int enc_id = connector->encoder_ids[0];
163 struct drm_mode_object *obj;
164 struct drm_encoder *encoder;
166 /* pick the encoder ids */
168 obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
171 encoder = obj_to_encoder(obj);
178 * radeon_connector_analog_encoder_conflict_solve
179 * - search for other connectors sharing this encoder
180 * if priority is true, then set them disconnected if this is connected
181 * if priority is false, set us disconnected if they are connected
183 static enum drm_connector_status
184 radeon_connector_analog_encoder_conflict_solve(struct drm_connector *connector,
185 struct drm_encoder *encoder,
186 enum drm_connector_status current_status,
189 struct drm_device *dev = connector->dev;
190 struct drm_connector *conflict;
191 struct radeon_connector *radeon_conflict;
194 list_for_each_entry(conflict, &dev->mode_config.connector_list, head) {
195 if (conflict == connector)
198 radeon_conflict = to_radeon_connector(conflict);
199 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
200 if (conflict->encoder_ids[i] == 0)
203 /* if the IDs match */
204 if (conflict->encoder_ids[i] == encoder->base.id) {
205 if (conflict->status != connector_status_connected)
208 if (radeon_conflict->use_digital)
211 if (priority == true) {
212 DRM_DEBUG_KMS("1: conflicting encoders switching off %s\n", drm_get_connector_name(conflict));
213 DRM_DEBUG_KMS("in favor of %s\n", drm_get_connector_name(connector));
214 conflict->status = connector_status_disconnected;
215 radeon_connector_update_scratch_regs(conflict, connector_status_disconnected);
217 DRM_DEBUG_KMS("2: conflicting encoders switching off %s\n", drm_get_connector_name(connector));
218 DRM_DEBUG_KMS("in favor of %s\n", drm_get_connector_name(conflict));
219 current_status = connector_status_disconnected;
225 return current_status;
229 static struct drm_display_mode *radeon_fp_native_mode(struct drm_encoder *encoder)
231 struct drm_device *dev = encoder->dev;
232 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
233 struct drm_display_mode *mode = NULL;
234 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
236 if (native_mode->hdisplay != 0 &&
237 native_mode->vdisplay != 0 &&
238 native_mode->clock != 0) {
239 mode = drm_mode_duplicate(dev, native_mode);
240 mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
241 drm_mode_set_name(mode);
243 DRM_DEBUG_KMS("Adding native panel mode %s\n", mode->name);
244 } else if (native_mode->hdisplay != 0 &&
245 native_mode->vdisplay != 0) {
246 /* mac laptops without an edid */
247 /* Note that this is not necessarily the exact panel mode,
248 * but an approximation based on the cvt formula. For these
249 * systems we should ideally read the mode info out of the
250 * registers or add a mode table, but this works and is much
253 mode = drm_cvt_mode(dev, native_mode->hdisplay, native_mode->vdisplay, 60, true, false, false);
254 mode->type = DRM_MODE_TYPE_PREFERRED | DRM_MODE_TYPE_DRIVER;
255 DRM_DEBUG_KMS("Adding cvt approximation of native panel mode %s\n", mode->name);
260 static void radeon_add_common_modes(struct drm_encoder *encoder, struct drm_connector *connector)
262 struct drm_device *dev = encoder->dev;
263 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
264 struct drm_display_mode *mode = NULL;
265 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
270 } common_modes[17] = {
290 for (i = 0; i < 17; i++) {
291 if (radeon_encoder->devices & (ATOM_DEVICE_TV_SUPPORT)) {
292 if (common_modes[i].w > 1024 ||
293 common_modes[i].h > 768)
296 if (radeon_encoder->devices & (ATOM_DEVICE_LCD_SUPPORT)) {
297 if (common_modes[i].w > native_mode->hdisplay ||
298 common_modes[i].h > native_mode->vdisplay ||
299 (common_modes[i].w == native_mode->hdisplay &&
300 common_modes[i].h == native_mode->vdisplay))
303 if (common_modes[i].w < 320 || common_modes[i].h < 200)
306 mode = drm_cvt_mode(dev, common_modes[i].w, common_modes[i].h, 60, false, false, false);
307 drm_mode_probed_add(connector, mode);
311 int radeon_connector_set_property(struct drm_connector *connector, struct drm_property *property,
314 struct drm_device *dev = connector->dev;
315 struct radeon_device *rdev = dev->dev_private;
316 struct drm_encoder *encoder;
317 struct radeon_encoder *radeon_encoder;
319 if (property == rdev->mode_info.coherent_mode_property) {
320 struct radeon_encoder_atom_dig *dig;
321 bool new_coherent_mode;
323 /* need to find digital encoder on connector */
324 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
328 radeon_encoder = to_radeon_encoder(encoder);
330 if (!radeon_encoder->enc_priv)
333 dig = radeon_encoder->enc_priv;
334 new_coherent_mode = val ? true : false;
335 if (dig->coherent_mode != new_coherent_mode) {
336 dig->coherent_mode = new_coherent_mode;
337 radeon_property_change_mode(&radeon_encoder->base);
341 if (property == rdev->mode_info.underscan_property) {
342 /* need to find digital encoder on connector */
343 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
347 radeon_encoder = to_radeon_encoder(encoder);
349 if (radeon_encoder->underscan_type != val) {
350 radeon_encoder->underscan_type = val;
351 radeon_property_change_mode(&radeon_encoder->base);
355 if (property == rdev->mode_info.underscan_hborder_property) {
356 /* need to find digital encoder on connector */
357 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
361 radeon_encoder = to_radeon_encoder(encoder);
363 if (radeon_encoder->underscan_hborder != val) {
364 radeon_encoder->underscan_hborder = val;
365 radeon_property_change_mode(&radeon_encoder->base);
369 if (property == rdev->mode_info.underscan_vborder_property) {
370 /* need to find digital encoder on connector */
371 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
375 radeon_encoder = to_radeon_encoder(encoder);
377 if (radeon_encoder->underscan_vborder != val) {
378 radeon_encoder->underscan_vborder = val;
379 radeon_property_change_mode(&radeon_encoder->base);
383 if (property == rdev->mode_info.tv_std_property) {
384 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TVDAC);
386 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_DAC);
392 radeon_encoder = to_radeon_encoder(encoder);
393 if (!radeon_encoder->enc_priv)
395 if (ASIC_IS_AVIVO(rdev) || radeon_r4xx_atom) {
396 struct radeon_encoder_atom_dac *dac_int;
397 dac_int = radeon_encoder->enc_priv;
398 dac_int->tv_std = val;
400 struct radeon_encoder_tv_dac *dac_int;
401 dac_int = radeon_encoder->enc_priv;
402 dac_int->tv_std = val;
404 radeon_property_change_mode(&radeon_encoder->base);
407 if (property == rdev->mode_info.load_detect_property) {
408 struct radeon_connector *radeon_connector =
409 to_radeon_connector(connector);
412 radeon_connector->dac_load_detect = false;
414 radeon_connector->dac_load_detect = true;
417 if (property == rdev->mode_info.tmds_pll_property) {
418 struct radeon_encoder_int_tmds *tmds = NULL;
420 /* need to find digital encoder on connector */
421 encoder = radeon_find_encoder(connector, DRM_MODE_ENCODER_TMDS);
425 radeon_encoder = to_radeon_encoder(encoder);
427 tmds = radeon_encoder->enc_priv;
432 if (rdev->is_atom_bios)
433 ret = radeon_atombios_get_tmds_info(radeon_encoder, tmds);
435 ret = radeon_legacy_get_tmds_info_from_combios(radeon_encoder, tmds);
437 if (val == 1 || ret == false) {
438 radeon_legacy_get_tmds_info_from_table(radeon_encoder, tmds);
440 radeon_property_change_mode(&radeon_encoder->base);
446 static void radeon_fixup_lvds_native_mode(struct drm_encoder *encoder,
447 struct drm_connector *connector)
449 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
450 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
451 struct drm_display_mode *t, *mode;
453 /* If the EDID preferred mode doesn't match the native mode, use it */
454 list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
455 if (mode->type & DRM_MODE_TYPE_PREFERRED) {
456 if (mode->hdisplay != native_mode->hdisplay ||
457 mode->vdisplay != native_mode->vdisplay)
458 memcpy(native_mode, mode, sizeof(*mode));
462 /* Try to get native mode details from EDID if necessary */
463 if (!native_mode->clock) {
464 list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
465 if (mode->hdisplay == native_mode->hdisplay &&
466 mode->vdisplay == native_mode->vdisplay) {
467 *native_mode = *mode;
468 drm_mode_set_crtcinfo(native_mode, CRTC_INTERLACE_HALVE_V);
469 DRM_DEBUG_KMS("Determined LVDS native mode details from EDID\n");
475 if (!native_mode->clock) {
476 DRM_DEBUG_KMS("No LVDS native mode details, disabling RMX\n");
477 radeon_encoder->rmx_type = RMX_OFF;
481 static int radeon_lvds_get_modes(struct drm_connector *connector)
483 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
484 struct drm_encoder *encoder;
486 struct drm_display_mode *mode;
488 if (radeon_connector->ddc_bus) {
489 ret = radeon_ddc_get_modes(radeon_connector);
491 encoder = radeon_best_single_encoder(connector);
493 radeon_fixup_lvds_native_mode(encoder, connector);
494 /* add scaled modes */
495 radeon_add_common_modes(encoder, connector);
501 encoder = radeon_best_single_encoder(connector);
505 /* we have no EDID modes */
506 mode = radeon_fp_native_mode(encoder);
509 drm_mode_probed_add(connector, mode);
510 /* add the width/height from vbios tables if available */
511 connector->display_info.width_mm = mode->width_mm;
512 connector->display_info.height_mm = mode->height_mm;
513 /* add scaled modes */
514 radeon_add_common_modes(encoder, connector);
520 static int radeon_lvds_mode_valid(struct drm_connector *connector,
521 struct drm_display_mode *mode)
523 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
525 if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
529 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
530 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
532 /* AVIVO hardware supports downscaling modes larger than the panel
533 * to the panel size, but I'm not sure this is desirable.
535 if ((mode->hdisplay > native_mode->hdisplay) ||
536 (mode->vdisplay > native_mode->vdisplay))
539 /* if scaling is disabled, block non-native modes */
540 if (radeon_encoder->rmx_type == RMX_OFF) {
541 if ((mode->hdisplay != native_mode->hdisplay) ||
542 (mode->vdisplay != native_mode->vdisplay))
550 static enum drm_connector_status
551 radeon_lvds_detect(struct drm_connector *connector, bool force)
553 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
554 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
555 enum drm_connector_status ret = connector_status_disconnected;
558 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
559 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
561 /* check if panel is valid */
562 if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
563 ret = connector_status_connected;
567 /* check for edid as well */
568 if (radeon_connector->edid)
569 ret = connector_status_connected;
571 if (radeon_connector->ddc_bus) {
572 radeon_connector->edid = drm_get_edid(&radeon_connector->base,
573 &radeon_connector->ddc_bus->adapter);
574 if (radeon_connector->edid)
575 ret = connector_status_connected;
578 /* check acpi lid status ??? */
580 radeon_connector_update_scratch_regs(connector, ret);
584 static void radeon_connector_destroy(struct drm_connector *connector)
586 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
588 if (radeon_connector->edid)
589 kfree(radeon_connector->edid);
590 kfree(radeon_connector->con_priv);
591 drm_sysfs_connector_remove(connector);
592 drm_connector_cleanup(connector);
596 static int radeon_lvds_set_property(struct drm_connector *connector,
597 struct drm_property *property,
600 struct drm_device *dev = connector->dev;
601 struct radeon_encoder *radeon_encoder;
602 enum radeon_rmx_type rmx_type;
605 if (property != dev->mode_config.scaling_mode_property)
608 if (connector->encoder)
609 radeon_encoder = to_radeon_encoder(connector->encoder);
611 struct drm_connector_helper_funcs *connector_funcs = connector->helper_private;
612 radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector));
616 case DRM_MODE_SCALE_NONE: rmx_type = RMX_OFF; break;
617 case DRM_MODE_SCALE_CENTER: rmx_type = RMX_CENTER; break;
618 case DRM_MODE_SCALE_ASPECT: rmx_type = RMX_ASPECT; break;
620 case DRM_MODE_SCALE_FULLSCREEN: rmx_type = RMX_FULL; break;
622 if (radeon_encoder->rmx_type == rmx_type)
625 radeon_encoder->rmx_type = rmx_type;
627 radeon_property_change_mode(&radeon_encoder->base);
632 struct drm_connector_helper_funcs radeon_lvds_connector_helper_funcs = {
633 .get_modes = radeon_lvds_get_modes,
634 .mode_valid = radeon_lvds_mode_valid,
635 .best_encoder = radeon_best_single_encoder,
638 struct drm_connector_funcs radeon_lvds_connector_funcs = {
639 .dpms = drm_helper_connector_dpms,
640 .detect = radeon_lvds_detect,
641 .fill_modes = drm_helper_probe_single_connector_modes,
642 .destroy = radeon_connector_destroy,
643 .set_property = radeon_lvds_set_property,
646 static int radeon_vga_get_modes(struct drm_connector *connector)
648 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
651 ret = radeon_ddc_get_modes(radeon_connector);
656 static int radeon_vga_mode_valid(struct drm_connector *connector,
657 struct drm_display_mode *mode)
659 struct drm_device *dev = connector->dev;
660 struct radeon_device *rdev = dev->dev_private;
662 /* XXX check mode bandwidth */
664 if ((mode->clock / 10) > rdev->clock.max_pixel_clock)
665 return MODE_CLOCK_HIGH;
670 static enum drm_connector_status
671 radeon_vga_detect(struct drm_connector *connector, bool force)
673 struct drm_device *dev = connector->dev;
674 struct radeon_device *rdev = dev->dev_private;
675 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
676 struct drm_encoder *encoder;
677 struct drm_encoder_helper_funcs *encoder_funcs;
679 enum drm_connector_status ret = connector_status_disconnected;
681 encoder = radeon_best_single_encoder(connector);
683 ret = connector_status_disconnected;
685 if (radeon_connector->ddc_bus)
686 dret = radeon_ddc_probe(radeon_connector);
688 radeon_connector->detected_by_load = false;
689 if (radeon_connector->edid) {
690 kfree(radeon_connector->edid);
691 radeon_connector->edid = NULL;
693 radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
695 if (!radeon_connector->edid) {
696 DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
697 drm_get_connector_name(connector));
698 ret = connector_status_connected;
700 radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
702 /* some oems have boards with separate digital and analog connectors
703 * with a shared ddc line (often vga + hdmi)
705 if (radeon_connector->use_digital && radeon_connector->shared_ddc) {
706 kfree(radeon_connector->edid);
707 radeon_connector->edid = NULL;
708 ret = connector_status_disconnected;
710 ret = connector_status_connected;
714 /* if we aren't forcing don't do destructive polling */
716 /* only return the previous status if we last
717 * detected a monitor via load.
719 if (radeon_connector->detected_by_load)
720 return connector->status;
725 if (radeon_connector->dac_load_detect && encoder) {
726 encoder_funcs = encoder->helper_private;
727 ret = encoder_funcs->detect(encoder, connector);
728 if (ret != connector_status_disconnected)
729 radeon_connector->detected_by_load = true;
733 if (ret == connector_status_connected)
734 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
736 /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the
737 * vbios to deal with KVMs. If we have one and are not able to detect a monitor
738 * by other means, assume the CRT is connected and use that EDID.
740 if ((!rdev->is_atom_bios) &&
741 (ret == connector_status_disconnected) &&
742 rdev->mode_info.bios_hardcoded_edid_size) {
743 ret = connector_status_connected;
746 radeon_connector_update_scratch_regs(connector, ret);
750 struct drm_connector_helper_funcs radeon_vga_connector_helper_funcs = {
751 .get_modes = radeon_vga_get_modes,
752 .mode_valid = radeon_vga_mode_valid,
753 .best_encoder = radeon_best_single_encoder,
756 struct drm_connector_funcs radeon_vga_connector_funcs = {
757 .dpms = drm_helper_connector_dpms,
758 .detect = radeon_vga_detect,
759 .fill_modes = drm_helper_probe_single_connector_modes,
760 .destroy = radeon_connector_destroy,
761 .set_property = radeon_connector_set_property,
764 static int radeon_tv_get_modes(struct drm_connector *connector)
766 struct drm_device *dev = connector->dev;
767 struct radeon_device *rdev = dev->dev_private;
768 struct drm_display_mode *tv_mode;
769 struct drm_encoder *encoder;
771 encoder = radeon_best_single_encoder(connector);
775 /* avivo chips can scale any mode */
776 if (rdev->family >= CHIP_RS600)
777 /* add scaled modes */
778 radeon_add_common_modes(encoder, connector);
780 /* only 800x600 is supported right now on pre-avivo chips */
781 tv_mode = drm_cvt_mode(dev, 800, 600, 60, false, false, false);
782 tv_mode->type = DRM_MODE_TYPE_DRIVER | DRM_MODE_TYPE_PREFERRED;
783 drm_mode_probed_add(connector, tv_mode);
788 static int radeon_tv_mode_valid(struct drm_connector *connector,
789 struct drm_display_mode *mode)
791 if ((mode->hdisplay > 1024) || (mode->vdisplay > 768))
792 return MODE_CLOCK_RANGE;
796 static enum drm_connector_status
797 radeon_tv_detect(struct drm_connector *connector, bool force)
799 struct drm_encoder *encoder;
800 struct drm_encoder_helper_funcs *encoder_funcs;
801 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
802 enum drm_connector_status ret = connector_status_disconnected;
804 if (!radeon_connector->dac_load_detect)
807 encoder = radeon_best_single_encoder(connector);
809 ret = connector_status_disconnected;
811 encoder_funcs = encoder->helper_private;
812 ret = encoder_funcs->detect(encoder, connector);
814 if (ret == connector_status_connected)
815 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, false);
816 radeon_connector_update_scratch_regs(connector, ret);
820 struct drm_connector_helper_funcs radeon_tv_connector_helper_funcs = {
821 .get_modes = radeon_tv_get_modes,
822 .mode_valid = radeon_tv_mode_valid,
823 .best_encoder = radeon_best_single_encoder,
826 struct drm_connector_funcs radeon_tv_connector_funcs = {
827 .dpms = drm_helper_connector_dpms,
828 .detect = radeon_tv_detect,
829 .fill_modes = drm_helper_probe_single_connector_modes,
830 .destroy = radeon_connector_destroy,
831 .set_property = radeon_connector_set_property,
834 static int radeon_dvi_get_modes(struct drm_connector *connector)
836 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
839 ret = radeon_ddc_get_modes(radeon_connector);
845 * Do a DDC probe, if DDC probe passes, get the full EDID so
846 * we can do analog/digital monitor detection at this point.
847 * If the monitor is an analog monitor or we got no DDC,
848 * we need to find the DAC encoder object for this connector.
849 * If we got no DDC, we do load detection on the DAC encoder object.
850 * If we got analog DDC or load detection passes on the DAC encoder
851 * we have to check if this analog encoder is shared with anyone else (TV)
852 * if its shared we have to set the other connector to disconnected.
854 static enum drm_connector_status
855 radeon_dvi_detect(struct drm_connector *connector, bool force)
857 struct drm_device *dev = connector->dev;
858 struct radeon_device *rdev = dev->dev_private;
859 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
860 struct drm_encoder *encoder = NULL;
861 struct drm_encoder_helper_funcs *encoder_funcs;
862 struct drm_mode_object *obj;
864 enum drm_connector_status ret = connector_status_disconnected;
867 if (radeon_connector->ddc_bus)
868 dret = radeon_ddc_probe(radeon_connector);
870 radeon_connector->detected_by_load = false;
871 if (radeon_connector->edid) {
872 kfree(radeon_connector->edid);
873 radeon_connector->edid = NULL;
875 radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
877 if (!radeon_connector->edid) {
878 DRM_ERROR("%s: probed a monitor but no|invalid EDID\n",
879 drm_get_connector_name(connector));
880 /* rs690 seems to have a problem with connectors not existing and always
881 * return a block of 0's. If we see this just stop polling on this output */
882 if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && radeon_connector->base.null_edid_counter) {
883 ret = connector_status_disconnected;
884 DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n", drm_get_connector_name(connector));
885 radeon_connector->ddc_bus = NULL;
888 radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL);
890 /* some oems have boards with separate digital and analog connectors
891 * with a shared ddc line (often vga + hdmi)
893 if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) {
894 kfree(radeon_connector->edid);
895 radeon_connector->edid = NULL;
896 ret = connector_status_disconnected;
898 ret = connector_status_connected;
900 /* This gets complicated. We have boards with VGA + HDMI with a
901 * shared DDC line and we have boards with DVI-D + HDMI with a shared
902 * DDC line. The latter is more complex because with DVI<->HDMI adapters
903 * you don't really know what's connected to which port as both are digital.
905 if (radeon_connector->shared_ddc && (ret == connector_status_connected)) {
906 struct drm_connector *list_connector;
907 struct radeon_connector *list_radeon_connector;
908 list_for_each_entry(list_connector, &dev->mode_config.connector_list, head) {
909 if (connector == list_connector)
911 list_radeon_connector = to_radeon_connector(list_connector);
912 if (list_radeon_connector->shared_ddc &&
913 (list_radeon_connector->ddc_bus->rec.i2c_id ==
914 radeon_connector->ddc_bus->rec.i2c_id)) {
915 /* cases where both connectors are digital */
916 if (list_connector->connector_type != DRM_MODE_CONNECTOR_VGA) {
917 /* hpd is our only option in this case */
918 if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
919 kfree(radeon_connector->edid);
920 radeon_connector->edid = NULL;
921 ret = connector_status_disconnected;
930 if ((ret == connector_status_connected) && (radeon_connector->use_digital == true))
933 /* DVI-D and HDMI-A are digital only */
934 if ((connector->connector_type == DRM_MODE_CONNECTOR_DVID) ||
935 (connector->connector_type == DRM_MODE_CONNECTOR_HDMIA))
938 /* if we aren't forcing don't do destructive polling */
940 /* only return the previous status if we last
941 * detected a monitor via load.
943 if (radeon_connector->detected_by_load)
944 ret = connector->status;
948 /* find analog encoder */
949 if (radeon_connector->dac_load_detect) {
950 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
951 if (connector->encoder_ids[i] == 0)
954 obj = drm_mode_object_find(connector->dev,
955 connector->encoder_ids[i],
956 DRM_MODE_OBJECT_ENCODER);
960 encoder = obj_to_encoder(obj);
962 if (encoder->encoder_type != DRM_MODE_ENCODER_DAC &&
963 encoder->encoder_type != DRM_MODE_ENCODER_TVDAC)
966 encoder_funcs = encoder->helper_private;
967 if (encoder_funcs->detect) {
968 if (ret != connector_status_connected) {
969 ret = encoder_funcs->detect(encoder, connector);
970 if (ret == connector_status_connected) {
971 radeon_connector->use_digital = false;
973 if (ret != connector_status_disconnected)
974 radeon_connector->detected_by_load = true;
981 if ((ret == connector_status_connected) && (radeon_connector->use_digital == false) &&
983 ret = radeon_connector_analog_encoder_conflict_solve(connector, encoder, ret, true);
986 /* RN50 and some RV100 asics in servers often have a hardcoded EDID in the
987 * vbios to deal with KVMs. If we have one and are not able to detect a monitor
988 * by other means, assume the DFP is connected and use that EDID. In most
989 * cases the DVI port is actually a virtual KVM port connected to the service
993 if ((!rdev->is_atom_bios) &&
994 (ret == connector_status_disconnected) &&
995 rdev->mode_info.bios_hardcoded_edid_size) {
996 radeon_connector->use_digital = true;
997 ret = connector_status_connected;
1000 /* updated in get modes as well since we need to know if it's analog or digital */
1001 radeon_connector_update_scratch_regs(connector, ret);
1005 /* okay need to be smart in here about which encoder to pick */
1006 struct drm_encoder *radeon_dvi_encoder(struct drm_connector *connector)
1008 int enc_id = connector->encoder_ids[0];
1009 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1010 struct drm_mode_object *obj;
1011 struct drm_encoder *encoder;
1013 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1014 if (connector->encoder_ids[i] == 0)
1017 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
1021 encoder = obj_to_encoder(obj);
1023 if (radeon_connector->use_digital == true) {
1024 if (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)
1027 if (encoder->encoder_type == DRM_MODE_ENCODER_DAC ||
1028 encoder->encoder_type == DRM_MODE_ENCODER_TVDAC)
1033 /* see if we have a default encoder TODO */
1035 /* then check use digitial */
1036 /* pick the first one */
1038 obj = drm_mode_object_find(connector->dev, enc_id, DRM_MODE_OBJECT_ENCODER);
1041 encoder = obj_to_encoder(obj);
1047 static void radeon_dvi_force(struct drm_connector *connector)
1049 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1050 if (connector->force == DRM_FORCE_ON)
1051 radeon_connector->use_digital = false;
1052 if (connector->force == DRM_FORCE_ON_DIGITAL)
1053 radeon_connector->use_digital = true;
1056 static int radeon_dvi_mode_valid(struct drm_connector *connector,
1057 struct drm_display_mode *mode)
1059 struct drm_device *dev = connector->dev;
1060 struct radeon_device *rdev = dev->dev_private;
1061 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1063 /* XXX check mode bandwidth */
1065 /* clocks over 135 MHz have heat issues with DVI on RV100 */
1066 if (radeon_connector->use_digital &&
1067 (rdev->family == CHIP_RV100) &&
1068 (mode->clock > 135000))
1069 return MODE_CLOCK_HIGH;
1071 if (radeon_connector->use_digital && (mode->clock > 165000)) {
1072 if ((radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I) ||
1073 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) ||
1074 (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B))
1076 else if (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_A) {
1077 if (ASIC_IS_DCE3(rdev)) {
1078 /* HDMI 1.3+ supports max clock of 340 Mhz */
1079 if (mode->clock > 340000)
1080 return MODE_CLOCK_HIGH;
1084 return MODE_CLOCK_HIGH;
1086 return MODE_CLOCK_HIGH;
1089 /* check against the max pixel clock */
1090 if ((mode->clock / 10) > rdev->clock.max_pixel_clock)
1091 return MODE_CLOCK_HIGH;
1096 struct drm_connector_helper_funcs radeon_dvi_connector_helper_funcs = {
1097 .get_modes = radeon_dvi_get_modes,
1098 .mode_valid = radeon_dvi_mode_valid,
1099 .best_encoder = radeon_dvi_encoder,
1102 struct drm_connector_funcs radeon_dvi_connector_funcs = {
1103 .dpms = drm_helper_connector_dpms,
1104 .detect = radeon_dvi_detect,
1105 .fill_modes = drm_helper_probe_single_connector_modes,
1106 .set_property = radeon_connector_set_property,
1107 .destroy = radeon_connector_destroy,
1108 .force = radeon_dvi_force,
1111 static void radeon_dp_connector_destroy(struct drm_connector *connector)
1113 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1114 struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1116 if (radeon_connector->edid)
1117 kfree(radeon_connector->edid);
1118 if (radeon_dig_connector->dp_i2c_bus)
1119 radeon_i2c_destroy(radeon_dig_connector->dp_i2c_bus);
1120 kfree(radeon_connector->con_priv);
1121 drm_sysfs_connector_remove(connector);
1122 drm_connector_cleanup(connector);
1126 static int radeon_dp_get_modes(struct drm_connector *connector)
1128 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1129 struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1130 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1133 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1134 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1135 struct drm_display_mode *mode;
1137 if (!radeon_dig_connector->edp_on)
1138 atombios_set_edp_panel_power(connector,
1139 ATOM_TRANSMITTER_ACTION_POWER_ON);
1140 ret = radeon_ddc_get_modes(radeon_connector);
1141 if (!radeon_dig_connector->edp_on)
1142 atombios_set_edp_panel_power(connector,
1143 ATOM_TRANSMITTER_ACTION_POWER_OFF);
1147 radeon_fixup_lvds_native_mode(encoder, connector);
1148 /* add scaled modes */
1149 radeon_add_common_modes(encoder, connector);
1154 encoder = radeon_best_single_encoder(connector);
1158 /* we have no EDID modes */
1159 mode = radeon_fp_native_mode(encoder);
1162 drm_mode_probed_add(connector, mode);
1163 /* add the width/height from vbios tables if available */
1164 connector->display_info.width_mm = mode->width_mm;
1165 connector->display_info.height_mm = mode->height_mm;
1166 /* add scaled modes */
1167 radeon_add_common_modes(encoder, connector);
1170 /* need to setup ddc on the bridge */
1171 if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
1172 ENCODER_OBJECT_ID_NONE) {
1174 radeon_atom_ext_encoder_setup_ddc(encoder);
1176 ret = radeon_ddc_get_modes(radeon_connector);
1182 u16 radeon_connector_encoder_get_dp_bridge_encoder_id(struct drm_connector *connector)
1184 struct drm_mode_object *obj;
1185 struct drm_encoder *encoder;
1186 struct radeon_encoder *radeon_encoder;
1189 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1190 if (connector->encoder_ids[i] == 0)
1193 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
1197 encoder = obj_to_encoder(obj);
1198 radeon_encoder = to_radeon_encoder(encoder);
1200 switch (radeon_encoder->encoder_id) {
1201 case ENCODER_OBJECT_ID_TRAVIS:
1202 case ENCODER_OBJECT_ID_NUTMEG:
1203 return radeon_encoder->encoder_id;
1209 return ENCODER_OBJECT_ID_NONE;
1212 bool radeon_connector_encoder_is_hbr2(struct drm_connector *connector)
1214 struct drm_mode_object *obj;
1215 struct drm_encoder *encoder;
1216 struct radeon_encoder *radeon_encoder;
1220 for (i = 0; i < DRM_CONNECTOR_MAX_ENCODER; i++) {
1221 if (connector->encoder_ids[i] == 0)
1224 obj = drm_mode_object_find(connector->dev, connector->encoder_ids[i], DRM_MODE_OBJECT_ENCODER);
1228 encoder = obj_to_encoder(obj);
1229 radeon_encoder = to_radeon_encoder(encoder);
1230 if (radeon_encoder->caps & ATOM_ENCODER_CAP_RECORD_HBR2)
1237 bool radeon_connector_is_dp12_capable(struct drm_connector *connector)
1239 struct drm_device *dev = connector->dev;
1240 struct radeon_device *rdev = dev->dev_private;
1242 if (ASIC_IS_DCE5(rdev) &&
1243 (rdev->clock.dp_extclk >= 53900) &&
1244 radeon_connector_encoder_is_hbr2(connector)) {
1251 static enum drm_connector_status
1252 radeon_dp_detect(struct drm_connector *connector, bool force)
1254 struct drm_device *dev = connector->dev;
1255 struct radeon_device *rdev = dev->dev_private;
1256 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1257 enum drm_connector_status ret = connector_status_disconnected;
1258 struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1259 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1261 if (radeon_connector->edid) {
1262 kfree(radeon_connector->edid);
1263 radeon_connector->edid = NULL;
1266 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1267 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1269 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1270 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
1272 /* check if panel is valid */
1273 if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240)
1274 ret = connector_status_connected;
1276 /* eDP is always DP */
1277 radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
1278 if (!radeon_dig_connector->edp_on)
1279 atombios_set_edp_panel_power(connector,
1280 ATOM_TRANSMITTER_ACTION_POWER_ON);
1281 if (radeon_dp_getdpcd(radeon_connector))
1282 ret = connector_status_connected;
1283 if (!radeon_dig_connector->edp_on)
1284 atombios_set_edp_panel_power(connector,
1285 ATOM_TRANSMITTER_ACTION_POWER_OFF);
1286 } else if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) !=
1287 ENCODER_OBJECT_ID_NONE) {
1288 /* DP bridges are always DP */
1289 radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
1290 /* get the DPCD from the bridge */
1291 radeon_dp_getdpcd(radeon_connector);
1294 /* setup ddc on the bridge */
1295 radeon_atom_ext_encoder_setup_ddc(encoder);
1296 if (radeon_ddc_probe(radeon_connector)) /* try DDC */
1297 ret = connector_status_connected;
1298 else if (radeon_connector->dac_load_detect) { /* try load detection */
1299 struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private;
1300 ret = encoder_funcs->detect(encoder, connector);
1304 radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);
1305 if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
1306 ret = connector_status_connected;
1307 if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT)
1308 radeon_dp_getdpcd(radeon_connector);
1310 if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) {
1311 if (radeon_dp_getdpcd(radeon_connector))
1312 ret = connector_status_connected;
1314 if (radeon_ddc_probe(radeon_connector))
1315 ret = connector_status_connected;
1320 radeon_connector_update_scratch_regs(connector, ret);
1324 static int radeon_dp_mode_valid(struct drm_connector *connector,
1325 struct drm_display_mode *mode)
1327 struct radeon_connector *radeon_connector = to_radeon_connector(connector);
1328 struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv;
1330 /* XXX check mode bandwidth */
1332 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
1333 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
1334 struct drm_encoder *encoder = radeon_best_single_encoder(connector);
1336 if ((mode->hdisplay < 320) || (mode->vdisplay < 240))
1340 struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder);
1341 struct drm_display_mode *native_mode = &radeon_encoder->native_mode;
1343 /* AVIVO hardware supports downscaling modes larger than the panel
1344 * to the panel size, but I'm not sure this is desirable.
1346 if ((mode->hdisplay > native_mode->hdisplay) ||
1347 (mode->vdisplay > native_mode->vdisplay))
1350 /* if scaling is disabled, block non-native modes */
1351 if (radeon_encoder->rmx_type == RMX_OFF) {
1352 if ((mode->hdisplay != native_mode->hdisplay) ||
1353 (mode->vdisplay != native_mode->vdisplay))
1359 if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) ||
1360 (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP))
1361 return radeon_dp_mode_valid_helper(connector, mode);
1367 struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = {
1368 .get_modes = radeon_dp_get_modes,
1369 .mode_valid = radeon_dp_mode_valid,
1370 .best_encoder = radeon_dvi_encoder,
1373 struct drm_connector_funcs radeon_dp_connector_funcs = {
1374 .dpms = drm_helper_connector_dpms,
1375 .detect = radeon_dp_detect,
1376 .fill_modes = drm_helper_probe_single_connector_modes,
1377 .set_property = radeon_connector_set_property,
1378 .destroy = radeon_dp_connector_destroy,
1379 .force = radeon_dvi_force,
1383 radeon_add_atom_connector(struct drm_device *dev,
1384 uint32_t connector_id,
1385 uint32_t supported_device,
1387 struct radeon_i2c_bus_rec *i2c_bus,
1388 uint32_t igp_lane_info,
1389 uint16_t connector_object_id,
1390 struct radeon_hpd *hpd,
1391 struct radeon_router *router)
1393 struct radeon_device *rdev = dev->dev_private;
1394 struct drm_connector *connector;
1395 struct radeon_connector *radeon_connector;
1396 struct radeon_connector_atom_dig *radeon_dig_connector;
1397 struct drm_encoder *encoder;
1398 struct radeon_encoder *radeon_encoder;
1399 uint32_t subpixel_order = SubPixelNone;
1400 bool shared_ddc = false;
1401 bool is_dp_bridge = false;
1403 if (connector_type == DRM_MODE_CONNECTOR_Unknown)
1406 /* if the user selected tv=0 don't try and add the connector */
1407 if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
1408 (connector_type == DRM_MODE_CONNECTOR_Composite) ||
1409 (connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&
1413 /* see if we already added it */
1414 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1415 radeon_connector = to_radeon_connector(connector);
1416 if (radeon_connector->connector_id == connector_id) {
1417 radeon_connector->devices |= supported_device;
1420 if (radeon_connector->ddc_bus && i2c_bus->valid) {
1421 if (radeon_connector->ddc_bus->rec.i2c_id == i2c_bus->i2c_id) {
1422 radeon_connector->shared_ddc = true;
1425 if (radeon_connector->router_bus && router->ddc_valid &&
1426 (radeon_connector->router.router_id == router->router_id)) {
1427 radeon_connector->shared_ddc = false;
1433 /* check if it's a dp bridge */
1434 list_for_each_entry(encoder, &dev->mode_config.encoder_list, head) {
1435 radeon_encoder = to_radeon_encoder(encoder);
1436 if (radeon_encoder->devices & supported_device) {
1437 switch (radeon_encoder->encoder_id) {
1438 case ENCODER_OBJECT_ID_TRAVIS:
1439 case ENCODER_OBJECT_ID_NUTMEG:
1440 is_dp_bridge = true;
1448 radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
1449 if (!radeon_connector)
1452 connector = &radeon_connector->base;
1454 radeon_connector->connector_id = connector_id;
1455 radeon_connector->devices = supported_device;
1456 radeon_connector->shared_ddc = shared_ddc;
1457 radeon_connector->connector_object_id = connector_object_id;
1458 radeon_connector->hpd = *hpd;
1460 radeon_connector->router = *router;
1461 if (router->ddc_valid || router->cd_valid) {
1462 radeon_connector->router_bus = radeon_i2c_lookup(rdev, &router->i2c_info);
1463 if (!radeon_connector->router_bus)
1464 DRM_ERROR("Failed to assign router i2c bus! Check dmesg for i2c errors.\n");
1468 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1469 if (!radeon_dig_connector)
1471 radeon_dig_connector->igp_lane_info = igp_lane_info;
1472 radeon_connector->con_priv = radeon_dig_connector;
1473 drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
1474 drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
1475 if (i2c_bus->valid) {
1476 /* add DP i2c bus */
1477 if (connector_type == DRM_MODE_CONNECTOR_eDP)
1478 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch");
1480 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch");
1481 if (!radeon_dig_connector->dp_i2c_bus)
1482 DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
1483 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1484 if (!radeon_connector->ddc_bus)
1485 DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1487 switch (connector_type) {
1488 case DRM_MODE_CONNECTOR_VGA:
1489 case DRM_MODE_CONNECTOR_DVIA:
1491 connector->interlace_allowed = true;
1492 connector->doublescan_allowed = true;
1493 radeon_connector->dac_load_detect = true;
1494 drm_connector_attach_property(&radeon_connector->base,
1495 rdev->mode_info.load_detect_property,
1498 case DRM_MODE_CONNECTOR_DVII:
1499 case DRM_MODE_CONNECTOR_DVID:
1500 case DRM_MODE_CONNECTOR_HDMIA:
1501 case DRM_MODE_CONNECTOR_HDMIB:
1502 case DRM_MODE_CONNECTOR_DisplayPort:
1503 drm_connector_attach_property(&radeon_connector->base,
1504 rdev->mode_info.underscan_property,
1506 drm_connector_attach_property(&radeon_connector->base,
1507 rdev->mode_info.underscan_hborder_property,
1509 drm_connector_attach_property(&radeon_connector->base,
1510 rdev->mode_info.underscan_vborder_property,
1512 subpixel_order = SubPixelHorizontalRGB;
1513 connector->interlace_allowed = true;
1514 if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
1515 connector->doublescan_allowed = true;
1517 connector->doublescan_allowed = false;
1518 if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1519 radeon_connector->dac_load_detect = true;
1520 drm_connector_attach_property(&radeon_connector->base,
1521 rdev->mode_info.load_detect_property,
1525 case DRM_MODE_CONNECTOR_LVDS:
1526 case DRM_MODE_CONNECTOR_eDP:
1527 drm_connector_attach_property(&radeon_connector->base,
1528 dev->mode_config.scaling_mode_property,
1529 DRM_MODE_SCALE_FULLSCREEN);
1530 subpixel_order = SubPixelHorizontalRGB;
1531 connector->interlace_allowed = false;
1532 connector->doublescan_allowed = false;
1536 switch (connector_type) {
1537 case DRM_MODE_CONNECTOR_VGA:
1538 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1539 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1540 if (i2c_bus->valid) {
1541 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1542 if (!radeon_connector->ddc_bus)
1543 DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1545 radeon_connector->dac_load_detect = true;
1546 drm_connector_attach_property(&radeon_connector->base,
1547 rdev->mode_info.load_detect_property,
1549 /* no HPD on analog connectors */
1550 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1551 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1552 connector->interlace_allowed = true;
1553 connector->doublescan_allowed = true;
1555 case DRM_MODE_CONNECTOR_DVIA:
1556 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1557 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1558 if (i2c_bus->valid) {
1559 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1560 if (!radeon_connector->ddc_bus)
1561 DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1563 radeon_connector->dac_load_detect = true;
1564 drm_connector_attach_property(&radeon_connector->base,
1565 rdev->mode_info.load_detect_property,
1567 /* no HPD on analog connectors */
1568 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1569 connector->interlace_allowed = true;
1570 connector->doublescan_allowed = true;
1572 case DRM_MODE_CONNECTOR_DVII:
1573 case DRM_MODE_CONNECTOR_DVID:
1574 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1575 if (!radeon_dig_connector)
1577 radeon_dig_connector->igp_lane_info = igp_lane_info;
1578 radeon_connector->con_priv = radeon_dig_connector;
1579 drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
1580 drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
1581 if (i2c_bus->valid) {
1582 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1583 if (!radeon_connector->ddc_bus)
1584 DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1586 subpixel_order = SubPixelHorizontalRGB;
1587 drm_connector_attach_property(&radeon_connector->base,
1588 rdev->mode_info.coherent_mode_property,
1590 if (ASIC_IS_AVIVO(rdev)) {
1591 drm_connector_attach_property(&radeon_connector->base,
1592 rdev->mode_info.underscan_property,
1594 drm_connector_attach_property(&radeon_connector->base,
1595 rdev->mode_info.underscan_hborder_property,
1597 drm_connector_attach_property(&radeon_connector->base,
1598 rdev->mode_info.underscan_vborder_property,
1601 if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1602 radeon_connector->dac_load_detect = true;
1603 drm_connector_attach_property(&radeon_connector->base,
1604 rdev->mode_info.load_detect_property,
1607 connector->interlace_allowed = true;
1608 if (connector_type == DRM_MODE_CONNECTOR_DVII)
1609 connector->doublescan_allowed = true;
1611 connector->doublescan_allowed = false;
1613 case DRM_MODE_CONNECTOR_HDMIA:
1614 case DRM_MODE_CONNECTOR_HDMIB:
1615 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1616 if (!radeon_dig_connector)
1618 radeon_dig_connector->igp_lane_info = igp_lane_info;
1619 radeon_connector->con_priv = radeon_dig_connector;
1620 drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
1621 drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
1622 if (i2c_bus->valid) {
1623 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1624 if (!radeon_connector->ddc_bus)
1625 DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1627 drm_connector_attach_property(&radeon_connector->base,
1628 rdev->mode_info.coherent_mode_property,
1630 if (ASIC_IS_AVIVO(rdev)) {
1631 drm_connector_attach_property(&radeon_connector->base,
1632 rdev->mode_info.underscan_property,
1634 drm_connector_attach_property(&radeon_connector->base,
1635 rdev->mode_info.underscan_hborder_property,
1637 drm_connector_attach_property(&radeon_connector->base,
1638 rdev->mode_info.underscan_vborder_property,
1641 subpixel_order = SubPixelHorizontalRGB;
1642 connector->interlace_allowed = true;
1643 if (connector_type == DRM_MODE_CONNECTOR_HDMIB)
1644 connector->doublescan_allowed = true;
1646 connector->doublescan_allowed = false;
1648 case DRM_MODE_CONNECTOR_DisplayPort:
1649 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1650 if (!radeon_dig_connector)
1652 radeon_dig_connector->igp_lane_info = igp_lane_info;
1653 radeon_connector->con_priv = radeon_dig_connector;
1654 drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
1655 drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
1656 if (i2c_bus->valid) {
1657 /* add DP i2c bus */
1658 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "DP-auxch");
1659 if (!radeon_dig_connector->dp_i2c_bus)
1660 DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
1661 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1662 if (!radeon_connector->ddc_bus)
1663 DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1665 subpixel_order = SubPixelHorizontalRGB;
1666 drm_connector_attach_property(&radeon_connector->base,
1667 rdev->mode_info.coherent_mode_property,
1669 if (ASIC_IS_AVIVO(rdev)) {
1670 drm_connector_attach_property(&radeon_connector->base,
1671 rdev->mode_info.underscan_property,
1673 drm_connector_attach_property(&radeon_connector->base,
1674 rdev->mode_info.underscan_hborder_property,
1676 drm_connector_attach_property(&radeon_connector->base,
1677 rdev->mode_info.underscan_vborder_property,
1680 connector->interlace_allowed = true;
1681 /* in theory with a DP to VGA converter... */
1682 connector->doublescan_allowed = false;
1684 case DRM_MODE_CONNECTOR_eDP:
1685 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1686 if (!radeon_dig_connector)
1688 radeon_dig_connector->igp_lane_info = igp_lane_info;
1689 radeon_connector->con_priv = radeon_dig_connector;
1690 drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type);
1691 drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs);
1692 if (i2c_bus->valid) {
1693 /* add DP i2c bus */
1694 radeon_dig_connector->dp_i2c_bus = radeon_i2c_create_dp(dev, i2c_bus, "eDP-auxch");
1695 if (!radeon_dig_connector->dp_i2c_bus)
1696 DRM_ERROR("DP: Failed to assign dp ddc bus! Check dmesg for i2c errors.\n");
1697 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1698 if (!radeon_connector->ddc_bus)
1699 DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1701 drm_connector_attach_property(&radeon_connector->base,
1702 dev->mode_config.scaling_mode_property,
1703 DRM_MODE_SCALE_FULLSCREEN);
1704 subpixel_order = SubPixelHorizontalRGB;
1705 connector->interlace_allowed = false;
1706 connector->doublescan_allowed = false;
1708 case DRM_MODE_CONNECTOR_SVIDEO:
1709 case DRM_MODE_CONNECTOR_Composite:
1710 case DRM_MODE_CONNECTOR_9PinDIN:
1711 drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
1712 drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
1713 radeon_connector->dac_load_detect = true;
1714 drm_connector_attach_property(&radeon_connector->base,
1715 rdev->mode_info.load_detect_property,
1717 drm_connector_attach_property(&radeon_connector->base,
1718 rdev->mode_info.tv_std_property,
1719 radeon_atombios_get_tv_info(rdev));
1720 /* no HPD on analog connectors */
1721 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1722 connector->interlace_allowed = false;
1723 connector->doublescan_allowed = false;
1725 case DRM_MODE_CONNECTOR_LVDS:
1726 radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL);
1727 if (!radeon_dig_connector)
1729 radeon_dig_connector->igp_lane_info = igp_lane_info;
1730 radeon_connector->con_priv = radeon_dig_connector;
1731 drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
1732 drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
1733 if (i2c_bus->valid) {
1734 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1735 if (!radeon_connector->ddc_bus)
1736 DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1738 drm_connector_attach_property(&radeon_connector->base,
1739 dev->mode_config.scaling_mode_property,
1740 DRM_MODE_SCALE_FULLSCREEN);
1741 subpixel_order = SubPixelHorizontalRGB;
1742 connector->interlace_allowed = false;
1743 connector->doublescan_allowed = false;
1748 if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
1750 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1752 connector->polled = DRM_CONNECTOR_POLL_HPD;
1754 connector->display_info.subpixel_order = subpixel_order;
1755 drm_sysfs_connector_add(connector);
1759 drm_connector_cleanup(connector);
1764 radeon_add_legacy_connector(struct drm_device *dev,
1765 uint32_t connector_id,
1766 uint32_t supported_device,
1768 struct radeon_i2c_bus_rec *i2c_bus,
1769 uint16_t connector_object_id,
1770 struct radeon_hpd *hpd)
1772 struct radeon_device *rdev = dev->dev_private;
1773 struct drm_connector *connector;
1774 struct radeon_connector *radeon_connector;
1775 uint32_t subpixel_order = SubPixelNone;
1777 if (connector_type == DRM_MODE_CONNECTOR_Unknown)
1780 /* if the user selected tv=0 don't try and add the connector */
1781 if (((connector_type == DRM_MODE_CONNECTOR_SVIDEO) ||
1782 (connector_type == DRM_MODE_CONNECTOR_Composite) ||
1783 (connector_type == DRM_MODE_CONNECTOR_9PinDIN)) &&
1787 /* see if we already added it */
1788 list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
1789 radeon_connector = to_radeon_connector(connector);
1790 if (radeon_connector->connector_id == connector_id) {
1791 radeon_connector->devices |= supported_device;
1796 radeon_connector = kzalloc(sizeof(struct radeon_connector), GFP_KERNEL);
1797 if (!radeon_connector)
1800 connector = &radeon_connector->base;
1802 radeon_connector->connector_id = connector_id;
1803 radeon_connector->devices = supported_device;
1804 radeon_connector->connector_object_id = connector_object_id;
1805 radeon_connector->hpd = *hpd;
1807 switch (connector_type) {
1808 case DRM_MODE_CONNECTOR_VGA:
1809 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1810 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1811 if (i2c_bus->valid) {
1812 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1813 if (!radeon_connector->ddc_bus)
1814 DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1816 radeon_connector->dac_load_detect = true;
1817 drm_connector_attach_property(&radeon_connector->base,
1818 rdev->mode_info.load_detect_property,
1820 /* no HPD on analog connectors */
1821 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1822 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1823 connector->interlace_allowed = true;
1824 connector->doublescan_allowed = true;
1826 case DRM_MODE_CONNECTOR_DVIA:
1827 drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type);
1828 drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs);
1829 if (i2c_bus->valid) {
1830 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1831 if (!radeon_connector->ddc_bus)
1832 DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1834 radeon_connector->dac_load_detect = true;
1835 drm_connector_attach_property(&radeon_connector->base,
1836 rdev->mode_info.load_detect_property,
1838 /* no HPD on analog connectors */
1839 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1840 connector->interlace_allowed = true;
1841 connector->doublescan_allowed = true;
1843 case DRM_MODE_CONNECTOR_DVII:
1844 case DRM_MODE_CONNECTOR_DVID:
1845 drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type);
1846 drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs);
1847 if (i2c_bus->valid) {
1848 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1849 if (!radeon_connector->ddc_bus)
1850 DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1852 if (connector_type == DRM_MODE_CONNECTOR_DVII) {
1853 radeon_connector->dac_load_detect = true;
1854 drm_connector_attach_property(&radeon_connector->base,
1855 rdev->mode_info.load_detect_property,
1858 subpixel_order = SubPixelHorizontalRGB;
1859 connector->interlace_allowed = true;
1860 if (connector_type == DRM_MODE_CONNECTOR_DVII)
1861 connector->doublescan_allowed = true;
1863 connector->doublescan_allowed = false;
1865 case DRM_MODE_CONNECTOR_SVIDEO:
1866 case DRM_MODE_CONNECTOR_Composite:
1867 case DRM_MODE_CONNECTOR_9PinDIN:
1868 drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type);
1869 drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs);
1870 radeon_connector->dac_load_detect = true;
1871 /* RS400,RC410,RS480 chipset seems to report a lot
1872 * of false positive on load detect, we haven't yet
1873 * found a way to make load detect reliable on those
1874 * chipset, thus just disable it for TV.
1876 if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480)
1877 radeon_connector->dac_load_detect = false;
1878 drm_connector_attach_property(&radeon_connector->base,
1879 rdev->mode_info.load_detect_property,
1880 radeon_connector->dac_load_detect);
1881 drm_connector_attach_property(&radeon_connector->base,
1882 rdev->mode_info.tv_std_property,
1883 radeon_combios_get_tv_info(rdev));
1884 /* no HPD on analog connectors */
1885 radeon_connector->hpd.hpd = RADEON_HPD_NONE;
1886 connector->interlace_allowed = false;
1887 connector->doublescan_allowed = false;
1889 case DRM_MODE_CONNECTOR_LVDS:
1890 drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type);
1891 drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs);
1892 if (i2c_bus->valid) {
1893 radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus);
1894 if (!radeon_connector->ddc_bus)
1895 DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n");
1897 drm_connector_attach_property(&radeon_connector->base,
1898 dev->mode_config.scaling_mode_property,
1899 DRM_MODE_SCALE_FULLSCREEN);
1900 subpixel_order = SubPixelHorizontalRGB;
1901 connector->interlace_allowed = false;
1902 connector->doublescan_allowed = false;
1906 if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) {
1908 connector->polled = DRM_CONNECTOR_POLL_CONNECT;
1910 connector->polled = DRM_CONNECTOR_POLL_HPD;
1911 connector->display_info.subpixel_order = subpixel_order;
1912 drm_sysfs_connector_add(connector);
1913 if (connector_type == DRM_MODE_CONNECTOR_LVDS) {
1914 struct drm_encoder *drm_encoder;
1916 list_for_each_entry(drm_encoder, &dev->mode_config.encoder_list, head) {
1917 struct radeon_encoder *radeon_encoder;
1919 radeon_encoder = to_radeon_encoder(drm_encoder);
1920 if (radeon_encoder->encoder_id == ENCODER_OBJECT_ID_INTERNAL_LVDS)
1921 radeon_legacy_backlight_init(radeon_encoder, connector);