Lines Matching +full:hdmi +full:- +full:connector
3 * Copyright (c) 2007-2008 Intel Corporation
24 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
31 #include <linux/hdmi.h>
49 (((edid)->version > (maj)) || \
50 ((edid)->version == (maj) && (edid)->revision > (min)))
77 /* Force reduced-blanking timings for detailed modes */
91 struct drm_connector *connector; member
116 /* BOE model on HP Pavilion 15-n233sl reports 8 bpc, but is a 6 bpc panel */
122 /* SDC panel of Lenovo B50-80 reports 8 bpc, but is a 6 bpc panel */
132 /* Envision Peripherals, Inc. EN-7100e */
144 /* LG Philips LCD LP154W01-A5 */
150 /* Samsung SyncMaster 22[5-6]BW */
154 /* Sony PVM-2541A does up to 12 bpc, but only reports max 8 bpc */
166 /* Panel in Samsung NP700G7A-S01PL notebook reports 6bpc */
169 /* Rotel RSX-1058 forwards sink's EDID but only does HDMI 1.1*/
226 /* 0x01 - 640x350@85Hz */
230 /* 0x02 - 640x400@85Hz */
234 /* 0x03 - 720x400@85Hz */
238 /* 0x04 - 640x480@60Hz */
242 /* 0x05 - 640x480@72Hz */
246 /* 0x06 - 640x480@75Hz */
250 /* 0x07 - 640x480@85Hz */
254 /* 0x08 - 800x600@56Hz */
258 /* 0x09 - 800x600@60Hz */
262 /* 0x0a - 800x600@72Hz */
266 /* 0x0b - 800x600@75Hz */
270 /* 0x0c - 800x600@85Hz */
274 /* 0x0d - 800x600@120Hz RB */
278 /* 0x0e - 848x480@60Hz */
282 /* 0x0f - 1024x768@43Hz, interlace */
287 /* 0x10 - 1024x768@60Hz */
291 /* 0x11 - 1024x768@70Hz */
295 /* 0x12 - 1024x768@75Hz */
299 /* 0x13 - 1024x768@85Hz */
303 /* 0x14 - 1024x768@120Hz RB */
307 /* 0x15 - 1152x864@75Hz */
311 /* 0x55 - 1280x720@60Hz */
315 /* 0x16 - 1280x768@60Hz RB */
319 /* 0x17 - 1280x768@60Hz */
323 /* 0x18 - 1280x768@75Hz */
327 /* 0x19 - 1280x768@85Hz */
331 /* 0x1a - 1280x768@120Hz RB */
335 /* 0x1b - 1280x800@60Hz RB */
339 /* 0x1c - 1280x800@60Hz */
343 /* 0x1d - 1280x800@75Hz */
347 /* 0x1e - 1280x800@85Hz */
351 /* 0x1f - 1280x800@120Hz RB */
355 /* 0x20 - 1280x960@60Hz */
359 /* 0x21 - 1280x960@85Hz */
363 /* 0x22 - 1280x960@120Hz RB */
367 /* 0x23 - 1280x1024@60Hz */
371 /* 0x24 - 1280x1024@75Hz */
375 /* 0x25 - 1280x1024@85Hz */
379 /* 0x26 - 1280x1024@120Hz RB */
383 /* 0x27 - 1360x768@60Hz */
387 /* 0x28 - 1360x768@120Hz RB */
391 /* 0x51 - 1366x768@60Hz */
395 /* 0x56 - 1366x768@60Hz */
399 /* 0x29 - 1400x1050@60Hz RB */
403 /* 0x2a - 1400x1050@60Hz */
407 /* 0x2b - 1400x1050@75Hz */
411 /* 0x2c - 1400x1050@85Hz */
415 /* 0x2d - 1400x1050@120Hz RB */
419 /* 0x2e - 1440x900@60Hz RB */
423 /* 0x2f - 1440x900@60Hz */
427 /* 0x30 - 1440x900@75Hz */
431 /* 0x31 - 1440x900@85Hz */
435 /* 0x32 - 1440x900@120Hz RB */
439 /* 0x53 - 1600x900@60Hz */
443 /* 0x33 - 1600x1200@60Hz */
447 /* 0x34 - 1600x1200@65Hz */
451 /* 0x35 - 1600x1200@70Hz */
455 /* 0x36 - 1600x1200@75Hz */
459 /* 0x37 - 1600x1200@85Hz */
463 /* 0x38 - 1600x1200@120Hz RB */
467 /* 0x39 - 1680x1050@60Hz RB */
471 /* 0x3a - 1680x1050@60Hz */
475 /* 0x3b - 1680x1050@75Hz */
479 /* 0x3c - 1680x1050@85Hz */
483 /* 0x3d - 1680x1050@120Hz RB */
487 /* 0x3e - 1792x1344@60Hz */
491 /* 0x3f - 1792x1344@75Hz */
495 /* 0x40 - 1792x1344@120Hz RB */
499 /* 0x41 - 1856x1392@60Hz */
503 /* 0x42 - 1856x1392@75Hz */
507 /* 0x43 - 1856x1392@120Hz RB */
511 /* 0x52 - 1920x1080@60Hz */
515 /* 0x44 - 1920x1200@60Hz RB */
519 /* 0x45 - 1920x1200@60Hz */
523 /* 0x46 - 1920x1200@75Hz */
527 /* 0x47 - 1920x1200@85Hz */
531 /* 0x48 - 1920x1200@120Hz RB */
535 /* 0x49 - 1920x1440@60Hz */
539 /* 0x4a - 1920x1440@75Hz */
543 /* 0x4b - 1920x1440@120Hz RB */
547 /* 0x54 - 2048x1152@60Hz */
551 /* 0x4c - 2560x1600@60Hz RB */
555 /* 0x4d - 2560x1600@60Hz */
559 /* 0x4e - 2560x1600@75Hz */
563 /* 0x4f - 2560x1600@85Hz */
567 /* 0x50 - 2560x1600@120Hz RB */
571 /* 0x57 - 4096x2160@60Hz RB */
575 /* 0x58 - 4096x2160@59.94Hz RB */
584 * modes are old-school Mac modes. The EDID spec says the 1152x864@75 mode
588 * The DMT modes have been fact-checked; the rest are mild guesses.
715 * From CEA/CTA-861 spec.
720 /* 1 - 640x480@60Hz 4:3 */
725 /* 2 - 720x480@60Hz 4:3 */
730 /* 3 - 720x480@60Hz 16:9 */
735 /* 4 - 1280x720@60Hz 16:9 */
740 /* 5 - 1920x1080i@60Hz 16:9 */
746 /* 6 - 720(1440)x480i@60Hz 4:3 */
752 /* 7 - 720(1440)x480i@60Hz 16:9 */
758 /* 8 - 720(1440)x240@60Hz 4:3 */
764 /* 9 - 720(1440)x240@60Hz 16:9 */
770 /* 10 - 2880x480i@60Hz 4:3 */
776 /* 11 - 2880x480i@60Hz 16:9 */
782 /* 12 - 2880x240@60Hz 4:3 */
787 /* 13 - 2880x240@60Hz 16:9 */
792 /* 14 - 1440x480@60Hz 4:3 */
797 /* 15 - 1440x480@60Hz 16:9 */
802 /* 16 - 1920x1080@60Hz 16:9 */
807 /* 17 - 720x576@50Hz 4:3 */
812 /* 18 - 720x576@50Hz 16:9 */
817 /* 19 - 1280x720@50Hz 16:9 */
822 /* 20 - 1920x1080i@50Hz 16:9 */
828 /* 21 - 720(1440)x576i@50Hz 4:3 */
834 /* 22 - 720(1440)x576i@50Hz 16:9 */
840 /* 23 - 720(1440)x288@50Hz 4:3 */
846 /* 24 - 720(1440)x288@50Hz 16:9 */
852 /* 25 - 2880x576i@50Hz 4:3 */
858 /* 26 - 2880x576i@50Hz 16:9 */
864 /* 27 - 2880x288@50Hz 4:3 */
869 /* 28 - 2880x288@50Hz 16:9 */
874 /* 29 - 1440x576@50Hz 4:3 */
879 /* 30 - 1440x576@50Hz 16:9 */
884 /* 31 - 1920x1080@50Hz 16:9 */
889 /* 32 - 1920x1080@24Hz 16:9 */
894 /* 33 - 1920x1080@25Hz 16:9 */
899 /* 34 - 1920x1080@30Hz 16:9 */
904 /* 35 - 2880x480@60Hz 4:3 */
909 /* 36 - 2880x480@60Hz 16:9 */
914 /* 37 - 2880x576@50Hz 4:3 */
919 /* 38 - 2880x576@50Hz 16:9 */
924 /* 39 - 1920x1080i@50Hz 16:9 */
930 /* 40 - 1920x1080i@100Hz 16:9 */
936 /* 41 - 1280x720@100Hz 16:9 */
941 /* 42 - 720x576@100Hz 4:3 */
946 /* 43 - 720x576@100Hz 16:9 */
951 /* 44 - 720(1440)x576i@100Hz 4:3 */
957 /* 45 - 720(1440)x576i@100Hz 16:9 */
963 /* 46 - 1920x1080i@120Hz 16:9 */
969 /* 47 - 1280x720@120Hz 16:9 */
974 /* 48 - 720x480@120Hz 4:3 */
979 /* 49 - 720x480@120Hz 16:9 */
984 /* 50 - 720(1440)x480i@120Hz 4:3 */
990 /* 51 - 720(1440)x480i@120Hz 16:9 */
996 /* 52 - 720x576@200Hz 4:3 */
1001 /* 53 - 720x576@200Hz 16:9 */
1006 /* 54 - 720(1440)x576i@200Hz 4:3 */
1012 /* 55 - 720(1440)x576i@200Hz 16:9 */
1018 /* 56 - 720x480@240Hz 4:3 */
1023 /* 57 - 720x480@240Hz 16:9 */
1028 /* 58 - 720(1440)x480i@240Hz 4:3 */
1034 /* 59 - 720(1440)x480i@240Hz 16:9 */
1040 /* 60 - 1280x720@24Hz 16:9 */
1045 /* 61 - 1280x720@25Hz 16:9 */
1050 /* 62 - 1280x720@30Hz 16:9 */
1055 /* 63 - 1920x1080@120Hz 16:9 */
1060 /* 64 - 1920x1080@100Hz 16:9 */
1065 /* 65 - 1280x720@24Hz 64:27 */
1070 /* 66 - 1280x720@25Hz 64:27 */
1075 /* 67 - 1280x720@30Hz 64:27 */
1080 /* 68 - 1280x720@50Hz 64:27 */
1085 /* 69 - 1280x720@60Hz 64:27 */
1090 /* 70 - 1280x720@100Hz 64:27 */
1095 /* 71 - 1280x720@120Hz 64:27 */
1100 /* 72 - 1920x1080@24Hz 64:27 */
1105 /* 73 - 1920x1080@25Hz 64:27 */
1110 /* 74 - 1920x1080@30Hz 64:27 */
1115 /* 75 - 1920x1080@50Hz 64:27 */
1120 /* 76 - 1920x1080@60Hz 64:27 */
1125 /* 77 - 1920x1080@100Hz 64:27 */
1130 /* 78 - 1920x1080@120Hz 64:27 */
1135 /* 79 - 1680x720@24Hz 64:27 */
1140 /* 80 - 1680x720@25Hz 64:27 */
1145 /* 81 - 1680x720@30Hz 64:27 */
1150 /* 82 - 1680x720@50Hz 64:27 */
1155 /* 83 - 1680x720@60Hz 64:27 */
1160 /* 84 - 1680x720@100Hz 64:27 */
1165 /* 85 - 1680x720@120Hz 64:27 */
1170 /* 86 - 2560x1080@24Hz 64:27 */
1175 /* 87 - 2560x1080@25Hz 64:27 */
1180 /* 88 - 2560x1080@30Hz 64:27 */
1185 /* 89 - 2560x1080@50Hz 64:27 */
1190 /* 90 - 2560x1080@60Hz 64:27 */
1195 /* 91 - 2560x1080@100Hz 64:27 */
1200 /* 92 - 2560x1080@120Hz 64:27 */
1205 /* 93 - 3840x2160@24Hz 16:9 */
1210 /* 94 - 3840x2160@25Hz 16:9 */
1215 /* 95 - 3840x2160@30Hz 16:9 */
1220 /* 96 - 3840x2160@50Hz 16:9 */
1225 /* 97 - 3840x2160@60Hz 16:9 */
1230 /* 98 - 4096x2160@24Hz 256:135 */
1235 /* 99 - 4096x2160@25Hz 256:135 */
1240 /* 100 - 4096x2160@30Hz 256:135 */
1245 /* 101 - 4096x2160@50Hz 256:135 */
1250 /* 102 - 4096x2160@60Hz 256:135 */
1255 /* 103 - 3840x2160@24Hz 64:27 */
1260 /* 104 - 3840x2160@25Hz 64:27 */
1265 /* 105 - 3840x2160@30Hz 64:27 */
1270 /* 106 - 3840x2160@50Hz 64:27 */
1275 /* 107 - 3840x2160@60Hz 64:27 */
1280 /* 108 - 1280x720@48Hz 16:9 */
1285 /* 109 - 1280x720@48Hz 64:27 */
1290 /* 110 - 1680x720@48Hz 64:27 */
1295 /* 111 - 1920x1080@48Hz 16:9 */
1300 /* 112 - 1920x1080@48Hz 64:27 */
1305 /* 113 - 2560x1080@48Hz 64:27 */
1310 /* 114 - 3840x2160@48Hz 16:9 */
1315 /* 115 - 4096x2160@48Hz 256:135 */
1320 /* 116 - 3840x2160@48Hz 64:27 */
1325 /* 117 - 3840x2160@100Hz 16:9 */
1330 /* 118 - 3840x2160@120Hz 16:9 */
1335 /* 119 - 3840x2160@100Hz 64:27 */
1340 /* 120 - 3840x2160@120Hz 64:27 */
1345 /* 121 - 5120x2160@24Hz 64:27 */
1350 /* 122 - 5120x2160@25Hz 64:27 */
1355 /* 123 - 5120x2160@30Hz 64:27 */
1360 /* 124 - 5120x2160@48Hz 64:27 */
1365 /* 125 - 5120x2160@50Hz 64:27 */
1370 /* 126 - 5120x2160@60Hz 64:27 */
1375 /* 127 - 5120x2160@100Hz 64:27 */
1383 * From CEA/CTA-861 spec.
1388 /* 193 - 5120x2160@120Hz 64:27 */
1393 /* 194 - 7680x4320@24Hz 16:9 */
1398 /* 195 - 7680x4320@25Hz 16:9 */
1403 /* 196 - 7680x4320@30Hz 16:9 */
1408 /* 197 - 7680x4320@48Hz 16:9 */
1413 /* 198 - 7680x4320@50Hz 16:9 */
1418 /* 199 - 7680x4320@60Hz 16:9 */
1423 /* 200 - 7680x4320@100Hz 16:9 */
1428 /* 201 - 7680x4320@120Hz 16:9 */
1433 /* 202 - 7680x4320@24Hz 64:27 */
1438 /* 203 - 7680x4320@25Hz 64:27 */
1443 /* 204 - 7680x4320@30Hz 64:27 */
1448 /* 205 - 7680x4320@48Hz 64:27 */
1453 /* 206 - 7680x4320@50Hz 64:27 */
1458 /* 207 - 7680x4320@60Hz 64:27 */
1463 /* 208 - 7680x4320@100Hz 64:27 */
1468 /* 209 - 7680x4320@120Hz 64:27 */
1473 /* 210 - 10240x4320@24Hz 64:27 */
1478 /* 211 - 10240x4320@25Hz 64:27 */
1483 /* 212 - 10240x4320@30Hz 64:27 */
1488 /* 213 - 10240x4320@48Hz 64:27 */
1493 /* 214 - 10240x4320@50Hz 64:27 */
1498 /* 215 - 10240x4320@60Hz 64:27 */
1503 /* 216 - 10240x4320@100Hz 64:27 */
1508 /* 217 - 10240x4320@120Hz 64:27 */
1513 /* 218 - 4096x2160@100Hz 256:135 */
1518 /* 219 - 4096x2160@120Hz 256:135 */
1526 * HDMI 1.4 4k modes. Index using the VIC.
1529 /* 0 - dummy, VICs start at 1 */
1531 /* 1 - 3840x2160@30Hz */
1537 /* 2 - 3840x2160@25Hz */
1543 /* 3 - 3840x2160@24Hz */
1549 /* 4 - 4096x2160@24Hz (SMPTE) */
1564 * drm_edid_header_is_valid - sanity check the header of the base EDID block
1586 "Minimum number of valid EDID header bytes (0-8, default 6)");
1593 for (i = 0; i < EDID_LENGTH - 1; i++) in drm_edid_block_checksum()
1596 crc = 0x100 - csum; in drm_edid_block_checksum()
1603 if (raw_edid[EDID_LENGTH - 1] != real_checksum) in drm_edid_block_checksum_diff()
1618 * drm_edid_are_equal - compare two edid blobs.
1634 edid1_len = EDID_LENGTH * (1 + edid1->extensions); in drm_edid_are_equal()
1635 edid2_len = EDID_LENGTH * (1 + edid2->extensions); in drm_edid_are_equal()
1649 * drm_edid_block_valid - Sanity check the EDID block (base or extension)
1681 * fix-up code here will correct the problem, the in drm_edid_block_valid()
1712 /* per-block-type checks */ in drm_edid_block_valid()
1715 if (edid->version != 1) { in drm_edid_block_valid()
1716 DRM_NOTE("EDID has major version %d, instead of 1\n", edid->version); in drm_edid_block_valid()
1720 if (edid->revision > 4) in drm_edid_block_valid()
1746 * drm_edid_is_valid - sanity check EDID data
1749 * Sanity-check an entire EDID record (including extensions)
1761 for (i = 0; i <= edid->extensions; i++) in drm_edid_is_valid()
1771 * drm_do_probe_ddc_edid() - get EDID information via I2C
1779 * Return: 0 on success or -1 on failure.
1792 * adapter reports EAGAIN. However, we find that bit-banging transfers in drm_do_probe_ddc_edid()
1818 * Avoid sending the segment addr to not upset non-compliant in drm_do_probe_ddc_edid()
1821 ret = i2c_transfer(adapter, &msgs[3 - xfers], xfers); in drm_do_probe_ddc_edid()
1823 if (ret == -ENXIO) { in drm_do_probe_ddc_edid()
1824 DRM_DEBUG_KMS("drm: skipping non-existent adapter %s\n", in drm_do_probe_ddc_edid()
1825 adapter->name); in drm_do_probe_ddc_edid()
1828 } while (ret != xfers && --retries); in drm_do_probe_ddc_edid()
1830 return ret == xfers ? 0 : -1; in drm_do_probe_ddc_edid()
1833 static void connector_bad_edid(struct drm_connector *connector, in connector_bad_edid() argument
1849 connector->real_edid_checksum = in connector_bad_edid()
1852 if (connector->bad_edid_counter++ && !drm_debug_enabled(DRM_UT_KMS)) in connector_bad_edid()
1855 drm_dbg_kms(connector->dev, "%s: EDID is invalid:\n", connector->name); in connector_bad_edid()
1874 static struct edid *drm_get_override_edid(struct drm_connector *connector) in drm_get_override_edid() argument
1878 if (connector->override_edid) in drm_get_override_edid()
1879 override = drm_edid_duplicate(connector->edid_blob_ptr->data); in drm_get_override_edid()
1882 override = drm_load_edid_firmware(connector); in drm_get_override_edid()
1888 * drm_add_override_edid_modes - add modes from override/firmware EDID
1889 * @connector: connector we're probing
1898 int drm_add_override_edid_modes(struct drm_connector *connector) in drm_add_override_edid_modes() argument
1903 override = drm_get_override_edid(connector); in drm_add_override_edid_modes()
1905 drm_connector_update_edid_property(connector, override); in drm_add_override_edid_modes()
1906 num_modes = drm_add_edid_modes(connector, override); in drm_add_override_edid_modes()
1909 DRM_DEBUG_KMS("[CONNECTOR:%d:%s] adding %d modes via fallback override/firmware EDID\n", in drm_add_override_edid_modes()
1910 connector->base.id, connector->name, num_modes); in drm_add_override_edid_modes()
1918 * drm_do_get_edid - get EDID data using a custom EDID block read function
1919 * @connector: connector we're probing
1937 struct edid *drm_do_get_edid(struct drm_connector *connector, in drm_do_get_edid() argument
1946 override = drm_get_override_edid(connector); in drm_do_get_edid()
1958 &connector->edid_corrupt)) in drm_do_get_edid()
1961 connector->null_edid_counter++; in drm_do_get_edid()
1989 valid_extensions--; in drm_do_get_edid()
1995 connector_bad_edid(connector, edid, edid[0x7e] + 1); in drm_do_get_edid()
1997 edid[EDID_LENGTH-1] += edid[0x7e] - valid_extensions; in drm_do_get_edid()
2023 connector_bad_edid(connector, edid, 1); in drm_do_get_edid()
2031 * drm_probe_ddc() - probe DDC presence
2046 * drm_get_edid - get EDID data, if available
2047 * @connector: connector we're probing
2051 * attach it to the connector.
2055 struct edid *drm_get_edid(struct drm_connector *connector, in drm_get_edid() argument
2060 if (connector->force == DRM_FORCE_OFF) in drm_get_edid()
2063 if (connector->force == DRM_FORCE_UNSPECIFIED && !drm_probe_ddc(adapter)) in drm_get_edid()
2066 edid = drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter); in drm_get_edid()
2067 drm_connector_update_edid_property(connector, edid); in drm_get_edid()
2073 * drm_get_edid_switcheroo - get EDID data for a vga_switcheroo output
2074 * @connector: connector we're probing
2083 struct edid *drm_get_edid_switcheroo(struct drm_connector *connector, in drm_get_edid_switcheroo() argument
2086 struct drm_device *dev = connector->dev; in drm_get_edid_switcheroo()
2087 struct pci_dev *pdev = to_pci_dev(dev->dev); in drm_get_edid_switcheroo()
2090 if (drm_WARN_ON_ONCE(dev, !dev_is_pci(dev->dev))) in drm_get_edid_switcheroo()
2094 edid = drm_get_edid(connector, adapter); in drm_get_edid_switcheroo()
2102 * drm_edid_duplicate - duplicate an EDID and the extensions
2109 return kmemdup(edid, (edid->extensions + 1) * EDID_LENGTH, GFP_KERNEL); in drm_edid_duplicate()
2116 * edid_vendor - match a string against EDID's obfuscated vendor field
2126 edid_vendor[0] = ((edid->mfg_id[0] & 0x7c) >> 2) + '@'; in edid_vendor()
2127 edid_vendor[1] = (((edid->mfg_id[0] & 0x3) << 3) | in edid_vendor()
2128 ((edid->mfg_id[1] & 0xe0) >> 5)) + '@'; in edid_vendor()
2129 edid_vendor[2] = (edid->mfg_id[1] & 0x1f) + '@'; in edid_vendor()
2135 * edid_get_quirks - return quirk flags for a given EDID
2148 if (edid_vendor(edid, quirk->vendor) && in edid_get_quirks()
2149 (EDID_PRODUCT_ID(edid) == quirk->product_id)) in edid_get_quirks()
2150 return quirk->quirks; in edid_get_quirks()
2156 #define MODE_SIZE(m) ((m)->hdisplay * (m)->vdisplay)
2157 #define MODE_REFRESH_DIFF(c,t) (abs((c) - (t)))
2160 * edid_fixup_preferred - set preferred modes based on quirk list
2161 * @connector: has mode list to fix up
2164 * Walk the mode list for @connector, clearing the preferred status
2167 static void edid_fixup_preferred(struct drm_connector *connector, in edid_fixup_preferred() argument
2174 if (list_empty(&connector->probed_modes)) in edid_fixup_preferred()
2182 preferred_mode = list_first_entry(&connector->probed_modes, in edid_fixup_preferred()
2185 list_for_each_entry_safe(cur_mode, t, &connector->probed_modes, head) { in edid_fixup_preferred()
2186 cur_mode->type &= ~DRM_MODE_TYPE_PREFERRED; in edid_fixup_preferred()
2205 preferred_mode->type |= DRM_MODE_TYPE_PREFERRED; in edid_fixup_preferred()
2211 return (mode->htotal - mode->hdisplay == 160) && in mode_is_rb()
2212 (mode->hsync_end - mode->hdisplay == 80) && in mode_is_rb()
2213 (mode->hsync_end - mode->hsync_start == 32) && in mode_is_rb()
2214 (mode->vsync_start - mode->vdisplay == 3); in mode_is_rb()
2218 * drm_mode_find_dmt - Create a copy of a mode if present in DMT
2223 * @rb: Mode reduced-blanking-ness
2238 if (hsize != ptr->hdisplay) in drm_mode_find_dmt()
2240 if (vsize != ptr->vdisplay) in drm_mode_find_dmt()
2277 n = (127 - d) / 18; in cea_for_each_detailed_block()
2305 cb(&(edid->detailed_timings[i]), closure); in drm_for_each_detailed_block()
2339 if (edid->revision >= 4) { in drm_monitor_supports_rb()
2346 return ((edid->input & DRM_EDID_INPUT_DIGITAL) != 0); in drm_monitor_supports_rb()
2408 * standard_timing_level - get std. timing level(CVT/GTF/DMT)
2413 if (edid->revision >= 2) { in standard_timing_level()
2414 if (edid->revision >= 4 && (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)) in standard_timing_level()
2418 if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) in standard_timing_level()
2438 if (mode->htotal <= 0) in drm_mode_hsync()
2441 return DIV_ROUND_CLOSEST(mode->clock, mode->htotal); in drm_mode_hsync()
2445 * drm_mode_std - convert standard mode info (width, height, refresh) into mode
2446 * @connector: connector of for the EDID block
2454 drm_mode_std(struct drm_connector *connector, struct edid *edid, in drm_mode_std() argument
2457 struct drm_device *dev = connector->dev; in drm_mode_std()
2461 unsigned aspect_ratio = (t->vfreq_aspect & EDID_TIMING_ASPECT_MASK) in drm_mode_std()
2463 unsigned vfreq = (t->vfreq_aspect & EDID_TIMING_VFREQ_MASK) in drm_mode_std()
2467 if (bad_std_timing(t->hsize, t->vfreq_aspect)) in drm_mode_std()
2471 hsize = t->hsize * 8 + 248; in drm_mode_std()
2476 if (edid->revision < 3) in drm_mode_std()
2496 * If this connector already has a mode for this size and refresh in drm_mode_std()
2501 list_for_each_entry(m, &connector->probed_modes, head) in drm_mode_std()
2502 if (m->hdisplay == hsize && m->vdisplay == vsize && in drm_mode_std()
2512 mode->hdisplay = 1366; in drm_mode_std()
2513 mode->hsync_start = mode->hsync_start - 1; in drm_mode_std()
2514 mode->hsync_end = mode->hsync_end - 1; in drm_mode_std()
2588 if (!(pt->misc & DRM_EDID_PT_INTERLACED)) in drm_mode_do_interlace_quirk()
2592 if ((mode->hdisplay == cea_interlaced[i].w) && in drm_mode_do_interlace_quirk()
2593 (mode->vdisplay == cea_interlaced[i].h / 2)) { in drm_mode_do_interlace_quirk()
2594 mode->vdisplay *= 2; in drm_mode_do_interlace_quirk()
2595 mode->vsync_start *= 2; in drm_mode_do_interlace_quirk()
2596 mode->vsync_end *= 2; in drm_mode_do_interlace_quirk()
2597 mode->vtotal *= 2; in drm_mode_do_interlace_quirk()
2598 mode->vtotal |= 1; in drm_mode_do_interlace_quirk()
2602 mode->flags |= DRM_MODE_FLAG_INTERLACE; in drm_mode_do_interlace_quirk()
2606 * drm_mode_detailed - create a new mode from an EDID detailed timing section
2621 struct detailed_pixel_timing *pt = &timing->data.pixel_data; in drm_mode_detailed()
2622 unsigned hactive = (pt->hactive_hblank_hi & 0xf0) << 4 | pt->hactive_lo; in drm_mode_detailed()
2623 unsigned vactive = (pt->vactive_vblank_hi & 0xf0) << 4 | pt->vactive_lo; in drm_mode_detailed()
2624 unsigned hblank = (pt->hactive_hblank_hi & 0xf) << 8 | pt->hblank_lo; in drm_mode_detailed()
2625 unsigned vblank = (pt->vactive_vblank_hi & 0xf) << 8 | pt->vblank_lo; in drm_mode_detailed()
2626 unsigned hsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc0) << 2 | pt->hsync_offset_lo; in drm_mode_detailed()
2627 …unsigned hsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x30) << 4 | pt->hsync_pulse… in drm_mode_detailed()
2628 …unsigned vsync_offset = (pt->hsync_vsync_offset_pulse_width_hi & 0xc) << 2 | pt->vsync_offset_puls… in drm_mode_detailed()
2629 …unsigned vsync_pulse_width = (pt->hsync_vsync_offset_pulse_width_hi & 0x3) << 4 | (pt->vsync_offse… in drm_mode_detailed()
2635 if (pt->misc & DRM_EDID_PT_STEREO) { in drm_mode_detailed()
2639 if (!(pt->misc & DRM_EDID_PT_SEPARATE_SYNC)) { in drm_mode_detailed()
2663 timing->pixel_clock = cpu_to_le16(1088); in drm_mode_detailed()
2665 mode->clock = le16_to_cpu(timing->pixel_clock) * 10; in drm_mode_detailed()
2667 mode->hdisplay = hactive; in drm_mode_detailed()
2668 mode->hsync_start = mode->hdisplay + hsync_offset; in drm_mode_detailed()
2669 mode->hsync_end = mode->hsync_start + hsync_pulse_width; in drm_mode_detailed()
2670 mode->htotal = mode->hdisplay + hblank; in drm_mode_detailed()
2672 mode->vdisplay = vactive; in drm_mode_detailed()
2673 mode->vsync_start = mode->vdisplay + vsync_offset; in drm_mode_detailed()
2674 mode->vsync_end = mode->vsync_start + vsync_pulse_width; in drm_mode_detailed()
2675 mode->vtotal = mode->vdisplay + vblank; in drm_mode_detailed()
2678 if (mode->hsync_end > mode->htotal) in drm_mode_detailed()
2679 mode->htotal = mode->hsync_end + 1; in drm_mode_detailed()
2680 if (mode->vsync_end > mode->vtotal) in drm_mode_detailed()
2681 mode->vtotal = mode->vsync_end + 1; in drm_mode_detailed()
2686 pt->misc |= DRM_EDID_PT_HSYNC_POSITIVE | DRM_EDID_PT_VSYNC_POSITIVE; in drm_mode_detailed()
2689 mode->flags |= (pt->misc & DRM_EDID_PT_HSYNC_POSITIVE) ? in drm_mode_detailed()
2691 mode->flags |= (pt->misc & DRM_EDID_PT_VSYNC_POSITIVE) ? in drm_mode_detailed()
2695 mode->width_mm = pt->width_mm_lo | (pt->width_height_mm_hi & 0xf0) << 4; in drm_mode_detailed()
2696 mode->height_mm = pt->height_mm_lo | (pt->width_height_mm_hi & 0xf) << 8; in drm_mode_detailed()
2699 mode->width_mm *= 10; in drm_mode_detailed()
2700 mode->height_mm *= 10; in drm_mode_detailed()
2704 mode->width_mm = edid->width_cm * 10; in drm_mode_detailed()
2705 mode->height_mm = edid->height_cm * 10; in drm_mode_detailed()
2708 mode->type = DRM_MODE_TYPE_DRIVER; in drm_mode_detailed()
2721 if (edid->revision >= 4) in mode_in_hsync_range()
2724 if (edid->revision >= 4) in mode_in_hsync_range()
2738 if (edid->revision >= 4) in mode_in_vsync_range()
2741 if (edid->revision >= 4) in mode_in_vsync_range()
2756 if (edid->revision >= 4 && t[10] == 0x04) in range_pixel_clock()
2757 return (t[9] * 10000) - ((t[12] >> 2) * 250); in range_pixel_clock()
2777 if (mode->clock > max_clock) in mode_in_range()
2781 if (edid->revision >= 4 && t[10] == 0x04) in mode_in_range()
2782 if (t[13] && mode->hdisplay > 8 * (t[13] + (256 * (t[12]&0x3)))) in mode_in_range()
2791 static bool valid_inferred_mode(const struct drm_connector *connector, in valid_inferred_mode() argument
2797 list_for_each_entry(m, &connector->probed_modes, head) { in valid_inferred_mode()
2798 if (mode->hdisplay == m->hdisplay && in valid_inferred_mode()
2799 mode->vdisplay == m->vdisplay && in valid_inferred_mode()
2802 if (mode->hdisplay <= m->hdisplay && in valid_inferred_mode()
2803 mode->vdisplay <= m->vdisplay) in valid_inferred_mode()
2810 drm_dmt_modes_for_range(struct drm_connector *connector, struct edid *edid, in drm_dmt_modes_for_range() argument
2815 struct drm_device *dev = connector->dev; in drm_dmt_modes_for_range()
2819 valid_inferred_mode(connector, drm_dmt_modes + i)) { in drm_dmt_modes_for_range()
2822 drm_mode_probed_add(connector, newmode); in drm_dmt_modes_for_range()
2836 if (mode->hdisplay == 1368 && mode->vdisplay == 768) { in drm_mode_fixup_1366x768()
2837 mode->hdisplay = 1366; in drm_mode_fixup_1366x768()
2838 mode->hsync_start--; in drm_mode_fixup_1366x768()
2839 mode->hsync_end--; in drm_mode_fixup_1366x768()
2845 drm_gtf_modes_for_range(struct drm_connector *connector, struct edid *edid, in drm_gtf_modes_for_range() argument
2850 struct drm_device *dev = connector->dev; in drm_gtf_modes_for_range()
2855 newmode = drm_gtf_mode(dev, m->w, m->h, m->r, 0, 0); in drm_gtf_modes_for_range()
2861 !valid_inferred_mode(connector, newmode)) { in drm_gtf_modes_for_range()
2866 drm_mode_probed_add(connector, newmode); in drm_gtf_modes_for_range()
2874 drm_cvt_modes_for_range(struct drm_connector *connector, struct edid *edid, in drm_cvt_modes_for_range() argument
2879 struct drm_device *dev = connector->dev; in drm_cvt_modes_for_range()
2885 newmode = drm_cvt_mode(dev, m->w, m->h, m->r, rb, 0, 0); in drm_cvt_modes_for_range()
2891 !valid_inferred_mode(connector, newmode)) { in drm_cvt_modes_for_range()
2896 drm_mode_probed_add(connector, newmode); in drm_cvt_modes_for_range()
2907 struct detailed_non_pixel *data = &timing->data.other_data; in do_inferred_modes()
2908 struct detailed_data_monitor_range *range = &data->data.range; in do_inferred_modes()
2913 closure->modes += drm_dmt_modes_for_range(closure->connector, in do_inferred_modes()
2914 closure->edid, in do_inferred_modes()
2917 if (!version_greater(closure->edid, 1, 1)) in do_inferred_modes()
2920 switch (range->flags) { in do_inferred_modes()
2923 closure->modes += drm_gtf_modes_for_range(closure->connector, in do_inferred_modes()
2924 closure->edid, in do_inferred_modes()
2928 if (!version_greater(closure->edid, 1, 3)) in do_inferred_modes()
2931 closure->modes += drm_cvt_modes_for_range(closure->connector, in do_inferred_modes()
2932 closure->edid, in do_inferred_modes()
2942 add_inferred_modes(struct drm_connector *connector, struct edid *edid) in add_inferred_modes() argument
2945 .connector = connector, in add_inferred_modes()
2957 drm_est3_modes(struct drm_connector *connector, struct detailed_timing *timing) in drm_est3_modes() argument
2964 for (j = 7; j >= 0; j--) { in drm_est3_modes()
2965 m = (i * 8) + (7 - j); in drm_est3_modes()
2969 mode = drm_mode_find_dmt(connector->dev, in drm_est3_modes()
2975 drm_mode_probed_add(connector, mode); in drm_est3_modes()
2993 closure->modes += drm_est3_modes(closure->connector, timing); in do_established_modes()
2997 * add_established_modes - get est. modes from EDID and add them
2998 * @connector: connector to add mode(s) to
3005 add_established_modes(struct drm_connector *connector, struct edid *edid) in add_established_modes() argument
3007 struct drm_device *dev = connector->dev; in add_established_modes()
3008 unsigned long est_bits = edid->established_timings.t1 | in add_established_modes()
3009 (edid->established_timings.t2 << 8) | in add_established_modes()
3010 ((edid->established_timings.mfg_rsvd & 0x80) << 9); in add_established_modes()
3013 .connector = connector, in add_established_modes()
3023 drm_mode_probed_add(connector, newmode); in add_established_modes()
3040 struct detailed_non_pixel *data = &timing->data.other_data; in do_standard_modes()
3041 struct drm_connector *connector = closure->connector; in do_standard_modes() local
3042 struct edid *edid = closure->edid; in do_standard_modes()
3049 struct std_timing *std = &data->data.timings[i]; in do_standard_modes()
3052 newmode = drm_mode_std(connector, edid, std); in do_standard_modes()
3054 drm_mode_probed_add(connector, newmode); in do_standard_modes()
3055 closure->modes++; in do_standard_modes()
3061 * add_standard_modes - get std. modes from EDID and add them
3062 * @connector: connector to add mode(s) to
3069 add_standard_modes(struct drm_connector *connector, struct edid *edid) in add_standard_modes() argument
3073 .connector = connector, in add_standard_modes()
3080 newmode = drm_mode_std(connector, edid, in add_standard_modes()
3081 &edid->standard_timings[i]); in add_standard_modes()
3083 drm_mode_probed_add(connector, newmode); in add_standard_modes()
3097 static int drm_cvt_modes(struct drm_connector *connector, in drm_cvt_modes() argument
3102 struct drm_device *dev = connector->dev; in drm_cvt_modes()
3110 cvt = &(timing->data.other_data.data.cvt[i]); in drm_cvt_modes()
3112 if (!memcmp(cvt->code, empty, 3)) in drm_cvt_modes()
3115 height = (cvt->code[0] + ((cvt->code[1] & 0xf0) << 4) + 1) * 2; in drm_cvt_modes()
3116 switch (cvt->code[1] & 0x0c) { in drm_cvt_modes()
3117 /* default - because compiler doesn't see that we've enumerated all cases */ in drm_cvt_modes()
3134 if (cvt->code[2] & (1 << j)) { in drm_cvt_modes()
3139 drm_mode_probed_add(connector, newmode); in drm_cvt_modes()
3157 closure->modes += drm_cvt_modes(closure->connector, timing); in do_cvt_mode()
3161 add_cvt_modes(struct drm_connector *connector, struct edid *edid) in add_cvt_modes() argument
3164 .connector = connector, in add_cvt_modes()
3187 newmode = drm_mode_detailed(closure->connector->dev, in do_detailed_mode()
3188 closure->edid, timing, in do_detailed_mode()
3189 closure->quirks); in do_detailed_mode()
3193 if (closure->preferred) in do_detailed_mode()
3194 newmode->type |= DRM_MODE_TYPE_PREFERRED; in do_detailed_mode()
3198 * so fix up anything that looks like CEA/HDMI mode, but the clock in do_detailed_mode()
3203 drm_mode_probed_add(closure->connector, newmode); in do_detailed_mode()
3204 closure->modes++; in do_detailed_mode()
3205 closure->preferred = false; in do_detailed_mode()
3209 * add_detailed_modes - Add modes from detailed timings
3210 * @connector: attached connector
3215 add_detailed_modes(struct drm_connector *connector, struct edid *edid, in add_detailed_modes() argument
3219 .connector = connector, in add_detailed_modes()
3227 (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING); in add_detailed_modes()
3258 if (edid == NULL || edid->extensions == 0) in drm_find_edid_extension()
3262 for (i = *ext_index; i < edid->extensions; i++) { in drm_find_edid_extension()
3268 if (i >= edid->extensions) in drm_find_edid_extension()
3292 if (block->tag == DATA_BLOCK_CTA) { in drm_find_cea_extension()
3304 BUILD_BUG_ON(1 + ARRAY_SIZE(edid_cea_modes_1) - 1 != 127); in cea_mode_for_vic()
3305 BUILD_BUG_ON(193 + ARRAY_SIZE(edid_cea_modes_193) - 1 != 219); in cea_mode_for_vic()
3308 return &edid_cea_modes_1[vic - 1]; in cea_mode_for_vic()
3310 return &edid_cea_modes_193[vic - 193]; in cea_mode_for_vic()
3333 unsigned int clock = cea_mode->clock; in cea_mode_alternate_clock()
3343 if (cea_mode->vdisplay == 240 || cea_mode->vdisplay == 480) in cea_mode_alternate_clock()
3363 BUILD_BUG_ON(cea_mode_for_vic(8)->vtotal != 262 || in cea_mode_alternate_timings()
3364 cea_mode_for_vic(9)->vtotal != 262 || in cea_mode_alternate_timings()
3365 cea_mode_for_vic(12)->vtotal != 262 || in cea_mode_alternate_timings()
3366 cea_mode_for_vic(13)->vtotal != 262 || in cea_mode_alternate_timings()
3367 cea_mode_for_vic(23)->vtotal != 312 || in cea_mode_alternate_timings()
3368 cea_mode_for_vic(24)->vtotal != 312 || in cea_mode_alternate_timings()
3369 cea_mode_for_vic(27)->vtotal != 312 || in cea_mode_alternate_timings()
3370 cea_mode_for_vic(28)->vtotal != 312); in cea_mode_alternate_timings()
3373 vic == 12 || vic == 13) && mode->vtotal < 263) || in cea_mode_alternate_timings()
3375 vic == 27 || vic == 28) && mode->vtotal < 314)) { in cea_mode_alternate_timings()
3376 mode->vsync_start++; in cea_mode_alternate_timings()
3377 mode->vsync_end++; in cea_mode_alternate_timings()
3378 mode->vtotal++; in cea_mode_alternate_timings()
3392 if (!to_match->clock) in drm_match_cea_mode_clock_tolerance()
3395 if (to_match->picture_aspect_ratio) in drm_match_cea_mode_clock_tolerance()
3406 if (abs(to_match->clock - clock1) > clock_tolerance && in drm_match_cea_mode_clock_tolerance()
3407 abs(to_match->clock - clock2) > clock_tolerance) in drm_match_cea_mode_clock_tolerance()
3420 * drm_match_cea_mode - look for a CEA mode matching given mode
3423 * Return: The CEA Video ID (VIC) of the mode or 0 if it isn't a CEA-861
3431 if (!to_match->clock) in drm_match_cea_mode()
3434 if (to_match->picture_aspect_ratio) in drm_match_cea_mode()
3445 if (KHZ2PICOS(to_match->clock) != KHZ2PICOS(clock1) && in drm_match_cea_mode()
3446 KHZ2PICOS(to_match->clock) != KHZ2PICOS(clock2)) in drm_match_cea_mode()
3469 return mode->picture_aspect_ratio; in drm_get_cea_aspect_ratio()
3480 * Calculate the alternate clock for HDMI modes (those from the HDMI vendor
3495 if (!to_match->clock) in drm_match_hdmi_mode_clock_tolerance()
3498 if (to_match->picture_aspect_ratio) in drm_match_hdmi_mode_clock_tolerance()
3506 clock1 = hdmi_mode->clock; in drm_match_hdmi_mode_clock_tolerance()
3509 if (abs(to_match->clock - clock1) > clock_tolerance && in drm_match_hdmi_mode_clock_tolerance()
3510 abs(to_match->clock - clock2) > clock_tolerance) in drm_match_hdmi_mode_clock_tolerance()
3521 * drm_match_hdmi_mode - look for a HDMI mode matching given mode
3524 * An HDMI mode is one defined in the HDMI vendor specific block.
3526 * Returns the HDMI Video ID (VIC) of the mode or 0 if it isn't one.
3533 if (!to_match->clock) in drm_match_hdmi_mode()
3536 if (to_match->picture_aspect_ratio) in drm_match_hdmi_mode()
3544 clock1 = hdmi_mode->clock; in drm_match_hdmi_mode()
3547 if ((KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock1) || in drm_match_hdmi_mode()
3548 KHZ2PICOS(to_match->clock) == KHZ2PICOS(clock2)) && in drm_match_hdmi_mode()
3561 add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid) in add_alternate_cea_modes() argument
3563 struct drm_device *dev = connector->dev; in add_alternate_cea_modes()
3576 list_for_each_entry(mode, &connector->probed_modes, head) { in add_alternate_cea_modes()
3596 clock1 = cea_mode->clock; in add_alternate_cea_modes()
3601 if (mode->clock != clock1 && mode->clock != clock2) in add_alternate_cea_modes()
3609 newmode->flags |= mode->flags & DRM_MODE_FLAG_3D_MASK; in add_alternate_cea_modes()
3615 if (mode->clock != clock1) in add_alternate_cea_modes()
3616 newmode->clock = clock1; in add_alternate_cea_modes()
3618 newmode->clock = clock2; in add_alternate_cea_modes()
3620 list_add_tail(&newmode->head, &list); in add_alternate_cea_modes()
3624 list_del(&mode->head); in add_alternate_cea_modes()
3625 drm_mode_probed_add(connector, mode); in add_alternate_cea_modes()
3634 /* 0-6 bit vic, 7th bit native mode indicator */ in svd_to_vic()
3642 drm_display_mode_from_vic_index(struct drm_connector *connector, in drm_display_mode_from_vic_index() argument
3646 struct drm_device *dev = connector->dev; in drm_display_mode_from_vic_index()
3666 * do_y420vdb_modes - Parse YCBCR 420 only modes
3667 * @connector: connector corresponding to the HDMI sink
3671 * Parse the CEA-861-F YCBCR 420 Video Data Block (Y420VDB)
3675 static int do_y420vdb_modes(struct drm_connector *connector, in do_y420vdb_modes() argument
3679 struct drm_device *dev = connector->dev; in do_y420vdb_modes()
3680 struct drm_display_info *info = &connector->display_info; in do_y420vdb_modes()
3681 struct drm_hdmi_info *hdmi = &info->hdmi; in do_y420vdb_modes() local
3693 bitmap_set(hdmi->y420_vdb_modes, vic, 1); in do_y420vdb_modes()
3694 drm_mode_probed_add(connector, newmode); in do_y420vdb_modes()
3699 info->color_formats |= DRM_COLOR_FORMAT_YCRCB420; in do_y420vdb_modes()
3704 * drm_add_cmdb_modes - Add a YCBCR 420 mode into bitmap
3705 * @connector: connector corresponding to the HDMI sink
3711 drm_add_cmdb_modes(struct drm_connector *connector, u8 svd) in drm_add_cmdb_modes() argument
3714 struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; in drm_add_cmdb_modes() local
3719 bitmap_set(hdmi->y420_cmdb_modes, vic, 1); in drm_add_cmdb_modes()
3723 * drm_display_mode_from_cea_vic() - return a mode for CEA VIC
3751 do_cea_modes(struct drm_connector *connector, const u8 *db, u8 len) in do_cea_modes() argument
3754 struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; in do_cea_modes() local
3759 mode = drm_display_mode_from_vic_index(connector, db, len, i); in do_cea_modes()
3768 * Add YCBCR420 modes only if sink is HDMI 2.0 capable. in do_cea_modes()
3770 if (i < 64 && hdmi->y420_cmdb_map & (1ULL << i)) in do_cea_modes()
3771 drm_add_cmdb_modes(connector, db[i]); in do_cea_modes()
3773 drm_mode_probed_add(connector, mode); in do_cea_modes()
3803 unsigned int interlaced = mode->flags & DRM_MODE_FLAG_INTERLACE; in stereo_match_mandatory()
3805 return mode->hdisplay == stereo_mode->width && in stereo_match_mandatory()
3806 mode->vdisplay == stereo_mode->height && in stereo_match_mandatory()
3807 interlaced == (stereo_mode->flags & DRM_MODE_FLAG_INTERLACE) && in stereo_match_mandatory()
3808 drm_mode_vrefresh(mode) == stereo_mode->vrefresh; in stereo_match_mandatory()
3811 static int add_hdmi_mandatory_stereo_modes(struct drm_connector *connector) in add_hdmi_mandatory_stereo_modes() argument
3813 struct drm_device *dev = connector->dev; in add_hdmi_mandatory_stereo_modes()
3820 list_for_each_entry(mode, &connector->probed_modes, head) { in add_hdmi_mandatory_stereo_modes()
3834 new_mode->flags |= mandatory->flags; in add_hdmi_mandatory_stereo_modes()
3835 list_add_tail(&new_mode->head, &stereo_modes); in add_hdmi_mandatory_stereo_modes()
3840 list_splice_tail(&stereo_modes, &connector->probed_modes); in add_hdmi_mandatory_stereo_modes()
3845 static int add_hdmi_mode(struct drm_connector *connector, u8 vic) in add_hdmi_mode() argument
3847 struct drm_device *dev = connector->dev; in add_hdmi_mode()
3851 DRM_ERROR("Unknown HDMI VIC: %d\n", vic); in add_hdmi_mode()
3859 drm_mode_probed_add(connector, newmode); in add_hdmi_mode()
3864 static int add_3d_struct_modes(struct drm_connector *connector, u16 structure, in add_3d_struct_modes() argument
3871 newmode = drm_display_mode_from_vic_index(connector, video_db, in add_3d_struct_modes()
3875 newmode->flags |= DRM_MODE_FLAG_3D_FRAME_PACKING; in add_3d_struct_modes()
3876 drm_mode_probed_add(connector, newmode); in add_3d_struct_modes()
3881 newmode = drm_display_mode_from_vic_index(connector, video_db, in add_3d_struct_modes()
3885 newmode->flags |= DRM_MODE_FLAG_3D_TOP_AND_BOTTOM; in add_3d_struct_modes()
3886 drm_mode_probed_add(connector, newmode); in add_3d_struct_modes()
3891 newmode = drm_display_mode_from_vic_index(connector, video_db, in add_3d_struct_modes()
3895 newmode->flags |= DRM_MODE_FLAG_3D_SIDE_BY_SIDE_HALF; in add_3d_struct_modes()
3896 drm_mode_probed_add(connector, newmode); in add_3d_struct_modes()
3905 * do_hdmi_vsdb_modes - Parse the HDMI Vendor Specific data block
3906 * @connector: connector corresponding to the HDMI sink
3910 * Parses the HDMI VSDB looking for modes to add to @connector. This function
3914 do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len, in do_hdmi_vsdb_modes() argument
3917 struct drm_display_info *info = &connector->display_info; in do_hdmi_vsdb_modes()
3946 modes += add_hdmi_mandatory_stereo_modes(connector); in do_hdmi_vsdb_modes()
3960 modes += add_hdmi_mode(connector, vic); in do_hdmi_vsdb_modes()
3971 if (len < (8 + offset + hdmi_3d_len - 1)) in do_hdmi_vsdb_modes()
3989 modes += add_3d_struct_modes(connector, in do_hdmi_vsdb_modes()
3998 for (i = 0; i < (hdmi_3d_len - multi_len); i++) { in do_hdmi_vsdb_modes()
4006 if (detail_present && (i + 1 == hdmi_3d_len - multi_len)) in do_hdmi_vsdb_modes()
4028 newmode = drm_display_mode_from_vic_index(connector, in do_hdmi_vsdb_modes()
4034 newmode->flags |= newflag; in do_hdmi_vsdb_modes()
4035 drm_mode_probed_add(connector, newmode); in do_hdmi_vsdb_modes()
4046 info->has_hdmi_infoframe = true; in do_hdmi_vsdb_modes()
4084 /* DisplayID CTA extension blocks and top-level CEA EDID in cea_db_offsets()
4095 * Byte number (decimal) within this block where the 18-byte in cea_db_offsets()
4096 * DTDs begin. If no non-DTD data is present in this extension in cea_db_offsets()
4099 * no non-DTD data. in cea_db_offsets()
4115 return -ERANGE; in cea_db_offsets()
4117 return -EOPNOTSUPP; in cea_db_offsets()
4198 static void drm_parse_y420cmdb_bitmap(struct drm_connector *connector, in drm_parse_y420cmdb_bitmap() argument
4201 struct drm_display_info *info = &connector->display_info; in drm_parse_y420cmdb_bitmap()
4202 struct drm_hdmi_info *hdmi = &info->hdmi; in drm_parse_y420cmdb_bitmap() local
4203 u8 map_len = cea_db_payload_len(db) - 1; in drm_parse_y420cmdb_bitmap()
4209 hdmi->y420_cmdb_map = U64_MAX; in drm_parse_y420cmdb_bitmap()
4210 info->color_formats |= DRM_COLOR_FORMAT_YCRCB420; in drm_parse_y420cmdb_bitmap()
4233 info->color_formats |= DRM_COLOR_FORMAT_YCRCB420; in drm_parse_y420cmdb_bitmap()
4235 hdmi->y420_cmdb_map = map; in drm_parse_y420cmdb_bitmap()
4239 add_cea_modes(struct drm_connector *connector, struct edid *edid) in add_cea_modes() argument
4242 const u8 *db, *hdmi = NULL, *video = NULL; in add_cea_modes() local
4259 modes += do_cea_modes(connector, video, dbl); in add_cea_modes()
4261 hdmi = db; in add_cea_modes()
4267 modes += do_y420vdb_modes(connector, in add_cea_modes()
4269 dbl - 1); in add_cea_modes()
4275 * We parse the HDMI VSDB after having added the cea modes as we will in add_cea_modes()
4278 if (hdmi) in add_cea_modes()
4279 modes += do_hdmi_vsdb_modes(connector, hdmi, hdmi_len, video, in add_cea_modes()
4300 clock1 = cea_mode->clock; in fixup_detailed_cea_mode_clock()
4305 type = "HDMI"; in fixup_detailed_cea_mode_clock()
4307 clock1 = cea_mode->clock; in fixup_detailed_cea_mode_clock()
4315 if (abs(mode->clock - clock1) < abs(mode->clock - clock2)) in fixup_detailed_cea_mode_clock()
4320 if (mode->clock == clock) in fixup_detailed_cea_mode_clock()
4323 DRM_DEBUG("detailed mode matches %s VIC %d, adjusting clock %d -> %d\n", in fixup_detailed_cea_mode_clock()
4324 type, vic, mode->clock, clock); in fixup_detailed_cea_mode_clock()
4325 mode->clock = clock; in fixup_detailed_cea_mode_clock()
4358 drm_parse_hdr_metadata_block(struct drm_connector *connector, const u8 *db) in drm_parse_hdr_metadata_block() argument
4364 connector->hdr_sink_metadata.hdmi_type1.eotf = in drm_parse_hdr_metadata_block()
4366 connector->hdr_sink_metadata.hdmi_type1.metadata_type = in drm_parse_hdr_metadata_block()
4370 connector->hdr_sink_metadata.hdmi_type1.max_cll = db[4]; in drm_parse_hdr_metadata_block()
4372 connector->hdr_sink_metadata.hdmi_type1.max_fall = db[5]; in drm_parse_hdr_metadata_block()
4374 connector->hdr_sink_metadata.hdmi_type1.min_cll = db[6]; in drm_parse_hdr_metadata_block()
4378 drm_parse_hdmi_vsdb_audio(struct drm_connector *connector, const u8 *db) in drm_parse_hdmi_vsdb_audio() argument
4383 connector->eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_SUPPORTS_AI; in drm_parse_hdmi_vsdb_audio()
4385 connector->latency_present[0] = db[8] >> 7; in drm_parse_hdmi_vsdb_audio()
4386 connector->latency_present[1] = (db[8] >> 6) & 1; in drm_parse_hdmi_vsdb_audio()
4389 connector->video_latency[0] = db[9]; in drm_parse_hdmi_vsdb_audio()
4391 connector->audio_latency[0] = db[10]; in drm_parse_hdmi_vsdb_audio()
4393 connector->video_latency[1] = db[11]; in drm_parse_hdmi_vsdb_audio()
4395 connector->audio_latency[1] = db[12]; in drm_parse_hdmi_vsdb_audio()
4397 DRM_DEBUG_KMS("HDMI: latency present %d %d, " in drm_parse_hdmi_vsdb_audio()
4400 connector->latency_present[0], in drm_parse_hdmi_vsdb_audio()
4401 connector->latency_present[1], in drm_parse_hdmi_vsdb_audio()
4402 connector->video_latency[0], in drm_parse_hdmi_vsdb_audio()
4403 connector->video_latency[1], in drm_parse_hdmi_vsdb_audio()
4404 connector->audio_latency[0], in drm_parse_hdmi_vsdb_audio()
4405 connector->audio_latency[1]); in drm_parse_hdmi_vsdb_audio()
4414 *(u8 **)data = t->data.other_data.data.str.str; in monitor_name()
4437 * drm_edid_get_monitor_name - fetch the monitor name from the edid
4451 name_length = min(get_monitor_name(edid, buf), bufsize - 1); in drm_edid_get_monitor_name()
4457 static void clear_eld(struct drm_connector *connector) in clear_eld() argument
4459 memset(connector->eld, 0, sizeof(connector->eld)); in clear_eld()
4461 connector->latency_present[0] = false; in clear_eld()
4462 connector->latency_present[1] = false; in clear_eld()
4463 connector->video_latency[0] = 0; in clear_eld()
4464 connector->audio_latency[0] = 0; in clear_eld()
4465 connector->video_latency[1] = 0; in clear_eld()
4466 connector->audio_latency[1] = 0; in clear_eld()
4470 * drm_edid_to_eld - build ELD from EDID
4471 * @connector: connector corresponding to the HDMI/DP sink
4474 * Fill the ELD (EDID-Like Data) buffer for passing to the audio driver. The
4477 static void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid) in drm_edid_to_eld() argument
4479 uint8_t *eld = connector->eld; in drm_edid_to_eld()
4486 clear_eld(connector); in drm_edid_to_eld()
4505 eld[DRM_ELD_MANUFACTURER_NAME0] = edid->mfg_id[0]; in drm_edid_to_eld()
4506 eld[DRM_ELD_MANUFACTURER_NAME1] = edid->mfg_id[1]; in drm_edid_to_eld()
4507 eld[DRM_ELD_PRODUCT_CODE0] = edid->prod_code[0]; in drm_edid_to_eld()
4508 eld[DRM_ELD_PRODUCT_CODE1] = edid->prod_code[1]; in drm_edid_to_eld()
4526 sad_count = min(dbl / 3, 15 - total_sad_count); in drm_edid_to_eld()
4538 /* HDMI Vendor-Specific Data Block */ in drm_edid_to_eld()
4540 drm_parse_hdmi_vsdb_audio(connector, db); in drm_edid_to_eld()
4549 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort || in drm_edid_to_eld()
4550 connector->connector_type == DRM_MODE_CONNECTOR_eDP) in drm_edid_to_eld()
4563 * drm_edid_to_sad - extracts SADs from EDID
4592 return -EPROTO; in drm_edid_to_sad()
4606 return -ENOMEM; in drm_edid_to_sad()
4624 * drm_edid_to_speaker_allocation - extracts Speaker Allocation Data Blocks from EDID
4654 return -EPROTO; in drm_edid_to_speaker_allocation()
4667 return -ENOMEM; in drm_edid_to_speaker_allocation()
4679 * drm_av_sync_delay - compute the HDMI/DP sink audio-video sync delay
4680 * @connector: connector associated with the HDMI/DP sink
4683 * Return: The HDMI/DP sink's audio-video sync delay in milliseconds or 0 if
4686 int drm_av_sync_delay(struct drm_connector *connector, in drm_av_sync_delay() argument
4689 int i = !!(mode->flags & DRM_MODE_FLAG_INTERLACE); in drm_av_sync_delay()
4692 if (!connector->latency_present[0]) in drm_av_sync_delay()
4694 if (!connector->latency_present[1]) in drm_av_sync_delay()
4697 a = connector->audio_latency[i]; in drm_av_sync_delay()
4698 v = connector->video_latency[i]; in drm_av_sync_delay()
4701 * HDMI/DP sink doesn't support audio or video? in drm_av_sync_delay()
4711 a = min(2 * (a - 1), 500); in drm_av_sync_delay()
4713 v = min(2 * (v - 1), 500); in drm_av_sync_delay()
4715 return max(v - a, 0); in drm_av_sync_delay()
4720 * drm_detect_hdmi_monitor - detect whether monitor is HDMI
4723 * Parse the CEA extension according to CEA-861-B.
4728 * Return: True if the monitor is HDMI, false if not or unknown.
4744 * Because HDMI identifier is in Vendor Specific Block, in drm_detect_hdmi_monitor()
4757 * drm_detect_monitor_audio - check monitor audio capability
4805 * drm_default_rgb_quant_range - default RGB quantization range
4809 * as specified in CEA-861.
4823 static void drm_parse_vcdb(struct drm_connector *connector, const u8 *db) in drm_parse_vcdb() argument
4825 struct drm_display_info *info = &connector->display_info; in drm_parse_vcdb()
4830 info->rgb_quant_range_selectable = true; in drm_parse_vcdb()
4868 static void drm_parse_ycbcr420_deep_color_info(struct drm_connector *connector, in drm_parse_ycbcr420_deep_color_info() argument
4872 struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; in drm_parse_ycbcr420_deep_color_info() local
4875 hdmi->y420_dc_modes = dc_mask; in drm_parse_ycbcr420_deep_color_info()
4878 static void drm_parse_hdmi_forum_vsdb(struct drm_connector *connector, in drm_parse_hdmi_forum_vsdb() argument
4881 struct drm_display_info *display = &connector->display_info; in drm_parse_hdmi_forum_vsdb()
4882 struct drm_hdmi_info *hdmi = &display->hdmi; in drm_parse_hdmi_forum_vsdb() local
4884 display->has_hdmi_infoframe = true; in drm_parse_hdmi_forum_vsdb()
4887 hdmi->scdc.supported = true; in drm_parse_hdmi_forum_vsdb()
4889 hdmi->scdc.read_request = true; in drm_parse_hdmi_forum_vsdb()
4893 * All HDMI 2.0 monitors must support scrambling at rates > 340 MHz. in drm_parse_hdmi_forum_vsdb()
4895 * * Availability of a HF-VSDB block in EDID (check) in drm_parse_hdmi_forum_vsdb()
4896 * * Non zero Max_TMDS_Char_Rate filed in HF-VSDB (let's check) in drm_parse_hdmi_forum_vsdb()
4904 struct drm_scdc *scdc = &hdmi->scdc; in drm_parse_hdmi_forum_vsdb()
4907 display->max_tmds_clock = max_tmds_clock; in drm_parse_hdmi_forum_vsdb()
4908 DRM_DEBUG_KMS("HF-VSDB: max TMDS clock %d kHz\n", in drm_parse_hdmi_forum_vsdb()
4909 display->max_tmds_clock); in drm_parse_hdmi_forum_vsdb()
4912 if (scdc->supported) { in drm_parse_hdmi_forum_vsdb()
4913 scdc->scrambling.supported = true; in drm_parse_hdmi_forum_vsdb()
4917 scdc->scrambling.low_rates = true; in drm_parse_hdmi_forum_vsdb()
4925 struct drm_hdmi_dsc_cap *hdmi_dsc = &hdmi->dsc_cap; in drm_parse_hdmi_forum_vsdb()
4929 drm_get_max_frl_rate(max_frl_rate, &hdmi->max_lanes, in drm_parse_hdmi_forum_vsdb()
4930 &hdmi->max_frl_rate_per_lane); in drm_parse_hdmi_forum_vsdb()
4931 hdmi_dsc->v_1p2 = hf_vsdb[11] & DRM_EDID_DSC_1P2; in drm_parse_hdmi_forum_vsdb()
4933 if (hdmi_dsc->v_1p2) { in drm_parse_hdmi_forum_vsdb()
4934 hdmi_dsc->native_420 = hf_vsdb[11] & DRM_EDID_DSC_NATIVE_420; in drm_parse_hdmi_forum_vsdb()
4935 hdmi_dsc->all_bpp = hf_vsdb[11] & DRM_EDID_DSC_ALL_BPP; in drm_parse_hdmi_forum_vsdb()
4938 hdmi_dsc->bpc_supported = 16; in drm_parse_hdmi_forum_vsdb()
4940 hdmi_dsc->bpc_supported = 12; in drm_parse_hdmi_forum_vsdb()
4942 hdmi_dsc->bpc_supported = 10; in drm_parse_hdmi_forum_vsdb()
4944 hdmi_dsc->bpc_supported = 0; in drm_parse_hdmi_forum_vsdb()
4947 drm_get_max_frl_rate(dsc_max_frl_rate, &hdmi_dsc->max_lanes, in drm_parse_hdmi_forum_vsdb()
4948 &hdmi_dsc->max_frl_rate_per_lane); in drm_parse_hdmi_forum_vsdb()
4949 hdmi_dsc->total_chunk_kbytes = hf_vsdb[13] & DRM_EDID_DSC_TOTAL_CHUNK_KBYTES; in drm_parse_hdmi_forum_vsdb()
4954 hdmi_dsc->max_slices = 1; in drm_parse_hdmi_forum_vsdb()
4955 hdmi_dsc->clk_per_slice = 340; in drm_parse_hdmi_forum_vsdb()
4958 hdmi_dsc->max_slices = 2; in drm_parse_hdmi_forum_vsdb()
4959 hdmi_dsc->clk_per_slice = 340; in drm_parse_hdmi_forum_vsdb()
4962 hdmi_dsc->max_slices = 4; in drm_parse_hdmi_forum_vsdb()
4963 hdmi_dsc->clk_per_slice = 340; in drm_parse_hdmi_forum_vsdb()
4966 hdmi_dsc->max_slices = 8; in drm_parse_hdmi_forum_vsdb()
4967 hdmi_dsc->clk_per_slice = 340; in drm_parse_hdmi_forum_vsdb()
4970 hdmi_dsc->max_slices = 8; in drm_parse_hdmi_forum_vsdb()
4971 hdmi_dsc->clk_per_slice = 400; in drm_parse_hdmi_forum_vsdb()
4974 hdmi_dsc->max_slices = 12; in drm_parse_hdmi_forum_vsdb()
4975 hdmi_dsc->clk_per_slice = 400; in drm_parse_hdmi_forum_vsdb()
4978 hdmi_dsc->max_slices = 16; in drm_parse_hdmi_forum_vsdb()
4979 hdmi_dsc->clk_per_slice = 400; in drm_parse_hdmi_forum_vsdb()
4983 hdmi_dsc->max_slices = 0; in drm_parse_hdmi_forum_vsdb()
4984 hdmi_dsc->clk_per_slice = 0; in drm_parse_hdmi_forum_vsdb()
4989 drm_parse_ycbcr420_deep_color_info(connector, hf_vsdb); in drm_parse_hdmi_forum_vsdb()
4992 static void drm_parse_hdmi_deep_color_info(struct drm_connector *connector, in drm_parse_hdmi_deep_color_info() argument
4993 const u8 *hdmi) in drm_parse_hdmi_deep_color_info() argument
4995 struct drm_display_info *info = &connector->display_info; in drm_parse_hdmi_deep_color_info()
4998 /* HDMI supports at least 8 bpc */ in drm_parse_hdmi_deep_color_info()
4999 info->bpc = 8; in drm_parse_hdmi_deep_color_info()
5001 if (cea_db_payload_len(hdmi) < 6) in drm_parse_hdmi_deep_color_info()
5004 if (hdmi[6] & DRM_EDID_HDMI_DC_30) { in drm_parse_hdmi_deep_color_info()
5006 info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_30; in drm_parse_hdmi_deep_color_info()
5007 DRM_DEBUG("%s: HDMI sink does deep color 30.\n", in drm_parse_hdmi_deep_color_info()
5008 connector->name); in drm_parse_hdmi_deep_color_info()
5011 if (hdmi[6] & DRM_EDID_HDMI_DC_36) { in drm_parse_hdmi_deep_color_info()
5013 info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_36; in drm_parse_hdmi_deep_color_info()
5014 DRM_DEBUG("%s: HDMI sink does deep color 36.\n", in drm_parse_hdmi_deep_color_info()
5015 connector->name); in drm_parse_hdmi_deep_color_info()
5018 if (hdmi[6] & DRM_EDID_HDMI_DC_48) { in drm_parse_hdmi_deep_color_info()
5020 info->edid_hdmi_dc_modes |= DRM_EDID_HDMI_DC_48; in drm_parse_hdmi_deep_color_info()
5021 DRM_DEBUG("%s: HDMI sink does deep color 48.\n", in drm_parse_hdmi_deep_color_info()
5022 connector->name); in drm_parse_hdmi_deep_color_info()
5026 DRM_DEBUG("%s: No deep color support on this HDMI sink.\n", in drm_parse_hdmi_deep_color_info()
5027 connector->name); in drm_parse_hdmi_deep_color_info()
5031 DRM_DEBUG("%s: Assigning HDMI sink color depth as %d bpc.\n", in drm_parse_hdmi_deep_color_info()
5032 connector->name, dc_bpc); in drm_parse_hdmi_deep_color_info()
5033 info->bpc = dc_bpc; in drm_parse_hdmi_deep_color_info()
5038 * HDMI 1.3 spec. in drm_parse_hdmi_deep_color_info()
5040 info->color_formats = DRM_COLOR_FORMAT_RGB444; in drm_parse_hdmi_deep_color_info()
5043 if (hdmi[6] & DRM_EDID_HDMI_DC_Y444) { in drm_parse_hdmi_deep_color_info()
5044 info->color_formats |= DRM_COLOR_FORMAT_YCRCB444; in drm_parse_hdmi_deep_color_info()
5045 DRM_DEBUG("%s: HDMI sink does YCRCB444 in deep color.\n", in drm_parse_hdmi_deep_color_info()
5046 connector->name); in drm_parse_hdmi_deep_color_info()
5053 if (!(hdmi[6] & DRM_EDID_HDMI_DC_36)) { in drm_parse_hdmi_deep_color_info()
5054 DRM_DEBUG("%s: HDMI sink should do DC_36, but does not!\n", in drm_parse_hdmi_deep_color_info()
5055 connector->name); in drm_parse_hdmi_deep_color_info()
5060 drm_parse_hdmi_vsdb_video(struct drm_connector *connector, const u8 *db) in drm_parse_hdmi_vsdb_video() argument
5062 struct drm_display_info *info = &connector->display_info; in drm_parse_hdmi_vsdb_video()
5065 info->is_hdmi = true; in drm_parse_hdmi_vsdb_video()
5068 info->dvi_dual = db[6] & 1; in drm_parse_hdmi_vsdb_video()
5070 info->max_tmds_clock = db[7] * 5000; in drm_parse_hdmi_vsdb_video()
5072 DRM_DEBUG_KMS("HDMI: DVI dual %d, " in drm_parse_hdmi_vsdb_video()
5074 info->dvi_dual, in drm_parse_hdmi_vsdb_video()
5075 info->max_tmds_clock); in drm_parse_hdmi_vsdb_video()
5077 drm_parse_hdmi_deep_color_info(connector, db); in drm_parse_hdmi_vsdb_video()
5080 static void drm_parse_cea_ext(struct drm_connector *connector, in drm_parse_cea_ext() argument
5083 struct drm_display_info *info = &connector->display_info; in drm_parse_cea_ext()
5091 info->cea_rev = edid_ext[1]; in drm_parse_cea_ext()
5094 info->color_formats = DRM_COLOR_FORMAT_RGB444; in drm_parse_cea_ext()
5096 info->color_formats |= DRM_COLOR_FORMAT_YCRCB444; in drm_parse_cea_ext()
5098 info->color_formats |= DRM_COLOR_FORMAT_YCRCB422; in drm_parse_cea_ext()
5107 drm_parse_hdmi_vsdb_video(connector, db); in drm_parse_cea_ext()
5109 drm_parse_hdmi_forum_vsdb(connector, db); in drm_parse_cea_ext()
5111 drm_parse_y420cmdb_bitmap(connector, db); in drm_parse_cea_ext()
5113 drm_parse_vcdb(connector, db); in drm_parse_cea_ext()
5115 drm_parse_hdr_metadata_block(connector, db); in drm_parse_cea_ext()
5124 const struct detailed_non_pixel *data = &timing->data.other_data; in get_monitor_range()
5125 const struct detailed_data_monitor_range *range = &data->data.range; in get_monitor_range()
5136 if (range->flags != DRM_EDID_RANGE_LIMITS_ONLY_FLAG) in get_monitor_range()
5139 monitor_range->min_vfreq = range->min_vfreq; in get_monitor_range()
5140 monitor_range->max_vfreq = range->max_vfreq; in get_monitor_range()
5144 void drm_get_monitor_range(struct drm_connector *connector, in drm_get_monitor_range() argument
5147 struct drm_display_info *info = &connector->display_info; in drm_get_monitor_range()
5153 &info->monitor_range); in drm_get_monitor_range()
5155 DRM_DEBUG_KMS("Supported Monitor Refresh rate range is %d Hz - %d Hz\n", in drm_get_monitor_range()
5156 info->monitor_range.min_vfreq, in drm_get_monitor_range()
5157 info->monitor_range.max_vfreq); in drm_get_monitor_range()
5160 /* A connector has no EDID information, so we've got no EDID to compute quirks from. Reset
5164 drm_reset_display_info(struct drm_connector *connector) in drm_reset_display_info() argument
5166 struct drm_display_info *info = &connector->display_info; in drm_reset_display_info()
5168 info->width_mm = 0; in drm_reset_display_info()
5169 info->height_mm = 0; in drm_reset_display_info()
5171 info->bpc = 0; in drm_reset_display_info()
5172 info->color_formats = 0; in drm_reset_display_info()
5173 info->cea_rev = 0; in drm_reset_display_info()
5174 info->max_tmds_clock = 0; in drm_reset_display_info()
5175 info->dvi_dual = false; in drm_reset_display_info()
5176 info->is_hdmi = false; in drm_reset_display_info()
5177 info->has_hdmi_infoframe = false; in drm_reset_display_info()
5178 info->rgb_quant_range_selectable = false; in drm_reset_display_info()
5179 memset(&info->hdmi, 0, sizeof(info->hdmi)); in drm_reset_display_info()
5181 info->non_desktop = 0; in drm_reset_display_info()
5182 memset(&info->monitor_range, 0, sizeof(info->monitor_range)); in drm_reset_display_info()
5185 u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid) in drm_add_display_info() argument
5187 struct drm_display_info *info = &connector->display_info; in drm_add_display_info()
5191 drm_reset_display_info(connector); in drm_add_display_info()
5193 info->width_mm = edid->width_cm * 10; in drm_add_display_info()
5194 info->height_mm = edid->height_cm * 10; in drm_add_display_info()
5196 info->non_desktop = !!(quirks & EDID_QUIRK_NON_DESKTOP); in drm_add_display_info()
5198 drm_get_monitor_range(connector, edid); in drm_add_display_info()
5200 DRM_DEBUG_KMS("non_desktop set to %d\n", info->non_desktop); in drm_add_display_info()
5202 if (edid->revision < 3) in drm_add_display_info()
5205 if (!(edid->input & DRM_EDID_INPUT_DIGITAL)) in drm_add_display_info()
5208 drm_parse_cea_ext(connector, edid); in drm_add_display_info()
5217 if (info->bpc == 0 && edid->revision == 3 && in drm_add_display_info()
5218 edid->input & DRM_EDID_DIGITAL_DFP_1_X) { in drm_add_display_info()
5219 info->bpc = 8; in drm_add_display_info()
5221 connector->name, info->bpc); in drm_add_display_info()
5225 if (edid->revision < 4) in drm_add_display_info()
5228 switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) { in drm_add_display_info()
5230 info->bpc = 6; in drm_add_display_info()
5233 info->bpc = 8; in drm_add_display_info()
5236 info->bpc = 10; in drm_add_display_info()
5239 info->bpc = 12; in drm_add_display_info()
5242 info->bpc = 14; in drm_add_display_info()
5245 info->bpc = 16; in drm_add_display_info()
5249 info->bpc = 0; in drm_add_display_info()
5253 DRM_DEBUG("%s: Assigning EDID-1.4 digital sink color depth as %d bpc.\n", in drm_add_display_info()
5254 connector->name, info->bpc); in drm_add_display_info()
5256 info->color_formats |= DRM_COLOR_FORMAT_RGB444; in drm_add_display_info()
5257 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444) in drm_add_display_info()
5258 info->color_formats |= DRM_COLOR_FORMAT_YCRCB444; in drm_add_display_info()
5259 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422) in drm_add_display_info()
5260 info->color_formats |= DRM_COLOR_FORMAT_YCRCB422; in drm_add_display_info()
5268 unsigned pixel_clock = (timings->pixel_clock[0] | in drm_mode_displayid_detailed()
5269 (timings->pixel_clock[1] << 8) | in drm_mode_displayid_detailed()
5270 (timings->pixel_clock[2] << 16)) + 1; in drm_mode_displayid_detailed()
5271 unsigned hactive = (timings->hactive[0] | timings->hactive[1] << 8) + 1; in drm_mode_displayid_detailed()
5272 unsigned hblank = (timings->hblank[0] | timings->hblank[1] << 8) + 1; in drm_mode_displayid_detailed()
5273 unsigned hsync = (timings->hsync[0] | (timings->hsync[1] & 0x7f) << 8) + 1; in drm_mode_displayid_detailed()
5274 unsigned hsync_width = (timings->hsw[0] | timings->hsw[1] << 8) + 1; in drm_mode_displayid_detailed()
5275 unsigned vactive = (timings->vactive[0] | timings->vactive[1] << 8) + 1; in drm_mode_displayid_detailed()
5276 unsigned vblank = (timings->vblank[0] | timings->vblank[1] << 8) + 1; in drm_mode_displayid_detailed()
5277 unsigned vsync = (timings->vsync[0] | (timings->vsync[1] & 0x7f) << 8) + 1; in drm_mode_displayid_detailed()
5278 unsigned vsync_width = (timings->vsw[0] | timings->vsw[1] << 8) + 1; in drm_mode_displayid_detailed()
5279 bool hsync_positive = (timings->hsync[1] >> 7) & 0x1; in drm_mode_displayid_detailed()
5280 bool vsync_positive = (timings->vsync[1] >> 7) & 0x1; in drm_mode_displayid_detailed()
5286 mode->clock = pixel_clock * 10; in drm_mode_displayid_detailed()
5287 mode->hdisplay = hactive; in drm_mode_displayid_detailed()
5288 mode->hsync_start = mode->hdisplay + hsync; in drm_mode_displayid_detailed()
5289 mode->hsync_end = mode->hsync_start + hsync_width; in drm_mode_displayid_detailed()
5290 mode->htotal = mode->hdisplay + hblank; in drm_mode_displayid_detailed()
5292 mode->vdisplay = vactive; in drm_mode_displayid_detailed()
5293 mode->vsync_start = mode->vdisplay + vsync; in drm_mode_displayid_detailed()
5294 mode->vsync_end = mode->vsync_start + vsync_width; in drm_mode_displayid_detailed()
5295 mode->vtotal = mode->vdisplay + vblank; in drm_mode_displayid_detailed()
5297 mode->flags = 0; in drm_mode_displayid_detailed()
5298 mode->flags |= hsync_positive ? DRM_MODE_FLAG_PHSYNC : DRM_MODE_FLAG_NHSYNC; in drm_mode_displayid_detailed()
5299 mode->flags |= vsync_positive ? DRM_MODE_FLAG_PVSYNC : DRM_MODE_FLAG_NVSYNC; in drm_mode_displayid_detailed()
5300 mode->type = DRM_MODE_TYPE_DRIVER; in drm_mode_displayid_detailed()
5302 if (timings->flags & 0x80) in drm_mode_displayid_detailed()
5303 mode->type |= DRM_MODE_TYPE_PREFERRED; in drm_mode_displayid_detailed()
5309 static int add_displayid_detailed_1_modes(struct drm_connector *connector, in add_displayid_detailed_1_modes() argument
5318 if (block->num_bytes % 20) in add_displayid_detailed_1_modes()
5321 num_timings = block->num_bytes / 20; in add_displayid_detailed_1_modes()
5323 struct displayid_detailed_timings_1 *timings = &det->timings[i]; in add_displayid_detailed_1_modes()
5325 newmode = drm_mode_displayid_detailed(connector->dev, timings); in add_displayid_detailed_1_modes()
5329 drm_mode_probed_add(connector, newmode); in add_displayid_detailed_1_modes()
5335 static int add_displayid_detailed_modes(struct drm_connector *connector, in add_displayid_detailed_modes() argument
5344 if (block->tag == DATA_BLOCK_TYPE_1_DETAILED_TIMING) in add_displayid_detailed_modes()
5345 num_modes += add_displayid_detailed_1_modes(connector, block); in add_displayid_detailed_modes()
5353 * drm_add_edid_modes - add modes from EDID data, if available
5354 * @connector: connector we're probing
5357 * Add the specified modes to the connector's mode list. Also fills out the
5358 * &drm_display_info structure and ELD in @connector with any information which
5363 int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) in drm_add_edid_modes() argument
5369 clear_eld(connector); in drm_add_edid_modes()
5373 clear_eld(connector); in drm_add_edid_modes()
5374 drm_warn(connector->dev, "%s: EDID invalid.\n", in drm_add_edid_modes()
5375 connector->name); in drm_add_edid_modes()
5379 drm_edid_to_eld(connector, edid); in drm_add_edid_modes()
5382 * CEA-861-F adds ycbcr capability map block, for HDMI 2.0 sinks. in drm_add_edid_modes()
5386 quirks = drm_add_display_info(connector, edid); in drm_add_edid_modes()
5390 * - preferred detailed mode in drm_add_edid_modes()
5391 * - other detailed modes from base block in drm_add_edid_modes()
5392 * - detailed modes from extension blocks in drm_add_edid_modes()
5393 * - CVT 3-byte code modes in drm_add_edid_modes()
5394 * - standard timing codes in drm_add_edid_modes()
5395 * - established timing codes in drm_add_edid_modes()
5396 * - modes inferred from GTF or CVT range information in drm_add_edid_modes()
5402 num_modes += add_detailed_modes(connector, edid, quirks); in drm_add_edid_modes()
5403 num_modes += add_cvt_modes(connector, edid); in drm_add_edid_modes()
5404 num_modes += add_standard_modes(connector, edid); in drm_add_edid_modes()
5405 num_modes += add_established_modes(connector, edid); in drm_add_edid_modes()
5406 num_modes += add_cea_modes(connector, edid); in drm_add_edid_modes()
5407 num_modes += add_alternate_cea_modes(connector, edid); in drm_add_edid_modes()
5408 num_modes += add_displayid_detailed_modes(connector, edid); in drm_add_edid_modes()
5409 if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) in drm_add_edid_modes()
5410 num_modes += add_inferred_modes(connector, edid); in drm_add_edid_modes()
5413 edid_fixup_preferred(connector, quirks); in drm_add_edid_modes()
5416 connector->display_info.bpc = 6; in drm_add_edid_modes()
5419 connector->display_info.bpc = 8; in drm_add_edid_modes()
5422 connector->display_info.bpc = 10; in drm_add_edid_modes()
5425 connector->display_info.bpc = 12; in drm_add_edid_modes()
5432 * drm_add_modes_noedid - add modes for the connectors without EDID
5433 * @connector: connector we're probing
5437 * Add the specified modes to the connector's mode list. Only when the
5442 int drm_add_modes_noedid(struct drm_connector *connector, in drm_add_modes_noedid() argument
5447 struct drm_device *dev = connector->dev; in drm_add_modes_noedid()
5462 * the connector. in drm_add_modes_noedid()
5464 if (ptr->hdisplay > hdisplay || in drm_add_modes_noedid()
5465 ptr->vdisplay > vdisplay) in drm_add_modes_noedid()
5472 drm_mode_probed_add(connector, mode); in drm_add_modes_noedid()
5481 * drm_set_preferred_mode - Sets the preferred mode of a connector
5482 * @connector: connector whose mode list should be processed
5489 void drm_set_preferred_mode(struct drm_connector *connector, in drm_set_preferred_mode() argument
5494 list_for_each_entry(mode, &connector->probed_modes, head) { in drm_set_preferred_mode()
5495 if (mode->hdisplay == hpref && in drm_set_preferred_mode()
5496 mode->vdisplay == vpref) in drm_set_preferred_mode()
5497 mode->type |= DRM_MODE_TYPE_PREFERRED; in drm_set_preferred_mode()
5502 static bool is_hdmi2_sink(const struct drm_connector *connector) in is_hdmi2_sink() argument
5505 * FIXME: sil-sii8620 doesn't have a connector around when in is_hdmi2_sink()
5506 * we need one, so we have to be prepared for a NULL connector. in is_hdmi2_sink()
5508 if (!connector) in is_hdmi2_sink()
5511 return connector->display_info.hdmi.scdc.supported || in is_hdmi2_sink()
5512 connector->display_info.color_formats & DRM_COLOR_FORMAT_YCRCB420; in is_hdmi2_sink()
5521 * drm_hdmi_infoframe_set_hdr_metadata() - fill an HDMI DRM infoframe with
5523 * @frame: HDMI DRM infoframe
5524 * @conn_state: Connector state containing HDR metadata
5532 struct drm_connector *connector; in drm_hdmi_infoframe_set_hdr_metadata() local
5537 return -EINVAL; in drm_hdmi_infoframe_set_hdr_metadata()
5539 connector = conn_state->connector; in drm_hdmi_infoframe_set_hdr_metadata()
5541 if (!conn_state->hdr_output_metadata) in drm_hdmi_infoframe_set_hdr_metadata()
5542 return -EINVAL; in drm_hdmi_infoframe_set_hdr_metadata()
5544 hdr_metadata = conn_state->hdr_output_metadata->data; in drm_hdmi_infoframe_set_hdr_metadata()
5546 if (!hdr_metadata || !connector) in drm_hdmi_infoframe_set_hdr_metadata()
5547 return -EINVAL; in drm_hdmi_infoframe_set_hdr_metadata()
5550 if (!is_eotf_supported(hdr_metadata->hdmi_metadata_type1.eotf, in drm_hdmi_infoframe_set_hdr_metadata()
5551 connector->hdr_sink_metadata.hdmi_type1.eotf)) { in drm_hdmi_infoframe_set_hdr_metadata()
5553 return -EINVAL; in drm_hdmi_infoframe_set_hdr_metadata()
5560 frame->eotf = hdr_metadata->hdmi_metadata_type1.eotf; in drm_hdmi_infoframe_set_hdr_metadata()
5561 frame->metadata_type = hdr_metadata->hdmi_metadata_type1.metadata_type; in drm_hdmi_infoframe_set_hdr_metadata()
5563 BUILD_BUG_ON(sizeof(frame->display_primaries) != in drm_hdmi_infoframe_set_hdr_metadata()
5564 sizeof(hdr_metadata->hdmi_metadata_type1.display_primaries)); in drm_hdmi_infoframe_set_hdr_metadata()
5565 BUILD_BUG_ON(sizeof(frame->white_point) != in drm_hdmi_infoframe_set_hdr_metadata()
5566 sizeof(hdr_metadata->hdmi_metadata_type1.white_point)); in drm_hdmi_infoframe_set_hdr_metadata()
5568 memcpy(&frame->display_primaries, in drm_hdmi_infoframe_set_hdr_metadata()
5569 &hdr_metadata->hdmi_metadata_type1.display_primaries, in drm_hdmi_infoframe_set_hdr_metadata()
5570 sizeof(frame->display_primaries)); in drm_hdmi_infoframe_set_hdr_metadata()
5572 memcpy(&frame->white_point, in drm_hdmi_infoframe_set_hdr_metadata()
5573 &hdr_metadata->hdmi_metadata_type1.white_point, in drm_hdmi_infoframe_set_hdr_metadata()
5574 sizeof(frame->white_point)); in drm_hdmi_infoframe_set_hdr_metadata()
5576 frame->max_display_mastering_luminance = in drm_hdmi_infoframe_set_hdr_metadata()
5577 hdr_metadata->hdmi_metadata_type1.max_display_mastering_luminance; in drm_hdmi_infoframe_set_hdr_metadata()
5578 frame->min_display_mastering_luminance = in drm_hdmi_infoframe_set_hdr_metadata()
5579 hdr_metadata->hdmi_metadata_type1.min_display_mastering_luminance; in drm_hdmi_infoframe_set_hdr_metadata()
5580 frame->max_fall = hdr_metadata->hdmi_metadata_type1.max_fall; in drm_hdmi_infoframe_set_hdr_metadata()
5581 frame->max_cll = hdr_metadata->hdmi_metadata_type1.max_cll; in drm_hdmi_infoframe_set_hdr_metadata()
5587 static u8 drm_mode_hdmi_vic(const struct drm_connector *connector, in drm_mode_hdmi_vic() argument
5590 bool has_hdmi_infoframe = connector ? in drm_mode_hdmi_vic()
5591 connector->display_info.has_hdmi_infoframe : false; in drm_mode_hdmi_vic()
5596 /* No HDMI VIC when signalling 3D video format */ in drm_mode_hdmi_vic()
5597 if (mode->flags & DRM_MODE_FLAG_3D_MASK) in drm_mode_hdmi_vic()
5603 static u8 drm_mode_cea_vic(const struct drm_connector *connector, in drm_mode_cea_vic() argument
5609 * HDMI spec says if a mode is found in HDMI 1.4b 4K modes in drm_mode_cea_vic()
5612 * HDMI 1.4b 4K modes in drm_mode_cea_vic()
5614 if (drm_mode_hdmi_vic(connector, mode)) in drm_mode_cea_vic()
5620 * HDMI 1.4 VIC range: 1 <= VIC <= 64 (CEA-861-D) but in drm_mode_cea_vic()
5621 * HDMI 2.0 VIC range: 1 <= VIC <= 107 (CEA-861-F). So we in drm_mode_cea_vic()
5622 * have to make sure we dont break HDMI 1.4 sinks. in drm_mode_cea_vic()
5624 if (!is_hdmi2_sink(connector) && vic > 64) in drm_mode_cea_vic()
5631 * drm_hdmi_avi_infoframe_from_display_mode() - fill an HDMI AVI infoframe with
5633 * @frame: HDMI AVI infoframe
5634 * @connector: the connector
5641 const struct drm_connector *connector, in drm_hdmi_avi_infoframe_from_display_mode() argument
5648 return -EINVAL; in drm_hdmi_avi_infoframe_from_display_mode()
5652 if (mode->flags & DRM_MODE_FLAG_DBLCLK) in drm_hdmi_avi_infoframe_from_display_mode()
5653 frame->pixel_repeat = 1; in drm_hdmi_avi_infoframe_from_display_mode()
5655 vic = drm_mode_cea_vic(connector, mode); in drm_hdmi_avi_infoframe_from_display_mode()
5656 hdmi_vic = drm_mode_hdmi_vic(connector, mode); in drm_hdmi_avi_infoframe_from_display_mode()
5658 frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE; in drm_hdmi_avi_infoframe_from_display_mode()
5661 * As some drivers don't support atomic, we can't use connector state. in drm_hdmi_avi_infoframe_from_display_mode()
5665 frame->content_type = HDMI_CONTENT_TYPE_GRAPHICS; in drm_hdmi_avi_infoframe_from_display_mode()
5666 frame->itc = 0; in drm_hdmi_avi_infoframe_from_display_mode()
5670 * user input (if specified) or from the CEA/HDMI mode lists. in drm_hdmi_avi_infoframe_from_display_mode()
5672 picture_aspect = mode->picture_aspect_ratio; in drm_hdmi_avi_infoframe_from_display_mode()
5688 return -EINVAL; in drm_hdmi_avi_infoframe_from_display_mode()
5691 return -EINVAL; in drm_hdmi_avi_infoframe_from_display_mode()
5693 return -EINVAL; in drm_hdmi_avi_infoframe_from_display_mode()
5699 frame->video_code = vic; in drm_hdmi_avi_infoframe_from_display_mode()
5700 frame->picture_aspect = picture_aspect; in drm_hdmi_avi_infoframe_from_display_mode()
5701 frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE; in drm_hdmi_avi_infoframe_from_display_mode()
5702 frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN; in drm_hdmi_avi_infoframe_from_display_mode()
5708 /* HDMI Colorspace Spec Definitions */
5751 * drm_hdmi_avi_infoframe_colorspace() - fill the HDMI AVI infoframe
5753 * @frame: HDMI AVI infoframe
5754 * @conn_state: connector state
5761 u32 colorimetry_index = conn_state->colorspace & FULL_COLORIMETRY_MASK; in drm_hdmi_avi_infoframe_colorspace()
5768 frame->colorimetry = colorimetry_val & NORMAL_COLORIMETRY_MASK; in drm_hdmi_avi_infoframe_colorspace()
5771 * structure and extend it in drivers/video/hdmi in drm_hdmi_avi_infoframe_colorspace()
5773 frame->extended_colorimetry = (colorimetry_val >> 2) & in drm_hdmi_avi_infoframe_colorspace()
5779 * drm_hdmi_avi_infoframe_quant_range() - fill the HDMI AVI infoframe
5781 * @frame: HDMI AVI infoframe
5782 * @connector: the connector
5788 const struct drm_connector *connector, in drm_hdmi_avi_infoframe_quant_range() argument
5792 const struct drm_display_info *info = &connector->display_info; in drm_hdmi_avi_infoframe_quant_range()
5795 * CEA-861: in drm_hdmi_avi_infoframe_quant_range()
5796 * "A Source shall not send a non-zero Q value that does not correspond in drm_hdmi_avi_infoframe_quant_range()
5801 * HDMI 2.0 recommends sending non-zero Q when it does match the in drm_hdmi_avi_infoframe_quant_range()
5804 if (info->rgb_quant_range_selectable || in drm_hdmi_avi_infoframe_quant_range()
5806 frame->quantization_range = rgb_quant_range; in drm_hdmi_avi_infoframe_quant_range()
5808 frame->quantization_range = HDMI_QUANTIZATION_RANGE_DEFAULT; in drm_hdmi_avi_infoframe_quant_range()
5811 * CEA-861-F: in drm_hdmi_avi_infoframe_quant_range()
5813 * YQ-field to match the RGB Quantization Range being transmitted in drm_hdmi_avi_infoframe_quant_range()
5815 * set YQ=1) and the Sink shall ignore the YQ-field." in drm_hdmi_avi_infoframe_quant_range()
5818 * by non-zero YQ when receiving RGB. There doesn't seem to be any in drm_hdmi_avi_infoframe_quant_range()
5819 * good way to tell which version of CEA-861 the sink supports, so in drm_hdmi_avi_infoframe_quant_range()
5820 * we limit non-zero YQ to HDMI 2.0 sinks only as HDMI 2.0 is based in drm_hdmi_avi_infoframe_quant_range()
5821 * on on CEA-861-F. in drm_hdmi_avi_infoframe_quant_range()
5823 if (!is_hdmi2_sink(connector) || in drm_hdmi_avi_infoframe_quant_range()
5825 frame->ycc_quantization_range = in drm_hdmi_avi_infoframe_quant_range()
5828 frame->ycc_quantization_range = in drm_hdmi_avi_infoframe_quant_range()
5834 * drm_hdmi_avi_infoframe_bars() - fill the HDMI AVI infoframe
5836 * @frame: HDMI AVI infoframe
5837 * @conn_state: connector state
5843 frame->right_bar = conn_state->tv.margins.right; in drm_hdmi_avi_infoframe_bars()
5844 frame->left_bar = conn_state->tv.margins.left; in drm_hdmi_avi_infoframe_bars()
5845 frame->top_bar = conn_state->tv.margins.top; in drm_hdmi_avi_infoframe_bars()
5846 frame->bottom_bar = conn_state->tv.margins.bottom; in drm_hdmi_avi_infoframe_bars()
5853 u32 layout = mode->flags & DRM_MODE_FLAG_3D_MASK; in s3d_structure_from_display_mode()
5878 * drm_hdmi_vendor_infoframe_from_display_mode() - fill an HDMI infoframe with
5880 * @frame: HDMI vendor infoframe
5881 * @connector: the connector
5884 * Note that there's is a need to send HDMI vendor infoframes only when using a
5886 * function will return -EINVAL, error that can be safely ignored.
5892 const struct drm_connector *connector, in drm_hdmi_vendor_infoframe_from_display_mode() argument
5896 * FIXME: sil-sii8620 doesn't have a connector around when in drm_hdmi_vendor_infoframe_from_display_mode()
5897 * we need one, so we have to be prepared for a NULL connector. in drm_hdmi_vendor_infoframe_from_display_mode()
5899 bool has_hdmi_infoframe = connector ? in drm_hdmi_vendor_infoframe_from_display_mode()
5900 connector->display_info.has_hdmi_infoframe : false; in drm_hdmi_vendor_infoframe_from_display_mode()
5904 return -EINVAL; in drm_hdmi_vendor_infoframe_from_display_mode()
5907 return -EINVAL; in drm_hdmi_vendor_infoframe_from_display_mode()
5917 * suggestion in HDMI 2.0 Appendix F. Apparently some sinks in drm_hdmi_vendor_infoframe_from_display_mode()
5922 frame->vic = drm_mode_hdmi_vic(connector, mode); in drm_hdmi_vendor_infoframe_from_display_mode()
5923 frame->s3d_struct = s3d_structure_from_display_mode(mode); in drm_hdmi_vendor_infoframe_from_display_mode()
5929 static void drm_parse_tiled_block(struct drm_connector *connector, in drm_parse_tiled_block() argument
5938 w = tile->tile_size[0] | tile->tile_size[1] << 8; in drm_parse_tiled_block()
5939 h = tile->tile_size[2] | tile->tile_size[3] << 8; in drm_parse_tiled_block()
5941 num_v_tile = (tile->topo[0] & 0xf) | (tile->topo[2] & 0x30); in drm_parse_tiled_block()
5942 num_h_tile = (tile->topo[0] >> 4) | ((tile->topo[2] >> 2) & 0x30); in drm_parse_tiled_block()
5943 tile_v_loc = (tile->topo[1] & 0xf) | ((tile->topo[2] & 0x3) << 4); in drm_parse_tiled_block()
5944 tile_h_loc = (tile->topo[1] >> 4) | (((tile->topo[2] >> 2) & 0x3) << 4); in drm_parse_tiled_block()
5946 connector->has_tile = true; in drm_parse_tiled_block()
5947 if (tile->tile_cap & 0x80) in drm_parse_tiled_block()
5948 connector->tile_is_single_monitor = true; in drm_parse_tiled_block()
5950 connector->num_h_tile = num_h_tile + 1; in drm_parse_tiled_block()
5951 connector->num_v_tile = num_v_tile + 1; in drm_parse_tiled_block()
5952 connector->tile_h_loc = tile_h_loc; in drm_parse_tiled_block()
5953 connector->tile_v_loc = tile_v_loc; in drm_parse_tiled_block()
5954 connector->tile_h_size = w + 1; in drm_parse_tiled_block()
5955 connector->tile_v_size = h + 1; in drm_parse_tiled_block()
5957 DRM_DEBUG_KMS("tile cap 0x%x\n", tile->tile_cap); in drm_parse_tiled_block()
5961 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()
5963 tg = drm_mode_get_tile_group(connector->dev, tile->topology_id); in drm_parse_tiled_block()
5965 tg = drm_mode_create_tile_group(connector->dev, tile->topology_id); in drm_parse_tiled_block()
5969 if (connector->tile_group != tg) { in drm_parse_tiled_block()
5972 if (connector->tile_group) in drm_parse_tiled_block()
5973 drm_mode_put_tile_group(connector->dev, connector->tile_group); in drm_parse_tiled_block()
5974 connector->tile_group = tg; in drm_parse_tiled_block()
5977 drm_mode_put_tile_group(connector->dev, tg); in drm_parse_tiled_block()
5981 void drm_update_tile_info(struct drm_connector *connector, in drm_update_tile_info() argument
5987 connector->has_tile = false; in drm_update_tile_info()
5991 if (block->tag == DATA_BLOCK_TILED_DISPLAY) in drm_update_tile_info()
5992 drm_parse_tiled_block(connector, block); in drm_update_tile_info()
5996 if (!connector->has_tile && connector->tile_group) { in drm_update_tile_info()
5997 drm_mode_put_tile_group(connector->dev, connector->tile_group); in drm_update_tile_info()
5998 connector->tile_group = NULL; in drm_update_tile_info()