[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