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); |