Commit 4ec53461 authored by Jani Nikula's avatar Jani Nikula

drm/edid: split out invalid block filtering to a separate function

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: default avatarJani Nikula <jani.nikula@intel.com>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/ea8ccd654b5beca6ccf99666754aea09c836b6a5.1648752228.git.jani.nikula@intel.com
parent 23e38d7b
...@@ -1823,6 +1823,33 @@ bool drm_edid_is_valid(struct edid *edid) ...@@ -1823,6 +1823,33 @@ bool drm_edid_is_valid(struct edid *edid)
} }
EXPORT_SYMBOL(drm_edid_is_valid); 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 #define DDC_SEGMENT_ADDR 0x30
/** /**
* drm_do_probe_ddc_edid() - get EDID information via I2C * drm_do_probe_ddc_edid() - get EDID information via I2C
...@@ -2072,32 +2099,9 @@ struct edid *drm_do_get_edid(struct drm_connector *connector, ...@@ -2072,32 +2099,9 @@ struct edid *drm_do_get_edid(struct drm_connector *connector,
} }
if (valid_extensions != edid->extensions) { if (valid_extensions != edid->extensions) {
struct edid *dest_block;
int i;
connector_bad_edid(connector, (u8 *)edid, edid->extensions + 1); connector_bad_edid(connector, (u8 *)edid, edid->extensions + 1);
new = kmalloc_array(valid_extensions + 1, EDID_LENGTH, edid = edid_filter_invalid_blocks(edid, valid_extensions);
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;
} }
return edid; return edid;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment