1b49b55bdSDave Airlie /* 2b49b55bdSDave Airlie * Copyright © 2014 Red Hat Inc. 3b49b55bdSDave Airlie * 4b49b55bdSDave Airlie * Permission is hereby granted, free of charge, to any person obtaining a 5b49b55bdSDave Airlie * copy of this software and associated documentation files (the "Software"), 6b49b55bdSDave Airlie * to deal in the Software without restriction, including without limitation 7b49b55bdSDave Airlie * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8b49b55bdSDave Airlie * and/or sell copies of the Software, and to permit persons to whom the 9b49b55bdSDave Airlie * Software is furnished to do so, subject to the following conditions: 10b49b55bdSDave Airlie * 11b49b55bdSDave Airlie * The above copyright notice and this permission notice shall be included in 12b49b55bdSDave Airlie * all copies or substantial portions of the Software. 13b49b55bdSDave Airlie * 14b49b55bdSDave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15b49b55bdSDave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16b49b55bdSDave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17b49b55bdSDave Airlie * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18b49b55bdSDave Airlie * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19b49b55bdSDave Airlie * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20b49b55bdSDave Airlie * OTHER DEALINGS IN THE SOFTWARE. 21b49b55bdSDave Airlie */ 22b49b55bdSDave Airlie #ifndef DRM_DISPLAYID_H 23b49b55bdSDave Airlie #define DRM_DISPLAYID_H 24b49b55bdSDave Airlie 254cc4f09eSJani Nikula #include <linux/types.h> 2618a9cbbeSJani Nikula #include <linux/bits.h> 274cc4f09eSJani Nikula 28d9ba1b4cSJani Nikula struct drm_edid; 294cc4f09eSJani Nikula 3018a9cbbeSJani Nikula #define VESA_IEEE_OUI 0x3a0292 3118a9cbbeSJani Nikula 32b5c24049SJani Nikula /* DisplayID Structure versions */ 33b5c24049SJani Nikula #define DISPLAY_ID_STRUCTURE_VER_20 0x20 34b5c24049SJani Nikula 358571c765SJani Nikula /* DisplayID Structure v1r2 Data Blocks */ 36b49b55bdSDave Airlie #define DATA_BLOCK_PRODUCT_ID 0x00 37b49b55bdSDave Airlie #define DATA_BLOCK_DISPLAY_PARAMETERS 0x01 38b49b55bdSDave Airlie #define DATA_BLOCK_COLOR_CHARACTERISTICS 0x02 39b49b55bdSDave Airlie #define DATA_BLOCK_TYPE_1_DETAILED_TIMING 0x03 40b49b55bdSDave Airlie #define DATA_BLOCK_TYPE_2_DETAILED_TIMING 0x04 41b49b55bdSDave Airlie #define DATA_BLOCK_TYPE_3_SHORT_TIMING 0x05 42b49b55bdSDave Airlie #define DATA_BLOCK_TYPE_4_DMT_TIMING 0x06 43b49b55bdSDave Airlie #define DATA_BLOCK_VESA_TIMING 0x07 44b49b55bdSDave Airlie #define DATA_BLOCK_CEA_TIMING 0x08 45b49b55bdSDave Airlie #define DATA_BLOCK_VIDEO_TIMING_RANGE 0x09 46b49b55bdSDave Airlie #define DATA_BLOCK_PRODUCT_SERIAL_NUMBER 0x0a 47b49b55bdSDave Airlie #define DATA_BLOCK_GP_ASCII_STRING 0x0b 48b49b55bdSDave Airlie #define DATA_BLOCK_DISPLAY_DEVICE_DATA 0x0c 49b49b55bdSDave Airlie #define DATA_BLOCK_INTERFACE_POWER_SEQUENCING 0x0d 50b49b55bdSDave Airlie #define DATA_BLOCK_TRANSFER_CHARACTERISTICS 0x0e 51b49b55bdSDave Airlie #define DATA_BLOCK_DISPLAY_INTERFACE 0x0f 52b49b55bdSDave Airlie #define DATA_BLOCK_STEREO_DISPLAY_INTERFACE 0x10 53b49b55bdSDave Airlie #define DATA_BLOCK_TILED_DISPLAY 0x12 548571c765SJani Nikula #define DATA_BLOCK_VENDOR_SPECIFIC 0x7f 55e28ad544SAndres Rodriguez #define DATA_BLOCK_CTA 0x81 56b49b55bdSDave Airlie 57b5c24049SJani Nikula /* DisplayID Structure v2r0 Data Blocks */ 58b5c24049SJani Nikula #define DATA_BLOCK_2_PRODUCT_ID 0x20 59b5c24049SJani Nikula #define DATA_BLOCK_2_DISPLAY_PARAMETERS 0x21 60b5c24049SJani Nikula #define DATA_BLOCK_2_TYPE_7_DETAILED_TIMING 0x22 61b5c24049SJani Nikula #define DATA_BLOCK_2_TYPE_8_ENUMERATED_TIMING 0x23 62b5c24049SJani Nikula #define DATA_BLOCK_2_TYPE_9_FORMULA_TIMING 0x24 63b5c24049SJani Nikula #define DATA_BLOCK_2_DYNAMIC_VIDEO_TIMING 0x25 64b5c24049SJani Nikula #define DATA_BLOCK_2_DISPLAY_INTERFACE_FEATURES 0x26 65b5c24049SJani Nikula #define DATA_BLOCK_2_STEREO_DISPLAY_INTERFACE 0x27 66b5c24049SJani Nikula #define DATA_BLOCK_2_TILED_DISPLAY_TOPOLOGY 0x28 67b5c24049SJani Nikula #define DATA_BLOCK_2_CONTAINER_ID 0x29 68b5c24049SJani Nikula #define DATA_BLOCK_2_VENDOR_SPECIFIC 0x7e 69b5c24049SJani Nikula #define DATA_BLOCK_2_CTA_DISPLAY_ID 0x81 70b5c24049SJani Nikula 718571c765SJani Nikula /* DisplayID Structure v1r2 Product Type */ 72b49b55bdSDave Airlie #define PRODUCT_TYPE_EXTENSION 0 73b49b55bdSDave Airlie #define PRODUCT_TYPE_TEST 1 74b49b55bdSDave Airlie #define PRODUCT_TYPE_PANEL 2 75b49b55bdSDave Airlie #define PRODUCT_TYPE_MONITOR 3 76b49b55bdSDave Airlie #define PRODUCT_TYPE_TV 4 77b49b55bdSDave Airlie #define PRODUCT_TYPE_REPEATER 5 78b49b55bdSDave Airlie #define PRODUCT_TYPE_DIRECT_DRIVE 6 79b49b55bdSDave Airlie 80b5c24049SJani Nikula /* DisplayID Structure v2r0 Display Product Primary Use Case (~Product Type) */ 81b5c24049SJani Nikula #define PRIMARY_USE_EXTENSION 0 82b5c24049SJani Nikula #define PRIMARY_USE_TEST 1 83b5c24049SJani Nikula #define PRIMARY_USE_GENERIC 2 84b5c24049SJani Nikula #define PRIMARY_USE_TV 3 85b5c24049SJani Nikula #define PRIMARY_USE_DESKTOP_PRODUCTIVITY 4 86b5c24049SJani Nikula #define PRIMARY_USE_DESKTOP_GAMING 5 87b5c24049SJani Nikula #define PRIMARY_USE_PRESENTATION 6 88b5c24049SJani Nikula #define PRIMARY_USE_HEAD_MOUNTED_VR 7 89b5c24049SJani Nikula #define PRIMARY_USE_HEAD_MOUNTED_AR 8 90b5c24049SJani Nikula 91339be1a8SJani Nikula struct displayid_header { 92b49b55bdSDave Airlie u8 rev; 93b49b55bdSDave Airlie u8 bytes; 94b49b55bdSDave Airlie u8 prod_id; 95b49b55bdSDave Airlie u8 ext_count; 96b49b55bdSDave Airlie } __packed; 97b49b55bdSDave Airlie 98b49b55bdSDave Airlie struct displayid_block { 99b49b55bdSDave Airlie u8 tag; 100b49b55bdSDave Airlie u8 rev; 101b49b55bdSDave Airlie u8 num_bytes; 102b49b55bdSDave Airlie } __packed; 103b49b55bdSDave Airlie 104b49b55bdSDave Airlie struct displayid_tiled_block { 105b49b55bdSDave Airlie struct displayid_block base; 106b49b55bdSDave Airlie u8 tile_cap; 107b49b55bdSDave Airlie u8 topo[3]; 108b49b55bdSDave Airlie u8 tile_size[4]; 109b49b55bdSDave Airlie u8 tile_pixel_bezel[5]; 110b49b55bdSDave Airlie u8 topology_id[8]; 111b49b55bdSDave Airlie } __packed; 112b49b55bdSDave Airlie 113a39ed680SDave Airlie struct displayid_detailed_timings_1 { 114a39ed680SDave Airlie u8 pixel_clock[3]; 115a39ed680SDave Airlie u8 flags; 116a39ed680SDave Airlie u8 hactive[2]; 117a39ed680SDave Airlie u8 hblank[2]; 118a39ed680SDave Airlie u8 hsync[2]; 119a39ed680SDave Airlie u8 hsw[2]; 120a39ed680SDave Airlie u8 vactive[2]; 121a39ed680SDave Airlie u8 vblank[2]; 122a39ed680SDave Airlie u8 vsync[2]; 123a39ed680SDave Airlie u8 vsw[2]; 124a39ed680SDave Airlie } __packed; 125a39ed680SDave Airlie 126a39ed680SDave Airlie struct displayid_detailed_timing_block { 127a39ed680SDave Airlie struct displayid_block base; 128ec4ac369SGustavo A. R. Silva struct displayid_detailed_timings_1 timings[]; 129a39ed680SDave Airlie }; 130e28ad544SAndres Rodriguez 13118a9cbbeSJani Nikula #define DISPLAYID_VESA_MSO_OVERLAP GENMASK(3, 0) 13218a9cbbeSJani Nikula #define DISPLAYID_VESA_MSO_MODE GENMASK(6, 5) 13318a9cbbeSJani Nikula 13418a9cbbeSJani Nikula struct displayid_vesa_vendor_specific_block { 13518a9cbbeSJani Nikula struct displayid_block base; 13618a9cbbeSJani Nikula u8 oui[3]; 13718a9cbbeSJani Nikula u8 data_structure_type; 13818a9cbbeSJani Nikula u8 mso; 13918a9cbbeSJani Nikula } __packed; 14018a9cbbeSJani Nikula 141*b568e6bbSJani Nikula /* 142*b568e6bbSJani Nikula * DisplayID iteration. 143*b568e6bbSJani Nikula * 144*b568e6bbSJani Nikula * Do not access directly, this is private. 145*b568e6bbSJani Nikula */ 1461a24c364SJani Nikula struct displayid_iter { 147d9ba1b4cSJani Nikula const struct drm_edid *drm_edid; 1481a24c364SJani Nikula 1491a24c364SJani Nikula const u8 *section; 1501a24c364SJani Nikula int length; 1511a24c364SJani Nikula int idx; 1521a24c364SJani Nikula int ext_index; 153*b568e6bbSJani Nikula 154*b568e6bbSJani Nikula u8 version; 155*b568e6bbSJani Nikula u8 primary_use; 1561a24c364SJani Nikula }; 1571a24c364SJani Nikula 158d9ba1b4cSJani Nikula void displayid_iter_edid_begin(const struct drm_edid *drm_edid, 1591a24c364SJani Nikula struct displayid_iter *iter); 1601a24c364SJani Nikula const struct displayid_block * 1611a24c364SJani Nikula __displayid_iter_next(struct displayid_iter *iter); 1621a24c364SJani Nikula #define displayid_iter_for_each(__block, __iter) \ 1631a24c364SJani Nikula while (((__block) = __displayid_iter_next(__iter))) 1641a24c364SJani Nikula void displayid_iter_end(struct displayid_iter *iter); 1651a24c364SJani Nikula 166*b568e6bbSJani Nikula u8 displayid_version(const struct displayid_iter *iter); 167*b568e6bbSJani Nikula u8 displayid_primary_use(const struct displayid_iter *iter); 168*b568e6bbSJani Nikula 169b49b55bdSDave Airlie #endif 170