* @raw_edid: pointer to raw EDID block
  * @block: type of block to validate (0 for base, extension otherwise)
  * @print_bad_edid: if true, dump bad EDID blocks to the console
+ * @edid_corrupt: if true, the header or checksum is invalid
  *
  * Validate a base or extension EDID block and optionally dump bad blocks to
  * the console.
  *
  * Return: True if the block is valid, false otherwise.
  */
-bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid)
+bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid,
+                         bool *edid_corrupt)
 {
        u8 csum;
        struct edid *edid = (struct edid *)raw_edid;
 
        if (block == 0) {
                int score = drm_edid_header_is_valid(raw_edid);
-               if (score == 8) ;
-               else if (score >= edid_fixup) {
+               if (score == 8) {
+                       if (edid_corrupt)
+                               *edid_corrupt = 0;
+               } else if (score >= edid_fixup) {
+                       /* Displayport Link CTS Core 1.2 rev1.1 test 4.2.2.6
+                        * The corrupt flag needs to be set here otherwise, the
+                        * fix-up code here will correct the problem, the
+                        * checksum is correct and the test fails
+                        */
+                       if (edid_corrupt)
+                               *edid_corrupt = 1;
                        DRM_DEBUG("Fixing EDID header, your hardware may be failing\n");
                        memcpy(raw_edid, edid_header, sizeof(edid_header));
                } else {
+                       if (edid_corrupt)
+                               *edid_corrupt = 1;
                        goto bad;
                }
        }
                        DRM_ERROR("EDID checksum is invalid, remainder is %d\n", csum);
                }
 
+               if (edid_corrupt)
+                       *edid_corrupt = 1;
+
                /* allow CEA to slide through, switches mangle this */
                if (raw_edid[0] != 0x02)
                        goto bad;
                return false;
 
        for (i = 0; i <= edid->extensions; i++)
-               if (!drm_edid_block_valid(raw + i * EDID_LENGTH, i, true))
+               if (!drm_edid_block_valid(raw + i * EDID_LENGTH, i, true, NULL))
                        return false;
 
        return true;
        for (i = 0; i < 4; i++) {
                if (get_edid_block(data, block, 0, EDID_LENGTH))
                        goto out;
-               if (drm_edid_block_valid(block, 0, print_bad_edid))
+               if (drm_edid_block_valid(block, 0, print_bad_edid,
+                                        &connector->edid_corrupt))
                        break;
                if (i == 0 && drm_edid_is_zero(block, EDID_LENGTH)) {
                        connector->null_edid_counter++;
                                  block + (valid_extensions + 1) * EDID_LENGTH,
                                  j, EDID_LENGTH))
                                goto out;
-                       if (drm_edid_block_valid(block + (valid_extensions + 1) * EDID_LENGTH, j, print_bad_edid)) {
+                       if (drm_edid_block_valid(block + (valid_extensions + 1)
+                                                * EDID_LENGTH, j,
+                                                print_bad_edid,
+                                                NULL)) {
                                valid_extensions++;
                                break;
                        }
 
                goto out;
        }
 
-       if (!drm_edid_block_valid(edid, 0, print_bad_edid)) {
+       if (!drm_edid_block_valid(edid, 0, print_bad_edid,
+                                 &connector->edid_corrupt)) {
                connector->bad_edid_counter++;
                DRM_ERROR("Base block of EDID firmware \"%s\" is invalid ",
                    name);
                if (i != valid_extensions + 1)
                        memcpy(edid + (valid_extensions + 1) * EDID_LENGTH,
                            edid + i * EDID_LENGTH, EDID_LENGTH);
-               if (drm_edid_block_valid(edid + i * EDID_LENGTH, i, print_bad_edid))
+               if (drm_edid_block_valid(edid + i * EDID_LENGTH, i,
+                                        print_bad_edid,
+                                        NULL))
                        valid_extensions++;
        }
 
 
        int null_edid_counter; /* needed to workaround some HW bugs where we get all 0s */
        unsigned bad_edid_counter;
 
+       /* Flag for raw EDID header corruption - used in Displayport
+        * compliance testing - * Displayport Link CTS Core 1.2 rev1.1 4.2.2.6
+        */
+       bool edid_corrupt;
+
        struct dentry *debugfs_entry;
 
        struct drm_connector_state *state;
                                   int hpref, int vpref);
 
 extern int drm_edid_header_is_valid(const u8 *raw_edid);
-extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid);
+extern bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid,
+                                bool *edid_corrupt);
 extern bool drm_edid_is_valid(struct edid *edid);
 
 extern struct drm_tile_group *drm_mode_create_tile_group(struct drm_device *dev,