|
@@ -4582,6 +4582,16 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
|
|
|
*/
|
|
|
status = connector_status_disconnected;
|
|
|
goto out;
|
|
|
+ } else if (connector->status == connector_status_connected) {
|
|
|
+ /*
|
|
|
+ * If display was connected already and is still connected
|
|
|
+ * check links status, there has been known issues of
|
|
|
+ * link loss triggerring long pulse!!!!
|
|
|
+ */
|
|
|
+ drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
|
|
|
+ intel_dp_check_link_status(intel_dp);
|
|
|
+ drm_modeset_unlock(&dev->mode_config.connection_mutex);
|
|
|
+ goto out;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -4595,6 +4605,7 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
|
|
|
intel_dp_set_edid(intel_dp);
|
|
|
|
|
|
status = connector_status_connected;
|
|
|
+ intel_dp->detect_done = true;
|
|
|
|
|
|
/* Try to read the source of the interrupt */
|
|
|
if (intel_dp->dpcd[DP_DPCD_REV] >= 0x11 &&
|
|
@@ -4611,8 +4622,21 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
|
|
|
}
|
|
|
|
|
|
out:
|
|
|
- if (status != connector_status_connected)
|
|
|
+ if (status != connector_status_connected) {
|
|
|
intel_dp_unset_edid(intel_dp);
|
|
|
+ /*
|
|
|
+ * If we were in MST mode, and device is not there,
|
|
|
+ * get out of MST mode
|
|
|
+ */
|
|
|
+ if (intel_dp->is_mst) {
|
|
|
+ DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
|
|
|
+ intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
|
|
|
+ intel_dp->is_mst = false;
|
|
|
+ drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
|
|
|
+ intel_dp->is_mst);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
intel_display_power_put(to_i915(dev), power_domain);
|
|
|
return;
|
|
|
}
|
|
@@ -4636,7 +4660,11 @@ intel_dp_detect(struct drm_connector *connector, bool force)
|
|
|
return connector_status_disconnected;
|
|
|
}
|
|
|
|
|
|
- intel_dp_long_pulse(intel_dp->attached_connector);
|
|
|
+ /* If full detect is not performed yet, do a full detect */
|
|
|
+ if (!intel_dp->detect_done)
|
|
|
+ intel_dp_long_pulse(intel_dp->attached_connector);
|
|
|
+
|
|
|
+ intel_dp->detect_done = false;
|
|
|
|
|
|
if (intel_connector->detect_edid)
|
|
|
return connector_status_connected;
|
|
@@ -4968,25 +4996,25 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
|
|
|
/* indicate that we need to restart link training */
|
|
|
intel_dp->train_set_valid = false;
|
|
|
|
|
|
- if (!intel_digital_port_connected(dev_priv, intel_dig_port))
|
|
|
- goto mst_fail;
|
|
|
-
|
|
|
- if (!intel_dp_get_dpcd(intel_dp)) {
|
|
|
- goto mst_fail;
|
|
|
- }
|
|
|
-
|
|
|
- intel_dp_probe_oui(intel_dp);
|
|
|
+ intel_dp_long_pulse(intel_dp->attached_connector);
|
|
|
+ if (intel_dp->is_mst)
|
|
|
+ ret = IRQ_HANDLED;
|
|
|
+ goto put_power;
|
|
|
|
|
|
- if (!intel_dp_probe_mst(intel_dp)) {
|
|
|
- drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
|
|
|
- intel_dp_check_link_status(intel_dp);
|
|
|
- drm_modeset_unlock(&dev->mode_config.connection_mutex);
|
|
|
- goto mst_fail;
|
|
|
- }
|
|
|
} else {
|
|
|
if (intel_dp->is_mst) {
|
|
|
- if (intel_dp_check_mst_status(intel_dp) == -EINVAL)
|
|
|
- goto mst_fail;
|
|
|
+ if (intel_dp_check_mst_status(intel_dp) == -EINVAL) {
|
|
|
+ /*
|
|
|
+ * If we were in MST mode, and device is not
|
|
|
+ * there, get out of MST mode
|
|
|
+ */
|
|
|
+ DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n",
|
|
|
+ intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
|
|
|
+ intel_dp->is_mst = false;
|
|
|
+ drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr,
|
|
|
+ intel_dp->is_mst);
|
|
|
+ goto put_power;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
if (!intel_dp->is_mst) {
|
|
@@ -4998,14 +5026,6 @@ intel_dp_hpd_pulse(struct intel_digital_port *intel_dig_port, bool long_hpd)
|
|
|
|
|
|
ret = IRQ_HANDLED;
|
|
|
|
|
|
- goto put_power;
|
|
|
-mst_fail:
|
|
|
- /* if we were in MST mode, and device is not there get out of MST mode */
|
|
|
- if (intel_dp->is_mst) {
|
|
|
- DRM_DEBUG_KMS("MST device may have disappeared %d vs %d\n", intel_dp->is_mst, intel_dp->mst_mgr.mst_state);
|
|
|
- intel_dp->is_mst = false;
|
|
|
- drm_dp_mst_topology_mgr_set_mst(&intel_dp->mst_mgr, intel_dp->is_mst);
|
|
|
- }
|
|
|
put_power:
|
|
|
intel_display_power_put(dev_priv, power_domain);
|
|
|
|