Commit ccc97def authored by Jani Nikula's avatar Jani Nikula

drm/edid: track invalid blocks in drm_do_get_edid()

Track invalid blocks instead of valid extensions to minimize impact on
the happy day scenario, and hide the details in the separate function.

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/6215f85b01c579a44c66129d2b5f41e1ab9294de.1648752228.git.jani.nikula@intel.com
parent 4ec53461
...@@ -1824,9 +1824,10 @@ bool drm_edid_is_valid(struct edid *edid) ...@@ -1824,9 +1824,10 @@ 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, static struct edid *edid_filter_invalid_blocks(const struct edid *edid,
int valid_extensions) int invalid_blocks)
{ {
struct edid *new, *dest_block; struct edid *new, *dest_block;
int valid_extensions = edid->extensions - invalid_blocks;
int i; int i;
new = kmalloc_array(valid_extensions + 1, EDID_LENGTH, GFP_KERNEL); new = kmalloc_array(valid_extensions + 1, EDID_LENGTH, GFP_KERNEL);
...@@ -2062,7 +2063,7 @@ struct edid *drm_do_get_edid(struct drm_connector *connector, ...@@ -2062,7 +2063,7 @@ struct edid *drm_do_get_edid(struct drm_connector *connector,
size_t len), size_t len),
void *data) void *data)
{ {
int j, valid_extensions = 0; int j, invalid_blocks = 0;
struct edid *edid, *new, *override; struct edid *edid, *new, *override;
override = drm_get_override_edid(connector); override = drm_get_override_edid(connector);
...@@ -2073,12 +2074,10 @@ struct edid *drm_do_get_edid(struct drm_connector *connector, ...@@ -2073,12 +2074,10 @@ struct edid *drm_do_get_edid(struct drm_connector *connector,
if (!edid) if (!edid)
return NULL; return NULL;
/* if there's no extensions or no connector, we're done */ if (edid->extensions == 0)
valid_extensions = edid->extensions;
if (valid_extensions == 0)
return edid; return edid;
new = krealloc(edid, (valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL); new = krealloc(edid, (edid->extensions + 1) * EDID_LENGTH, GFP_KERNEL);
if (!new) if (!new)
goto out; goto out;
edid = new; edid = new;
...@@ -2095,13 +2094,13 @@ struct edid *drm_do_get_edid(struct drm_connector *connector, ...@@ -2095,13 +2094,13 @@ struct edid *drm_do_get_edid(struct drm_connector *connector,
} }
if (try == 4) if (try == 4)
valid_extensions--; invalid_blocks++;
} }
if (valid_extensions != edid->extensions) { if (invalid_blocks) {
connector_bad_edid(connector, (u8 *)edid, edid->extensions + 1); connector_bad_edid(connector, (u8 *)edid, edid->extensions + 1);
edid = edid_filter_invalid_blocks(edid, valid_extensions); edid = edid_filter_invalid_blocks(edid, invalid_blocks);
} }
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