Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 899526d9 authored by Jesse Barnes's avatar Jesse Barnes Committed by Keith Packard
Browse files

drm/i915/dp: try to read receiver capabilities 3 times when detecting



If ->detect is called too soon after a hot plug event, the sink may not
be ready yet.  So try up to 3 times with 1ms sleeps in between tries to
get the data (spec dictates that receivers must be ready to respond within
1ms and that sources should try 3 times).

See section 9.1 of the 1.1a DisplayPort spec.

Signed-off-by: default avatarJesse Barnes <jbarnes@virtuousgeek.org>
Reviewed-by: default avatarKeith Packard <keithp@keithp.com>
Signed-off-by: default avatarKeith Packard <keithp@keithp.com>
parent 59cd09e1
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -1551,6 +1551,7 @@ static enum drm_connector_status
ironlake_dp_detect(struct intel_dp *intel_dp)
{
	enum drm_connector_status status;
	int ret, i;

	/* Can't disconnect eDP, but you can close the lid... */
	if (is_edp(intel_dp)) {
@@ -1561,12 +1562,16 @@ ironlake_dp_detect(struct intel_dp *intel_dp)
	}

	status = connector_status_disconnected;
	if (intel_dp_aux_native_read(intel_dp,
	for (i = 0; i < 3; i++) {
		ret = intel_dp_aux_native_read(intel_dp,
					       0x000, intel_dp->dpcd,
				     sizeof (intel_dp->dpcd))
	    == sizeof(intel_dp->dpcd)) {
		if (intel_dp->dpcd[DP_DPCD_REV] != 0)
					       sizeof (intel_dp->dpcd));
		if (ret == sizeof(intel_dp->dpcd) &&
		    intel_dp->dpcd[DP_DPCD_REV] != 0) {
			status = connector_status_connected;
			break;
		}
		msleep(1);
	}
	DRM_DEBUG_KMS("DPCD: %hx%hx%hx%hx\n", intel_dp->dpcd[0],
		      intel_dp->dpcd[1], intel_dp->dpcd[2], intel_dp->dpcd[3]);