diff --git a/common/edid.c b/common/edid.c index e66108f24a..df797fcdd5 100644 --- a/common/edid.c +++ b/common/edid.c @@ -12,6 +12,7 @@ #include #include +#include #include #include @@ -29,6 +30,17 @@ int edid_check_info(struct edid1_info *edid_info) return 0; } +int edid_check_checksum(u8 *edid_block) +{ + u8 checksum = 0; + int i; + + for (i = 0; i < 128; i++) + checksum += edid_block[i]; + + return (checksum == 0) ? 0 : -EINVAL; +} + int edid_get_ranges(struct edid1_info *edid, unsigned int *hmin, unsigned int *hmax, unsigned int *vmin, unsigned int *vmax) diff --git a/include/edid.h b/include/edid.h index d3cc5232de..a69f43a206 100644 --- a/include/edid.h +++ b/include/edid.h @@ -245,6 +245,15 @@ void edid_print_info(struct edid1_info *edid_info); */ int edid_check_info(struct edid1_info *info); +/** + * Check checksum of a 128 bytes EDID data block + * + * @param edid_block EDID block data + * + * @return 0 on success, or a negative errno on error + */ +int edid_check_checksum(u8 *edid_block); + /** * Get the horizontal and vertical rate ranges of the monitor. *