Rev 5271 | Rev 6321 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5271 | Rev 6104 | ||
---|---|---|---|
Line 25... | Line 25... | ||
25 | */ |
25 | */ |
26 | #include |
26 | #include |
27 | #include |
27 | #include |
28 | #include |
28 | #include |
29 | #include |
29 | #include |
- | 30 | #include |
|
30 | #include |
31 | #include |
31 | #include "radeon.h" |
32 | #include "radeon.h" |
- | 33 | #include "radeon_audio.h" |
|
32 | #include "atom.h" |
34 | #include "atom.h" |
Line -... | Line 35... | ||
- | 35 | ||
Line -... | Line 36... | ||
- | 36 | #include |
|
- | 37 | ||
- | 38 | static int radeon_dp_handle_hpd(struct drm_connector *connector) |
|
- | 39 | { |
|
Line -... | Line 40... | ||
- | 40 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
|
- | 41 | int ret; |
|
- | 42 | ||
- | 43 | ret = radeon_dp_mst_check_status(radeon_connector); |
|
- | 44 | if (ret == -EINVAL) |
|
33 | 45 | return 1; |
|
34 | 46 | return 0; |
|
35 | 47 | } |
|
36 | void radeon_connector_hotplug(struct drm_connector *connector) |
48 | void radeon_connector_hotplug(struct drm_connector *connector) |
37 | { |
49 | { |
Line -... | Line 50... | ||
- | 50 | struct drm_device *dev = connector->dev; |
|
- | 51 | struct radeon_device *rdev = dev->dev_private; |
|
- | 52 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
|
- | 53 | ||
- | 54 | if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) { |
|
- | 55 | struct radeon_connector_atom_dig *dig_connector = |
|
- | 56 | radeon_connector->con_priv; |
|
- | 57 | ||
- | 58 | if (radeon_connector->is_mst_connector) |
|
- | 59 | return; |
|
- | 60 | if (dig_connector->is_mst) { |
|
38 | struct drm_device *dev = connector->dev; |
61 | radeon_dp_handle_hpd(connector); |
39 | struct radeon_device *rdev = dev->dev_private; |
62 | return; |
40 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
63 | } |
41 | 64 | } |
|
42 | /* bail if the connector does not have hpd pin, e.g., |
65 | /* bail if the connector does not have hpd pin, e.g., |
Line 43... | Line 66... | ||
43 | * VGA, TV, etc. |
66 | * VGA, TV, etc. |
Line 44... | Line 67... | ||
44 | */ |
67 | */ |
45 | if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) |
68 | if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) |
46 | return; |
69 | return; |
47 | 70 | ||
Line 65... | Line 88... | ||
65 | dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector); |
88 | dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector); |
66 | /* don't do anything if sink is not display port, i.e., |
89 | /* don't do anything if sink is not display port, i.e., |
67 | * passive dp->(dvi|hdmi) adaptor |
90 | * passive dp->(dvi|hdmi) adaptor |
68 | */ |
91 | */ |
69 | if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { |
92 | if (dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { |
70 | int saved_dpms = connector->dpms; |
93 | int saved_dpms = connector->dpms; |
71 | /* Only turn off the display if it's physically disconnected */ |
94 | /* Only turn off the display if it's physically disconnected */ |
72 | if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { |
95 | if (!radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { |
73 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); |
96 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_OFF); |
74 | } else if (radeon_dp_needs_link_train(radeon_connector)) { |
97 | } else if (radeon_dp_needs_link_train(radeon_connector)) { |
- | 98 | /* Don't try to start link training before we |
|
- | 99 | * have the dpcd */ |
|
- | 100 | if (!radeon_dp_getdpcd(radeon_connector)) |
|
- | 101 | return; |
|
- | 102 | ||
75 | /* set it to OFF so that drm_helper_connector_dpms() |
103 | /* set it to OFF so that drm_helper_connector_dpms() |
76 | * won't return immediately since the current state |
104 | * won't return immediately since the current state |
77 | * is ON at this point. |
105 | * is ON at this point. |
78 | */ |
106 | */ |
79 | connector->dpms = DRM_MODE_DPMS_OFF; |
107 | connector->dpms = DRM_MODE_DPMS_OFF; |
80 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); |
108 | drm_helper_connector_dpms(connector, DRM_MODE_DPMS_ON); |
81 | } |
- | |
82 | connector->dpms = saved_dpms; |
- | |
83 | } |
109 | } |
- | 110 | connector->dpms = saved_dpms; |
|
- | 111 | } |
|
84 | } |
112 | } |
85 | } |
113 | } |
Line 86... | Line 114... | ||
86 | 114 | ||
87 | static void radeon_property_change_mode(struct drm_encoder *encoder) |
115 | static void radeon_property_change_mode(struct drm_encoder *encoder) |
Line 132... | Line 160... | ||
132 | case DRM_MODE_CONNECTOR_eDP: |
160 | case DRM_MODE_CONNECTOR_eDP: |
133 | case DRM_MODE_CONNECTOR_LVDS: |
161 | case DRM_MODE_CONNECTOR_LVDS: |
134 | if (connector->display_info.bpc) |
162 | if (connector->display_info.bpc) |
135 | bpc = connector->display_info.bpc; |
163 | bpc = connector->display_info.bpc; |
136 | else if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { |
164 | else if (ASIC_IS_DCE41(rdev) || ASIC_IS_DCE5(rdev)) { |
137 | struct drm_connector_helper_funcs *connector_funcs = |
165 | const struct drm_connector_helper_funcs *connector_funcs = |
138 | connector->helper_private; |
166 | connector->helper_private; |
139 | struct drm_encoder *encoder = connector_funcs->best_encoder(connector); |
167 | struct drm_encoder *encoder = connector_funcs->best_encoder(connector); |
140 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
168 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
141 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
169 | struct radeon_encoder_atom_dig *dig = radeon_encoder->enc_priv; |
Line 222... | Line 250... | ||
222 | { |
250 | { |
223 | struct drm_device *dev = connector->dev; |
251 | struct drm_device *dev = connector->dev; |
224 | struct radeon_device *rdev = dev->dev_private; |
252 | struct radeon_device *rdev = dev->dev_private; |
225 | struct drm_encoder *best_encoder = NULL; |
253 | struct drm_encoder *best_encoder = NULL; |
226 | struct drm_encoder *encoder = NULL; |
254 | struct drm_encoder *encoder = NULL; |
227 | struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; |
255 | const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; |
228 | bool connected; |
256 | bool connected; |
229 | int i; |
257 | int i; |
Line 230... | Line 258... | ||
230 | 258 | ||
Line 369... | Line 397... | ||
369 | { |
397 | { |
370 | int enc_id = connector->encoder_ids[0]; |
398 | int enc_id = connector->encoder_ids[0]; |
371 | /* pick the encoder ids */ |
399 | /* pick the encoder ids */ |
372 | if (enc_id) |
400 | if (enc_id) |
373 | return drm_encoder_find(connector->dev, enc_id); |
401 | return drm_encoder_find(connector->dev, enc_id); |
374 | return NULL; |
402 | return NULL; |
375 | } |
403 | } |
Line 376... | Line 404... | ||
376 | 404 | ||
377 | static void radeon_get_native_mode(struct drm_connector *connector) |
405 | static void radeon_get_native_mode(struct drm_connector *connector) |
378 | { |
406 | { |
Line 557... | Line 585... | ||
557 | 585 | ||
558 | dig = radeon_encoder->enc_priv; |
586 | dig = radeon_encoder->enc_priv; |
559 | new_coherent_mode = val ? true : false; |
587 | new_coherent_mode = val ? true : false; |
560 | if (dig->coherent_mode != new_coherent_mode) { |
588 | if (dig->coherent_mode != new_coherent_mode) { |
561 | dig->coherent_mode = new_coherent_mode; |
589 | dig->coherent_mode = new_coherent_mode; |
562 | radeon_property_change_mode(&radeon_encoder->base); |
590 | radeon_property_change_mode(&radeon_encoder->base); |
563 | } |
591 | } |
Line 564... | Line 592... | ||
564 | } |
592 | } |
565 | 593 | ||
566 | if (property == rdev->mode_info.audio_property) { |
594 | if (property == rdev->mode_info.audio_property) { |
Line 699... | Line 727... | ||
699 | enum radeon_rmx_type rmx_type; |
727 | enum radeon_rmx_type rmx_type; |
Line 700... | Line 728... | ||
700 | 728 | ||
701 | if (connector->encoder) |
729 | if (connector->encoder) |
702 | radeon_encoder = to_radeon_encoder(connector->encoder); |
730 | radeon_encoder = to_radeon_encoder(connector->encoder); |
703 | else { |
731 | else { |
704 | struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; |
732 | const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; |
705 | radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector)); |
733 | radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector)); |
Line 706... | Line 734... | ||
706 | } |
734 | } |
707 | 735 | ||
Line 722... | Line 750... | ||
722 | radeon_encoder->rmx_type = rmx_type; |
750 | radeon_encoder->rmx_type = rmx_type; |
Line 723... | Line 751... | ||
723 | 751 | ||
724 | radeon_property_change_mode(&radeon_encoder->base); |
752 | radeon_property_change_mode(&radeon_encoder->base); |
Line -... | Line 753... | ||
- | 753 | } |
|
- | 754 | ||
- | 755 | if (property == rdev->mode_info.output_csc_property) { |
|
- | 756 | if (connector->encoder) |
|
- | 757 | radeon_encoder = to_radeon_encoder(connector->encoder); |
|
- | 758 | else { |
|
- | 759 | const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; |
|
- | 760 | radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector)); |
|
- | 761 | } |
|
- | 762 | ||
- | 763 | if (radeon_encoder->output_csc == val) |
|
- | 764 | return 0; |
|
- | 765 | ||
- | 766 | radeon_encoder->output_csc = val; |
|
- | 767 | ||
- | 768 | if (connector->encoder->crtc) { |
|
- | 769 | struct drm_crtc *crtc = connector->encoder->crtc; |
|
- | 770 | const struct drm_crtc_helper_funcs *crtc_funcs = crtc->helper_private; |
|
- | 771 | struct radeon_crtc *radeon_crtc = to_radeon_crtc(crtc); |
|
- | 772 | ||
- | 773 | radeon_crtc->output_csc = radeon_encoder->output_csc; |
|
- | 774 | ||
- | 775 | (*crtc_funcs->load_lut)(crtc); |
|
- | 776 | } |
|
725 | } |
777 | } |
726 | 778 | ||
Line 727... | Line 779... | ||
727 | return 0; |
779 | return 0; |
728 | } |
780 | } |
Line 768... | Line 820... | ||
768 | int ret = 0; |
820 | int ret = 0; |
769 | struct drm_display_mode *mode; |
821 | struct drm_display_mode *mode; |
Line 770... | Line 822... | ||
770 | 822 | ||
771 | radeon_connector_get_edid(connector); |
823 | radeon_connector_get_edid(connector); |
772 | ret = radeon_ddc_get_modes(connector); |
824 | ret = radeon_ddc_get_modes(connector); |
773 | if (ret > 0) { |
825 | if (ret > 0) { |
774 | encoder = radeon_best_single_encoder(connector); |
826 | encoder = radeon_best_single_encoder(connector); |
775 | if (encoder) { |
827 | if (encoder) { |
776 | radeon_fixup_lvds_native_mode(encoder, connector); |
828 | radeon_fixup_lvds_native_mode(encoder, connector); |
777 | /* add scaled modes */ |
829 | /* add scaled modes */ |
778 | radeon_add_common_modes(encoder, connector); |
- | |
779 | } |
- | |
780 | return ret; |
830 | radeon_add_common_modes(encoder, connector); |
- | 831 | } |
|
- | 832 | return ret; |
|
Line 781... | Line 833... | ||
781 | } |
833 | } |
782 | 834 | ||
783 | encoder = radeon_best_single_encoder(connector); |
835 | encoder = radeon_best_single_encoder(connector); |
Line 843... | Line 895... | ||
843 | struct drm_display_mode *native_mode = &radeon_encoder->native_mode; |
895 | struct drm_display_mode *native_mode = &radeon_encoder->native_mode; |
Line 844... | Line 896... | ||
844 | 896 | ||
845 | /* check if panel is valid */ |
897 | /* check if panel is valid */ |
846 | if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240) |
898 | if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240) |
- | 899 | ret = connector_status_connected; |
|
- | 900 | /* don't fetch the edid from the vbios if ddc fails and runpm is |
|
847 | ret = connector_status_connected; |
901 | * enabled so we report disconnected. |
- | 902 | */ |
|
- | 903 | if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0)) |
|
848 | 904 | ret = connector_status_disconnected; |
|
Line 849... | Line 905... | ||
849 | } |
905 | } |
850 | 906 | ||
851 | /* check for edid as well */ |
907 | /* check for edid as well */ |
Line 882... | Line 938... | ||
882 | return 0; |
938 | return 0; |
Line 883... | Line 939... | ||
883 | 939 | ||
884 | if (connector->encoder) |
940 | if (connector->encoder) |
885 | radeon_encoder = to_radeon_encoder(connector->encoder); |
941 | radeon_encoder = to_radeon_encoder(connector->encoder); |
886 | else { |
942 | else { |
887 | struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; |
943 | const struct drm_connector_helper_funcs *connector_funcs = connector->helper_private; |
888 | radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector)); |
944 | radeon_encoder = to_radeon_encoder(connector_funcs->best_encoder(connector)); |
Line 889... | Line 945... | ||
889 | } |
945 | } |
890 | 946 | ||
Line 950... | Line 1006... | ||
950 | { |
1006 | { |
951 | struct drm_device *dev = connector->dev; |
1007 | struct drm_device *dev = connector->dev; |
952 | struct radeon_device *rdev = dev->dev_private; |
1008 | struct radeon_device *rdev = dev->dev_private; |
953 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1009 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
954 | struct drm_encoder *encoder; |
1010 | struct drm_encoder *encoder; |
955 | struct drm_encoder_helper_funcs *encoder_funcs; |
1011 | const struct drm_encoder_helper_funcs *encoder_funcs; |
956 | bool dret = false; |
1012 | bool dret = false; |
957 | enum drm_connector_status ret = connector_status_disconnected; |
1013 | enum drm_connector_status ret = connector_status_disconnected; |
Line 958... | Line 1014... | ||
958 | 1014 | ||
959 | encoder = radeon_best_single_encoder(connector); |
1015 | encoder = radeon_best_single_encoder(connector); |
Line 980... | Line 1036... | ||
980 | */ |
1036 | */ |
981 | if (radeon_connector->use_digital && radeon_connector->shared_ddc) { |
1037 | if (radeon_connector->use_digital && radeon_connector->shared_ddc) { |
982 | radeon_connector_free_edid(connector); |
1038 | radeon_connector_free_edid(connector); |
983 | ret = connector_status_disconnected; |
1039 | ret = connector_status_disconnected; |
984 | } else { |
1040 | } else { |
985 | ret = connector_status_connected; |
1041 | ret = connector_status_connected; |
986 | } |
1042 | } |
987 | } |
1043 | } |
988 | } else { |
1044 | } else { |
Line 989... | Line 1045... | ||
989 | 1045 | ||
990 | /* if we aren't forcing don't do destructive polling */ |
1046 | /* if we aren't forcing don't do destructive polling */ |
Line 1072... | Line 1128... | ||
1072 | 1128 | ||
1073 | static enum drm_connector_status |
1129 | static enum drm_connector_status |
1074 | radeon_tv_detect(struct drm_connector *connector, bool force) |
1130 | radeon_tv_detect(struct drm_connector *connector, bool force) |
1075 | { |
1131 | { |
1076 | struct drm_encoder *encoder; |
1132 | struct drm_encoder *encoder; |
1077 | struct drm_encoder_helper_funcs *encoder_funcs; |
1133 | const struct drm_encoder_helper_funcs *encoder_funcs; |
1078 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1134 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1079 | enum drm_connector_status ret = connector_status_disconnected; |
1135 | enum drm_connector_status ret = connector_status_disconnected; |
Line 1080... | Line 1136... | ||
1080 | int r; |
1136 | int r; |
Line 1146... | Line 1202... | ||
1146 | { |
1202 | { |
1147 | struct drm_device *dev = connector->dev; |
1203 | struct drm_device *dev = connector->dev; |
1148 | struct radeon_device *rdev = dev->dev_private; |
1204 | struct radeon_device *rdev = dev->dev_private; |
1149 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1205 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1150 | struct drm_encoder *encoder = NULL; |
1206 | struct drm_encoder *encoder = NULL; |
1151 | struct drm_encoder_helper_funcs *encoder_funcs; |
1207 | const struct drm_encoder_helper_funcs *encoder_funcs; |
1152 | int i, r; |
1208 | int i, r; |
1153 | enum drm_connector_status ret = connector_status_disconnected; |
1209 | enum drm_connector_status ret = connector_status_disconnected; |
1154 | bool dret = false, broken_edid = false; |
1210 | bool dret = false, broken_edid = false; |
Line 1155... | Line 1211... | ||
1155 | 1211 | ||
1156 | 1212 | ||
1157 | if (!force && radeon_check_hpd_status_unchanged(connector)) { |
1213 | if (!force && radeon_check_hpd_status_unchanged(connector)) { |
1158 | ret = connector->status; |
1214 | ret = connector->status; |
Line 1159... | Line 1215... | ||
1159 | goto exit; |
1215 | goto exit; |
1160 | } |
1216 | } |
- | 1217 | ||
1161 | 1218 | if (radeon_connector->ddc_bus) { |
|
1162 | if (radeon_connector->ddc_bus) |
1219 | dret = radeon_ddc_probe(radeon_connector, false); |
1163 | dret = radeon_ddc_probe(radeon_connector, false); |
1220 | } |
1164 | if (dret) { |
1221 | if (dret) { |
Line 1190... | Line 1247... | ||
1190 | */ |
1247 | */ |
1191 | if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) { |
1248 | if ((!radeon_connector->use_digital) && radeon_connector->shared_ddc) { |
1192 | radeon_connector_free_edid(connector); |
1249 | radeon_connector_free_edid(connector); |
1193 | ret = connector_status_disconnected; |
1250 | ret = connector_status_disconnected; |
1194 | } else { |
1251 | } else { |
1195 | ret = connector_status_connected; |
1252 | ret = connector_status_connected; |
1196 | } |
1253 | } |
1197 | /* This gets complicated. We have boards with VGA + HDMI with a |
1254 | /* This gets complicated. We have boards with VGA + HDMI with a |
1198 | * shared DDC line and we have boards with DVI-D + HDMI with a shared |
1255 | * shared DDC line and we have boards with DVI-D + HDMI with a shared |
1199 | * DDC line. The latter is more complex because with DVI<->HDMI adapters |
1256 | * DDC line. The latter is more complex because with DVI<->HDMI adapters |
1200 | * you don't really know what's connected to which port as both are digital. |
1257 | * you don't really know what's connected to which port as both are digital. |
Line 1235... | Line 1292... | ||
1235 | if (!force) { |
1292 | if (!force) { |
1236 | /* only return the previous status if we last |
1293 | /* only return the previous status if we last |
1237 | * detected a monitor via load. |
1294 | * detected a monitor via load. |
1238 | */ |
1295 | */ |
1239 | if (radeon_connector->detected_by_load) |
1296 | if (radeon_connector->detected_by_load) |
1240 | ret = connector->status; |
1297 | ret = connector->status; |
1241 | goto out; |
1298 | goto out; |
1242 | } |
1299 | } |
Line 1243... | Line 1300... | ||
1243 | 1300 | ||
1244 | /* find analog encoder */ |
1301 | /* find analog encoder */ |
Line 1257... | Line 1314... | ||
1257 | continue; |
1314 | continue; |
Line 1258... | Line 1315... | ||
1258 | 1315 | ||
1259 | encoder_funcs = encoder->helper_private; |
1316 | encoder_funcs = encoder->helper_private; |
1260 | if (encoder_funcs->detect) { |
1317 | if (encoder_funcs->detect) { |
1261 | if (!broken_edid) { |
1318 | if (!broken_edid) { |
1262 | if (ret != connector_status_connected) { |
1319 | if (ret != connector_status_connected) { |
1263 | /* deal with analog monitors without DDC */ |
1320 | /* deal with analog monitors without DDC */ |
1264 | ret = encoder_funcs->detect(encoder, connector); |
1321 | ret = encoder_funcs->detect(encoder, connector); |
1265 | if (ret == connector_status_connected) { |
1322 | if (ret == connector_status_connected) { |
- | 1323 | radeon_connector->use_digital = false; |
|
- | 1324 | } |
|
- | 1325 | if (ret != connector_status_disconnected) |
|
1266 | radeon_connector->use_digital = false; |
1326 | radeon_connector->detected_by_load = true; |
1267 | } |
- | |
1268 | if (ret != connector_status_disconnected) |
- | |
1269 | radeon_connector->detected_by_load = true; |
- | |
1270 | } |
1327 | } |
1271 | } else { |
1328 | } else { |
1272 | enum drm_connector_status lret; |
1329 | enum drm_connector_status lret; |
1273 | /* assume digital unless load detected otherwise */ |
1330 | /* assume digital unless load detected otherwise */ |
1274 | radeon_connector->use_digital = true; |
1331 | radeon_connector->use_digital = true; |
1275 | lret = encoder_funcs->detect(encoder, connector); |
1332 | lret = encoder_funcs->detect(encoder, connector); |
1276 | DRM_DEBUG_KMS("load_detect %x returned: %x\n",encoder->encoder_type,lret); |
1333 | DRM_DEBUG_KMS("load_detect %x returned: %x\n",encoder->encoder_type,lret); |
1277 | if (lret == connector_status_connected) |
1334 | if (lret == connector_status_connected) |
1278 | radeon_connector->use_digital = false; |
1335 | radeon_connector->use_digital = false; |
1279 | } |
1336 | } |
1280 | break; |
- | |
1281 | } |
1337 | break; |
1282 | } |
1338 | } |
- | 1339 | } |
|
Line 1283... | Line 1340... | ||
1283 | } |
1340 | } |
1284 | 1341 | ||
1285 | if ((ret == connector_status_connected) && (radeon_connector->use_digital == false) && |
1342 | if ((ret == connector_status_connected) && (radeon_connector->use_digital == false) && |
1286 | encoder) { |
1343 | encoder) { |
Line 1302... | Line 1359... | ||
1302 | } |
1359 | } |
Line 1303... | Line 1360... | ||
1303 | 1360 | ||
1304 | /* updated in get modes as well since we need to know if it's analog or digital */ |
1361 | /* updated in get modes as well since we need to know if it's analog or digital */ |
Line -... | Line 1362... | ||
- | 1362 | radeon_connector_update_scratch_regs(connector, ret); |
|
- | 1363 | ||
- | 1364 | if ((radeon_audio != 0) && radeon_connector->use_digital) { |
|
- | 1365 | const struct drm_connector_helper_funcs *connector_funcs = |
|
- | 1366 | connector->helper_private; |
|
- | 1367 | ||
- | 1368 | encoder = connector_funcs->best_encoder(connector); |
|
- | 1369 | if (encoder && (encoder->encoder_type == DRM_MODE_ENCODER_TMDS)) { |
|
- | 1370 | radeon_connector_get_edid(connector); |
|
- | 1371 | radeon_audio_detect(connector, encoder, ret); |
|
- | 1372 | } |
|
1305 | radeon_connector_update_scratch_regs(connector, ret); |
1373 | } |
1306 | 1374 | ||
1307 | exit: |
1375 | exit: |
Line 1308... | Line 1376... | ||
1308 | return ret; |
1376 | return ret; |
Line 1370... | Line 1438... | ||
1370 | if ((radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I) || |
1438 | if ((radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_I) || |
1371 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) || |
1439 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_DUAL_LINK_DVI_D) || |
1372 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) |
1440 | (radeon_connector->connector_object_id == CONNECTOR_OBJECT_ID_HDMI_TYPE_B)) |
1373 | return MODE_OK; |
1441 | return MODE_OK; |
1374 | else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { |
1442 | else if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { |
1375 | /* HDMI 1.3+ supports max clock of 340 Mhz */ |
1443 | /* HDMI 1.3+ supports max clock of 340 Mhz */ |
1376 | if (mode->clock > 340000) |
1444 | if (mode->clock > 340000) |
1377 | return MODE_CLOCK_HIGH; |
1445 | return MODE_CLOCK_HIGH; |
1378 | else |
1446 | else |
1379 | return MODE_OK; |
1447 | return MODE_OK; |
1380 | } else { |
1448 | } else { |
1381 | return MODE_CLOCK_HIGH; |
1449 | return MODE_CLOCK_HIGH; |
1382 | } |
1450 | } |
1383 | } |
1451 | } |
Line 1384... | Line 1452... | ||
1384 | 1452 | ||
1385 | /* check against the max pixel clock */ |
1453 | /* check against the max pixel clock */ |
1386 | if ((mode->clock / 10) > rdev->clock.max_pixel_clock) |
1454 | if ((mode->clock / 10) > rdev->clock.max_pixel_clock) |
Line 1414... | Line 1482... | ||
1414 | if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) || |
1482 | if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) || |
1415 | (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) { |
1483 | (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) { |
1416 | struct drm_display_mode *mode; |
1484 | struct drm_display_mode *mode; |
Line 1417... | Line 1485... | ||
1417 | 1485 | ||
1418 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
1486 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
1419 | if (!radeon_dig_connector->edp_on) |
1487 | if (!radeon_dig_connector->edp_on) |
1420 | atombios_set_edp_panel_power(connector, |
1488 | atombios_set_edp_panel_power(connector, |
1421 | ATOM_TRANSMITTER_ACTION_POWER_ON); |
1489 | ATOM_TRANSMITTER_ACTION_POWER_ON); |
1422 | radeon_connector_get_edid(connector); |
1490 | radeon_connector_get_edid(connector); |
1423 | ret = radeon_ddc_get_modes(connector); |
1491 | ret = radeon_ddc_get_modes(connector); |
1424 | if (!radeon_dig_connector->edp_on) |
1492 | if (!radeon_dig_connector->edp_on) |
1425 | atombios_set_edp_panel_power(connector, |
1493 | atombios_set_edp_panel_power(connector, |
1426 | ATOM_TRANSMITTER_ACTION_POWER_OFF); |
1494 | ATOM_TRANSMITTER_ACTION_POWER_OFF); |
1427 | } else { |
1495 | } else { |
1428 | /* need to setup ddc on the bridge */ |
1496 | /* need to setup ddc on the bridge */ |
1429 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != |
1497 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != |
1430 | ENCODER_OBJECT_ID_NONE) { |
1498 | ENCODER_OBJECT_ID_NONE) { |
Line 1455... | Line 1523... | ||
1455 | /* add the width/height from vbios tables if available */ |
1523 | /* add the width/height from vbios tables if available */ |
1456 | connector->display_info.width_mm = mode->width_mm; |
1524 | connector->display_info.width_mm = mode->width_mm; |
1457 | connector->display_info.height_mm = mode->height_mm; |
1525 | connector->display_info.height_mm = mode->height_mm; |
1458 | /* add scaled modes */ |
1526 | /* add scaled modes */ |
1459 | radeon_add_common_modes(encoder, connector); |
1527 | radeon_add_common_modes(encoder, connector); |
1460 | } |
1528 | } |
1461 | } else { |
1529 | } else { |
1462 | /* need to setup ddc on the bridge */ |
1530 | /* need to setup ddc on the bridge */ |
1463 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != |
1531 | if (radeon_connector_encoder_get_dp_bridge_encoder_id(connector) != |
1464 | ENCODER_OBJECT_ID_NONE) { |
1532 | ENCODER_OBJECT_ID_NONE) { |
1465 | if (encoder) |
1533 | if (encoder) |
Line 1548... | Line 1616... | ||
1548 | enum drm_connector_status ret = connector_status_disconnected; |
1616 | enum drm_connector_status ret = connector_status_disconnected; |
1549 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
1617 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
1550 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); |
1618 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); |
1551 | int r; |
1619 | int r; |
Line -... | Line 1620... | ||
- | 1620 | ||
- | 1621 | if (radeon_dig_connector->is_mst) |
|
Line 1552... | Line 1622... | ||
1552 | 1622 | return connector_status_disconnected; |
|
1553 | 1623 | ||
1554 | if (!force && radeon_check_hpd_status_unchanged(connector)) { |
1624 | if (!force && radeon_check_hpd_status_unchanged(connector)) { |
1555 | ret = connector->status; |
1625 | ret = connector->status; |
Line 1565... | Line 1635... | ||
1565 | struct drm_display_mode *native_mode = &radeon_encoder->native_mode; |
1635 | struct drm_display_mode *native_mode = &radeon_encoder->native_mode; |
Line 1566... | Line 1636... | ||
1566 | 1636 | ||
1567 | /* check if panel is valid */ |
1637 | /* check if panel is valid */ |
1568 | if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240) |
1638 | if (native_mode->hdisplay >= 320 && native_mode->vdisplay >= 240) |
- | 1639 | ret = connector_status_connected; |
|
- | 1640 | /* don't fetch the edid from the vbios if ddc fails and runpm is |
|
- | 1641 | * enabled so we report disconnected. |
|
- | 1642 | */ |
|
- | 1643 | if ((rdev->flags & RADEON_IS_PX) && (radeon_runtime_pm != 0)) |
|
1569 | ret = connector_status_connected; |
1644 | ret = connector_status_disconnected; |
1570 | } |
1645 | } |
1571 | /* eDP is always DP */ |
1646 | /* eDP is always DP */ |
1572 | radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT; |
1647 | radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT; |
1573 | if (!radeon_dig_connector->edp_on) |
1648 | if (!radeon_dig_connector->edp_on) |
Line 1585... | Line 1660... | ||
1585 | /* get the DPCD from the bridge */ |
1660 | /* get the DPCD from the bridge */ |
1586 | radeon_dp_getdpcd(radeon_connector); |
1661 | radeon_dp_getdpcd(radeon_connector); |
Line 1587... | Line 1662... | ||
1587 | 1662 | ||
1588 | if (encoder) { |
1663 | if (encoder) { |
1589 | /* setup ddc on the bridge */ |
1664 | /* setup ddc on the bridge */ |
1590 | radeon_atom_ext_encoder_setup_ddc(encoder); |
1665 | radeon_atom_ext_encoder_setup_ddc(encoder); |
1591 | /* bridge chips are always aux */ |
1666 | /* bridge chips are always aux */ |
1592 | if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */ |
1667 | if (radeon_ddc_probe(radeon_connector, true)) /* try DDC */ |
1593 | ret = connector_status_connected; |
1668 | ret = connector_status_connected; |
1594 | else if (radeon_connector->dac_load_detect) { /* try load detection */ |
1669 | else if (radeon_connector->dac_load_detect) { /* try load detection */ |
1595 | struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; |
1670 | const struct drm_encoder_helper_funcs *encoder_funcs = encoder->helper_private; |
1596 | ret = encoder_funcs->detect(encoder, connector); |
1671 | ret = encoder_funcs->detect(encoder, connector); |
1597 | } |
1672 | } |
1598 | } |
1673 | } |
1599 | } else { |
1674 | } else { |
1600 | radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector); |
1675 | radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector); |
1601 | if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { |
1676 | if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { |
1602 | ret = connector_status_connected; |
1677 | ret = connector_status_connected; |
1603 | if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) |
1678 | if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { |
- | 1679 | radeon_dp_getdpcd(radeon_connector); |
|
- | 1680 | r = radeon_dp_mst_probe(radeon_connector); |
|
- | 1681 | if (r == 1) |
|
- | 1682 | ret = connector_status_disconnected; |
|
1604 | radeon_dp_getdpcd(radeon_connector); |
1683 | } |
1605 | } else { |
1684 | } else { |
1606 | if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { |
1685 | if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) { |
- | 1686 | if (radeon_dp_getdpcd(radeon_connector)) { |
|
- | 1687 | r = radeon_dp_mst_probe(radeon_connector); |
|
- | 1688 | if (r == 1) |
|
- | 1689 | ret = connector_status_disconnected; |
|
1607 | if (radeon_dp_getdpcd(radeon_connector)) |
1690 | else |
- | 1691 | ret = connector_status_connected; |
|
1608 | ret = connector_status_connected; |
1692 | } |
1609 | } else { |
1693 | } else { |
1610 | /* try non-aux ddc (DP to DVI/HDMI/etc. adapter) */ |
1694 | /* try non-aux ddc (DP to DVI/HDMI/etc. adapter) */ |
1611 | if (radeon_ddc_probe(radeon_connector, false)) |
1695 | if (radeon_ddc_probe(radeon_connector, false)) |
- | 1696 | ret = connector_status_connected; |
|
1612 | ret = connector_status_connected; |
1697 | } |
1613 | } |
1698 | } |
1614 | } |
- | |
Line 1615... | Line 1699... | ||
1615 | } |
1699 | } |
- | 1700 | ||
- | 1701 | radeon_connector_update_scratch_regs(connector, ret); |
|
- | 1702 | ||
- | 1703 | if ((radeon_audio != 0) && encoder) { |
|
- | 1704 | radeon_connector_get_edid(connector); |
|
- | 1705 | radeon_audio_detect(connector, encoder, ret); |
|
1616 | 1706 | } |
|
1617 | radeon_connector_update_scratch_regs(connector, ret); |
1707 | |
1618 | out: |
1708 | out: |
Line 1619... | Line 1709... | ||
1619 | return ret; |
1709 | return ret; |
Line 1638... | Line 1728... | ||
1638 | 1728 | ||
1639 | if (encoder) { |
1729 | if (encoder) { |
1640 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
1730 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
Line 1641... | Line 1731... | ||
1641 | struct drm_display_mode *native_mode = &radeon_encoder->native_mode; |
1731 | struct drm_display_mode *native_mode = &radeon_encoder->native_mode; |
1642 | 1732 | ||
1643 | /* AVIVO hardware supports downscaling modes larger than the panel |
1733 | /* AVIVO hardware supports downscaling modes larger than the panel |
1644 | * to the panel size, but I'm not sure this is desirable. |
1734 | * to the panel size, but I'm not sure this is desirable. |
1645 | */ |
1735 | */ |
1646 | if ((mode->hdisplay > native_mode->hdisplay) || |
1736 | if ((mode->hdisplay > native_mode->hdisplay) || |
Line 1653... | Line 1743... | ||
1653 | (mode->vdisplay != native_mode->vdisplay)) |
1743 | (mode->vdisplay != native_mode->vdisplay)) |
1654 | return MODE_PANEL; |
1744 | return MODE_PANEL; |
1655 | } |
1745 | } |
1656 | } |
1746 | } |
1657 | } else { |
1747 | } else { |
1658 | if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
1748 | if ((radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) || |
1659 | (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) { |
1749 | (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_eDP)) { |
1660 | return radeon_dp_mode_valid_helper(connector, mode); |
1750 | return radeon_dp_mode_valid_helper(connector, mode); |
1661 | } else { |
1751 | } else { |
1662 | if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { |
1752 | if (ASIC_IS_DCE6(rdev) && drm_detect_hdmi_monitor(radeon_connector_edid(connector))) { |
1663 | /* HDMI 1.3+ supports max clock of 340 Mhz */ |
1753 | /* HDMI 1.3+ supports max clock of 340 Mhz */ |
Line 1668... | Line 1758... | ||
1668 | return MODE_CLOCK_HIGH; |
1758 | return MODE_CLOCK_HIGH; |
1669 | } |
1759 | } |
1670 | } |
1760 | } |
1671 | } |
1761 | } |
Line 1672... | Line 1762... | ||
1672 | 1762 | ||
1673 | return MODE_OK; |
1763 | return MODE_OK; |
Line 1674... | Line 1764... | ||
1674 | } |
1764 | } |
1675 | 1765 | ||
1676 | static const struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = { |
1766 | static const struct drm_connector_helper_funcs radeon_dp_connector_helper_funcs = { |
Line 1803... | Line 1893... | ||
1803 | if (radeon_connector->ddc_bus) |
1893 | if (radeon_connector->ddc_bus) |
1804 | has_aux = true; |
1894 | has_aux = true; |
1805 | else |
1895 | else |
1806 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1896 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1807 | } |
1897 | } |
1808 | switch (connector_type) { |
1898 | switch (connector_type) { |
1809 | case DRM_MODE_CONNECTOR_VGA: |
1899 | case DRM_MODE_CONNECTOR_VGA: |
1810 | case DRM_MODE_CONNECTOR_DVIA: |
1900 | case DRM_MODE_CONNECTOR_DVIA: |
1811 | default: |
1901 | default: |
1812 | drm_connector_init(dev, &radeon_connector->base, |
1902 | drm_connector_init(dev, &radeon_connector->base, |
1813 | &radeon_dp_connector_funcs, connector_type); |
1903 | &radeon_dp_connector_funcs, connector_type); |
1814 | drm_connector_helper_add(&radeon_connector->base, |
1904 | drm_connector_helper_add(&radeon_connector->base, |
Line 1820... | Line 1910... | ||
1820 | rdev->mode_info.load_detect_property, |
1910 | rdev->mode_info.load_detect_property, |
1821 | 1); |
1911 | 1); |
1822 | drm_object_attach_property(&radeon_connector->base.base, |
1912 | drm_object_attach_property(&radeon_connector->base.base, |
1823 | dev->mode_config.scaling_mode_property, |
1913 | dev->mode_config.scaling_mode_property, |
1824 | DRM_MODE_SCALE_NONE); |
1914 | DRM_MODE_SCALE_NONE); |
- | 1915 | if (ASIC_IS_DCE5(rdev)) |
|
- | 1916 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 1917 | rdev->mode_info.output_csc_property, |
|
- | 1918 | RADEON_OUTPUT_CSC_BYPASS); |
|
1825 | break; |
1919 | break; |
1826 | case DRM_MODE_CONNECTOR_DVII: |
1920 | case DRM_MODE_CONNECTOR_DVII: |
1827 | case DRM_MODE_CONNECTOR_DVID: |
1921 | case DRM_MODE_CONNECTOR_DVID: |
1828 | case DRM_MODE_CONNECTOR_HDMIA: |
1922 | case DRM_MODE_CONNECTOR_HDMIA: |
1829 | case DRM_MODE_CONNECTOR_HDMIB: |
1923 | case DRM_MODE_CONNECTOR_HDMIB: |
Line 1849... | Line 1943... | ||
1849 | drm_object_attach_property(&radeon_connector->base.base, |
1943 | drm_object_attach_property(&radeon_connector->base.base, |
1850 | rdev->mode_info.dither_property, |
1944 | rdev->mode_info.dither_property, |
1851 | RADEON_FMT_DITHER_DISABLE); |
1945 | RADEON_FMT_DITHER_DISABLE); |
Line 1852... | Line 1946... | ||
1852 | 1946 | ||
1853 | if (radeon_audio != 0) |
1947 | if (radeon_audio != 0) |
1854 | drm_object_attach_property(&radeon_connector->base.base, |
1948 | drm_object_attach_property(&radeon_connector->base.base, |
1855 | rdev->mode_info.audio_property, |
1949 | rdev->mode_info.audio_property, |
- | 1950 | RADEON_AUDIO_AUTO); |
|
- | 1951 | if (ASIC_IS_DCE5(rdev)) |
|
- | 1952 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 1953 | rdev->mode_info.output_csc_property, |
|
Line 1856... | Line 1954... | ||
1856 | RADEON_AUDIO_AUTO); |
1954 | RADEON_OUTPUT_CSC_BYPASS); |
1857 | 1955 | ||
1858 | subpixel_order = SubPixelHorizontalRGB; |
1956 | subpixel_order = SubPixelHorizontalRGB; |
1859 | connector->interlace_allowed = true; |
1957 | connector->interlace_allowed = true; |
Line 1883... | Line 1981... | ||
1883 | break; |
1981 | break; |
1884 | } |
1982 | } |
1885 | } else { |
1983 | } else { |
1886 | switch (connector_type) { |
1984 | switch (connector_type) { |
1887 | case DRM_MODE_CONNECTOR_VGA: |
1985 | case DRM_MODE_CONNECTOR_VGA: |
1888 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
1986 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
1889 | drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); |
1987 | drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); |
1890 | if (i2c_bus->valid) { |
1988 | if (i2c_bus->valid) { |
1891 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1989 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1892 | if (!radeon_connector->ddc_bus) |
1990 | if (!radeon_connector->ddc_bus) |
1893 | DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1991 | DRM_ERROR("VGA: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1894 | } |
1992 | } |
1895 | radeon_connector->dac_load_detect = true; |
1993 | radeon_connector->dac_load_detect = true; |
1896 | drm_object_attach_property(&radeon_connector->base.base, |
1994 | drm_object_attach_property(&radeon_connector->base.base, |
1897 | rdev->mode_info.load_detect_property, |
1995 | rdev->mode_info.load_detect_property, |
1898 | 1); |
1996 | 1); |
1899 | if (ASIC_IS_AVIVO(rdev)) |
1997 | if (ASIC_IS_AVIVO(rdev)) |
1900 | drm_object_attach_property(&radeon_connector->base.base, |
1998 | drm_object_attach_property(&radeon_connector->base.base, |
1901 | dev->mode_config.scaling_mode_property, |
1999 | dev->mode_config.scaling_mode_property, |
1902 | DRM_MODE_SCALE_NONE); |
2000 | DRM_MODE_SCALE_NONE); |
- | 2001 | if (ASIC_IS_DCE5(rdev)) |
|
- | 2002 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 2003 | rdev->mode_info.output_csc_property, |
|
- | 2004 | RADEON_OUTPUT_CSC_BYPASS); |
|
1903 | /* no HPD on analog connectors */ |
2005 | /* no HPD on analog connectors */ |
1904 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
2006 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
1905 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
2007 | connector->polled = DRM_CONNECTOR_POLL_CONNECT; |
1906 | connector->interlace_allowed = true; |
2008 | connector->interlace_allowed = true; |
1907 | connector->doublescan_allowed = true; |
2009 | connector->doublescan_allowed = true; |
1908 | break; |
2010 | break; |
1909 | case DRM_MODE_CONNECTOR_DVIA: |
2011 | case DRM_MODE_CONNECTOR_DVIA: |
1910 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
2012 | drm_connector_init(dev, &radeon_connector->base, &radeon_vga_connector_funcs, connector_type); |
1911 | drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); |
2013 | drm_connector_helper_add(&radeon_connector->base, &radeon_vga_connector_helper_funcs); |
1912 | if (i2c_bus->valid) { |
2014 | if (i2c_bus->valid) { |
1913 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
2015 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1914 | if (!radeon_connector->ddc_bus) |
2016 | if (!radeon_connector->ddc_bus) |
1915 | DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
2017 | DRM_ERROR("DVIA: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1916 | } |
2018 | } |
1917 | radeon_connector->dac_load_detect = true; |
2019 | radeon_connector->dac_load_detect = true; |
1918 | drm_object_attach_property(&radeon_connector->base.base, |
2020 | drm_object_attach_property(&radeon_connector->base.base, |
1919 | rdev->mode_info.load_detect_property, |
2021 | rdev->mode_info.load_detect_property, |
1920 | 1); |
2022 | 1); |
1921 | if (ASIC_IS_AVIVO(rdev)) |
2023 | if (ASIC_IS_AVIVO(rdev)) |
1922 | drm_object_attach_property(&radeon_connector->base.base, |
2024 | drm_object_attach_property(&radeon_connector->base.base, |
1923 | dev->mode_config.scaling_mode_property, |
2025 | dev->mode_config.scaling_mode_property, |
1924 | DRM_MODE_SCALE_NONE); |
2026 | DRM_MODE_SCALE_NONE); |
- | 2027 | if (ASIC_IS_DCE5(rdev)) |
|
- | 2028 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 2029 | rdev->mode_info.output_csc_property, |
|
- | 2030 | RADEON_OUTPUT_CSC_BYPASS); |
|
1925 | /* no HPD on analog connectors */ |
2031 | /* no HPD on analog connectors */ |
1926 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
2032 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
1927 | connector->interlace_allowed = true; |
2033 | connector->interlace_allowed = true; |
1928 | connector->doublescan_allowed = true; |
2034 | connector->doublescan_allowed = true; |
1929 | break; |
2035 | break; |
1930 | case DRM_MODE_CONNECTOR_DVII: |
2036 | case DRM_MODE_CONNECTOR_DVII: |
1931 | case DRM_MODE_CONNECTOR_DVID: |
2037 | case DRM_MODE_CONNECTOR_DVID: |
1932 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
2038 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
1933 | if (!radeon_dig_connector) |
2039 | if (!radeon_dig_connector) |
1934 | goto failed; |
2040 | goto failed; |
1935 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
2041 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
1936 | radeon_connector->con_priv = radeon_dig_connector; |
2042 | radeon_connector->con_priv = radeon_dig_connector; |
1937 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); |
2043 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); |
1938 | drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); |
2044 | drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); |
1939 | if (i2c_bus->valid) { |
2045 | if (i2c_bus->valid) { |
1940 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
2046 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1941 | if (!radeon_connector->ddc_bus) |
2047 | if (!radeon_connector->ddc_bus) |
1942 | DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
2048 | DRM_ERROR("DVI: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1943 | } |
2049 | } |
1944 | subpixel_order = SubPixelHorizontalRGB; |
2050 | subpixel_order = SubPixelHorizontalRGB; |
1945 | drm_object_attach_property(&radeon_connector->base.base, |
2051 | drm_object_attach_property(&radeon_connector->base.base, |
1946 | rdev->mode_info.coherent_mode_property, |
2052 | rdev->mode_info.coherent_mode_property, |
1947 | 1); |
2053 | 1); |
1948 | if (ASIC_IS_AVIVO(rdev)) { |
2054 | if (ASIC_IS_AVIVO(rdev)) { |
1949 | drm_object_attach_property(&radeon_connector->base.base, |
2055 | drm_object_attach_property(&radeon_connector->base.base, |
1950 | rdev->mode_info.underscan_property, |
2056 | rdev->mode_info.underscan_property, |
1951 | UNDERSCAN_OFF); |
2057 | UNDERSCAN_OFF); |
1952 | drm_object_attach_property(&radeon_connector->base.base, |
2058 | drm_object_attach_property(&radeon_connector->base.base, |
1953 | rdev->mode_info.underscan_hborder_property, |
2059 | rdev->mode_info.underscan_hborder_property, |
1954 | 0); |
2060 | 0); |
1955 | drm_object_attach_property(&radeon_connector->base.base, |
2061 | drm_object_attach_property(&radeon_connector->base.base, |
1956 | rdev->mode_info.underscan_vborder_property, |
2062 | rdev->mode_info.underscan_vborder_property, |
1957 | 0); |
2063 | 0); |
1958 | drm_object_attach_property(&radeon_connector->base.base, |
2064 | drm_object_attach_property(&radeon_connector->base.base, |
1959 | rdev->mode_info.dither_property, |
2065 | rdev->mode_info.dither_property, |
1960 | RADEON_FMT_DITHER_DISABLE); |
2066 | RADEON_FMT_DITHER_DISABLE); |
1961 | drm_object_attach_property(&radeon_connector->base.base, |
2067 | drm_object_attach_property(&radeon_connector->base.base, |
1962 | dev->mode_config.scaling_mode_property, |
2068 | dev->mode_config.scaling_mode_property, |
1963 | DRM_MODE_SCALE_NONE); |
2069 | DRM_MODE_SCALE_NONE); |
1964 | } |
2070 | } |
1965 | if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { |
2071 | if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { |
1966 | drm_object_attach_property(&radeon_connector->base.base, |
2072 | drm_object_attach_property(&radeon_connector->base.base, |
1967 | rdev->mode_info.audio_property, |
2073 | rdev->mode_info.audio_property, |
1968 | RADEON_AUDIO_AUTO); |
2074 | RADEON_AUDIO_AUTO); |
1969 | } |
2075 | } |
1970 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { |
2076 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { |
1971 | radeon_connector->dac_load_detect = true; |
2077 | radeon_connector->dac_load_detect = true; |
1972 | drm_object_attach_property(&radeon_connector->base.base, |
2078 | drm_object_attach_property(&radeon_connector->base.base, |
1973 | rdev->mode_info.load_detect_property, |
2079 | rdev->mode_info.load_detect_property, |
1974 | 1); |
2080 | 1); |
1975 | } |
2081 | } |
- | 2082 | if (ASIC_IS_DCE5(rdev)) |
|
- | 2083 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 2084 | rdev->mode_info.output_csc_property, |
|
- | 2085 | RADEON_OUTPUT_CSC_BYPASS); |
|
1976 | connector->interlace_allowed = true; |
2086 | connector->interlace_allowed = true; |
1977 | if (connector_type == DRM_MODE_CONNECTOR_DVII) |
2087 | if (connector_type == DRM_MODE_CONNECTOR_DVII) |
1978 | connector->doublescan_allowed = true; |
2088 | connector->doublescan_allowed = true; |
1979 | else |
2089 | else |
1980 | connector->doublescan_allowed = false; |
2090 | connector->doublescan_allowed = false; |
1981 | break; |
2091 | break; |
1982 | case DRM_MODE_CONNECTOR_HDMIA: |
2092 | case DRM_MODE_CONNECTOR_HDMIA: |
1983 | case DRM_MODE_CONNECTOR_HDMIB: |
2093 | case DRM_MODE_CONNECTOR_HDMIB: |
1984 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
2094 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
1985 | if (!radeon_dig_connector) |
2095 | if (!radeon_dig_connector) |
1986 | goto failed; |
2096 | goto failed; |
1987 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
2097 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
1988 | radeon_connector->con_priv = radeon_dig_connector; |
2098 | radeon_connector->con_priv = radeon_dig_connector; |
1989 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); |
2099 | drm_connector_init(dev, &radeon_connector->base, &radeon_dvi_connector_funcs, connector_type); |
1990 | drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); |
2100 | drm_connector_helper_add(&radeon_connector->base, &radeon_dvi_connector_helper_funcs); |
1991 | if (i2c_bus->valid) { |
2101 | if (i2c_bus->valid) { |
1992 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
2102 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
1993 | if (!radeon_connector->ddc_bus) |
2103 | if (!radeon_connector->ddc_bus) |
1994 | DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
2104 | DRM_ERROR("HDMI: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
1995 | } |
2105 | } |
1996 | drm_object_attach_property(&radeon_connector->base.base, |
2106 | drm_object_attach_property(&radeon_connector->base.base, |
1997 | rdev->mode_info.coherent_mode_property, |
2107 | rdev->mode_info.coherent_mode_property, |
1998 | 1); |
2108 | 1); |
1999 | if (ASIC_IS_AVIVO(rdev)) { |
2109 | if (ASIC_IS_AVIVO(rdev)) { |
2000 | drm_object_attach_property(&radeon_connector->base.base, |
2110 | drm_object_attach_property(&radeon_connector->base.base, |
2001 | rdev->mode_info.underscan_property, |
2111 | rdev->mode_info.underscan_property, |
2002 | UNDERSCAN_OFF); |
2112 | UNDERSCAN_OFF); |
2003 | drm_object_attach_property(&radeon_connector->base.base, |
2113 | drm_object_attach_property(&radeon_connector->base.base, |
2004 | rdev->mode_info.underscan_hborder_property, |
2114 | rdev->mode_info.underscan_hborder_property, |
2005 | 0); |
2115 | 0); |
2006 | drm_object_attach_property(&radeon_connector->base.base, |
2116 | drm_object_attach_property(&radeon_connector->base.base, |
2007 | rdev->mode_info.underscan_vborder_property, |
2117 | rdev->mode_info.underscan_vborder_property, |
2008 | 0); |
2118 | 0); |
2009 | drm_object_attach_property(&radeon_connector->base.base, |
2119 | drm_object_attach_property(&radeon_connector->base.base, |
2010 | rdev->mode_info.dither_property, |
2120 | rdev->mode_info.dither_property, |
2011 | RADEON_FMT_DITHER_DISABLE); |
2121 | RADEON_FMT_DITHER_DISABLE); |
2012 | drm_object_attach_property(&radeon_connector->base.base, |
2122 | drm_object_attach_property(&radeon_connector->base.base, |
2013 | dev->mode_config.scaling_mode_property, |
2123 | dev->mode_config.scaling_mode_property, |
2014 | DRM_MODE_SCALE_NONE); |
2124 | DRM_MODE_SCALE_NONE); |
2015 | } |
2125 | } |
2016 | if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { |
2126 | if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { |
2017 | drm_object_attach_property(&radeon_connector->base.base, |
2127 | drm_object_attach_property(&radeon_connector->base.base, |
2018 | rdev->mode_info.audio_property, |
2128 | rdev->mode_info.audio_property, |
2019 | RADEON_AUDIO_AUTO); |
2129 | RADEON_AUDIO_AUTO); |
2020 | } |
2130 | } |
- | 2131 | if (ASIC_IS_DCE5(rdev)) |
|
- | 2132 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 2133 | rdev->mode_info.output_csc_property, |
|
- | 2134 | RADEON_OUTPUT_CSC_BYPASS); |
|
2021 | subpixel_order = SubPixelHorizontalRGB; |
2135 | subpixel_order = SubPixelHorizontalRGB; |
2022 | connector->interlace_allowed = true; |
2136 | connector->interlace_allowed = true; |
2023 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) |
2137 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) |
2024 | connector->doublescan_allowed = true; |
2138 | connector->doublescan_allowed = true; |
2025 | else |
2139 | else |
2026 | connector->doublescan_allowed = false; |
2140 | connector->doublescan_allowed = false; |
2027 | break; |
2141 | break; |
2028 | case DRM_MODE_CONNECTOR_DisplayPort: |
2142 | case DRM_MODE_CONNECTOR_DisplayPort: |
2029 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
2143 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
2030 | if (!radeon_dig_connector) |
2144 | if (!radeon_dig_connector) |
2031 | goto failed; |
2145 | goto failed; |
2032 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
2146 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
2033 | radeon_connector->con_priv = radeon_dig_connector; |
2147 | radeon_connector->con_priv = radeon_dig_connector; |
2034 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); |
2148 | drm_connector_init(dev, &radeon_connector->base, &radeon_dp_connector_funcs, connector_type); |
2035 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); |
2149 | drm_connector_helper_add(&radeon_connector->base, &radeon_dp_connector_helper_funcs); |
2036 | if (i2c_bus->valid) { |
2150 | if (i2c_bus->valid) { |
2037 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
2151 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
2038 | if (radeon_connector->ddc_bus) |
2152 | if (radeon_connector->ddc_bus) |
2039 | has_aux = true; |
2153 | has_aux = true; |
2040 | else |
2154 | else |
2041 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
2155 | DRM_ERROR("DP: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
2042 | } |
2156 | } |
2043 | subpixel_order = SubPixelHorizontalRGB; |
2157 | subpixel_order = SubPixelHorizontalRGB; |
2044 | drm_object_attach_property(&radeon_connector->base.base, |
2158 | drm_object_attach_property(&radeon_connector->base.base, |
2045 | rdev->mode_info.coherent_mode_property, |
2159 | rdev->mode_info.coherent_mode_property, |
2046 | 1); |
2160 | 1); |
2047 | if (ASIC_IS_AVIVO(rdev)) { |
2161 | if (ASIC_IS_AVIVO(rdev)) { |
2048 | drm_object_attach_property(&radeon_connector->base.base, |
2162 | drm_object_attach_property(&radeon_connector->base.base, |
2049 | rdev->mode_info.underscan_property, |
2163 | rdev->mode_info.underscan_property, |
2050 | UNDERSCAN_OFF); |
2164 | UNDERSCAN_OFF); |
2051 | drm_object_attach_property(&radeon_connector->base.base, |
2165 | drm_object_attach_property(&radeon_connector->base.base, |
2052 | rdev->mode_info.underscan_hborder_property, |
2166 | rdev->mode_info.underscan_hborder_property, |
2053 | 0); |
2167 | 0); |
2054 | drm_object_attach_property(&radeon_connector->base.base, |
2168 | drm_object_attach_property(&radeon_connector->base.base, |
2055 | rdev->mode_info.underscan_vborder_property, |
2169 | rdev->mode_info.underscan_vborder_property, |
2056 | 0); |
2170 | 0); |
2057 | drm_object_attach_property(&radeon_connector->base.base, |
2171 | drm_object_attach_property(&radeon_connector->base.base, |
2058 | rdev->mode_info.dither_property, |
2172 | rdev->mode_info.dither_property, |
2059 | RADEON_FMT_DITHER_DISABLE); |
2173 | RADEON_FMT_DITHER_DISABLE); |
2060 | drm_object_attach_property(&radeon_connector->base.base, |
2174 | drm_object_attach_property(&radeon_connector->base.base, |
2061 | dev->mode_config.scaling_mode_property, |
2175 | dev->mode_config.scaling_mode_property, |
2062 | DRM_MODE_SCALE_NONE); |
2176 | DRM_MODE_SCALE_NONE); |
2063 | } |
2177 | } |
2064 | if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { |
2178 | if (ASIC_IS_DCE2(rdev) && (radeon_audio != 0)) { |
2065 | drm_object_attach_property(&radeon_connector->base.base, |
2179 | drm_object_attach_property(&radeon_connector->base.base, |
2066 | rdev->mode_info.audio_property, |
2180 | rdev->mode_info.audio_property, |
2067 | RADEON_AUDIO_AUTO); |
2181 | RADEON_AUDIO_AUTO); |
2068 | } |
2182 | } |
- | 2183 | if (ASIC_IS_DCE5(rdev)) |
|
- | 2184 | drm_object_attach_property(&radeon_connector->base.base, |
|
- | 2185 | rdev->mode_info.output_csc_property, |
|
- | 2186 | RADEON_OUTPUT_CSC_BYPASS); |
|
2069 | connector->interlace_allowed = true; |
2187 | connector->interlace_allowed = true; |
2070 | /* in theory with a DP to VGA converter... */ |
2188 | /* in theory with a DP to VGA converter... */ |
2071 | connector->doublescan_allowed = false; |
2189 | connector->doublescan_allowed = false; |
2072 | break; |
2190 | break; |
2073 | case DRM_MODE_CONNECTOR_eDP: |
2191 | case DRM_MODE_CONNECTOR_eDP: |
2074 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
2192 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
2075 | if (!radeon_dig_connector) |
2193 | if (!radeon_dig_connector) |
2076 | goto failed; |
2194 | goto failed; |
2077 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
2195 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
Line 2090... | Line 2208... | ||
2090 | DRM_MODE_SCALE_FULLSCREEN); |
2208 | DRM_MODE_SCALE_FULLSCREEN); |
2091 | subpixel_order = SubPixelHorizontalRGB; |
2209 | subpixel_order = SubPixelHorizontalRGB; |
2092 | connector->interlace_allowed = false; |
2210 | connector->interlace_allowed = false; |
2093 | connector->doublescan_allowed = false; |
2211 | connector->doublescan_allowed = false; |
2094 | break; |
2212 | break; |
2095 | case DRM_MODE_CONNECTOR_SVIDEO: |
2213 | case DRM_MODE_CONNECTOR_SVIDEO: |
2096 | case DRM_MODE_CONNECTOR_Composite: |
2214 | case DRM_MODE_CONNECTOR_Composite: |
2097 | case DRM_MODE_CONNECTOR_9PinDIN: |
2215 | case DRM_MODE_CONNECTOR_9PinDIN: |
2098 | drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); |
2216 | drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); |
2099 | drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); |
2217 | drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); |
2100 | radeon_connector->dac_load_detect = true; |
2218 | radeon_connector->dac_load_detect = true; |
2101 | drm_object_attach_property(&radeon_connector->base.base, |
2219 | drm_object_attach_property(&radeon_connector->base.base, |
2102 | rdev->mode_info.load_detect_property, |
2220 | rdev->mode_info.load_detect_property, |
2103 | 1); |
2221 | 1); |
2104 | drm_object_attach_property(&radeon_connector->base.base, |
2222 | drm_object_attach_property(&radeon_connector->base.base, |
2105 | rdev->mode_info.tv_std_property, |
2223 | rdev->mode_info.tv_std_property, |
2106 | radeon_atombios_get_tv_info(rdev)); |
2224 | radeon_atombios_get_tv_info(rdev)); |
2107 | /* no HPD on analog connectors */ |
2225 | /* no HPD on analog connectors */ |
2108 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
2226 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
2109 | connector->interlace_allowed = false; |
2227 | connector->interlace_allowed = false; |
2110 | connector->doublescan_allowed = false; |
2228 | connector->doublescan_allowed = false; |
2111 | break; |
2229 | break; |
2112 | case DRM_MODE_CONNECTOR_LVDS: |
2230 | case DRM_MODE_CONNECTOR_LVDS: |
2113 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
2231 | radeon_dig_connector = kzalloc(sizeof(struct radeon_connector_atom_dig), GFP_KERNEL); |
2114 | if (!radeon_dig_connector) |
2232 | if (!radeon_dig_connector) |
2115 | goto failed; |
2233 | goto failed; |
2116 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
2234 | radeon_dig_connector->igp_lane_info = igp_lane_info; |
2117 | radeon_connector->con_priv = radeon_dig_connector; |
2235 | radeon_connector->con_priv = radeon_dig_connector; |
2118 | drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); |
2236 | drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); |
2119 | drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs); |
2237 | drm_connector_helper_add(&radeon_connector->base, &radeon_lvds_connector_helper_funcs); |
2120 | if (i2c_bus->valid) { |
2238 | if (i2c_bus->valid) { |
2121 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
2239 | radeon_connector->ddc_bus = radeon_i2c_lookup(rdev, i2c_bus); |
2122 | if (!radeon_connector->ddc_bus) |
2240 | if (!radeon_connector->ddc_bus) |
2123 | DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
2241 | DRM_ERROR("LVDS: Failed to assign ddc bus! Check dmesg for i2c errors.\n"); |
2124 | } |
2242 | } |
2125 | drm_object_attach_property(&radeon_connector->base.base, |
2243 | drm_object_attach_property(&radeon_connector->base.base, |
2126 | dev->mode_config.scaling_mode_property, |
2244 | dev->mode_config.scaling_mode_property, |
2127 | DRM_MODE_SCALE_FULLSCREEN); |
2245 | DRM_MODE_SCALE_FULLSCREEN); |
2128 | subpixel_order = SubPixelHorizontalRGB; |
2246 | subpixel_order = SubPixelHorizontalRGB; |
2129 | connector->interlace_allowed = false; |
2247 | connector->interlace_allowed = false; |
2130 | connector->doublescan_allowed = false; |
2248 | connector->doublescan_allowed = false; |
2131 | break; |
2249 | break; |
2132 | } |
2250 | } |
2133 | } |
2251 | } |
Line 2134... | Line 2252... | ||
2134 | 2252 | ||
2135 | if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) { |
2253 | if (radeon_connector->hpd.hpd == RADEON_HPD_NONE) { |
2136 | if (i2c_bus->valid) |
2254 | if (i2c_bus->valid) |
Line 2254... | Line 2372... | ||
2254 | connector->doublescan_allowed = false; |
2372 | connector->doublescan_allowed = false; |
2255 | break; |
2373 | break; |
2256 | case DRM_MODE_CONNECTOR_SVIDEO: |
2374 | case DRM_MODE_CONNECTOR_SVIDEO: |
2257 | case DRM_MODE_CONNECTOR_Composite: |
2375 | case DRM_MODE_CONNECTOR_Composite: |
2258 | case DRM_MODE_CONNECTOR_9PinDIN: |
2376 | case DRM_MODE_CONNECTOR_9PinDIN: |
2259 | drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); |
2377 | drm_connector_init(dev, &radeon_connector->base, &radeon_tv_connector_funcs, connector_type); |
2260 | drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); |
2378 | drm_connector_helper_add(&radeon_connector->base, &radeon_tv_connector_helper_funcs); |
2261 | radeon_connector->dac_load_detect = true; |
2379 | radeon_connector->dac_load_detect = true; |
2262 | /* RS400,RC410,RS480 chipset seems to report a lot |
2380 | /* RS400,RC410,RS480 chipset seems to report a lot |
2263 | * of false positive on load detect, we haven't yet |
2381 | * of false positive on load detect, we haven't yet |
2264 | * found a way to make load detect reliable on those |
2382 | * found a way to make load detect reliable on those |
2265 | * chipset, thus just disable it for TV. |
2383 | * chipset, thus just disable it for TV. |
2266 | */ |
2384 | */ |
2267 | if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) |
2385 | if (rdev->family == CHIP_RS400 || rdev->family == CHIP_RS480) |
2268 | radeon_connector->dac_load_detect = false; |
2386 | radeon_connector->dac_load_detect = false; |
2269 | drm_object_attach_property(&radeon_connector->base.base, |
2387 | drm_object_attach_property(&radeon_connector->base.base, |
2270 | rdev->mode_info.load_detect_property, |
2388 | rdev->mode_info.load_detect_property, |
2271 | radeon_connector->dac_load_detect); |
2389 | radeon_connector->dac_load_detect); |
2272 | drm_object_attach_property(&radeon_connector->base.base, |
2390 | drm_object_attach_property(&radeon_connector->base.base, |
2273 | rdev->mode_info.tv_std_property, |
2391 | rdev->mode_info.tv_std_property, |
2274 | radeon_combios_get_tv_info(rdev)); |
2392 | radeon_combios_get_tv_info(rdev)); |
2275 | /* no HPD on analog connectors */ |
2393 | /* no HPD on analog connectors */ |
2276 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
2394 | radeon_connector->hpd.hpd = RADEON_HPD_NONE; |
2277 | connector->interlace_allowed = false; |
2395 | connector->interlace_allowed = false; |
2278 | connector->doublescan_allowed = false; |
2396 | connector->doublescan_allowed = false; |
2279 | break; |
2397 | break; |
2280 | case DRM_MODE_CONNECTOR_LVDS: |
2398 | case DRM_MODE_CONNECTOR_LVDS: |
2281 | drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); |
2399 | drm_connector_init(dev, &radeon_connector->base, &radeon_lvds_connector_funcs, connector_type); |
Line 2300... | Line 2418... | ||
2300 | } else |
2418 | } else |
2301 | connector->polled = DRM_CONNECTOR_POLL_HPD; |
2419 | connector->polled = DRM_CONNECTOR_POLL_HPD; |
2302 | connector->display_info.subpixel_order = subpixel_order; |
2420 | connector->display_info.subpixel_order = subpixel_order; |
2303 | drm_connector_register(connector); |
2421 | drm_connector_register(connector); |
2304 | }>>>>>>->>>>>>>>>=> |
2422 | } |
- | 2423 | ||
- | 2424 | void radeon_setup_mst_connector(struct drm_device *dev) |
|
- | 2425 | { |
|
- | 2426 | struct radeon_device *rdev = dev->dev_private; |
|
- | 2427 | struct drm_connector *connector; |
|
- | 2428 | struct radeon_connector *radeon_connector; |
|
- | 2429 | ||
- | 2430 | if (!ASIC_IS_DCE5(rdev)) |
|
- | 2431 | return; |
|
- | 2432 | ||
- | 2433 | if (radeon_mst == 0) |
|
- | 2434 | return; |
|
- | 2435 | ||
- | 2436 | list_for_each_entry(connector, &dev->mode_config.connector_list, head) { |
|
- | 2437 | int ret; |
|
- | 2438 | ||
- | 2439 | radeon_connector = to_radeon_connector(connector); |
|
- | 2440 | ||
- | 2441 | if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort) |
|
- | 2442 | continue; |
|
- | 2443 | ||
- | 2444 | ret = radeon_dp_mst_init(radeon_connector); |
|
- | 2445 | } |
|
- | 2446 | }>>>>>>->>>>>>>>>=> |