Skip to content

Commit 6c9b3db

Browse files
committed
drm/edid: add function for checking drm_edid validity
We've lacked a function for immutable validity check on drm_edid. Add one. Signed-off-by: Jani Nikula <[email protected]> Reviewed-by: Ville Syrjälä <[email protected]> Link: https://patchwork.freedesktop.org/patch/msgid/f96188f64e9f7f3deff348d08296609353b12316.1666614699.git.jani.nikula@intel.com
1 parent b16c9e6 commit 6c9b3db

File tree

2 files changed

+31
-0
lines changed

2 files changed

+31
-0
lines changed

drivers/gpu/drm/drm_edid.c

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2040,6 +2040,36 @@ bool drm_edid_is_valid(struct edid *edid)
20402040
}
20412041
EXPORT_SYMBOL(drm_edid_is_valid);
20422042

2043+
/**
2044+
* drm_edid_valid - sanity check EDID data
2045+
* @drm_edid: EDID data
2046+
*
2047+
* Sanity check an EDID. Cross check block count against allocated size and
2048+
* checksum the blocks.
2049+
*
2050+
* Return: True if the EDID data is valid, false otherwise.
2051+
*/
2052+
bool drm_edid_valid(const struct drm_edid *drm_edid)
2053+
{
2054+
int i;
2055+
2056+
if (!drm_edid)
2057+
return false;
2058+
2059+
if (edid_size_by_blocks(__drm_edid_block_count(drm_edid)) != drm_edid->size)
2060+
return false;
2061+
2062+
for (i = 0; i < drm_edid_block_count(drm_edid); i++) {
2063+
const void *block = drm_edid_block_data(drm_edid, i);
2064+
2065+
if (!edid_block_valid(block, i == 0))
2066+
return false;
2067+
}
2068+
2069+
return true;
2070+
}
2071+
EXPORT_SYMBOL(drm_edid_valid);
2072+
20432073
static struct edid *edid_filter_invalid_blocks(struct edid *edid,
20442074
size_t *alloc_size)
20452075
{

include/drm/drm_edid.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -606,6 +606,7 @@ drm_display_mode_from_cea_vic(struct drm_device *dev,
606606
const struct drm_edid *drm_edid_alloc(const void *edid, size_t size);
607607
const struct drm_edid *drm_edid_dup(const struct drm_edid *drm_edid);
608608
void drm_edid_free(const struct drm_edid *drm_edid);
609+
bool drm_edid_valid(const struct drm_edid *drm_edid);
609610
const struct edid *drm_edid_raw(const struct drm_edid *drm_edid);
610611
const struct drm_edid *drm_edid_read(struct drm_connector *connector);
611612
const struct drm_edid *drm_edid_read_ddc(struct drm_connector *connector,

0 commit comments

Comments
 (0)