Subversion Repositories Kolibri OS

Rev

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,