Rev 1428 | Rev 1963 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 1428 | Rev 1430 | ||
---|---|---|---|
Line 58... | Line 58... | ||
58 | #define EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE (1 << 4) |
58 | #define EDID_QUIRK_DETAILED_USE_MAXIMUM_SIZE (1 << 4) |
59 | /* Monitor forgot to set the first detailed is preferred bit. */ |
59 | /* Monitor forgot to set the first detailed is preferred bit. */ |
60 | #define EDID_QUIRK_FIRST_DETAILED_PREFERRED (1 << 5) |
60 | #define EDID_QUIRK_FIRST_DETAILED_PREFERRED (1 << 5) |
61 | /* use +hsync +vsync for detailed mode */ |
61 | /* use +hsync +vsync for detailed mode */ |
62 | #define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6) |
62 | #define EDID_QUIRK_DETAILED_SYNC_PP (1 << 6) |
63 | /* define the number of Extension EDID block */ |
- | |
64 | #define MAX_EDID_EXT_NUM 4 |
- | |
- | 63 | ||
Line 65... | Line 64... | ||
65 | 64 | ||
66 | #define LEVEL_DMT 0 |
65 | #define LEVEL_DMT 0 |
67 | #define LEVEL_GTF 1 |
66 | #define LEVEL_GTF 1 |
Line 112... | Line 111... | ||
112 | static const u8 edid_header[] = { |
111 | static const u8 edid_header[] = { |
113 | 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 |
112 | 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00 |
114 | }; |
113 | }; |
Line 115... | Line 114... | ||
115 | 114 | ||
116 | /** |
115 | /** |
117 | * edid_is_valid - sanity check EDID data |
116 | * drm_edid_is_valid - sanity check EDID data |
118 | * @edid: EDID data |
117 | * @edid: EDID data |
119 | * |
118 | * |
120 | * Sanity check the EDID block by looking at the header, the version number |
119 | * Sanity check the EDID block by looking at the header, the version number |
121 | * and the checksum. Return 0 if the EDID doesn't check out, or 1 if it's |
120 | * and the checksum. Return 0 if the EDID doesn't check out, or 1 if it's |
122 | * valid. |
121 | * valid. |
123 | */ |
122 | */ |
124 | static bool edid_is_valid(struct edid *edid) |
123 | bool drm_edid_is_valid(struct edid *edid) |
125 | { |
124 | { |
126 | int i, score = 0; |
125 | int i, score = 0; |
127 | u8 csum = 0; |
126 | u8 csum = 0; |
Line 161... | Line 160... | ||
161 | // print_hex_dump_bytes(KERN_ERR, DUMP_PREFIX_NONE, raw_edid, EDID_LENGTH); |
160 | // print_hex_dump_bytes(KERN_ERR, DUMP_PREFIX_NONE, raw_edid, EDID_LENGTH); |
162 | // printk("\n"); |
161 | // printk("\n"); |
163 | } |
162 | } |
164 | return 0; |
163 | return 0; |
165 | } |
164 | } |
- | 165 | EXPORT_SYMBOL(drm_edid_is_valid); |
|
Line 166... | Line 166... | ||
166 | 166 | ||
167 | /** |
167 | /** |
168 | * edid_vendor - match a string against EDID's obfuscated vendor field |
168 | * edid_vendor - match a string against EDID's obfuscated vendor field |
169 | * @edid: EDID to match |
169 | * @edid: EDID to match |
Line 1110... | Line 1110... | ||
1110 | */ |
1110 | */ |
1111 | return 0; |
1111 | return 0; |
1112 | } |
1112 | } |
Line 1113... | Line 1113... | ||
1113 | 1113 | ||
1114 | /* Chose real EDID extension number */ |
1114 | /* Chose real EDID extension number */ |
1115 | edid_ext_num = edid->extensions > MAX_EDID_EXT_NUM ? |
1115 | edid_ext_num = edid->extensions > DRM_MAX_EDID_EXT_NUM ? |
Line 1116... | Line 1116... | ||
1116 | MAX_EDID_EXT_NUM : edid->extensions; |
1116 | DRM_MAX_EDID_EXT_NUM : edid->extensions; |
1117 | 1117 | ||
1118 | /* Find CEA extension */ |
1118 | /* Find CEA extension */ |
1119 | for (i = 0; i < edid_ext_num; i++) { |
1119 | for (i = 0; i < edid_ext_num; i++) { |
Line 1193... | Line 1193... | ||
1193 | int i; |
1193 | int i; |
Line 1194... | Line 1194... | ||
1194 | 1194 | ||
1195 | for (i = 0; i < 4; i++) { |
1195 | for (i = 0; i < 4; i++) { |
1196 | if (drm_do_probe_ddc_edid(adapter, buf, len)) |
1196 | if (drm_do_probe_ddc_edid(adapter, buf, len)) |
1197 | return -1; |
1197 | return -1; |
1198 | if (edid_is_valid((struct edid *)buf)) |
1198 | if (drm_edid_is_valid((struct edid *)buf)) |
1199 | return 0; |
1199 | return 0; |
Line 1200... | Line 1200... | ||
1200 | } |
1200 | } |
1201 | 1201 | ||
Line 1218... | Line 1218... | ||
1218 | struct i2c_adapter *adapter) |
1218 | struct i2c_adapter *adapter) |
1219 | { |
1219 | { |
1220 | int ret; |
1220 | int ret; |
1221 | struct edid *edid; |
1221 | struct edid *edid; |
Line 1222... | Line 1222... | ||
1222 | 1222 | ||
1223 | edid = kmalloc(EDID_LENGTH * (MAX_EDID_EXT_NUM + 1), |
1223 | edid = kmalloc(EDID_LENGTH * (DRM_MAX_EDID_EXT_NUM + 1), |
1224 | GFP_KERNEL); |
1224 | GFP_KERNEL); |
1225 | if (edid == NULL) { |
1225 | if (edid == NULL) { |
1226 | dev_warn(&connector->dev->pdev->dev, |
1226 | dev_warn(&connector->dev->pdev->dev, |
1227 | "Failed to allocate EDID\n"); |
1227 | "Failed to allocate EDID\n"); |
Line 1236... | Line 1236... | ||
1236 | 1236 | ||
1237 | /* There are EDID extensions to be read */ |
1237 | /* There are EDID extensions to be read */ |
1238 | if (edid->extensions != 0) { |
1238 | if (edid->extensions != 0) { |
Line 1239... | Line 1239... | ||
1239 | int edid_ext_num = edid->extensions; |
1239 | int edid_ext_num = edid->extensions; |
1240 | 1240 | ||
1241 | if (edid_ext_num > MAX_EDID_EXT_NUM) { |
1241 | if (edid_ext_num > DRM_MAX_EDID_EXT_NUM) { |
1242 | dev_warn(&connector->dev->pdev->dev, |
1242 | dev_warn(&connector->dev->pdev->dev, |
1243 | "The number of extension(%d) is " |
1243 | "The number of extension(%d) is " |
1244 | "over max (%d), actually read number (%d)\n", |
1244 | "over max (%d), actually read number (%d)\n", |
1245 | edid_ext_num, MAX_EDID_EXT_NUM, |
1245 | edid_ext_num, DRM_MAX_EDID_EXT_NUM, |
1246 | MAX_EDID_EXT_NUM); |
1246 | DRM_MAX_EDID_EXT_NUM); |
1247 | /* Reset EDID extension number to be read */ |
1247 | /* Reset EDID extension number to be read */ |
1248 | edid_ext_num = MAX_EDID_EXT_NUM; |
1248 | edid_ext_num = DRM_MAX_EDID_EXT_NUM; |
1249 | } |
1249 | } |
1250 | /* Read EDID including extensions too */ |
1250 | /* Read EDID including extensions too */ |
1251 | ret = drm_ddc_read_edid(connector, adapter, (char *)edid, |
1251 | ret = drm_ddc_read_edid(connector, adapter, (char *)edid, |
Line 1286... | Line 1286... | ||
1286 | /* No EDID or EDID extensions */ |
1286 | /* No EDID or EDID extensions */ |
1287 | if (edid == NULL || edid->extensions == 0) |
1287 | if (edid == NULL || edid->extensions == 0) |
1288 | goto end; |
1288 | goto end; |
Line 1289... | Line 1289... | ||
1289 | 1289 | ||
1290 | /* Chose real EDID extension number */ |
1290 | /* Chose real EDID extension number */ |
1291 | edid_ext_num = edid->extensions > MAX_EDID_EXT_NUM ? |
1291 | edid_ext_num = edid->extensions > DRM_MAX_EDID_EXT_NUM ? |
Line 1292... | Line 1292... | ||
1292 | MAX_EDID_EXT_NUM : edid->extensions; |
1292 | DRM_MAX_EDID_EXT_NUM : edid->extensions; |
1293 | 1293 | ||
1294 | /* Find CEA extension */ |
1294 | /* Find CEA extension */ |
1295 | for (i = 0; i < edid_ext_num; i++) { |
1295 | for (i = 0; i < edid_ext_num; i++) { |
Line 1344... | Line 1344... | ||
1344 | u32 quirks; |
1344 | u32 quirks; |
Line 1345... | Line 1345... | ||
1345 | 1345 | ||
1346 | if (edid == NULL) { |
1346 | if (edid == NULL) { |
1347 | return 0; |
1347 | return 0; |
1348 | } |
1348 | } |
1349 | if (!edid_is_valid(edid)) { |
1349 | if (!drm_edid_is_valid(edid)) { |
1350 | dev_warn(&connector->dev->pdev->dev, "%s: EDID invalid.\n", |
1350 | dev_warn(&connector->dev->pdev->dev, "%s: EDID invalid.\n", |
1351 | drm_get_connector_name(connector)); |
1351 | drm_get_connector_name(connector)); |
1352 | return 0; |
1352 | return 0; |