drm: Add helper to compare edids.
authorStanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Tue, 30 Jun 2020 00:26:58 +0000 (05:56 +0530)
committerMaarten Lankhorst <maarten.lankhorst@linux.intel.com>
Tue, 30 Jun 2020 11:31:15 +0000 (13:31 +0200)
Many drivers would benefit from using
drm helper to compare edid, rather
than bothering with own implementation.

v2: Added documentation for this function.

Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com>
Signed-off-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200630002700.5451-2-kunal1.joshi@intel.com
drivers/gpu/drm/drm_edid.c
include/drm/drm_edid.h

index 71ae0cd..920ac9e 100644 (file)
@@ -1616,6 +1616,39 @@ static bool drm_edid_is_zero(const u8 *in_edid, int length)
 }
 
 /**
+ * drm_edid_are_equal - compare two edid blobs.
+ * @edid1: pointer to first blob
+ * @edid2: pointer to second blob
+ * This helper can be used during probing to determine if
+ * edid had changed.
+ */
+bool drm_edid_are_equal(const struct edid *edid1, const struct edid *edid2)
+{
+       int edid1_len, edid2_len;
+       bool edid1_present = edid1 != NULL;
+       bool edid2_present = edid2 != NULL;
+
+       if (edid1_present != edid2_present)
+               return false;
+
+       if (edid1) {
+
+               edid1_len = EDID_LENGTH * (1 + edid1->extensions);
+               edid2_len = EDID_LENGTH * (1 + edid2->extensions);
+
+               if (edid1_len != edid2_len)
+                       return false;
+
+               if (memcmp(edid1, edid2, edid1_len))
+                       return false;
+       }
+
+       return true;
+}
+EXPORT_SYMBOL(drm_edid_are_equal);
+
+
+/**
  * drm_edid_block_valid - Sanity check the EDID block (base or extension)
  * @raw_edid: pointer to raw EDID block
  * @block: type of block to validate (0 for base, extension otherwise)
index 4325431..cfa4f5a 100644 (file)
@@ -359,6 +359,15 @@ drm_load_edid_firmware(struct drm_connector *connector)
 }
 #endif
 
+/**
+ * drm_edid_are_equal - compare two edid blobs.
+ * @edid1: pointer to first blob
+ * @edid2: pointer to second blob
+ * This helper can be used during probing to determine if
+ * edid had changed.
+ */
+bool drm_edid_are_equal(const struct edid *edid1, const struct edid *edid2);
+
 int
 drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
                                         const struct drm_connector *connector,