[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