[PATCH] drm/i915/bxt: Workaround LSPCON suspend/resume failure

Imre Deak imre.deak at intel.com
Wed Oct 19 13:22:10 UTC 2016


Signed-off-by: Imre Deak <imre.deak at intel.com>
---
 drivers/gpu/drm/i915/intel_drv.h    |  1 +
 drivers/gpu/drm/i915/intel_lspcon.c | 31 +++++++++++++++++++++++++++++++
 2 files changed, 32 insertions(+)

diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 5760420..913e443 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -965,6 +965,7 @@ struct intel_lspcon {
 	bool active;
 	enum drm_lspcon_mode mode;
 	struct drm_dp_aux *aux;
+	char device_id[6];
 };
 
 struct intel_digital_port {
diff --git a/drivers/gpu/drm/i915/intel_lspcon.c b/drivers/gpu/drm/i915/intel_lspcon.c
index d606f1a..93653c9 100644
--- a/drivers/gpu/drm/i915/intel_lspcon.c
+++ b/drivers/gpu/drm/i915/intel_lspcon.c
@@ -89,8 +89,33 @@ static bool lspcon_probe(struct intel_lspcon *lspcon)
 	return true;
 }
 
+static void lspcon_pcon_wa(struct intel_lspcon *lspcon)
+{
+	char buf;
+	int tmo = 40;
+
+	/* In PCON mode? */
+	if (drm_dp_dpcd_read(lspcon->aux, 0, &buf, 1) < 0)
+		return;
+
+	while (tmo--) {
+		char device_id[6];
+
+		if (drm_dp_dpcd_read(lspcon->aux, DP_BRANCH_ID, device_id,
+				     sizeof(device_id)) == sizeof(device_id) &&
+		    !memcmp(device_id, lspcon->device_id, sizeof(device_id)))
+			return;
+
+		msleep(10);
+	}
+
+	DRM_DEBUG_KMS("LSPCON device ID mismatch after resume\n");
+}
+
 void lspcon_resume(struct intel_lspcon *lspcon)
 {
+	lspcon_pcon_wa(lspcon);
+
 	if (lspcon_change_mode(lspcon, DRM_LSPCON_MODE_PCON, true))
 		DRM_ERROR("LSPCON resume failed\n");
 	else
@@ -131,6 +156,12 @@ bool lspcon_init(struct intel_digital_port *intel_dig_port)
 		}
 	}
 
+	if (drm_dp_dpcd_read(lspcon->aux, DP_BRANCH_ID, lspcon->device_id,
+			     sizeof(lspcon->device_id)) == sizeof(lspcon->device_id))
+		DRM_DEBUG_KMS("LSPCON device ID: %.*s\n",
+			      (int)sizeof(lspcon->device_id),
+			      lspcon->device_id);
+
 	DRM_DEBUG_KMS("Success: LSPCON init\n");
 	return true;
 }
-- 
2.5.0



More information about the Intel-gfx-trybot mailing list