OSDN Git Service

drm/edid: split out invalid block filtering to a separate function
authorJani Nikula <jani.nikula@intel.com>
Thu, 31 Mar 2022 18:45:07 +0000 (21:45 +0300)
committerJani Nikula <jani.nikula@intel.com>
Fri, 1 Apr 2022 14:44:46 +0000 (17:44 +0300)
It's such a special case there's no point in keeping it inline in the
happy day scenario, confusing matters.

v2: Rebase on the invalid block filtering fix

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/ea8ccd654b5beca6ccf99666754aea09c836b6a5.1648752228.git.jani.nikula@intel.com
drivers/gpu/drm/drm_edid.c

index e63a93f..32d9f2a 100644 (file)
@@ -1823,6 +1823,33 @@ bool drm_edid_is_valid(struct edid *edid)
 }
 EXPORT_SYMBOL(drm_edid_is_valid);
 
+static struct edid *edid_filter_invalid_blocks(const struct edid *edid,
+                                              int valid_extensions)
+{
+       struct edid *new, *dest_block;
+       int i;
+
+       new = kmalloc_array(valid_extensions + 1, EDID_LENGTH, GFP_KERNEL);
+       if (!new)
+               goto out;
+
+       dest_block = new;
+       for (i = 0; i <= edid->extensions; i++) {
+               const void *block = edid + i;
+
+               if (edid_block_valid(block, i == 0))
+                       memcpy(dest_block++, block, EDID_LENGTH);
+       }
+
+       new->checksum += new->extensions - valid_extensions;
+       new->extensions = valid_extensions;
+
+out:
+       kfree(edid);
+
+       return new;
+}
+
 #define DDC_SEGMENT_ADDR 0x30
 /**
  * drm_do_probe_ddc_edid() - get EDID information via I2C
@@ -2072,32 +2099,9 @@ struct edid *drm_do_get_edid(struct drm_connector *connector,
        }
 
        if (valid_extensions != edid->extensions) {
-               struct edid *dest_block;
-               int i;
-
                connector_bad_edid(connector, (u8 *)edid, edid->extensions + 1);
 
-               new = kmalloc_array(valid_extensions + 1, EDID_LENGTH,
-                                   GFP_KERNEL);
-               if (!new)
-                       goto out;
-
-               dest_block = new;
-               for (i = 0; i <= edid->extensions; i++) {
-                       void *block = edid + i;
-
-                       if (!edid_block_valid(block, i == 0))
-                               continue;
-
-                       memcpy(dest_block, block, EDID_LENGTH);
-                       dest_block++;
-               }
-
-               new->checksum += new->extensions - valid_extensions;
-               new->extensions = valid_extensions;
-
-               kfree(edid);
-               edid = new;
+               edid = edid_filter_invalid_blocks(edid, valid_extensions);
        }
 
        return edid;