Subversion Repositories Kolibri OS

Rev

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;