Rev 1963 | Rev 2160 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1963 | Rev 1986 | ||
---|---|---|---|
Line 42... | Line 42... | ||
42 | 42 | ||
43 | extern void |
43 | extern void |
44 | radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder, |
44 | radeon_legacy_backlight_init(struct radeon_encoder *radeon_encoder, |
Line -... | Line 45... | ||
- | 45 | struct drm_connector *drm_connector); |
|
- | 46 | ||
45 | struct drm_connector *drm_connector); |
47 | bool radeon_connector_encoder_is_dp_bridge(struct drm_connector *connector); |
46 | 48 | ||
47 | void radeon_connector_hotplug(struct drm_connector *connector) |
49 | void radeon_connector_hotplug(struct drm_connector *connector) |
48 | { |
50 | { |
49 | struct drm_device *dev = connector->dev; |
51 | struct drm_device *dev = connector->dev; |
Line 834... | Line 836... | ||
834 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter); |
836 | radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter); |
Line 835... | Line 837... | ||
835 | 837 | ||
836 | if (!radeon_connector->edid) { |
838 | if (!radeon_connector->edid) { |
837 | DRM_ERROR("%s: probed a monitor but no|invalid EDID\n", |
839 | DRM_ERROR("%s: probed a monitor but no|invalid EDID\n", |
- | 840 | drm_get_connector_name(connector)); |
|
- | 841 | /* rs690 seems to have a problem with connectors not existing and always |
|
- | 842 | * return a block of 0's. If we see this just stop polling on this output */ |
|
- | 843 | if ((rdev->family == CHIP_RS690 || rdev->family == CHIP_RS740) && radeon_connector->base.null_edid_counter) { |
|
- | 844 | ret = connector_status_disconnected; |
|
- | 845 | DRM_ERROR("%s: detected RS690 floating bus bug, stopping ddc detect\n", drm_get_connector_name(connector)); |
|
- | 846 | radeon_connector->ddc_bus = NULL; |
|
838 | drm_get_connector_name(connector)); |
847 | } |
839 | } else { |
848 | } else { |
Line 840... | Line 849... | ||
840 | radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); |
849 | radeon_connector->use_digital = !!(radeon_connector->edid->input & DRM_EDID_INPUT_DIGITAL); |
841 | 850 | ||
Line 1061... | Line 1070... | ||
1061 | 1070 | ||
1062 | static int radeon_dp_get_modes(struct drm_connector *connector) |
1071 | static int radeon_dp_get_modes(struct drm_connector *connector) |
1063 | { |
1072 | { |
1064 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1073 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
- | 1074 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
|
1065 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
1075 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); |
Line 1066... | Line 1076... | ||
1066 | int ret; |
1076 | int ret; |
1067 | 1077 | ||
1068 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
1078 | if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) || |
Line 1069... | Line 1079... | ||
1069 | struct drm_encoder *encoder; |
1079 | (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) { |
1070 | struct drm_display_mode *mode; |
1080 | struct drm_display_mode *mode; |
1071 | 1081 | ||
Line 1076... | Line 1086... | ||
1076 | if (!radeon_dig_connector->edp_on) |
1086 | if (!radeon_dig_connector->edp_on) |
1077 | atombios_set_edp_panel_power(connector, |
1087 | atombios_set_edp_panel_power(connector, |
1078 | ATOM_TRANSMITTER_ACTION_POWER_OFF); |
1088 | ATOM_TRANSMITTER_ACTION_POWER_OFF); |
Line 1079... | Line 1089... | ||
1079 | 1089 | ||
1080 | if (ret > 0) { |
- | |
1081 | encoder = radeon_best_single_encoder(connector); |
1090 | if (ret > 0) { |
1082 | if (encoder) { |
1091 | if (encoder) { |
1083 | radeon_fixup_lvds_native_mode(encoder, connector); |
1092 | radeon_fixup_lvds_native_mode(encoder, connector); |
1084 | /* add scaled modes */ |
1093 | /* add scaled modes */ |
1085 | radeon_add_common_modes(encoder, connector); |
1094 | radeon_add_common_modes(encoder, connector); |
Line 1100... | Line 1109... | ||
1100 | connector->display_info.width_mm = mode->width_mm; |
1109 | connector->display_info.width_mm = mode->width_mm; |
1101 | connector->display_info.height_mm = mode->height_mm; |
1110 | connector->display_info.height_mm = mode->height_mm; |
1102 | /* add scaled modes */ |
1111 | /* add scaled modes */ |
1103 | radeon_add_common_modes(encoder, connector); |
1112 | radeon_add_common_modes(encoder, connector); |
1104 | } |
1113 | } |
1105 | } else |
1114 | } else { |
- | 1115 | /* need to setup ddc on the bridge */ |
|
- | 1116 | if (radeon_connector_encoder_is_dp_bridge(connector)) { |
|
- | 1117 | if (encoder) |
|
- | 1118 | radeon_atom_ext_encoder_setup_ddc(encoder); |
|
- | 1119 | } |
|
1106 | ret = radeon_ddc_get_modes(radeon_connector); |
1120 | ret = radeon_ddc_get_modes(radeon_connector); |
- | 1121 | } |
|
Line 1107... | Line 1122... | ||
1107 | 1122 | ||
1108 | return ret; |
1123 | return ret; |
Line 1109... | Line 1124... | ||
1109 | } |
1124 | } |
Line 1185... | Line 1200... | ||
1185 | struct drm_device *dev = connector->dev; |
1200 | struct drm_device *dev = connector->dev; |
1186 | struct radeon_device *rdev = dev->dev_private; |
1201 | struct radeon_device *rdev = dev->dev_private; |
1187 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1202 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1188 | enum drm_connector_status ret = connector_status_disconnected; |
1203 | enum drm_connector_status ret = connector_status_disconnected; |
1189 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
1204 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
- | 1205 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); |
|
Line 1190... | Line 1206... | ||
1190 | 1206 | ||
1191 | if (radeon_connector->edid) { |
1207 | if (radeon_connector->edid) { |
1192 | kfree(radeon_connector->edid); |
1208 | kfree(radeon_connector->edid); |
1193 | radeon_connector->edid = NULL; |
1209 | radeon_connector->edid = NULL; |
Line 1194... | Line 1210... | ||
1194 | } |
1210 | } |
1195 | 1211 | ||
1196 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
1212 | if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) || |
1197 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); |
1213 | (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) { |
1198 | if (encoder) { |
1214 | if (encoder) { |
Line 1199... | Line 1215... | ||
1199 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
1215 | struct radeon_encoder *radeon_encoder = to_radeon_encoder(encoder); |
Line 1212... | Line 1228... | ||
1212 | ret = connector_status_connected; |
1228 | ret = connector_status_connected; |
1213 | if (!radeon_dig_connector->edp_on) |
1229 | if (!radeon_dig_connector->edp_on) |
1214 | atombios_set_edp_panel_power(connector, |
1230 | atombios_set_edp_panel_power(connector, |
1215 | ATOM_TRANSMITTER_ACTION_POWER_OFF); |
1231 | ATOM_TRANSMITTER_ACTION_POWER_OFF); |
1216 | } else { |
1232 | } else { |
- | 1233 | /* need to setup ddc on the bridge */ |
|
- | 1234 | if (radeon_connector_encoder_is_dp_bridge(connector)) { |
|
- | 1235 | if (encoder) |
|
- | 1236 | radeon_atom_ext_encoder_setup_ddc(encoder); |
|
- | 1237 | } |
|
1217 | radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector); |
1238 | radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector); |
1218 | if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { |
1239 | if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) { |
1219 | ret = connector_status_connected; |
1240 | ret = connector_status_connected; |
1220 | if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) |
1241 | if (radeon_dig_connector->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT) |
1221 | radeon_dp_getdpcd(radeon_connector); |
1242 | radeon_dp_getdpcd(radeon_connector); |
Line 1226... | Line 1247... | ||
1226 | } else { |
1247 | } else { |
1227 | if (radeon_ddc_probe(radeon_connector)) |
1248 | if (radeon_ddc_probe(radeon_connector)) |
1228 | ret = connector_status_connected; |
1249 | ret = connector_status_connected; |
1229 | } |
1250 | } |
1230 | } |
1251 | } |
- | 1252 | ||
- | 1253 | if ((ret == connector_status_disconnected) && |
|
- | 1254 | radeon_connector->dac_load_detect) { |
|
- | 1255 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); |
|
- | 1256 | struct drm_encoder_helper_funcs *encoder_funcs; |
|
- | 1257 | if (encoder) { |
|
- | 1258 | encoder_funcs = encoder->helper_private; |
|
- | 1259 | ret = encoder_funcs->detect(encoder, connector); |
|
- | 1260 | } |
|
- | 1261 | } |
|
1231 | } |
1262 | } |
Line 1232... | Line 1263... | ||
1232 | 1263 | ||
1233 | radeon_connector_update_scratch_regs(connector, ret); |
1264 | radeon_connector_update_scratch_regs(connector, ret); |
1234 | return ret; |
1265 | return ret; |
Line 1240... | Line 1271... | ||
1240 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1271 | struct radeon_connector *radeon_connector = to_radeon_connector(connector); |
1241 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
1272 | struct radeon_connector_atom_dig *radeon_dig_connector = radeon_connector->con_priv; |
Line 1242... | Line 1273... | ||
1242 | 1273 | ||
Line 1243... | Line 1274... | ||
1243 | /* XXX check mode bandwidth */ |
1274 | /* XXX check mode bandwidth */ |
- | 1275 | ||
1244 | 1276 | if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) || |
|
Line 1245... | Line 1277... | ||
1245 | if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) { |
1277 | (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) { |
1246 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); |
1278 | struct drm_encoder *encoder = radeon_best_single_encoder(connector); |
Line 1399... | Line 1431... | ||
1399 | case DRM_MODE_CONNECTOR_VGA: |
1431 | case DRM_MODE_CONNECTOR_VGA: |
1400 | case DRM_MODE_CONNECTOR_DVIA: |
1432 | case DRM_MODE_CONNECTOR_DVIA: |
1401 | default: |
1433 | default: |
1402 | connector->interlace_allowed = true; |
1434 | connector->interlace_allowed = true; |
1403 | connector->doublescan_allowed = true; |
1435 | connector->doublescan_allowed = true; |
- | 1436 | radeon_connector->dac_load_detect = true; |
|
- | 1437 | drm_connector_attach_property(&radeon_connector->base, |
|
- | 1438 | rdev->mode_info.load_detect_property, |
|
- | 1439 | 1); |
|
1404 | break; |
1440 | break; |
1405 | case DRM_MODE_CONNECTOR_DVII: |
1441 | case DRM_MODE_CONNECTOR_DVII: |
1406 | case DRM_MODE_CONNECTOR_DVID: |
1442 | case DRM_MODE_CONNECTOR_DVID: |
1407 | case DRM_MODE_CONNECTOR_HDMIA: |
1443 | case DRM_MODE_CONNECTOR_HDMIA: |
1408 | case DRM_MODE_CONNECTOR_HDMIB: |
1444 | case DRM_MODE_CONNECTOR_HDMIB: |
Line 1420... | Line 1456... | ||
1420 | connector->interlace_allowed = true; |
1456 | connector->interlace_allowed = true; |
1421 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) |
1457 | if (connector_type == DRM_MODE_CONNECTOR_HDMIB) |
1422 | connector->doublescan_allowed = true; |
1458 | connector->doublescan_allowed = true; |
1423 | else |
1459 | else |
1424 | connector->doublescan_allowed = false; |
1460 | connector->doublescan_allowed = false; |
- | 1461 | if (connector_type == DRM_MODE_CONNECTOR_DVII) { |
|
- | 1462 | radeon_connector->dac_load_detect = true; |
|
- | 1463 | drm_connector_attach_property(&radeon_connector->base, |
|
- | 1464 | rdev->mode_info.load_detect_property, |
|
- | 1465 | 1); |
|
- | 1466 | } |
|
1425 | break; |
1467 | break; |
1426 | case DRM_MODE_CONNECTOR_LVDS: |
1468 | case DRM_MODE_CONNECTOR_LVDS: |
1427 | case DRM_MODE_CONNECTOR_eDP: |
1469 | case DRM_MODE_CONNECTOR_eDP: |
1428 | drm_connector_attach_property(&radeon_connector->base, |
1470 | drm_connector_attach_property(&radeon_connector->base, |
1429 | dev->mode_config.scaling_mode_property, |
1471 | dev->mode_config.scaling_mode_property, |