}
 
 /* Get override or firmware EDID */
-static struct edid *drm_get_override_edid(struct drm_connector *connector,
-                                         size_t *alloc_size)
+static const struct drm_edid *drm_edid_override_get(struct drm_connector *connector)
 {
-       struct edid *override = NULL;
+       const struct drm_edid *override = NULL;
 
        mutex_lock(&connector->edid_override_mutex);
 
        if (connector->edid_override)
-               override = drm_edid_duplicate(connector->edid_override->edid);
+               override = drm_edid_dup(connector->edid_override);
 
        mutex_unlock(&connector->edid_override_mutex);
 
        if (!override)
                override = drm_edid_load_firmware(connector);
 
-       /* FIXME: Get alloc size from deeper down the stack */
-       if (!IS_ERR_OR_NULL(override) && alloc_size)
-               *alloc_size = edid_size(override);
-
        return IS_ERR(override) ? NULL : override;
 }
 
  */
 int drm_edid_override_connector_update(struct drm_connector *connector)
 {
-       struct edid *override;
+       const struct drm_edid *override;
        int num_modes = 0;
 
-       override = drm_get_override_edid(connector, NULL);
+       override = drm_edid_override_get(connector);
        if (override) {
-               drm_connector_update_edid_property(connector, override);
-               num_modes = drm_add_edid_modes(connector, override);
-               kfree(override);
+               num_modes = drm_edid_connector_update(connector, override);
+
+               drm_edid_free(override);
 
                DRM_DEBUG_KMS("[CONNECTOR:%d:%s] adding %d modes via fallback override/firmware EDID\n",
                              connector->base.id, connector->name, num_modes);
 {
        enum edid_block_status status;
        int i, num_blocks, invalid_blocks = 0;
+       const struct drm_edid *override;
        struct edid *edid, *new;
        size_t alloc_size = EDID_LENGTH;
 
-       edid = drm_get_override_edid(connector, &alloc_size);
-       if (edid)
+       override = drm_edid_override_get(connector);
+       if (override) {
+               alloc_size = override->size;
+               edid = kmemdup(override->edid, alloc_size, GFP_KERNEL);
+               drm_edid_free(override);
+               if (!edid)
+                       return NULL;
                goto ok;
+       }
 
        edid = kmalloc(alloc_size, GFP_KERNEL);
        if (!edid)
 
        },
 };
 
-static int edid_size(const u8 *edid, int data_size)
-{
-       if (data_size < EDID_LENGTH)
-               return 0;
-
-       return (edid[0x7e] + 1) * EDID_LENGTH;
-}
-
-static void *edid_load(struct drm_connector *connector, const char *name)
+static const struct drm_edid *edid_load(struct drm_connector *connector, const char *name)
 {
        const struct firmware *fw = NULL;
        const u8 *fwdata;
-       u8 *edid;
+       const struct drm_edid *drm_edid;
        int fwsize, builtin;
-       int i, valid_extensions = 0;
-       bool print_bad_edid = !connector->bad_edid_counter || drm_debug_enabled(DRM_UT_KMS);
 
        builtin = match_string(generic_edid_name, GENERIC_EDIDS, name);
        if (builtin >= 0) {
                fwsize = fw->size;
        }
 
-       if (edid_size(fwdata, fwsize) != fwsize) {
-               DRM_ERROR("Size of EDID firmware \"%s\" is invalid "
-                         "(expected %d, got %d\n", name,
-                         edid_size(fwdata, fwsize), (int)fwsize);
-               edid = ERR_PTR(-EINVAL);
-               goto out;
-       }
-
-       edid = kmemdup(fwdata, fwsize, GFP_KERNEL);
-       if (edid == NULL) {
-               edid = ERR_PTR(-ENOMEM);
-               goto out;
-       }
-
-       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);
-               kfree(edid);
-               edid = ERR_PTR(-EINVAL);
-               goto out;
-       }
-
-       for (i = 1; i <= edid[0x7e]; i++) {
-               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,
-                                        NULL))
-                       valid_extensions++;
-       }
-
-       if (valid_extensions != edid[0x7e]) {
-               u8 *new_edid;
+       drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Loaded %s firmware EDID \"%s\"\n",
+                   connector->base.id, connector->name,
+                   builtin >= 0 ? "built-in" : "external", name);
 
-               edid[EDID_LENGTH-1] += edid[0x7e] - valid_extensions;
-               DRM_INFO("Found %d valid extensions instead of %d in EDID data "
-                   "\"%s\" for connector \"%s\"\n", valid_extensions,
-                   edid[0x7e], name, connector->name);
-               edid[0x7e] = valid_extensions;
-
-               new_edid = krealloc(edid, (valid_extensions + 1) * EDID_LENGTH,
-                                   GFP_KERNEL);
-               if (new_edid)
-                       edid = new_edid;
+       drm_edid = drm_edid_alloc(fwdata, fwsize);
+       if (!drm_edid_valid(drm_edid)) {
+               drm_err(connector->dev, "Invalid firmware EDID \"%s\"\n", name);
+               drm_edid_free(drm_edid);
+               drm_edid = ERR_PTR(-EINVAL);
        }
 
-       DRM_INFO("Got %s EDID base block and %d extension%s from "
-           "\"%s\" for connector \"%s\"\n", (builtin >= 0) ? "built-in" :
-           "external", valid_extensions, valid_extensions == 1 ? "" : "s",
-           name, connector->name);
-
-out:
        release_firmware(fw);
-       return edid;
+
+       return drm_edid;
 }
 
-struct edid *drm_edid_load_firmware(struct drm_connector *connector)
+const struct drm_edid *drm_edid_load_firmware(struct drm_connector *connector)
 {
        char *edidname, *last, *colon, *fwstr, *edidstr, *fallback = NULL;
-       struct edid *edid;
+       const struct drm_edid *drm_edid;
 
        if (edid_firmware[0] == '\0')
                return ERR_PTR(-ENOENT);
        if (*last == '\n')
                *last = '\0';
 
-       edid = edid_load(connector, edidname);
+       drm_edid = edid_load(connector, edidname);
+
        kfree(fwstr);
 
-       return edid;
+       return drm_edid;
 }