Subversion Repositories Kolibri OS

Rev

Rev 6937 | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6937 Rev 7144
Line 30... Line 30...
30
#include 
30
#include 
31
#include 
31
#include 
32
#include 
32
#include 
33
#include 
33
#include 
34
#include 
34
#include 
-
 
35
#include 
35
#include 
36
#include 
36
#include 
37
#include 
37
#include 
38
#include 
Line 38... Line 39...
38
 
39
 
Line 202... Line 203...
202
	{ DRM_MODE("848x480", DRM_MODE_TYPE_DRIVER, 33750, 848, 864,
203
	{ DRM_MODE("848x480", DRM_MODE_TYPE_DRIVER, 33750, 848, 864,
203
		   976, 1088, 0, 480, 486, 494, 517, 0,
204
		   976, 1088, 0, 480, 486, 494, 517, 0,
204
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
205
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) },
205
	/* 0x0f - 1024x768@43Hz, interlace */
206
	/* 0x0f - 1024x768@43Hz, interlace */
206
	{ DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER, 44900, 1024, 1032,
207
	{ DRM_MODE("1024x768i", DRM_MODE_TYPE_DRIVER, 44900, 1024, 1032,
207
		   1208, 1264, 0, 768, 768, 772, 817, 0,
208
		   1208, 1264, 0, 768, 768, 776, 817, 0,
208
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
209
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC |
209
		   DRM_MODE_FLAG_INTERLACE) },
210
		   DRM_MODE_FLAG_INTERLACE) },
210
	/* 0x10 - 1024x768@60Hz */
211
	/* 0x10 - 1024x768@60Hz */
211
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
212
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 65000, 1024, 1048,
212
		   1184, 1344, 0, 768, 771, 777, 806, 0,
213
		   1184, 1344, 0, 768, 771, 777, 806, 0,
Line 519... Line 520...
519
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@56Hz */
520
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 800x600@56Hz */
520
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656,
521
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 656,
521
		   720, 840, 0, 480, 481, 484, 500, 0,
522
		   720, 840, 0, 480, 481, 484, 500, 0,
522
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@75Hz */
523
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@75Hz */
523
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664,
524
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 31500, 640, 664,
524
		   704,  832, 0, 480, 489, 491, 520, 0,
525
		   704,  832, 0, 480, 489, 492, 520, 0,
525
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@72Hz */
526
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@72Hz */
526
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 30240, 640, 704,
527
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 30240, 640, 704,
527
		   768,  864, 0, 480, 483, 486, 525, 0,
528
		   768,  864, 0, 480, 483, 486, 525, 0,
528
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@67Hz */
529
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@67Hz */
529
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25200, 640, 656,
530
	{ DRM_MODE("640x480", DRM_MODE_TYPE_DRIVER, 25175, 640, 656,
530
		   752, 800, 0, 480, 490, 492, 525, 0,
531
		   752, 800, 0, 480, 490, 492, 525, 0,
531
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@60Hz */
532
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 640x480@60Hz */
532
	{ DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 738,
533
	{ DRM_MODE("720x400", DRM_MODE_TYPE_DRIVER, 35500, 720, 738,
533
		   846, 900, 0, 400, 421, 423,  449, 0,
534
		   846, 900, 0, 400, 421, 423,  449, 0,
534
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 720x400@88Hz */
535
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 720x400@88Hz */
Line 536... Line 537...
536
		   846,  900, 0, 400, 412, 414, 449, 0,
537
		   846,  900, 0, 400, 412, 414, 449, 0,
537
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 720x400@70Hz */
538
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 720x400@70Hz */
538
	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296,
539
	{ DRM_MODE("1280x1024", DRM_MODE_TYPE_DRIVER, 135000, 1280, 1296,
539
		   1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
540
		   1440, 1688, 0, 1024, 1025, 1028, 1066, 0,
540
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1280x1024@75Hz */
541
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1280x1024@75Hz */
541
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78800, 1024, 1040,
542
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 78750, 1024, 1040,
542
		   1136, 1312, 0,  768, 769, 772, 800, 0,
543
		   1136, 1312, 0,  768, 769, 772, 800, 0,
543
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1024x768@75Hz */
544
		   DRM_MODE_FLAG_PHSYNC | DRM_MODE_FLAG_PVSYNC) }, /* 1024x768@75Hz */
544
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048,
545
	{ DRM_MODE("1024x768", DRM_MODE_TYPE_DRIVER, 75000, 1024, 1048,
545
		   1184, 1328, 0,  768, 771, 777, 806, 0,
546
		   1184, 1328, 0,  768, 771, 777, 806, 0,
546
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@70Hz */
547
		   DRM_MODE_FLAG_NHSYNC | DRM_MODE_FLAG_NVSYNC) }, /* 1024x768@70Hz */
Line 1393... Line 1394...
1393
	return edid;
1394
	return edid;
1394
}
1395
}
1395
EXPORT_SYMBOL(drm_get_edid);
1396
EXPORT_SYMBOL(drm_get_edid);
Line 1396... Line 1397...
1396
 
1397
 
-
 
1398
/**
-
 
1399
 * drm_get_edid_switcheroo - get EDID data for a vga_switcheroo output
-
 
1400
 * @connector: connector we're probing
-
 
1401
 * @adapter: I2C adapter to use for DDC
-
 
1402
 *
-
 
1403
 * Wrapper around drm_get_edid() for laptops with dual GPUs using one set of
-
 
1404
 * outputs. The wrapper adds the requisite vga_switcheroo calls to temporarily
-
 
1405
 * switch DDC to the GPU which is retrieving EDID.
-
 
1406
 *
-
 
1407
 * Return: Pointer to valid EDID or %NULL if we couldn't find any.
-
 
1408
 */
-
 
1409
struct edid *drm_get_edid_switcheroo(struct drm_connector *connector,
-
 
1410
				     struct i2c_adapter *adapter)
-
 
1411
{
-
 
1412
	struct pci_dev *pdev = connector->dev->pdev;
-
 
1413
	struct edid *edid;
-
 
1414
 
-
 
1415
	vga_switcheroo_lock_ddc(pdev);
-
 
1416
	edid = drm_get_edid(connector, adapter);
-
 
1417
	vga_switcheroo_unlock_ddc(pdev);
-
 
1418
 
-
 
1419
	return edid;
-
 
1420
}
-
 
1421
EXPORT_SYMBOL(drm_get_edid_switcheroo);
-
 
1422
 
1397
/**
1423
/**
1398
 * drm_edid_duplicate - duplicate an EDID and the extensions
1424
 * drm_edid_duplicate - duplicate an EDID and the extensions
1399
 * @edid: EDID to duplicate
1425
 * @edid: EDID to duplicate
1400
 *
1426
 *
1401
 * Return: Pointer to duplicated EDID or NULL on allocation failure.
1427
 * Return: Pointer to duplicated EDID or NULL on allocation failure.
Line 2213... Line 2239...
2213
static int
2239
static int
2214
drm_est3_modes(struct drm_connector *connector, struct detailed_timing *timing)
2240
drm_est3_modes(struct drm_connector *connector, struct detailed_timing *timing)
2215
{
2241
{
2216
	int i, j, m, modes = 0;
2242
	int i, j, m, modes = 0;
2217
	struct drm_display_mode *mode;
2243
	struct drm_display_mode *mode;
2218
	u8 *est = ((u8 *)timing) + 5;
2244
	u8 *est = ((u8 *)timing) + 6;
Line 2219... Line 2245...
2219
 
2245
 
2220
	for (i = 0; i < 6; i++) {
2246
	for (i = 0; i < 6; i++) {
2221
		for (j = 7; j >= 0; j--) {
2247
		for (j = 7; j >= 0; j--) {
2222
			m = (i * 8) + (7 - j);
2248
			m = (i * 8) + (7 - j);
Line 3280... Line 3306...
3280
{
3306
{
3281
	uint8_t *eld = connector->eld;
3307
	uint8_t *eld = connector->eld;
3282
	u8 *cea;
3308
	u8 *cea;
3283
	u8 *name;
3309
	u8 *name;
3284
	u8 *db;
3310
	u8 *db;
3285
	int sad_count = 0;
3311
	int total_sad_count = 0;
3286
	int mnl;
3312
	int mnl;
3287
	int dbl;
3313
	int dbl;
Line 3288... Line 3314...
3288
 
3314
 
Line 3294... Line 3320...
3294
		return;
3320
		return;
3295
	}
3321
	}
Line 3296... Line 3322...
3296
 
3322
 
3297
	name = NULL;
3323
	name = NULL;
-
 
3324
	drm_for_each_detailed_block((u8 *)edid, monitor_name, &name);
3298
	drm_for_each_detailed_block((u8 *)edid, monitor_name, &name);
3325
	/* max: 13 bytes EDID, 16 bytes ELD */
3299
	for (mnl = 0; name && mnl < 13; mnl++) {
3326
	for (mnl = 0; name && mnl < 13; mnl++) {
3300
		if (name[mnl] == 0x0a)
3327
		if (name[mnl] == 0x0a)
3301
			break;
3328
			break;
3302
		eld[20 + mnl] = name[mnl];
3329
		eld[20 + mnl] = name[mnl];
Line 3322... Line 3349...
3322
		for_each_cea_db(cea, i, start, end) {
3349
		for_each_cea_db(cea, i, start, end) {
3323
			db = &cea[i];
3350
			db = &cea[i];
3324
			dbl = cea_db_payload_len(db);
3351
			dbl = cea_db_payload_len(db);
Line 3325... Line 3352...
3325
 
3352
 
-
 
3353
			switch (cea_db_tag(db)) {
-
 
3354
				int sad_count;
3326
			switch (cea_db_tag(db)) {
3355
 
3327
			case AUDIO_BLOCK:
3356
			case AUDIO_BLOCK:
3328
				/* Audio Data Block, contains SADs */
3357
				/* Audio Data Block, contains SADs */
3329
				sad_count = dbl / 3;
3358
				sad_count = min(dbl / 3, 15 - total_sad_count);
3330
				if (dbl >= 1)
3359
				if (sad_count >= 1)
-
 
3360
					memcpy(eld + 20 + mnl + total_sad_count * 3,
-
 
3361
					       &db[1], sad_count * 3);
3331
					memcpy(eld + 20 + mnl, &db[1], dbl);
3362
				total_sad_count += sad_count;
3332
				break;
3363
				break;
3333
			case SPEAKER_BLOCK:
3364
			case SPEAKER_BLOCK:
3334
				/* Speaker Allocation Data Block */
3365
				/* Speaker Allocation Data Block */
3335
				if (dbl >= 1)
3366
				if (dbl >= 1)
Line 3343... Line 3374...
3343
			default:
3374
			default:
3344
				break;
3375
				break;
3345
			}
3376
			}
3346
		}
3377
		}
3347
	}
3378
	}
3348
	eld[5] |= sad_count << 4;
3379
	eld[5] |= total_sad_count << 4;
Line 3349... Line 3380...
3349
 
3380
 
3350
	eld[DRM_ELD_BASELINE_ELD_LEN] =
3381
	eld[DRM_ELD_BASELINE_ELD_LEN] =
Line 3351... Line 3382...
3351
		DIV_ROUND_UP(drm_eld_calc_baseline_block_size(eld), 4);
3382
		DIV_ROUND_UP(drm_eld_calc_baseline_block_size(eld), 4);
3352
 
3383
 
3353
	DRM_DEBUG_KMS("ELD size %d, SAD count %d\n",
3384
	DRM_DEBUG_KMS("ELD size %d, SAD count %d\n",
3354
		      drm_eld_size(eld), sad_count);
3385
		      drm_eld_size(eld), total_sad_count);
Line 3355... Line 3386...
3355
}
3386
}
3356
EXPORT_SYMBOL(drm_edid_to_eld);
3387
EXPORT_SYMBOL(drm_edid_to_eld);