[PATCH v1] drm/i915: Test patch for checking if edid change during suspend is fixed by those changes.

Stanislav Lisovskiy stanislav.lisovskiy at intel.com
Mon Jun 24 13:05:45 UTC 2019


Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=105540
Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy at intel.com>
---
 drivers/gpu/drm/drm_probe_helper.c           | 26 ++++++++++++++++++++
 drivers/gpu/drm/i915/display/intel_dp.c      | 21 ++++++++++++++--
 drivers/gpu/drm/i915/display/intel_hdmi.c    | 17 +++++++++++--
 drivers/gpu/drm/i915/display/intel_hotplug.c |  2 +-
 4 files changed, 61 insertions(+), 5 deletions(-)

diff --git a/drivers/gpu/drm/drm_probe_helper.c b/drivers/gpu/drm/drm_probe_helper.c
index ef2c468205a2..110222fc9664 100644
--- a/drivers/gpu/drm/drm_probe_helper.c
+++ b/drivers/gpu/drm/drm_probe_helper.c
@@ -776,6 +776,8 @@ bool drm_helper_hpd_irq_event(struct drm_device *dev)
 	struct drm_connector_list_iter conn_iter;
 	enum drm_connector_status old_status;
 	bool changed = false;
+	struct drm_property_blob *old_edid_blob_ptr;
+	bool edid_changed = false;
 
 	if (!dev->mode_config.poll_enabled)
 		return false;
@@ -789,12 +791,36 @@ bool drm_helper_hpd_irq_event(struct drm_device *dev)
 
 		old_status = connector->status;
 
+		if (connector->edid_blob_ptr)
+			old_edid_blob_ptr = drm_property_blob_get(connector->edid_blob_ptr);
+		else
+			old_edid_blob_ptr = NULL;
+
 		connector->status = drm_helper_probe_detect(connector, NULL, false);
 		DRM_DEBUG_KMS("[CONNECTOR:%d:%s] status updated from %s to %s\n",
 			      connector->base.id,
 			      connector->name,
 			      drm_get_connector_status_name(old_status),
 			      drm_get_connector_status_name(connector->status));
+
+		/* Check changing of edid when a connector status still remains
+		 * as "connector_status_connected".
+		 */
+		if (connector->status == connector_status_connected &&
+		    old_status == connector_status_connected && old_edid_blob_ptr) {
+
+			if (old_edid_blob_ptr != connector->edid_blob_ptr) {
+				edid_changed = true;
+			}
+			if (edid_changed) {
+				changed = true;
+				DRM_DEBUG_KMS("[CONNECTOR:%d:%s] edid updated\n",
+					      connector->base.id,
+					      connector->name);
+			}
+		}
+		drm_property_blob_put(old_edid_blob_ptr);
+
 		if (old_status != connector->status)
 			changed = true;
 	}
diff --git a/drivers/gpu/drm/i915/display/intel_dp.c b/drivers/gpu/drm/i915/display/intel_dp.c
index 4336df46fe78..b1bfacb72ca1 100644
--- a/drivers/gpu/drm/i915/display/intel_dp.c
+++ b/drivers/gpu/drm/i915/display/intel_dp.c
@@ -5510,12 +5510,29 @@ static void
 intel_dp_set_edid(struct intel_dp *intel_dp)
 {
 	struct intel_connector *intel_connector = intel_dp->attached_connector;
+	struct drm_connector *connector = &intel_connector->base;
 	struct edid *edid;
+	struct edid *old_edid;
 
-	intel_dp_unset_edid(intel_dp);
 	edid = intel_dp_get_edid(intel_dp);
-	intel_connector->detect_edid = edid;
+	old_edid = intel_connector->detect_edid;
+
+	intel_dp_unset_edid(intel_dp);
+
+	if (old_edid) {
+		int old_len, new_len;
+		old_len = EDID_LENGTH * (1 + old_edid->extensions);
+		new_len = EDID_LENGTH * (1 + edid->extensions);
 
+		if (!memcmp(old_edid, edid, old_len) && (old_len == new_len)) {
+			return;
+		}
+	}
+	DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Edid was changed! Updating blob property.\n",
+		    connector->base.id, connector->name);
+
+	intel_connector->detect_edid = edid;
+	intel_connector_update_modes(&intel_connector->base, edid);
 	intel_dp->has_audio = drm_detect_monitor_audio(edid);
 	drm_dp_cec_set_edid(&intel_dp->aux, edid);
 }
diff --git a/drivers/gpu/drm/i915/display/intel_hdmi.c b/drivers/gpu/drm/i915/display/intel_hdmi.c
index 0ebec69bbbfc..89559d8b85e3 100644
--- a/drivers/gpu/drm/i915/display/intel_hdmi.c
+++ b/drivers/gpu/drm/i915/display/intel_hdmi.c
@@ -2503,7 +2503,7 @@ intel_hdmi_set_edid(struct drm_connector *connector)
 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
 	struct intel_hdmi *intel_hdmi = intel_attached_hdmi(connector);
 	intel_wakeref_t wakeref;
-	struct edid *edid;
+	struct edid *edid, *old_edid;
 	bool connected = false;
 	struct i2c_adapter *i2c;
 
@@ -2524,11 +2524,24 @@ intel_hdmi_set_edid(struct drm_connector *connector)
 
 	intel_display_power_put(dev_priv, POWER_DOMAIN_GMBUS, wakeref);
 
+	old_edid = to_intel_connector(connector)->detect_edid;
+	if (old_edid) {
+		int old_len, new_len;
+		old_len = EDID_LENGTH * (1 + old_edid->extensions);
+		new_len = EDID_LENGTH * (1 + edid->extensions);
+
+		if (!memcmp(old_edid, edid, old_len) && (old_len == new_len))
+			return connected;
+	}
+	intel_connector_update_modes(connector, edid);
+
+	DRM_DEBUG_KMS("[CONNECTOR:%d:%s] Edid was changed! Updating blob property.\n",
+	    connector->base.id, connector->name);
 	to_intel_connector(connector)->detect_edid = edid;
+
 	if (edid && edid->input & DRM_EDID_INPUT_DIGITAL) {
 		intel_hdmi->has_audio = drm_detect_monitor_audio(edid);
 		intel_hdmi->has_hdmi_sink = drm_detect_hdmi_monitor(edid);
-
 		connected = true;
 	}
 
diff --git a/drivers/gpu/drm/i915/display/intel_hotplug.c b/drivers/gpu/drm/i915/display/intel_hotplug.c
index ea3de4acc850..9cd4f02a5323 100644
--- a/drivers/gpu/drm/i915/display/intel_hotplug.c
+++ b/drivers/gpu/drm/i915/display/intel_hotplug.c
@@ -389,7 +389,7 @@ static void i915_hotplug_work_func(struct work_struct *work)
 	mutex_unlock(&dev->mode_config.mutex);
 
 	if (changed)
-		drm_kms_helper_hotplug_event(dev);
+		drm_helper_hpd_irq_event(dev);
 }
 
 
-- 
2.17.1



More information about the Intel-gfx-trybot mailing list