Lines Matching +full:abs +full:- +full:fuzz
3 * Copyright (c) 2007-2008 Intel Corporation
24 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
48 (((edid)->version > (maj)) || \
49 ((edid)->version == (maj) && (edid)->revision > (min)))
76 /* Force reduced-blanking timings for detailed modes */
115 /* BOE model on HP Pavilion 15-n233sl reports 8 bpc, but is a 6 bpc panel */
121 /* SDC panel of Lenovo B50-80 reports 8 bpc, but is a 6 bpc panel */
131 /* Envision Peripherals, Inc. EN-7100e */
143 /* LG Philips LCD LP154W01-A5 */
149 /* Samsung SyncMaster 22[5-6]BW */
153 /* Sony PVM-2541A does up to 12 bpc, but only reports max 8 bpc */
165 /* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */
168 /* Rotel RSX-1058 forwards sink's EDID but only does HDMI 1.1*/
225 /* 0x01 - 640x350@85Hz */
229 /* 0x02 - 640x400@85Hz */
233 /* 0x03 - 720x400@85Hz */
237 /* 0x04 - 640x480@60Hz */
241 /* 0x05 - 640x480@72Hz */
245 /* 0x06 - 640x480@75Hz */
249 /* 0x07 - 640x480@85Hz */
253 /* 0x08 - 800x600@56Hz */
257 /* 0x09 - 800x600@60Hz */
261 /* 0x0a - 800x600@72Hz */
265 /* 0x0b - 800x600@75Hz */
269 /* 0x0c - 800x600@85Hz */
273 /* 0x0d - 800x600@120Hz RB */
277 /* 0x0e - 848x480@60Hz */
281 /* 0x0f - 1024x768@43Hz, interlace */
286 /* 0x10 - 1024x768@60Hz */
290 /* 0x11 - 1024x768@70Hz */
294 /* 0x12 - 1024x768@75Hz */
298 /* 0x13 - 1024x768@85Hz */
302 /* 0x14 - 1024x768@120Hz RB */
306 /* 0x15 - 1152x864@75Hz */
310 /* 0x55 - 1280x720@60Hz */
314 /* 0x16 - 1280x768@60Hz RB */
318 /* 0x17 - 1280x768@60Hz */
322 /* 0x18 - 1280x768@75Hz */
326 /* 0x19 - 1280x768@85Hz */
330 /* 0x1a - 1280x768@120Hz RB */
334 /* 0x1b - 1280x800@60Hz RB */
338 /* 0x1c - 1280x800@60Hz */
342 /* 0x1d - 1280x800@75Hz */
346 /* 0x1e - 1280x800@85Hz */
350 /* 0x1f - 1280x800@120Hz RB */
354 /* 0x20 - 1280x960@60Hz */
358 /* 0x21 - 1280x960@85Hz */
362 /* 0x22 - 1280x960@120Hz RB */
366 /* 0x23 - 1280x1024@60Hz */
370 /* 0x24 - 1280x1024@75Hz */
374 /* 0x25 - 1280x1024@85Hz */
378 /* 0x26 - 1280x1024@120Hz RB */
382 /* 0x27 - 1360x768@60Hz */
386 /* 0x28 - 1360x768@120Hz RB */
390 /* 0x51 - 1366x768@60Hz */
394 /* 0x56 - 1366x768@60Hz */
398 /* 0x29 - 1400x1050@60Hz RB */
402 /* 0x2a - 1400x1050@60Hz */
406 /* 0x2b - 1400x1050@75Hz */
410 /* 0x2c - 1400x1050@85Hz */
414 /* 0x2d - 1400x1050@120Hz RB */
418 /* 0x2e - 1440x900@60Hz RB */
422 /* 0x2f - 1440x900@60Hz */
426 /* 0x30 - 1440x900@75Hz */
430 /* 0x31 - 1440x900@85Hz */
434 /* 0x32 - 1440x900@120Hz RB */
438 /* 0x53 - 1600x900@60Hz */
442 /* 0x33 - 1600x1200@60Hz */
446 /* 0x34 - 1600x1200@65Hz */
450 /* 0x35 - 1600x1200@70Hz */
454 /* 0x36 - 1600x1200@75Hz */
458 /* 0x37 - 1600x1200@85Hz */
462 /* 0x38 - 1600x1200@120Hz RB */
466 /* 0x39 - 1680x1050@60Hz RB */
470 /* 0x3a - 1680x1050@60Hz */
474 /* 0x3b - 1680x1050@75Hz */
478 /* 0x3c - 1680x1050@85Hz */
482 /* 0x3d - 1680x1050@120Hz RB */
486 /* 0x3e - 1792x1344@60Hz */
490 /* 0x3f - 1792x1344@75Hz */
494 /* 0x40 - 1792x1344@120Hz RB */
498 /* 0x41 - 1856x1392@60Hz */
502 /* 0x42 - 1856x1392@75Hz */
506 /* 0x43 - 1856x1392@120Hz RB */
510 /* 0x52 - 1920x1080@60Hz */
514 /* 0x44 - 1920x1200@60Hz RB */
518 /* 0x45 - 1920x1200@60Hz */
522 /* 0x46 - 1920x1200@75Hz */
526 /* 0x47 - 1920x1200@85Hz */
530 /* 0x48 - 1920x1200@120Hz RB */
534 /* 0x49 - 1920x1440@60Hz */
538 /* 0x4a - 1920x1440@75Hz */
542 /* 0x4b - 1920x1440@120Hz RB */
546 /* 0x54 - 2048x1152@60Hz */
550 /* 0x4c - 2560x1600@60Hz RB */
554 /* 0x4d - 2560x1600@60Hz */
558 /* 0x4e - 2560x1600@75Hz */
562 /* 0x4f - 2560x1600@85Hz */
566 /* 0x50 - 2560x1600@120Hz RB */
570 /* 0x57 - 4096x2160@60Hz RB */
574 /* 0x58 - 4096x2160@59.94Hz RB */
583 * modes are old-school Mac modes. The EDID spec says the 1152x864@75 mode
587 * The DMT modes have been fact-checked; the rest are mild guesses.
714 * From CEA/CTA-861 spec.
719 /* 1 - 640x480@60Hz 4:3 */
724 /* 2 - 720x480@60Hz 4:3 */
729 /* 3 - 720x480@60Hz 16:9 */
734 /* 4 - 1280x720@60Hz 16:9 */
739 /* 5 - 1920x1080i@60Hz 16:9 */
745 /* 6 - 720(1440)x480i@60Hz 4:3 */
751 /* 7 - 720(1440)x480i@60Hz 16:9 */
757 /* 8 - 720(1440)x240@60Hz 4:3 */
763 /* 9 - 720(1440)x240@60Hz 16:9 */
769 /* 10 - 2880x480i@60Hz 4:3 */
775 /* 11 - 2880x480i@60Hz 16:9 */
781 /* 12 - 2880x240@60Hz 4:3 */
786 /* 13 - 2880x240@60Hz 16:9 */
791 /* 14 - 1440x480@60Hz 4:3 */
796 /* 15 - 1440x480@60Hz 16:9 */
801 /* 16 - 1920x1080@60Hz 16:9 */
806 /* 17 - 720x576@50Hz 4:3 */
811 /* 18 - 720x576@50Hz 16:9 */
816 /* 19 - 1280x720@50Hz 16:9 */
821 /* 20 - 1920x1080i@50Hz 16:9 */
827 /* 21 - 720(1440)x576i@50Hz 4:3 */
833 /* 22 - 720(1440)x576i@50Hz 16:9 */
839 /* 23 - 720(1440)x288@50Hz 4:3 */
845 /* 24 - 720(1440)x288@50Hz 16:9 */
851 /* 25 - 2880x576i@50Hz 4:3 */
857 /* 26 - 2880x576i@50Hz 16:9 */
863 /* 27 - 2880x288@50Hz 4:3 */
868 /* 28 - 2880x288@50Hz 16:9 */
873 /* 29 - 1440x576@50Hz 4:3 */
878 /* 30 - 1440x576@50Hz 16:9 */
883 /* 31 - 1920x1080@50Hz 16:9 */
888 /* 32 - 1920x1080@24Hz 16:9 */
893 /* 33 - 1920x1080@25Hz 16:9 */
898 /* 34 - 1920x1080@30Hz 16:9 */
903 /* 35 - 2880x480@60Hz 4:3 */
908 /* 36 - 2880x480@60Hz 16:9 */
913 /* 37 - 2880x576@50Hz 4:3 */
918 /* 38 - 2880x576@50Hz 16:9 */
923 /* 39 - 1920x1080i@50Hz 16:9 */
929 /* 40 - 1920x1080i@100Hz 16:9 */
935 /* 41 - 1280x720@100Hz 16:9 */
940 /* 42 - 720x576@100Hz 4:3 */
945 /* 43 - 720x576@100Hz 16:9 */
950 /* 44 - 720(1440)x576i@100Hz 4:3 */
956 /* 45 - 720(1440)x576i@100Hz 16:9 */
962 /* 46 - 1920x1080i@120Hz 16:9 */
968 /* 47 - 1280x720@120Hz 16:9 */
973 /* 48 - 720x480@120Hz 4:3 */
978 /* 49 - 720x480@120Hz 16:9 */
983 /* 50 - 720(1440)x480i@120Hz 4:3 */
989 /* 51 - 720(1440)x480i@120Hz 16:9 */
995 /* 52 - 720x576@200Hz 4:3 */
1000 /* 53 - 720x576@200Hz 16:9 */
1005 /* 54 - 720(1440)x576i@200Hz 4:3 */
1011 /* 55 - 720(1440)x576i@200Hz 16:9 */
1017 /* 56 - 720x480@240Hz 4:3 */
1022 /* 57 - 720x480@240Hz 16:9 */
1027 /* 58 - 720(1440)x480i@240Hz 4:3 */
1033 /* 59 - 720(1440)x480i@240Hz 16:9 */
1039 /* 60 - 1280x720@24Hz 16:9 */
1044 /* 61 - 1280x720@25Hz 16:9 */
1049 /* 62 - 1280x720@30Hz 16:9 */
1054 /* 63 - 1920x1080@120Hz 16:9 */
1059 /* 64 - 1920x1080@100Hz 16:9 */
1064 /* 65 - 1280x720@24Hz 64:27 */
1069 /* 66 - 1280x720@25Hz 64:27 */
1074 /* 67 - 1280x720@30Hz 64:27 */
1079 /* 68 - 1280x720@50Hz 64:27 */
1084 /* 69 - 1280x720@60Hz 64:27 */
1089 /* 70 - 1280x720@100Hz 64:27 */
1094 /* 71 - 1280x720@120Hz 64:27 */
1099 /* 72 - 1920x1080@24Hz 64:27 */
1104 /* 73 - 1920x1080@25Hz 64:27 */
1109 /* 74 - 1920x1080@30Hz 64:27 */
1114 /* 75 - 1920x1080@50Hz 64:27 */
1119 /* 76 - 1920x1080@60Hz 64:27 */
1124 /* 77 - 1920x1080@100Hz 64:27 */
1129 /* 78 - 1920x1080@120Hz 64:27 */
1134 /* 79 - 1680x720@24Hz 64:27 */
1139 /* 80 - 1680x720@25Hz 64:27 */
1144 /* 81 - 1680x720@30Hz 64:27 */
1149 /* 82 - 1680x720@50Hz 64:27 */
1154 /* 83 - 1680x720@60Hz 64:27 */
1159 /* 84 - 1680x720@100Hz 64:27 */
1164 /* 85 - 1680x720@120Hz 64:27 */
1169 /* 86 - 2560x1080@24Hz 64:27 */
1174 /* 87 - 2560x1080@25Hz 64:27 */
1179 /* 88 - 2560x1080@30Hz 64:27 */
1184 /* 89 - 2560x1080@50Hz 64:27 */
1189 /* 90 - 2560x1080@60Hz 64:27 */
1194 /* 91 - 2560x1080@100Hz 64:27 */
1199 /* 92 - 2560x1080@120Hz 64:27 */
1204 /* 93 - 3840x2160@24Hz 16:9 */
1209 /* 94 - 3840x2160@25Hz 16:9 */
1214 /* 95 - 3840x2160@30Hz 16:9 */
1219 /* 96 - 3840x2160@50Hz 16:9 */
1224 /* 97 - 3840x2160@60Hz 16:9 */
1229 /* 98 - 4096x2160@24Hz 256:135 */
1234 /* 99 - 4096x2160@25Hz 256:135 */
1239 /* 100 - 4096x2160@30Hz 256:135 */
1244 /* 101 - 4096x2160@50Hz 256:135 */
1249 /* 102 - 4096x2160@60Hz 256:135 */
1254 /* 103 - 3840x2160@24Hz 64:27 */
1259 /* 104 - 3840x2160@25Hz 64:27 */
1264 /* 105 - 3840x2160@30Hz 64:27 */
1269 /* 106 - 3840x2160@50Hz 64:27 */
1274 /* 107 - 3840x2160@60Hz 64:27 */
1279 /* 108 - 1280x720@48Hz 16:9 */
1284 /* 109 - 1280x720@48Hz 64:27 */
1289 /* 110 - 1680x720@48Hz 64:27 */
1294 /* 111 - 1920x1080@48Hz 16:9 */
1299 /* 112 - 1920x1080@48Hz 64:27 */
1304 /* 113 - 2560x1080@48Hz 64:27 */
1309 /* 114 - 3840x2160@48Hz 16:9 */
1314 /* 115 - 4096x2160@48Hz 256:135 */
1319 /* 116 - 3840x2160@48Hz 64:27 */
1324 /* 117 - 3840x2160@100Hz 16:9 */
1329 /* 118 - 3840x2160@120Hz 16:9 */
1334 /* 119 - 3840x2160@100Hz 64:27 */
1339 /* 120 - 3840x2160@120Hz 64:27 */
1344 /* 121 - 5120x2160@24Hz 64:27 */
1349 /* 122 - 5120x2160@25Hz 64:27 */
1354 /* 123 - 5120x2160@30Hz 64:27 */
1359 /* 124 - 5120x2160@48Hz 64:27 */
1364 /* 125 - 5120x2160@50Hz 64:27 */
1369 /* 126 - 5120x2160@60Hz 64:27 */
1374 /* 127 - 5120x2160@100Hz 64:27 */
1382 * From CEA/CTA-861 spec.
1387 /* 193 - 5120x2160@120Hz 64:27 */
1392 /* 194 - 7680x4320@24Hz 16:9 */
1397 /* 195 - 7680x4320@25Hz 16:9 */
1402 /* 196 - 7680x4320@30Hz 16:9 */
1407 /* 197 - 7680x4320@48Hz 16:9 */
1412 /* 198 - 7680x4320@50Hz 16:9 */
1417 /* 199 - 7680x4320@60Hz 16:9 */
1422 /* 200 - 7680x4320@100Hz 16:9 */
1427 /* 201 - 7680x4320@120Hz 16:9 */
1432 /* 202 - 7680x4320@24Hz 64:27 */
1437 /* 203 - 7680x4320@25Hz 64:27 */
1442 /* 204 - 7680x4320@30Hz 64:27 */
1447 /* 205 - 7680x4320@48Hz 64:27 */
1452 /* 206 - 7680x4320@50Hz 64:27 */
1457 /* 207 - 7680x4320@60Hz 64:27 */
1462 /* 208 - 7680x4320@100Hz 64:27 */
1467 /* 209 - 7680x4320@120Hz 64:27 */
1472 /* 210 - 10240x4320@24Hz 64:27 */
1477 /* 211 - 10240x4320@25Hz 64:27 */
1482 /* 212 - 10240x4320@30Hz 64:27 */
1487 /* 213 - 10240x4320@48Hz 64:27 */
1492 /* 214 - 10240x4320@50Hz 64:27 */
1497 /* 215 - 10240x4320@60Hz 64:27 */
1502 /* 216 - 10240x4320@100Hz 64:27 */
1507 /* 217 - 10240x4320@120Hz 64:27 */
1512 /* 218 - 4096x2160@100Hz 256:135 */
1517 /* 219 - 4096x2160@120Hz 256:135 */
1528 /* 0 - dummy, VICs start at 1 */
1530 /* 1 - 3840x2160@30Hz */
1536 /* 2 - 3840x2160@25Hz */
1542 /* 3 - 3840x2160@24Hz */
1548 /* 4 - 4096x2160@24Hz (SMPTE) */
1563 * drm_edid_header_is_valid - sanity check the header of the base EDID block
1585 "Minimum number of valid EDID header bytes (0-8, default 6)");
1594 for (i = 0; i < EDID_LENGTH - 1; i++) in drm_edid_block_checksum()
1597 crc = 0x100 - csum; in drm_edid_block_checksum()
1604 if (raw_edid[EDID_LENGTH - 1] != real_checksum) in drm_edid_block_checksum_diff()
1619 * drm_edid_are_equal - compare two edid blobs.
1635 edid1_len = EDID_LENGTH * (1 + edid1->extensions); in drm_edid_are_equal()
1636 edid2_len = EDID_LENGTH * (1 + edid2->extensions); in drm_edid_are_equal()
1650 * drm_edid_block_valid - Sanity check the EDID block (base or extension)
1682 * fix-up code here will correct the problem, the in drm_edid_block_valid()
1713 /* per-block-type checks */ in drm_edid_block_valid()
1716 if (edid->version != 1) { in drm_edid_block_valid()
1717 DRM_NOTE("EDID has major version %d, instead of 1\n", edid->version); in drm_edid_block_valid()
1721 if (edid->revision > 4) in drm_edid_block_valid()
1747 * drm_edid_is_valid - sanity check EDID data
1750 * Sanity-check an entire EDID record (including extensions)
1762 for (i = 0; i <= edid->extensions; i++) in drm_edid_is_valid()
1772 * drm_do_probe_ddc_edid() - get EDID information via I2C
1780 * Return: 0 on success or -1 on failure.
1793 * adapter reports EAGAIN. However, we find that bit-banging transfers in drm_do_probe_ddc_edid()
1819 * Avoid sending the segment addr to not upset non-compliant in drm_do_probe_ddc_edid()
1822 ret = i2c_transfer(adapter, &msgs[3 - xfers], xfers); in drm_do_probe_ddc_edid()
1824 if (ret == -ENXIO) { in drm_do_probe_ddc_edid()
1825 DRM_DEBUG_KMS("drm: skipping non-existent adapter %s\n", in drm_do_probe_ddc_edid()
1826 adapter->name); in drm_do_probe_ddc_edid()
1829 } while (ret != xfers && --retries); in drm_do_probe_ddc_edid()
1831 return ret == xfers ? 0 : -1; in drm_do_probe_ddc_edid()
1850 connector->real_edid_checksum = in connector_bad_edid()
1853 if (connector->bad_edid_counter++ && !drm_debug_enabled(DRM_UT_KMS)) in connector_bad_edid()
1856 drm_warn(connector->dev, "%s: EDID is invalid:\n", connector->name); in connector_bad_edid()
1879 if (connector->override_edid) in drm_get_override_edid()
1880 override = drm_edid_duplicate(connector->edid_blob_ptr->data); in drm_get_override_edid()
1889 * drm_add_override_edid_modes - add modes from override/firmware EDID
1911 connector->base.id, connector->name, num_modes); in drm_add_override_edid_modes()
1921 * - CTA-861-H section 7.3.3 CTA Extension Version 3
1930 return d - 4; in cea_db_collection_size()
1957 /* No extensions according to base block, no HF-EEODB. */ in edid_hfeeodb_extension_block_count()
1958 if (!edid->extensions) in edid_hfeeodb_extension_block_count()
1961 /* HF-EEODB is always in the first EDID extension block only */ in edid_hfeeodb_extension_block_count()
1971 * Sinks that include the HF-EEODB in their E-EDID shall include one and in edid_hfeeodb_extension_block_count()
1972 * only one instance of the HF-EEODB in the E-EDID, occupying bytes 4 in edid_hfeeodb_extension_block_count()
1973 * through 6 of Block 1 of the E-EDID. in edid_hfeeodb_extension_block_count()
1989 * drm_do_get_edid - get EDID data using a custom EDID block read function
2030 &connector->edid_corrupt)) in drm_do_get_edid()
2033 connector->null_edid_counter++; in drm_do_get_edid()
2068 * the first Data Block is HF-EEODB, override the in drm_do_get_edid()
2071 * Note: HF-EEODB could specify a smaller extension in drm_do_get_edid()
2108 new[EDID_LENGTH - 1] += new[0x7e] - valid_extensions; in drm_do_get_edid()
2143 &connector->edid_corrupt)) in drm_do_get_edid()
2146 connector->null_edid_counter++; in drm_do_get_edid()
2174 valid_extensions--; in drm_do_get_edid()
2198 new[EDID_LENGTH - 1] += new[0x7e] - valid_extensions; in drm_do_get_edid()
2217 * drm_probe_ddc() - probe DDC presence
2232 * drm_get_edid - get EDID data, if available
2246 if (connector->force == DRM_FORCE_OFF) in drm_get_edid()
2249 if (connector->force == DRM_FORCE_UNSPECIFIED && !drm_probe_ddc(adapter)) in drm_get_edid()
2259 * drm_get_edid_switcheroo - get EDID data for a vga_switcheroo output
2272 struct pci_dev *pdev = connector->dev->pdev; in drm_get_edid_switcheroo()
2284 * drm_edid_duplicate - duplicate an EDID and the extensions
2291 return kmemdup(edid, (edid->extensions + 1) * EDID_LENGTH, GFP_KERNEL); in drm_edid_duplicate()
2298 * edid_vendor - match a string against EDID's obfuscated vendor field
2308 edid_vendor[0] = ((edid->mfg_id[0] & 0x7c) >> 2) + '@'; in edid_vendor()
2309 edid_vendor[1] = (((edid->mfg_id[0] & 0x3) << 3) | in edid_vendor()
2310 ((edid->mfg_id[1] & 0xe0) >> 5)) + '@'; in edid_vendor()
2311 edid_vendor[2] = (edid->mfg_id[1] & 0x1f) + '@'; in edid_vendor()
2317 * edid_get_quirks - return quirk flags for a given EDID
2330 if (edid_vendor(edid, quirk->vendor) && in edid_get_quirks()
2331 (EDID_PRODUCT_ID(edid) == quirk->product_id)) in edid_get_quirks()
2332 return quirk->quirks; in edid_get_quirks()
2338 #define MODE_SIZE(m) ((m)->hdisplay * (m)->vdisplay)
2339 #define MODE_REFRESH_DIFF(c,t) (abs((c) - (t)))
2342 * edid_fixup_preferred - set preferred modes based on quirk list
2356 if (list_empty(&connector->probed_modes)) in edid_fixup_preferred()
2364 preferred_mode = list_first_entry(&connector->probed_modes, in edid_fixup_preferred()
2367 list_for_each_entry_safe(cur_mode, t, &connector->probed_modes, head) { in edid_fixup_preferred()
2368 cur_mode->type &= ~DRM_MODE_TYPE_PREFERRED; in edid_fixup_preferred()
2387 preferred_mode->type |= DRM_MODE_TYPE_PREFERRED; in edid_fixup_preferred()
2393 return (mode->htotal - mode->hdisplay == 160) && in mode_is_rb()
2394 (mode->hsync_end - mode->hdisplay == 80) && in mode_is_rb()
2395 (mode->hsync_end - mode->hsync_start == 32) && in mode_is_rb()
2396 (mode->vsync_start - mode->vdisplay == 3); in mode_is_rb()
2400 * drm_mode_find_dmt - Create a copy of a mode if present in DMT
2405 * @rb: Mode reduced-blanking-ness
2420 if (hsize != ptr->hdisplay) in drm_mode_find_dmt()
2422 if (vsize != ptr->vdisplay) in drm_mode_find_dmt()
2459 n = (127 - d) / 18; in cea_for_each_detailed_block()
2487 cb(&(edid->detailed_timings[i]), closure); in drm_for_each_detailed_block()
2521 if (edid->revision >= 4) { in drm_monitor_supports_rb()
2528 return ((edid->input & DRM_EDID_INPUT_DIGITAL) != 0); in drm_monitor_supports_rb()
2590 * standard_timing_level - get std. timing level(CVT/GTF/DMT)
2595 if (edid->revision >= 2) { in standard_timing_level()
2596 if (edid->revision >= 4 && (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)) in standard_timing_level()
2600 if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) in standard_timing_level()
2620 if (mode->htotal <= 0) in drm_mode_hsync()
2623 return DIV_ROUND_CLOSEST(mode->clock, mode->htotal); in drm_mode_hsync()
2627 * drm_mode_std - convert standard mode info (width, height, refresh) into mode
2639 struct drm_device *dev = connector->dev; in drm_mode_std()
2643 unsigned aspect_ratio = (t->vfreq_aspect & EDID_TIMING_ASPECT_MASK) in drm_mode_std()
2645 unsigned vfreq = (t->vfreq_aspect & EDID_TIMING_VFREQ_MASK) in drm_mode_std()
2649 if (bad_std_timing(t->hsize, t->vfreq_aspect)) in drm_mode_std()
2653 hsize = t->hsize * 8 + 248; in drm_mode_std()
2658 if (edid->revision < 3) in drm_mode_std()
2683 list_for_each_entry(m, &connector->probed_modes, head) in drm_mode_std()
2684 if (m->hdisplay == hsize && m->vdisplay == vsize && in drm_mode_std()
2694 mode->hdisplay = 1366; in drm_mode_std()
2695 mode->hsync_start = mode->hsync_start - 1; in drm_mode_std()
2696 mode->hsync_end = mode->hsync_end - 1; in drm_mode_std()
2770 if (!(pt->misc & DRM_EDID_PT_INTERLACED)) in drm_mode_do_interlace_quirk()
2774 if ((mode->hdisplay == cea_interlaced[i].w) && in drm_mode_do_interlace_quirk()
2775 (mode->vdisplay == cea_interlaced[i].h / 2)) { in drm_mode_do_interlace_quirk()
2776 mode->vdisplay *= 2; in drm_mode_do_interlace_quirk()
2777 mode->vsync_start *= 2; in drm_mode_do_interlace_quirk()
2778 mode->vsync_end *= 2; in drm_mode_do_interlace_quirk()
2779 mode->vtotal *= 2; in drm_mode_do_interlace_quirk()
2780 mode->vtotal |= 1; in drm_mode_do_interlace_quirk()
2784 mode->flags |= DRM_MODE_FLAG_INTERLACE; in drm_mode_do_interlace_quirk()
2788 * drm_mode_detailed - create a new mode from an EDID detailed timing section
2803 struct detailed_pixel_timing *pt = &timing->data.pixel_data; in drm_mode_detailed()
2804 unsigned hactive = (pt->hactive_hblank_hi & 0xf0) << 4 | pt->hactive_lo; in drm_mode_detailed()
2805 unsigned vactive = (pt->vactive_vblank_hi & 0xf0) << 4 | pt->vactive_lo; in drm_mode_detailed()
2806 unsigned hblank = (pt->hactive_hblank_hi & 0xf) << 8 | pt->hblank_lo; in drm_mode_detailed()
2807 unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | pt->vblank_lo; in drm_mode_detailed()
2808 unsigned hsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2 | pt->hsync_offset_lo; in drm_mode_detailed()
2809 …unsigned hsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x30) << 4 | pt->hsync_pulse… in drm_mode_detailed()
2810 …unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) << 2 | pt->vsync_offset_puls… in drm_mode_detailed()
2811 …unsigned vsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 4 | (pt->vsync_offse… in drm_mode_detailed()
2817 if (pt->misc & DRM_EDID_PT_STEREO) { in drm_mode_detailed()
2821 if (!(pt->misc & DRM_EDID_PT_SEPARATE_SYNC)) { in drm_mode_detailed()
2845 timing->pixel_clock = cpu_to_le16(1088); in drm_mode_detailed()
2847 mode->clock = le16_to_cpu(timing->pixel_clock) * 10; in drm_mode_detailed()
2849 mode->hdisplay = hactive; in drm_mode_detailed()
2850 mode->hsync_start = mode->hdisplay + hsync_offset; in drm_mode_detailed()
2851 mode->hsync_end = mode->hsync_start + hsync_pulse_width; in drm_mode_detailed()
2852 mode->htotal = mode->hdisplay + hblank; in drm_mode_detailed()
2854 mode->vdisplay = vactive; in drm_mode_detailed()
2855 mode->vsync_start = mode->vdisplay + vsync_offset; in drm_mode_detailed()
2856 mode->vsync_end = mode->vsync_start + vsync_pulse_width; in drm_mode_detailed()
2857 mode->vtotal = mode->vdisplay + vblank; in drm_mode_detailed()
2860 if (mode->hsync_end > mode->htotal) in drm_mode_detailed()
2861 mode->htotal = mode->hsync_end + 1; in drm_mode_detailed()
2862 if (mode->vsync_end > mode->vtotal) in drm_mode_detailed()
2863 mode->vtotal = mode->vsync_end + 1; in drm_mode_detailed()
2868 pt->misc |= DRM_EDID_PT_HSYNC_POSITIVE | DRM_EDID_PT_VSYNC_POSITIVE; in drm_mode_detailed()
2871 mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ? in drm_mode_detailed()
2873 mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ? in drm_mode_detailed()
2877 mode->width_mm = pt->width_mm_lo | (pt->width_height_mm_hi & 0xf0) << 4; in drm_mode_detailed()
2878 mode->height_mm = pt->height_mm_lo | (pt->width_height_mm_hi & 0xf) << 8; in drm_mode_detailed()
2881 mode->width_mm *= 10; in drm_mode_detailed()
2882 mode->height_mm *= 10; in drm_mode_detailed()
2886 mode->width_mm = edid->width_cm * 10; in drm_mode_detailed()
2887 mode->height_mm = edid->height_cm * 10; in drm_mode_detailed()
2890 mode->type = DRM_MODE_TYPE_DRIVER; in drm_mode_detailed()
2903 if (edid->revision >= 4) in mode_in_hsync_range()
2906 if (edid->revision >= 4) in mode_in_hsync_range()
2920 if (edid->revision >= 4) in mode_in_vsync_range()
2923 if (edid->revision >= 4) in mode_in_vsync_range()
2938 if (edid->revision >= 4 && t[10] == 0x04) in range_pixel_clock()
2939 return (t[9] * 10000) - ((t[12] >> 2) * 250); in range_pixel_clock()
2941 /* 1.3 is pathetic, so fuzz up a bit */ in range_pixel_clock()
2959 if (mode->clock > max_clock) in mode_in_range()
2963 if (edid->revision >= 4 && t[10] == 0x04) in mode_in_range()
2964 if (t[13] && mode->hdisplay > 8 * (t[13] + (256 * (t[12]&0x3)))) in mode_in_range()
2979 list_for_each_entry(m, &connector->probed_modes, head) { in valid_inferred_mode()
2980 if (mode->hdisplay == m->hdisplay && in valid_inferred_mode()
2981 mode->vdisplay == m->vdisplay && in valid_inferred_mode()
2984 if (mode->hdisplay <= m->hdisplay && in valid_inferred_mode()
2985 mode->vdisplay <= m->vdisplay) in valid_inferred_mode()
2997 struct drm_device *dev = connector->dev; in drm_dmt_modes_for_range()
3018 if (mode->hdisplay == 1368 && mode->vdisplay == 768) { in drm_mode_fixup_1366x768()
3019 mode->hdisplay = 1366; in drm_mode_fixup_1366x768()
3020 mode->hsync_start--; in drm_mode_fixup_1366x768()
3021 mode->hsync_end--; in drm_mode_fixup_1366x768()
3032 struct drm_device *dev = connector->dev; in drm_gtf_modes_for_range()
3037 newmode = drm_gtf_mode(dev, m->w, m->h, m->r, 0, 0); in drm_gtf_modes_for_range()
3061 struct drm_device *dev = connector->dev; in drm_cvt_modes_for_range()
3067 newmode = drm_cvt_mode(dev, m->w, m->h, m->r, rb, 0, 0); in drm_cvt_modes_for_range()
3089 struct detailed_non_pixel *data = &timing->data.other_data; in do_inferred_modes()
3090 struct detailed_data_monitor_range *range = &data->data.range; in do_inferred_modes()
3095 closure->modes += drm_dmt_modes_for_range(closure->connector, in do_inferred_modes()
3096 closure->edid, in do_inferred_modes()
3099 if (!version_greater(closure->edid, 1, 1)) in do_inferred_modes()
3102 switch (range->flags) { in do_inferred_modes()
3105 closure->modes += drm_gtf_modes_for_range(closure->connector, in do_inferred_modes()
3106 closure->edid, in do_inferred_modes()
3110 if (!version_greater(closure->edid, 1, 3)) in do_inferred_modes()
3113 closure->modes += drm_cvt_modes_for_range(closure->connector, in do_inferred_modes()
3114 closure->edid, in do_inferred_modes()
3146 for (j = 7; j >= 0; j--) { in drm_est3_modes()
3147 m = (i * 8) + (7 - j); in drm_est3_modes()
3151 mode = drm_mode_find_dmt(connector->dev, in drm_est3_modes()
3175 closure->modes += drm_est3_modes(closure->connector, timing); in do_established_modes()
3179 * add_established_modes - get est. modes from EDID and add them
3189 struct drm_device *dev = connector->dev; in add_established_modes()
3190 unsigned long est_bits = edid->established_timings.t1 | in add_established_modes()
3191 (edid->established_timings.t2 << 8) | in add_established_modes()
3192 ((edid->established_timings.mfg_rsvd & 0x80) << 9); in add_established_modes()
3222 struct detailed_non_pixel *data = &timing->data.other_data; in do_standard_modes()
3223 struct drm_connector *connector = closure->connector; in do_standard_modes()
3224 struct edid *edid = closure->edid; in do_standard_modes()
3231 struct std_timing *std = &data->data.timings[i]; in do_standard_modes()
3237 closure->modes++; in do_standard_modes()
3243 * add_standard_modes - get std. modes from EDID and add them
3263 &edid->standard_timings[i]); in add_standard_modes()
3284 struct drm_device *dev = connector->dev; in drm_cvt_modes()
3292 cvt = &(timing->data.other_data.data.cvt[i]); in drm_cvt_modes()
3294 if (!memcmp(cvt->code, empty, 3)) in drm_cvt_modes()
3297 height = (cvt->code[0] + ((cvt->code[1] & 0xf0) << 4) + 1) * 2; in drm_cvt_modes()
3298 switch (cvt->code[1] & 0x0c) { in drm_cvt_modes()
3299 /* default - because compiler doesn't see that we've enumerated all cases */ in drm_cvt_modes()
3316 if (cvt->code[2] & (1 << j)) { in drm_cvt_modes()
3339 closure->modes += drm_cvt_modes(closure->connector, timing); in do_cvt_mode()
3369 newmode = drm_mode_detailed(closure->connector->dev, in do_detailed_mode()
3370 closure->edid, timing, in do_detailed_mode()
3371 closure->quirks); in do_detailed_mode()
3375 if (closure->preferred) in do_detailed_mode()
3376 newmode->type |= DRM_MODE_TYPE_PREFERRED; in do_detailed_mode()
3385 drm_mode_probed_add(closure->connector, newmode); in do_detailed_mode()
3386 closure->modes++; in do_detailed_mode()
3387 closure->preferred = false; in do_detailed_mode()
3391 * add_detailed_modes - Add modes from detailed timings
3409 (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING); in add_detailed_modes()
3442 if (edid == NULL || edid->extensions == 0) in drm_find_edid_extension()
3448 len = edid->extensions; in drm_find_edid_extension()
3473 if (edid == NULL || edid->extensions == 0) in drm_find_edid_extension()
3477 for (i = *ext_index; i < edid->extensions; i++) { in drm_find_edid_extension()
3483 if (i >= edid->extensions) in drm_find_edid_extension()
3504 *length = EDID_LENGTH - 1; in drm_find_displayid_extension()
3512 *length = *idx + sizeof(*base) + base->bytes; in drm_find_displayid_extension()
3542 if (block->tag == DATA_BLOCK_CTA) in drm_find_cea_extension()
3552 BUILD_BUG_ON(1 + ARRAY_SIZE(edid_cea_modes_1) - 1 != 127); in cea_mode_for_vic()
3553 BUILD_BUG_ON(193 + ARRAY_SIZE(edid_cea_modes_193) - 1 != 219); in cea_mode_for_vic()
3556 return &edid_cea_modes_1[vic - 1]; in cea_mode_for_vic()
3558 return &edid_cea_modes_193[vic - 193]; in cea_mode_for_vic()
3581 unsigned int clock = cea_mode->clock; in cea_mode_alternate_clock()
3591 if (cea_mode->vdisplay == 240 || cea_mode->vdisplay == 480) in cea_mode_alternate_clock()
3611 BUILD_BUG_ON(cea_mode_for_vic(8)->vtotal != 262 || in cea_mode_alternate_timings()
3612 cea_mode_for_vic(9)->vtotal != 262 || in cea_mode_alternate_timings()
3613 cea_mode_for_vic(12)->vtotal != 262 || in cea_mode_alternate_timings()
3614 cea_mode_for_vic(13)->vtotal != 262 || in cea_mode_alternate_timings()
3615 cea_mode_for_vic(23)->vtotal != 312 || in cea_mode_alternate_timings()
3616 cea_mode_for_vic(24)->vtotal != 312 || in cea_mode_alternate_timings()
3617 cea_mode_for_vic(27)->vtotal != 312 || in cea_mode_alternate_timings()
3618 cea_mode_for_vic(28)->vtotal != 312); in cea_mode_alternate_timings()
3621 vic == 12 || vic == 13) && mode->vtotal < 263) || in cea_mode_alternate_timings()
3623 vic == 27 || vic == 28) && mode->vtotal < 314)) { in cea_mode_alternate_timings()
3624 mode->vsync_start++; in cea_mode_alternate_timings()
3625 mode->vsync_end++; in cea_mode_alternate_timings()
3626 mode->vtotal++; in cea_mode_alternate_timings()
3640 if (!to_match->clock) in drm_match_cea_mode_clock_tolerance()
3643 if (to_match->picture_aspect_ratio) in drm_match_cea_mode_clock_tolerance()
3654 if (abs(to_match->clock - clock1) > clock_tolerance && in drm_match_cea_mode_clock_tolerance()
3655 abs(to_match->clock - clock2) > clock_tolerance) in drm_match_cea_mode_clock_tolerance()
3668 * drm_match_cea_mode - look for a CEA mode matching given mode
3671 * Return: The CEA Video ID (VIC) of the mode or 0 if it isn't a CEA-861
3679 if (!to_match->clock) in drm_match_cea_mode()
3682 if (to_match->picture_aspect_ratio) in drm_match_cea_mode()
3693 if (KHZ2PICOS(to_match->clock) != KHZ2PICOS(clock1) && in drm_match_cea_mode()
3694 KHZ2PICOS(to_match->clock) != KHZ2PICOS(clock2)) in drm_match_cea_mode()
3717 return mode->picture_aspect_ratio; in drm_get_cea_aspect_ratio()
3743 if (!to_match->clock) in drm_match_hdmi_mode_clock_tolerance()
3746 if (to_match->picture_aspect_ratio) in drm_match_hdmi_mode_clock_tolerance()
3754 clock1 = hdmi_mode->clock; in drm_match_hdmi_mode_clock_tolerance()
3757 if (abs(to_match->clock - clock1) > clock_tolerance && in drm_match_hdmi_mode_clock_tolerance()
3758 abs(to_match->clock - clock2) > clock_tolerance) in drm_match_hdmi_mode_clock_tolerance()
3769 * drm_match_hdmi_mode - look for a HDMI mode matching given mode
3781 if (!to_match->clock) in drm_match_hdmi_mode()
3784 if (to_match->picture_aspect_ratio) in drm_match_hdmi_mode()
3792 clock1 = hdmi_mode->clock; in drm_match_hdmi_mode()
3795 if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) || in drm_match_hdmi_mode()
3796 KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) && in drm_match_hdmi_mode()
3811 struct drm_device *dev = connector->dev; in add_alternate_cea_modes()
3824 list_for_each_entry(mode, &connector->probed_modes, head) { in add_alternate_cea_modes()
3844 clock1 = cea_mode->clock; in add_alternate_cea_modes()
3849 if (mode->clock != clock1 && mode->clock != clock2) in add_alternate_cea_modes()
3857 newmode->flags |= mode->flags & DRM_MODE_FLAG_3D_MASK; in add_alternate_cea_modes()
3863 if (mode->clock != clock1) in add_alternate_cea_modes()
3864 newmode->clock = clock1; in add_alternate_cea_modes()
3866 newmode->clock = clock2; in add_alternate_cea_modes()
3868 list_add_tail(&newmode->head, &list); in add_alternate_cea_modes()
3872 list_del(&mode->head); in add_alternate_cea_modes()
3882 /* 0-6 bit vic, 7th bit native mode indicator */ in svd_to_vic()
3894 struct drm_device *dev = connector->dev; in drm_display_mode_from_vic_index()
3914 * do_y420vdb_modes - Parse YCBCR 420 only modes
3919 * Parse the CEA-861-F YCBCR 420 Video Data Block (Y420VDB)
3927 struct drm_device *dev = connector->dev; in do_y420vdb_modes()
3928 struct drm_display_info *info = &connector->display_info; in do_y420vdb_modes()
3929 struct drm_hdmi_info *hdmi = &info->hdmi; in do_y420vdb_modes()
3941 bitmap_set(hdmi->y420_vdb_modes, vic, 1); in do_y420vdb_modes()
3947 info->color_formats |= DRM_COLOR_FORMAT_YCRCB420; in do_y420vdb_modes()
3952 * drm_add_cmdb_modes - Add a YCBCR 420 mode into bitmap
3962 struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; in drm_add_cmdb_modes()
3967 bitmap_set(hdmi->y420_cmdb_modes, vic, 1); in drm_add_cmdb_modes()
3971 * drm_display_mode_from_cea_vic() - return a mode for CEA VIC
4002 struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; in do_cea_modes()
4018 if (i < 64 && hdmi->y420_cmdb_map & (1ULL << i)) in do_cea_modes()
4051 unsigned int interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE; in stereo_match_mandatory()
4053 return mode->hdisplay == stereo_mode->width && in stereo_match_mandatory()
4054 mode->vdisplay == stereo_mode->height && in stereo_match_mandatory()
4055 interlaced == (stereo_mode->flags & DRM_MODE_FLAG_INTERLACE) && in stereo_match_mandatory()
4056 drm_mode_vrefresh(mode) == stereo_mode->vrefresh; in stereo_match_mandatory()
4061 struct drm_device *dev = connector->dev; in add_hdmi_mandatory_stereo_modes()
4068 list_for_each_entry(mode, &connector->probed_modes, head) { in add_hdmi_mandatory_stereo_modes()
4082 new_mode->flags |= mandatory->flags; in add_hdmi_mandatory_stereo_modes()
4083 list_add_tail(&new_mode->head, &stereo_modes); in add_hdmi_mandatory_stereo_modes()
4088 list_splice_tail(&stereo_modes, &connector->probed_modes); in add_hdmi_mandatory_stereo_modes()
4095 struct drm_device *dev = connector->dev; in add_hdmi_mode()
4123 newmode->flags |= DRM_MODE_FLAG_3D_FRAME_PACKING; in add_3d_struct_modes()
4133 newmode->flags |= DRM_MODE_FLAG_3D_TOP_AND_BOTTOM; in add_3d_struct_modes()
4143 newmode->flags |= DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF; in add_3d_struct_modes()
4153 * do_hdmi_vsdb_modes - Parse the HDMI Vendor Specific data block
4165 struct drm_display_info *info = &connector->display_info; in do_hdmi_vsdb_modes()
4219 if (len < (8 + offset + hdmi_3d_len - 1)) in do_hdmi_vsdb_modes()
4246 for (i = 0; i < (hdmi_3d_len - multi_len); i++) { in do_hdmi_vsdb_modes()
4254 if (detail_present && (i + 1 == hdmi_3d_len - multi_len)) in do_hdmi_vsdb_modes()
4282 newmode->flags |= newflag; in do_hdmi_vsdb_modes()
4294 info->has_hdmi_infoframe = true; in do_hdmi_vsdb_modes()
4332 /* DisplayID CTA extension blocks and top-level CEA EDID in cea_db_offsets()
4343 * Byte number (decimal) within this block where the 18-byte in cea_db_offsets()
4344 * DTDs begin. If no non-DTD data is present in this extension in cea_db_offsets()
4347 * no non-DTD data. in cea_db_offsets()
4363 return -ERANGE; in cea_db_offsets()
4365 return -EOPNOTSUPP; in cea_db_offsets()
4449 struct drm_display_info *info = &connector->display_info; in drm_parse_y420cmdb_bitmap()
4450 struct drm_hdmi_info *hdmi = &info->hdmi; in drm_parse_y420cmdb_bitmap()
4451 u8 map_len = cea_db_payload_len(db) - 1; in drm_parse_y420cmdb_bitmap()
4457 hdmi->y420_cmdb_map = U64_MAX; in drm_parse_y420cmdb_bitmap()
4458 info->color_formats |= DRM_COLOR_FORMAT_YCRCB420; in drm_parse_y420cmdb_bitmap()
4481 info->color_formats |= DRM_COLOR_FORMAT_YCRCB420; in drm_parse_y420cmdb_bitmap()
4483 hdmi->y420_cmdb_map = map; in drm_parse_y420cmdb_bitmap()
4500 count = edid->extensions; in add_cea_modes()
4529 dbl - 1); in add_cea_modes()
4579 dbl - 1); in add_cea_modes()
4611 clock1 = cea_mode->clock; in fixup_detailed_cea_mode_clock()
4618 clock1 = cea_mode->clock; in fixup_detailed_cea_mode_clock()
4626 if (abs(mode->clock - clock1) < abs(mode->clock - clock2)) in fixup_detailed_cea_mode_clock()
4631 if (mode->clock == clock) in fixup_detailed_cea_mode_clock()
4634 DRM_DEBUG("detailed mode matches %s VIC %d, adjusting clock %d -> %d\n", in fixup_detailed_cea_mode_clock()
4635 type, vic, mode->clock, clock); in fixup_detailed_cea_mode_clock()
4636 mode->clock = clock; in fixup_detailed_cea_mode_clock()
4675 connector->hdr_sink_metadata.hdmi_type1.eotf = in drm_parse_hdr_metadata_block()
4677 connector->hdr_sink_metadata.hdmi_type1.metadata_type = in drm_parse_hdr_metadata_block()
4681 connector->hdr_sink_metadata.hdmi_type1.max_cll = db[4]; in drm_parse_hdr_metadata_block()
4683 connector->hdr_sink_metadata.hdmi_type1.max_fall = db[5]; in drm_parse_hdr_metadata_block()
4685 connector->hdr_sink_metadata.hdmi_type1.min_cll = db[6]; in drm_parse_hdr_metadata_block()
4694 connector->eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_SUPPORTS_AI; in drm_parse_hdmi_vsdb_audio()
4696 connector->latency_present[0] = db[8] >> 7; in drm_parse_hdmi_vsdb_audio()
4697 connector->latency_present[1] = (db[8] >> 6) & 1; in drm_parse_hdmi_vsdb_audio()
4700 connector->video_latency[0] = db[9]; in drm_parse_hdmi_vsdb_audio()
4702 connector->audio_latency[0] = db[10]; in drm_parse_hdmi_vsdb_audio()
4704 connector->video_latency[1] = db[11]; in drm_parse_hdmi_vsdb_audio()
4706 connector->audio_latency[1] = db[12]; in drm_parse_hdmi_vsdb_audio()
4711 connector->latency_present[0], in drm_parse_hdmi_vsdb_audio()
4712 connector->latency_present[1], in drm_parse_hdmi_vsdb_audio()
4713 connector->video_latency[0], in drm_parse_hdmi_vsdb_audio()
4714 connector->video_latency[1], in drm_parse_hdmi_vsdb_audio()
4715 connector->audio_latency[0], in drm_parse_hdmi_vsdb_audio()
4716 connector->audio_latency[1]); in drm_parse_hdmi_vsdb_audio()
4725 *(u8 **)data = t->data.other_data.data.str.str; in monitor_name()
4748 * drm_edid_get_monitor_name - fetch the monitor name from the edid
4762 name_length = min(get_monitor_name(edid, buf), bufsize - 1); in drm_edid_get_monitor_name()
4770 memset(connector->eld, 0, sizeof(connector->eld)); in clear_eld()
4772 connector->latency_present[0] = false; in clear_eld()
4773 connector->latency_present[1] = false; in clear_eld()
4774 connector->video_latency[0] = 0; in clear_eld()
4775 connector->audio_latency[0] = 0; in clear_eld()
4776 connector->video_latency[1] = 0; in clear_eld()
4777 connector->audio_latency[1] = 0; in clear_eld()
4781 * drm_edid_to_eld - build ELD from EDID
4785 * Fill the ELD (EDID-Like Data) buffer for passing to the audio driver. The
4790 uint8_t *eld = connector->eld; in drm_edid_to_eld()
4816 eld[DRM_ELD_MANUFACTURER_NAME0] = edid->mfg_id[0]; in drm_edid_to_eld()
4817 eld[DRM_ELD_MANUFACTURER_NAME1] = edid->mfg_id[1]; in drm_edid_to_eld()
4818 eld[DRM_ELD_PRODUCT_CODE0] = edid->prod_code[0]; in drm_edid_to_eld()
4819 eld[DRM_ELD_PRODUCT_CODE1] = edid->prod_code[1]; in drm_edid_to_eld()
4837 sad_count = min(dbl / 3, 15 - total_sad_count); in drm_edid_to_eld()
4849 /* HDMI Vendor-Specific Data Block */ in drm_edid_to_eld()
4860 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort || in drm_edid_to_eld()
4861 connector->connector_type == DRM_MODE_CONNECTOR_eDP) in drm_edid_to_eld()
4874 * drm_edid_to_sad - extracts SADs from EDID
4903 return -EPROTO; in drm_edid_to_sad()
4917 return -ENOMEM; in drm_edid_to_sad()
4935 * drm_edid_to_speaker_allocation - extracts Speaker Allocation Data Blocks from EDID
4965 return -EPROTO; in drm_edid_to_speaker_allocation()
4978 return -ENOMEM; in drm_edid_to_speaker_allocation()
4990 * drm_av_sync_delay - compute the HDMI/DP sink audio-video sync delay
4994 * Return: The HDMI/DP sink's audio-video sync delay in milliseconds or 0 if
5000 int i = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); in drm_av_sync_delay()
5003 if (!connector->latency_present[0]) in drm_av_sync_delay()
5005 if (!connector->latency_present[1]) in drm_av_sync_delay()
5008 a = connector->audio_latency[i]; in drm_av_sync_delay()
5009 v = connector->video_latency[i]; in drm_av_sync_delay()
5022 a = min(2 * (a - 1), 500); in drm_av_sync_delay()
5024 v = min(2 * (v - 1), 500); in drm_av_sync_delay()
5026 return max(v - a, 0); in drm_av_sync_delay()
5031 * drm_detect_hdmi_monitor - detect whether monitor is HDMI
5034 * Parse the CEA extension according to CEA-861-B.
5068 * drm_detect_monitor_audio - check monitor audio capability
5117 * drm_default_rgb_quant_range - default RGB quantization range
5121 * as specified in CEA-861.
5137 struct drm_display_info *info = &connector->display_info; in drm_parse_vcdb()
5142 info->rgb_quant_range_selectable = true; in drm_parse_vcdb()
5186 struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; in drm_parse_ycbcr420_deep_color_info()
5189 hdmi->y420_dc_modes = dc_mask; in drm_parse_ycbcr420_deep_color_info()
5195 struct drm_display_info *display = &connector->display_info; in drm_parse_hdmi_forum_vsdb()
5196 struct drm_hdmi_info *hdmi = &display->hdmi; in drm_parse_hdmi_forum_vsdb()
5198 display->has_hdmi_infoframe = true; in drm_parse_hdmi_forum_vsdb()
5201 hdmi->scdc.supported = true; in drm_parse_hdmi_forum_vsdb()
5203 hdmi->scdc.read_request = true; in drm_parse_hdmi_forum_vsdb()
5209 * * Availability of a HF-VSDB block in EDID (check) in drm_parse_hdmi_forum_vsdb()
5210 * * Non zero Max_TMDS_Char_Rate filed in HF-VSDB (let's check) in drm_parse_hdmi_forum_vsdb()
5218 struct drm_scdc *scdc = &hdmi->scdc; in drm_parse_hdmi_forum_vsdb()
5221 display->max_tmds_clock = max_tmds_clock; in drm_parse_hdmi_forum_vsdb()
5222 DRM_DEBUG_KMS("HF-VSDB: max TMDS clock %d kHz\n", in drm_parse_hdmi_forum_vsdb()
5223 display->max_tmds_clock); in drm_parse_hdmi_forum_vsdb()
5226 if (scdc->supported) { in drm_parse_hdmi_forum_vsdb()
5227 scdc->scrambling.supported = true; in drm_parse_hdmi_forum_vsdb()
5231 scdc->scrambling.low_rates = true; in drm_parse_hdmi_forum_vsdb()
5240 struct drm_hdmi_dsc_cap *hdmi_dsc = &hdmi->dsc_cap; in drm_parse_hdmi_forum_vsdb()
5244 drm_get_max_frl_rate(max_frl_rate, &hdmi->max_lanes, in drm_parse_hdmi_forum_vsdb()
5245 &hdmi->max_frl_rate_per_lane); in drm_parse_hdmi_forum_vsdb()
5246 hdmi_dsc->v_1p2 = hf_vsdb[11] & DRM_EDID_DSC_1P2; in drm_parse_hdmi_forum_vsdb()
5248 if (hdmi_dsc->v_1p2) { in drm_parse_hdmi_forum_vsdb()
5249 hdmi_dsc->native_420 = hf_vsdb[11] & DRM_EDID_DSC_NATIVE_420; in drm_parse_hdmi_forum_vsdb()
5250 hdmi_dsc->all_bpp = hf_vsdb[11] & DRM_EDID_DSC_ALL_BPP; in drm_parse_hdmi_forum_vsdb()
5253 hdmi_dsc->bpc_supported = 16; in drm_parse_hdmi_forum_vsdb()
5255 hdmi_dsc->bpc_supported = 12; in drm_parse_hdmi_forum_vsdb()
5257 hdmi_dsc->bpc_supported = 10; in drm_parse_hdmi_forum_vsdb()
5259 hdmi_dsc->bpc_supported = 0; in drm_parse_hdmi_forum_vsdb()
5262 drm_get_max_frl_rate(dsc_max_frl_rate, &hdmi_dsc->max_lanes, in drm_parse_hdmi_forum_vsdb()
5263 &hdmi_dsc->max_frl_rate_per_lane); in drm_parse_hdmi_forum_vsdb()
5264 hdmi_dsc->total_chunk_kbytes = hf_vsdb[13] & DRM_EDID_DSC_TOTAL_CHUNK_KBYTES; in drm_parse_hdmi_forum_vsdb()
5269 hdmi_dsc->max_slices = 1; in drm_parse_hdmi_forum_vsdb()
5270 hdmi_dsc->clk_per_slice = 340; in drm_parse_hdmi_forum_vsdb()
5273 hdmi_dsc->max_slices = 2; in drm_parse_hdmi_forum_vsdb()
5274 hdmi_dsc->clk_per_slice = 340; in drm_parse_hdmi_forum_vsdb()
5277 hdmi_dsc->max_slices = 4; in drm_parse_hdmi_forum_vsdb()
5278 hdmi_dsc->clk_per_slice = 340; in drm_parse_hdmi_forum_vsdb()
5281 hdmi_dsc->max_slices = 8; in drm_parse_hdmi_forum_vsdb()
5282 hdmi_dsc->clk_per_slice = 340; in drm_parse_hdmi_forum_vsdb()
5285 hdmi_dsc->max_slices = 8; in drm_parse_hdmi_forum_vsdb()
5286 hdmi_dsc->clk_per_slice = 400; in drm_parse_hdmi_forum_vsdb()
5289 hdmi_dsc->max_slices = 12; in drm_parse_hdmi_forum_vsdb()
5290 hdmi_dsc->clk_per_slice = 400; in drm_parse_hdmi_forum_vsdb()
5293 hdmi_dsc->max_slices = 16; in drm_parse_hdmi_forum_vsdb()
5294 hdmi_dsc->clk_per_slice = 400; in drm_parse_hdmi_forum_vsdb()
5298 hdmi_dsc->max_slices = 0; in drm_parse_hdmi_forum_vsdb()
5299 hdmi_dsc->clk_per_slice = 0; in drm_parse_hdmi_forum_vsdb()
5311 struct drm_display_info *info = &connector->display_info; in drm_parse_hdmi_deep_color_info()
5315 info->bpc = 8; in drm_parse_hdmi_deep_color_info()
5322 info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_30; in drm_parse_hdmi_deep_color_info()
5324 connector->name); in drm_parse_hdmi_deep_color_info()
5329 info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_36; in drm_parse_hdmi_deep_color_info()
5331 connector->name); in drm_parse_hdmi_deep_color_info()
5336 info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_48; in drm_parse_hdmi_deep_color_info()
5338 connector->name); in drm_parse_hdmi_deep_color_info()
5343 connector->name); in drm_parse_hdmi_deep_color_info()
5348 connector->name, dc_bpc); in drm_parse_hdmi_deep_color_info()
5349 info->bpc = dc_bpc; in drm_parse_hdmi_deep_color_info()
5354 connector->name); in drm_parse_hdmi_deep_color_info()
5363 connector->name); in drm_parse_hdmi_deep_color_info()
5370 struct drm_display_info *info = &connector->display_info; in drm_parse_hdmi_vsdb_video()
5373 info->is_hdmi = true; in drm_parse_hdmi_vsdb_video()
5376 info->dvi_dual = db[6] & 1; in drm_parse_hdmi_vsdb_video()
5378 info->max_tmds_clock = db[7] * 5000; in drm_parse_hdmi_vsdb_video()
5382 info->dvi_dual, in drm_parse_hdmi_vsdb_video()
5383 info->max_tmds_clock); in drm_parse_hdmi_vsdb_video()
5391 struct drm_display_info *info = &connector->display_info; in drm_parse_cea_ext()
5399 info->cea_rev = edid_ext[1]; in drm_parse_cea_ext()
5402 info->color_formats = DRM_COLOR_FORMAT_RGB444; in drm_parse_cea_ext()
5404 info->color_formats |= DRM_COLOR_FORMAT_YCRCB444; in drm_parse_cea_ext()
5406 info->color_formats |= DRM_COLOR_FORMAT_YCRCB422; in drm_parse_cea_ext()
5432 const struct detailed_non_pixel *data = &timing->data.other_data; in get_monitor_range()
5433 const struct detailed_data_monitor_range *range = &data->data.range; in get_monitor_range()
5444 if (range->flags != DRM_EDID_RANGE_LIMITS_ONLY_FLAG) in get_monitor_range()
5447 monitor_range->min_vfreq = range->min_vfreq; in get_monitor_range()
5448 monitor_range->max_vfreq = range->max_vfreq; in get_monitor_range()
5455 struct drm_display_info *info = &connector->display_info; in drm_get_monitor_range()
5461 &info->monitor_range); in drm_get_monitor_range()
5463 DRM_DEBUG_KMS("Supported Monitor Refresh rate range is %d Hz - %d Hz\n", in drm_get_monitor_range()
5464 info->monitor_range.min_vfreq, in drm_get_monitor_range()
5465 info->monitor_range.max_vfreq); in drm_get_monitor_range()
5474 struct drm_display_info *info = &connector->display_info; in drm_reset_display_info()
5476 info->width_mm = 0; in drm_reset_display_info()
5477 info->height_mm = 0; in drm_reset_display_info()
5479 info->bpc = 0; in drm_reset_display_info()
5480 info->color_formats = 0; in drm_reset_display_info()
5481 info->cea_rev = 0; in drm_reset_display_info()
5482 info->max_tmds_clock = 0; in drm_reset_display_info()
5483 info->dvi_dual = false; in drm_reset_display_info()
5484 info->is_hdmi = false; in drm_reset_display_info()
5485 info->has_hdmi_infoframe = false; in drm_reset_display_info()
5486 info->rgb_quant_range_selectable = false; in drm_reset_display_info()
5487 memset(&info->hdmi, 0, sizeof(info->hdmi)); in drm_reset_display_info()
5489 info->non_desktop = 0; in drm_reset_display_info()
5490 memset(&info->monitor_range, 0, sizeof(info->monitor_range)); in drm_reset_display_info()
5495 struct drm_display_info *info = &connector->display_info; in drm_add_display_info()
5501 info->width_mm = edid->width_cm * 10; in drm_add_display_info()
5502 info->height_mm = edid->height_cm * 10; in drm_add_display_info()
5504 info->non_desktop = !!(quirks & EDID_QUIRK_NON_DESKTOP); in drm_add_display_info()
5508 DRM_DEBUG_KMS("non_desktop set to %d\n", info->non_desktop); in drm_add_display_info()
5510 if (edid->revision < 3) in drm_add_display_info()
5513 if (!(edid->input & DRM_EDID_INPUT_DIGITAL)) in drm_add_display_info()
5516 info->color_formats |= DRM_COLOR_FORMAT_RGB444; in drm_add_display_info()
5526 if (info->bpc == 0 && edid->revision == 3 && in drm_add_display_info()
5527 edid->input & DRM_EDID_DIGITAL_DFP_1_X) { in drm_add_display_info()
5528 info->bpc = 8; in drm_add_display_info()
5530 connector->name, info->bpc); in drm_add_display_info()
5534 if (edid->revision < 4) in drm_add_display_info()
5537 switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) { in drm_add_display_info()
5539 info->bpc = 6; in drm_add_display_info()
5542 info->bpc = 8; in drm_add_display_info()
5545 info->bpc = 10; in drm_add_display_info()
5548 info->bpc = 12; in drm_add_display_info()
5551 info->bpc = 14; in drm_add_display_info()
5554 info->bpc = 16; in drm_add_display_info()
5558 info->bpc = 0; in drm_add_display_info()
5562 DRM_DEBUG("%s: Assigning EDID-1.4 digital sink color depth as %d bpc.\n", in drm_add_display_info()
5563 connector->name, info->bpc); in drm_add_display_info()
5565 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444) in drm_add_display_info()
5566 info->color_formats |= DRM_COLOR_FORMAT_YCRCB444; in drm_add_display_info()
5567 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422) in drm_add_display_info()
5568 info->color_formats |= DRM_COLOR_FORMAT_YCRCB422; in drm_add_display_info()
5581 base->rev, base->bytes, base->prod_id, base->ext_count); in validate_displayid()
5584 dispid_length = sizeof(*base) + base->bytes + 1; in validate_displayid()
5585 if (dispid_length > length - idx) in validate_displayid()
5586 return -EINVAL; in validate_displayid()
5592 return -EINVAL; in validate_displayid()
5602 unsigned pixel_clock = (timings->pixel_clock[0] | in drm_mode_displayid_detailed()
5603 (timings->pixel_clock[1] << 8) | in drm_mode_displayid_detailed()
5604 (timings->pixel_clock[2] << 16)) + 1; in drm_mode_displayid_detailed()
5605 unsigned hactive = (timings->hactive[0] | timings->hactive[1] << 8) + 1; in drm_mode_displayid_detailed()
5606 unsigned hblank = (timings->hblank[0] | timings->hblank[1] << 8) + 1; in drm_mode_displayid_detailed()
5607 unsigned hsync = (timings->hsync[0] | (timings->hsync[1] & 0x7f) << 8) + 1; in drm_mode_displayid_detailed()
5608 unsigned hsync_width = (timings->hsw[0] | timings->hsw[1] << 8) + 1; in drm_mode_displayid_detailed()
5609 unsigned vactive = (timings->vactive[0] | timings->vactive[1] << 8) + 1; in drm_mode_displayid_detailed()
5610 unsigned vblank = (timings->vblank[0] | timings->vblank[1] << 8) + 1; in drm_mode_displayid_detailed()
5611 unsigned vsync = (timings->vsync[0] | (timings->vsync[1] & 0x7f) << 8) + 1; in drm_mode_displayid_detailed()
5612 unsigned vsync_width = (timings->vsw[0] | timings->vsw[1] << 8) + 1; in drm_mode_displayid_detailed()
5613 bool hsync_positive = (timings->hsync[1] >> 7) & 0x1; in drm_mode_displayid_detailed()
5614 bool vsync_positive = (timings->vsync[1] >> 7) & 0x1; in drm_mode_displayid_detailed()
5620 mode->clock = pixel_clock * 10; in drm_mode_displayid_detailed()
5621 mode->hdisplay = hactive; in drm_mode_displayid_detailed()
5622 mode->hsync_start = mode->hdisplay + hsync; in drm_mode_displayid_detailed()
5623 mode->hsync_end = mode->hsync_start + hsync_width; in drm_mode_displayid_detailed()
5624 mode->htotal = mode->hdisplay + hblank; in drm_mode_displayid_detailed()
5626 mode->vdisplay = vactive; in drm_mode_displayid_detailed()
5627 mode->vsync_start = mode->vdisplay + vsync; in drm_mode_displayid_detailed()
5628 mode->vsync_end = mode->vsync_start + vsync_width; in drm_mode_displayid_detailed()
5629 mode->vtotal = mode->vdisplay + vblank; in drm_mode_displayid_detailed()
5631 mode->flags = 0; in drm_mode_displayid_detailed()
5632 mode->flags |= hsync_positive ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC; in drm_mode_displayid_detailed()
5633 mode->flags |= vsync_positive ? DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC; in drm_mode_displayid_detailed()
5634 mode->type = DRM_MODE_TYPE_DRIVER; in drm_mode_displayid_detailed()
5636 if (timings->flags & 0x80) in drm_mode_displayid_detailed()
5637 mode->type |= DRM_MODE_TYPE_PREFERRED; in drm_mode_displayid_detailed()
5652 if (block->num_bytes % 20) in add_displayid_detailed_1_modes()
5655 num_timings = block->num_bytes / 20; in add_displayid_detailed_1_modes()
5657 struct displayid_detailed_timings_1 *timings = &det->timings[i]; in add_displayid_detailed_1_modes()
5659 newmode = drm_mode_displayid_detailed(connector->dev, timings); in add_displayid_detailed_1_modes()
5686 switch (block->tag) { in add_displayid_detailed_modes()
5698 * drm_add_edid_modes - add modes from EDID data, if available
5719 drm_warn(connector->dev, "%s: EDID invalid.\n", in drm_add_edid_modes()
5720 connector->name); in drm_add_edid_modes()
5727 * CEA-861-F adds ycbcr capability map block, for HDMI 2.0 sinks. in drm_add_edid_modes()
5735 * - preferred detailed mode in drm_add_edid_modes()
5736 * - other detailed modes from base block in drm_add_edid_modes()
5737 * - detailed modes from extension blocks in drm_add_edid_modes()
5738 * - CVT 3-byte code modes in drm_add_edid_modes()
5739 * - standard timing codes in drm_add_edid_modes()
5740 * - established timing codes in drm_add_edid_modes()
5741 * - modes inferred from GTF or CVT range information in drm_add_edid_modes()
5754 if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) in drm_add_edid_modes()
5761 connector->display_info.bpc = 6; in drm_add_edid_modes()
5764 connector->display_info.bpc = 8; in drm_add_edid_modes()
5767 connector->display_info.bpc = 10; in drm_add_edid_modes()
5770 connector->display_info.bpc = 12; in drm_add_edid_modes()
5777 * drm_add_modes_noedid - add modes for the connectors without EDID
5792 struct drm_device *dev = connector->dev; in drm_add_modes_noedid()
5809 if (ptr->hdisplay > hdisplay || in drm_add_modes_noedid()
5810 ptr->vdisplay > vdisplay) in drm_add_modes_noedid()
5826 * drm_set_preferred_mode - Sets the preferred mode of a connector
5839 list_for_each_entry(mode, &connector->probed_modes, head) { in drm_set_preferred_mode()
5840 if (mode->hdisplay == hpref && in drm_set_preferred_mode()
5841 mode->vdisplay == vpref) in drm_set_preferred_mode()
5842 mode->type |= DRM_MODE_TYPE_PREFERRED; in drm_set_preferred_mode()
5850 * FIXME: sil-sii8620 doesn't have a connector around when in is_hdmi2_sink()
5856 return connector->display_info.hdmi.scdc.supported || in is_hdmi2_sink()
5857 connector->display_info.color_formats & DRM_COLOR_FORMAT_YCRCB420; in is_hdmi2_sink()
5866 * drm_hdmi_infoframe_set_hdr_metadata() - fill an HDMI DRM infoframe with
5882 return -EINVAL; in drm_hdmi_infoframe_set_hdr_metadata()
5884 connector = conn_state->connector; in drm_hdmi_infoframe_set_hdr_metadata()
5886 if (!conn_state->hdr_output_metadata) in drm_hdmi_infoframe_set_hdr_metadata()
5887 return -EINVAL; in drm_hdmi_infoframe_set_hdr_metadata()
5889 hdr_metadata = conn_state->hdr_output_metadata->data; in drm_hdmi_infoframe_set_hdr_metadata()
5892 return -EINVAL; in drm_hdmi_infoframe_set_hdr_metadata()
5895 if (!is_eotf_supported(hdr_metadata->hdmi_metadata_type1.eotf, in drm_hdmi_infoframe_set_hdr_metadata()
5896 connector->hdr_sink_metadata.hdmi_type1.eotf)) { in drm_hdmi_infoframe_set_hdr_metadata()
5898 return -EINVAL; in drm_hdmi_infoframe_set_hdr_metadata()
5905 frame->eotf = hdr_metadata->hdmi_metadata_type1.eotf; in drm_hdmi_infoframe_set_hdr_metadata()
5906 frame->metadata_type = hdr_metadata->hdmi_metadata_type1.metadata_type; in drm_hdmi_infoframe_set_hdr_metadata()
5908 BUILD_BUG_ON(sizeof(frame->display_primaries) != in drm_hdmi_infoframe_set_hdr_metadata()
5909 sizeof(hdr_metadata->hdmi_metadata_type1.display_primaries)); in drm_hdmi_infoframe_set_hdr_metadata()
5910 BUILD_BUG_ON(sizeof(frame->white_point) != in drm_hdmi_infoframe_set_hdr_metadata()
5911 sizeof(hdr_metadata->hdmi_metadata_type1.white_point)); in drm_hdmi_infoframe_set_hdr_metadata()
5913 memcpy(&frame->display_primaries, in drm_hdmi_infoframe_set_hdr_metadata()
5914 &hdr_metadata->hdmi_metadata_type1.display_primaries, in drm_hdmi_infoframe_set_hdr_metadata()
5915 sizeof(frame->display_primaries)); in drm_hdmi_infoframe_set_hdr_metadata()
5917 memcpy(&frame->white_point, in drm_hdmi_infoframe_set_hdr_metadata()
5918 &hdr_metadata->hdmi_metadata_type1.white_point, in drm_hdmi_infoframe_set_hdr_metadata()
5919 sizeof(frame->white_point)); in drm_hdmi_infoframe_set_hdr_metadata()
5921 frame->max_display_mastering_luminance = in drm_hdmi_infoframe_set_hdr_metadata()
5922 hdr_metadata->hdmi_metadata_type1.max_display_mastering_luminance; in drm_hdmi_infoframe_set_hdr_metadata()
5923 frame->min_display_mastering_luminance = in drm_hdmi_infoframe_set_hdr_metadata()
5924 hdr_metadata->hdmi_metadata_type1.min_display_mastering_luminance; in drm_hdmi_infoframe_set_hdr_metadata()
5925 frame->max_fall = hdr_metadata->hdmi_metadata_type1.max_fall; in drm_hdmi_infoframe_set_hdr_metadata()
5926 frame->max_cll = hdr_metadata->hdmi_metadata_type1.max_cll; in drm_hdmi_infoframe_set_hdr_metadata()
5936 connector->display_info.has_hdmi_infoframe : false; in drm_mode_hdmi_vic()
5942 if (mode->flags & DRM_MODE_FLAG_3D_MASK) in drm_mode_hdmi_vic()
5965 * HDMI 1.4 VIC range: 1 <= VIC <= 64 (CEA-861-D) but in drm_mode_cea_vic()
5966 * HDMI 2.0 VIC range: 1 <= VIC <= 107 (CEA-861-F). So we in drm_mode_cea_vic()
5976 * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with
5993 return -EINVAL; in drm_hdmi_avi_infoframe_from_display_mode()
5997 if (mode->flags & DRM_MODE_FLAG_DBLCLK) in drm_hdmi_avi_infoframe_from_display_mode()
5998 frame->pixel_repeat = 1; in drm_hdmi_avi_infoframe_from_display_mode()
6003 frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE; in drm_hdmi_avi_infoframe_from_display_mode()
6010 frame->content_type = HDMI_CONTENT_TYPE_GRAPHICS; in drm_hdmi_avi_infoframe_from_display_mode()
6011 frame->itc = 0; in drm_hdmi_avi_infoframe_from_display_mode()
6017 picture_aspect = mode->picture_aspect_ratio; in drm_hdmi_avi_infoframe_from_display_mode()
6033 return -EINVAL; in drm_hdmi_avi_infoframe_from_display_mode()
6036 return -EINVAL; in drm_hdmi_avi_infoframe_from_display_mode()
6038 return -EINVAL; in drm_hdmi_avi_infoframe_from_display_mode()
6044 frame->video_code = vic; in drm_hdmi_avi_infoframe_from_display_mode()
6045 frame->picture_aspect = picture_aspect; in drm_hdmi_avi_infoframe_from_display_mode()
6046 frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE; in drm_hdmi_avi_infoframe_from_display_mode()
6047 frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN; in drm_hdmi_avi_infoframe_from_display_mode()
6096 * drm_hdmi_avi_infoframe_colorspace() - fill the HDMI AVI infoframe
6106 u32 colorimetry_index = conn_state->colorspace & FULL_COLORIMETRY_MASK; in drm_hdmi_avi_infoframe_colorspace()
6113 frame->colorimetry = colorimetry_val & NORMAL_COLORIMETRY_MASK; in drm_hdmi_avi_infoframe_colorspace()
6118 frame->extended_colorimetry = (colorimetry_val >> 2) & in drm_hdmi_avi_infoframe_colorspace()
6124 * drm_hdmi_avi_infoframe_quant_range() - fill the HDMI AVI infoframe
6137 const struct drm_display_info *info = &connector->display_info; in drm_hdmi_avi_infoframe_quant_range()
6140 * CEA-861: in drm_hdmi_avi_infoframe_quant_range()
6141 * "A Source shall not send a non-zero Q value that does not correspond in drm_hdmi_avi_infoframe_quant_range()
6146 * HDMI 2.0 recommends sending non-zero Q when it does match the in drm_hdmi_avi_infoframe_quant_range()
6149 if (info->rgb_quant_range_selectable || in drm_hdmi_avi_infoframe_quant_range()
6151 frame->quantization_range = rgb_quant_range; in drm_hdmi_avi_infoframe_quant_range()
6153 frame->quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT; in drm_hdmi_avi_infoframe_quant_range()
6156 * CEA-861-F: in drm_hdmi_avi_infoframe_quant_range()
6158 * YQ-field to match the RGB Quantization Range being transmitted in drm_hdmi_avi_infoframe_quant_range()
6160 * set YQ=1) and the Sink shall ignore the YQ-field." in drm_hdmi_avi_infoframe_quant_range()
6163 * by non-zero YQ when receiving RGB. There doesn't seem to be any in drm_hdmi_avi_infoframe_quant_range()
6164 * good way to tell which version of CEA-861 the sink supports, so in drm_hdmi_avi_infoframe_quant_range()
6165 * we limit non-zero YQ to HDMI 2.0 sinks only as HDMI 2.0 is based in drm_hdmi_avi_infoframe_quant_range()
6166 * on on CEA-861-F. in drm_hdmi_avi_infoframe_quant_range()
6170 frame->ycc_quantization_range = in drm_hdmi_avi_infoframe_quant_range()
6173 frame->ycc_quantization_range = in drm_hdmi_avi_infoframe_quant_range()
6179 * drm_hdmi_avi_infoframe_bars() - fill the HDMI AVI infoframe
6188 frame->right_bar = conn_state->tv.margins.right; in drm_hdmi_avi_infoframe_bars()
6189 frame->left_bar = conn_state->tv.margins.left; in drm_hdmi_avi_infoframe_bars()
6190 frame->top_bar = conn_state->tv.margins.top; in drm_hdmi_avi_infoframe_bars()
6191 frame->bottom_bar = conn_state->tv.margins.bottom; in drm_hdmi_avi_infoframe_bars()
6198 u32 layout = mode->flags & DRM_MODE_FLAG_3D_MASK; in s3d_structure_from_display_mode()
6223 * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
6231 * function will return -EINVAL, error that can be safely ignored.
6241 * FIXME: sil-sii8620 doesn't have a connector around when in drm_hdmi_vendor_infoframe_from_display_mode()
6245 connector->display_info.has_hdmi_infoframe : false; in drm_hdmi_vendor_infoframe_from_display_mode()
6249 return -EINVAL; in drm_hdmi_vendor_infoframe_from_display_mode()
6252 return -EINVAL; in drm_hdmi_vendor_infoframe_from_display_mode()
6267 frame->vic = drm_mode_hdmi_vic(connector, mode); in drm_hdmi_vendor_infoframe_from_display_mode()
6268 frame->s3d_struct = s3d_structure_from_display_mode(mode); in drm_hdmi_vendor_infoframe_from_display_mode()
6283 w = tile->tile_size[0] | tile->tile_size[1] << 8; in drm_parse_tiled_block()
6284 h = tile->tile_size[2] | tile->tile_size[3] << 8; in drm_parse_tiled_block()
6286 num_v_tile = (tile->topo[0] & 0xf) | (tile->topo[2] & 0x30); in drm_parse_tiled_block()
6287 num_h_tile = (tile->topo[0] >> 4) | ((tile->topo[2] >> 2) & 0x30); in drm_parse_tiled_block()
6288 tile_v_loc = (tile->topo[1] & 0xf) | ((tile->topo[2] & 0x3) << 4); in drm_parse_tiled_block()
6289 tile_h_loc = (tile->topo[1] >> 4) | (((tile->topo[2] >> 2) & 0x3) << 4); in drm_parse_tiled_block()
6291 connector->has_tile = true; in drm_parse_tiled_block()
6292 if (tile->tile_cap & 0x80) in drm_parse_tiled_block()
6293 connector->tile_is_single_monitor = true; in drm_parse_tiled_block()
6295 connector->num_h_tile = num_h_tile + 1; in drm_parse_tiled_block()
6296 connector->num_v_tile = num_v_tile + 1; in drm_parse_tiled_block()
6297 connector->tile_h_loc = tile_h_loc; in drm_parse_tiled_block()
6298 connector->tile_v_loc = tile_v_loc; in drm_parse_tiled_block()
6299 connector->tile_h_size = w + 1; in drm_parse_tiled_block()
6300 connector->tile_v_size = h + 1; in drm_parse_tiled_block()
6302 DRM_DEBUG_KMS("tile cap 0x%x\n", tile->tile_cap); in drm_parse_tiled_block()
6306 DRM_DEBUG_KMS("vend %c%c%c\n", tile->topology_id[0], tile->topology_id[1], tile->topology_id[2]); in drm_parse_tiled_block()
6308 tg = drm_mode_get_tile_group(connector->dev, tile->topology_id); in drm_parse_tiled_block()
6310 tg = drm_mode_create_tile_group(connector->dev, tile->topology_id); in drm_parse_tiled_block()
6314 if (connector->tile_group != tg) { in drm_parse_tiled_block()
6317 if (connector->tile_group) in drm_parse_tiled_block()
6318 drm_mode_put_tile_group(connector->dev, connector->tile_group); in drm_parse_tiled_block()
6319 connector->tile_group = tg; in drm_parse_tiled_block()
6322 drm_mode_put_tile_group(connector->dev, tg); in drm_parse_tiled_block()
6334 block->tag, block->rev, block->num_bytes); in drm_displayid_parse_tiled()
6336 switch (block->tag) { in drm_displayid_parse_tiled()
6341 DRM_DEBUG_KMS("found DisplayID tag 0x%x, unhandled\n", block->tag); in drm_displayid_parse_tiled()
6354 connector->has_tile = false; in drm_update_tile_info()
6364 if (!connector->has_tile && connector->tile_group) { in drm_update_tile_info()
6365 drm_mode_put_tile_group(connector->dev, connector->tile_group); in drm_update_tile_info()
6366 connector->tile_group = NULL; in drm_update_tile_info()