Commit b06947b5 authored by Alex Deucher's avatar Alex Deucher Committed by Dave Airlie
Browse files

drm/radeon/kms: fix DP detect and EDID fetch for DP bridges



Sink type is always DP for DP bridges and EDID fetch on
DP bridges is always i2c over aux rather than plain i2c.

Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>
parent ddf28352
Loading
Loading
Loading
Loading
+24 −13
Original line number Diff line number Diff line
@@ -1297,12 +1297,33 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
		if (!radeon_dig_connector->edp_on)
			atombios_set_edp_panel_power(connector,
						     ATOM_TRANSMITTER_ACTION_POWER_OFF);
	} else {
	} else if (radeon_connector_encoder_is_dp_bridge(connector)) {
		/* DP bridges are always DP */
		radeon_dig_connector->dp_sink_type = CONNECTOR_OBJECT_ID_DISPLAYPORT;
		/* get the DPCD from the bridge */
		radeon_dp_getdpcd(radeon_connector);

		if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd))
			ret = connector_status_connected;
		else {
			/* need to setup ddc on the bridge */
		if (radeon_connector_encoder_is_dp_bridge(connector)) {
			if (encoder)
				radeon_atom_ext_encoder_setup_ddc(encoder);
			if (radeon_ddc_probe(radeon_connector,
					     radeon_connector->requires_extended_probe))
				ret = connector_status_connected;
		}

		if ((ret == connector_status_disconnected) &&
		    radeon_connector->dac_load_detect) {
			struct drm_encoder *encoder = radeon_best_single_encoder(connector);
			struct drm_encoder_helper_funcs *encoder_funcs;
			if (encoder) {
				encoder_funcs = encoder->helper_private;
				ret = encoder_funcs->detect(encoder, connector);
			}
		}
	} else {
		radeon_dig_connector->dp_sink_type = radeon_dp_getsinktype(radeon_connector);
		if (radeon_hpd_sense(rdev, radeon_connector->hpd.hpd)) {
			ret = connector_status_connected;
@@ -1318,16 +1339,6 @@ radeon_dp_detect(struct drm_connector *connector, bool force)
					ret = connector_status_connected;
			}
		}

		if ((ret == connector_status_disconnected) &&
		    radeon_connector->dac_load_detect) {
			struct drm_encoder *encoder = radeon_best_single_encoder(connector);
			struct drm_encoder_helper_funcs *encoder_funcs;
			if (encoder) {
				encoder_funcs = encoder->helper_private;
				ret = encoder_funcs->detect(encoder, connector);
			}
		}
	}

	radeon_connector_update_scratch_regs(connector, ret);
+12 −7
Original line number Diff line number Diff line
@@ -707,16 +707,21 @@ int radeon_ddc_get_modes(struct radeon_connector *radeon_connector)
		radeon_router_select_ddc_port(radeon_connector);

	if ((radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
	    (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP)) {
	    (radeon_connector->base.connector_type == DRM_MODE_CONNECTOR_eDP) ||
	    radeon_connector_encoder_is_dp_bridge(&radeon_connector->base)) {
		struct radeon_connector_atom_dig *dig = radeon_connector->con_priv;

		if ((dig->dp_sink_type == CONNECTOR_OBJECT_ID_DISPLAYPORT ||
		     dig->dp_sink_type == CONNECTOR_OBJECT_ID_eDP) && dig->dp_i2c_bus)
			radeon_connector->edid = drm_get_edid(&radeon_connector->base, &dig->dp_i2c_bus->adapter);
	}
	if (!radeon_connector->ddc_bus)
		return -1;
	if (!radeon_connector->edid) {
		radeon_connector->edid = drm_get_edid(&radeon_connector->base, &radeon_connector->ddc_bus->adapter);
			radeon_connector->edid = drm_get_edid(&radeon_connector->base,
							      &dig->dp_i2c_bus->adapter);
		else if (radeon_connector->ddc_bus && !radeon_connector->edid)
			radeon_connector->edid = drm_get_edid(&radeon_connector->base,
							      &radeon_connector->ddc_bus->adapter);
	} else {
		if (radeon_connector->ddc_bus && !radeon_connector->edid)
			radeon_connector->edid = drm_get_edid(&radeon_connector->base,
							      &radeon_connector->ddc_bus->adapter);
	}

	if (!radeon_connector->edid) {