aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_edid.c
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2014-12-10 19:12:57 -0500
committerDave Airlie <airlied@redhat.com>2014-12-10 19:12:57 -0500
commitda9df2f41057d71102668f5ac6b3fc998118a59b (patch)
tree8061b865d05043cf25263040ef86d4f54549ce25 /drivers/gpu/drm/drm_edid.c
parentd1b8792b636f83804add26ec1ac90a686be19e49 (diff)
parenta18c0af171bfb875012da26f23df051004726973 (diff)
Merge tag 'topic/core-stuff-2014-12-10' of git://anongit.freedesktop.org/drm-intel into drm-next
Merge drm core fixes from Daniel. * tag 'topic/core-stuff-2014-12-10' of git://anongit.freedesktop.org/drm-intel: drm: Zero out DRM object memory upon cleanup drm: fix a typo in a comment drm: fix a word repetition in a comment drm: Fix memory leak at error path of drm_read() drm/Documentation: Fix rowspan value in drm-kms-properties drm/edid: Restore kerneldoc consistency drm/edid: new drm_edid_block_checksum helper function V3 drm/edid: shorten log output in case of all zeroes edid block drm/edid: move drm_edid_is_zero to top, make edid argument const
Diffstat (limited to 'drivers/gpu/drm/drm_edid.c')
-rw-r--r--drivers/gpu/drm/drm_edid.c43
1 files changed, 28 insertions, 15 deletions
diff --git a/drivers/gpu/drm/drm_edid.c b/drivers/gpu/drm/drm_edid.c
index 72fd8820e186..53bc7a628909 100644
--- a/drivers/gpu/drm/drm_edid.c
+++ b/drivers/gpu/drm/drm_edid.c
@@ -1017,6 +1017,25 @@ MODULE_PARM_DESC(edid_fixup,
1017 1017
1018static void drm_get_displayid(struct drm_connector *connector, 1018static void drm_get_displayid(struct drm_connector *connector,
1019 struct edid *edid); 1019 struct edid *edid);
1020
1021static int drm_edid_block_checksum(const u8 *raw_edid)
1022{
1023 int i;
1024 u8 csum = 0;
1025 for (i = 0; i < EDID_LENGTH; i++)
1026 csum += raw_edid[i];
1027
1028 return csum;
1029}
1030
1031static bool drm_edid_is_zero(const u8 *in_edid, int length)
1032{
1033 if (memchr_inv(in_edid, 0, length))
1034 return false;
1035
1036 return true;
1037}
1038
1020/** 1039/**
1021 * drm_edid_block_valid - Sanity check the EDID block (base or extension) 1040 * drm_edid_block_valid - Sanity check the EDID block (base or extension)
1022 * @raw_edid: pointer to raw EDID block 1041 * @raw_edid: pointer to raw EDID block
@@ -1030,8 +1049,7 @@ static void drm_get_displayid(struct drm_connector *connector,
1030 */ 1049 */
1031bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid) 1050bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid)
1032{ 1051{
1033 int i; 1052 u8 csum;
1034 u8 csum = 0;
1035 struct edid *edid = (struct edid *)raw_edid; 1053 struct edid *edid = (struct edid *)raw_edid;
1036 1054
1037 if (WARN_ON(!raw_edid)) 1055 if (WARN_ON(!raw_edid))
@@ -1051,8 +1069,7 @@ bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid)
1051 } 1069 }
1052 } 1070 }
1053 1071
1054 for (i = 0; i < EDID_LENGTH; i++) 1072 csum = drm_edid_block_checksum(raw_edid);
1055 csum += raw_edid[i];
1056 if (csum) { 1073 if (csum) {
1057 if (print_bad_edid) { 1074 if (print_bad_edid) {
1058 DRM_ERROR("EDID checksum is invalid, remainder is %d\n", csum); 1075 DRM_ERROR("EDID checksum is invalid, remainder is %d\n", csum);
@@ -1083,9 +1100,13 @@ bool drm_edid_block_valid(u8 *raw_edid, int block, bool print_bad_edid)
1083 1100
1084bad: 1101bad:
1085 if (print_bad_edid) { 1102 if (print_bad_edid) {
1086 printk(KERN_ERR "Raw EDID:\n"); 1103 if (drm_edid_is_zero(raw_edid, EDID_LENGTH)) {
1087 print_hex_dump(KERN_ERR, " \t", DUMP_PREFIX_NONE, 16, 1, 1104 printk(KERN_ERR "EDID block is all zeroes\n");
1105 } else {
1106 printk(KERN_ERR "Raw EDID:\n");
1107 print_hex_dump(KERN_ERR, " \t", DUMP_PREFIX_NONE, 16, 1,
1088 raw_edid, EDID_LENGTH, false); 1108 raw_edid, EDID_LENGTH, false);
1109 }
1089 } 1110 }
1090 return false; 1111 return false;
1091} 1112}
@@ -1118,7 +1139,7 @@ EXPORT_SYMBOL(drm_edid_is_valid);
1118#define DDC_SEGMENT_ADDR 0x30 1139#define DDC_SEGMENT_ADDR 0x30
1119/** 1140/**
1120 * drm_do_probe_ddc_edid() - get EDID information via I2C 1141 * drm_do_probe_ddc_edid() - get EDID information via I2C
1121 * @adapter: I2C device adaptor 1142 * @data: I2C device adapter
1122 * @buf: EDID data buffer to be filled 1143 * @buf: EDID data buffer to be filled
1123 * @block: 128 byte EDID block to start fetching from 1144 * @block: 128 byte EDID block to start fetching from
1124 * @len: EDID data buffer length to fetch 1145 * @len: EDID data buffer length to fetch
@@ -1179,14 +1200,6 @@ drm_do_probe_ddc_edid(void *data, u8 *buf, unsigned int block, size_t len)
1179 return ret == xfers ? 0 : -1; 1200 return ret == xfers ? 0 : -1;
1180} 1201}
1181 1202
1182static bool drm_edid_is_zero(u8 *in_edid, int length)
1183{
1184 if (memchr_inv(in_edid, 0, length))
1185 return false;
1186
1187 return true;
1188}
1189
1190/** 1203/**
1191 * drm_do_get_edid - get EDID data using a custom EDID block read function 1204 * drm_do_get_edid - get EDID data using a custom EDID block read function
1192 * @connector: connector we're probing 1205 * @connector: connector we're probing