intel-gfx.lists.freedesktop.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] drm/edid: Add helper to detect whether EDID changed
@ 2017-07-24 14:54 Paul Kocialkowski
  2017-07-24 14:54 ` [PATCH 2/2] drm/i915: Detect monitor change from EDID change after resume Paul Kocialkowski
                   ` (3 more replies)
  0 siblings, 4 replies; 12+ messages in thread
From: Paul Kocialkowski @ 2017-07-24 14:54 UTC (permalink / raw)
  To: dri-devel, linux-kernel, intel-gfx; +Cc: David Airlie, Daniel Vetter

This adds a common drm helper to detect whether the EDID changed from
the last known cached one. This is useful help detect that a monitor was
changed during a suspend/resume cycle.

When that happens (a monitor is replaced by another one during suspend),
no hotplug event will be triggered so the change will not be caught at
resume time. Detecting that the EDID changed allows detecting it.

Signed-off-by: Paul Kocialkowski <paul.kocialkowski@linux.intel.com>
---
 drivers/gpu/drm/drm_edid.c | 45 +++++++++++++++++++++++++++++++++++++++++++++
 include/drm/drm_edid.h     |  3 +++
 2 files changed, 48 insertions(+)

diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 6bb6337be920..f6ce8bc2907a 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -5036,3 +5036,48 @@ static void drm_get_displayid(struct drm_connector *connector,
 	}
 	return;
 }
+
+/**
+ * drm_check_edid_changed - Check whether the EDID changed since the last update
+ * @connector: connector we're probing
+ * @adapter: I2C adapter to use for DDC
+ *
+ * Check whether the EDID changed since the last time it was updated in the
+ * drm blob cache.
+ *
+ * Return: A boolean indicating whether a change happened or not.
+ */
+bool drm_check_edid_changed(struct drm_connector *connector,
+			    struct i2c_adapter *adapter)
+{
+	struct drm_property_blob *edid_blob;
+	struct edid *edid_stored;
+	struct edid *edid_read;
+	int ret = 0;
+
+	if (!connector->edid_blob_ptr)
+		return false;
+
+	edid_blob = drm_property_blob_get(connector->edid_blob_ptr);
+	if (!edid_blob)
+		return false;
+
+	if (!edid_blob->data || edid_blob->length != sizeof(struct edid))
+		goto out;
+
+	edid_stored = (struct edid *) edid_blob->data;
+
+	edid_read = drm_get_edid(connector, adapter);
+	if (!edid_read)
+		goto out;
+
+	ret = memcmp(edid_stored, edid_read, sizeof(struct edid));
+
+	kfree(edid_read);
+
+out:
+	drm_property_blob_put(edid_blob);
+
+	return ret != 0;
+}
+EXPORT_SYMBOL_GPL(drm_check_edid_changed);
diff --git a/include/drm/drm_edid.h b/include/drm/drm_edid.h
index 1e1908a6b1d6..593a97b269c3 100644
--- a/include/drm/drm_edid.h
+++ b/include/drm/drm_edid.h
@@ -485,4 +485,7 @@ void drm_edid_get_monitor_name(struct edid *edid, char *name,
 struct drm_display_mode *drm_mode_find_dmt(struct drm_device *dev,
 					   int hsize, int vsize, int fresh,
 					   bool rb);
+bool drm_check_edid_changed(struct drm_connector *connector,
+			    struct i2c_adapter *adapter);
+
 #endif /* __DRM_EDID_H__ */
-- 
2.13.2

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2017-07-26 15:09 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-07-24 14:54 [PATCH 1/2] drm/edid: Add helper to detect whether EDID changed Paul Kocialkowski
2017-07-24 14:54 ` [PATCH 2/2] drm/i915: Detect monitor change from EDID change after resume Paul Kocialkowski
2017-07-24 16:00 ` [PATCH 1/2] drm/edid: Add helper to detect whether EDID changed Harry Wentland
2017-07-24 16:11 ` ✗ Fi.CI.BAT: warning for series starting with [1/2] " Patchwork
2017-07-25  6:53 ` [PATCH 1/2] " Daniel Vetter
2017-07-25  7:25   ` Paul Kocialkowski
2017-07-25  7:34     ` Daniel Vetter
2017-07-25  7:58       ` Paul Kocialkowski
2017-07-25  8:16         ` Daniel Vetter
2017-07-25 12:18           ` Paul Kocialkowski
2017-07-25 15:50             ` Daniel Vetter
2017-07-26 15:09               ` Paul Kocialkowski

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).