1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright © 2014 Red Hat Inc. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a 5*4882a593Smuzhiyun * copy of this software and associated documentation files (the "Software"), 6*4882a593Smuzhiyun * to deal in the Software without restriction, including without limitation 7*4882a593Smuzhiyun * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*4882a593Smuzhiyun * and/or sell copies of the Software, and to permit persons to whom the 9*4882a593Smuzhiyun * Software is furnished to do so, subject to the following conditions: 10*4882a593Smuzhiyun * 11*4882a593Smuzhiyun * The above copyright notice and this permission notice shall be included in 12*4882a593Smuzhiyun * all copies or substantial portions of the Software. 13*4882a593Smuzhiyun * 14*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17*4882a593Smuzhiyun * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR 18*4882a593Smuzhiyun * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19*4882a593Smuzhiyun * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20*4882a593Smuzhiyun * OTHER DEALINGS IN THE SOFTWARE. 21*4882a593Smuzhiyun */ 22*4882a593Smuzhiyun #ifndef DRM_DISPLAYID_H 23*4882a593Smuzhiyun #define DRM_DISPLAYID_H 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #define DATA_BLOCK_PRODUCT_ID 0x00 26*4882a593Smuzhiyun #define DATA_BLOCK_DISPLAY_PARAMETERS 0x01 27*4882a593Smuzhiyun #define DATA_BLOCK_COLOR_CHARACTERISTICS 0x02 28*4882a593Smuzhiyun #define DATA_BLOCK_TYPE_1_DETAILED_TIMING 0x03 29*4882a593Smuzhiyun #define DATA_BLOCK_TYPE_2_DETAILED_TIMING 0x04 30*4882a593Smuzhiyun #define DATA_BLOCK_TYPE_3_SHORT_TIMING 0x05 31*4882a593Smuzhiyun #define DATA_BLOCK_TYPE_4_DMT_TIMING 0x06 32*4882a593Smuzhiyun #define DATA_BLOCK_VESA_TIMING 0x07 33*4882a593Smuzhiyun #define DATA_BLOCK_CEA_TIMING 0x08 34*4882a593Smuzhiyun #define DATA_BLOCK_VIDEO_TIMING_RANGE 0x09 35*4882a593Smuzhiyun #define DATA_BLOCK_PRODUCT_SERIAL_NUMBER 0x0a 36*4882a593Smuzhiyun #define DATA_BLOCK_GP_ASCII_STRING 0x0b 37*4882a593Smuzhiyun #define DATA_BLOCK_DISPLAY_DEVICE_DATA 0x0c 38*4882a593Smuzhiyun #define DATA_BLOCK_INTERFACE_POWER_SEQUENCING 0x0d 39*4882a593Smuzhiyun #define DATA_BLOCK_TRANSFER_CHARACTERISTICS 0x0e 40*4882a593Smuzhiyun #define DATA_BLOCK_DISPLAY_INTERFACE 0x0f 41*4882a593Smuzhiyun #define DATA_BLOCK_STEREO_DISPLAY_INTERFACE 0x10 42*4882a593Smuzhiyun #define DATA_BLOCK_TILED_DISPLAY 0x12 43*4882a593Smuzhiyun #define DATA_BLOCK_CTA 0x81 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun #define DATA_BLOCK_VENDOR_SPECIFIC 0x7f 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun #define PRODUCT_TYPE_EXTENSION 0 48*4882a593Smuzhiyun #define PRODUCT_TYPE_TEST 1 49*4882a593Smuzhiyun #define PRODUCT_TYPE_PANEL 2 50*4882a593Smuzhiyun #define PRODUCT_TYPE_MONITOR 3 51*4882a593Smuzhiyun #define PRODUCT_TYPE_TV 4 52*4882a593Smuzhiyun #define PRODUCT_TYPE_REPEATER 5 53*4882a593Smuzhiyun #define PRODUCT_TYPE_DIRECT_DRIVE 6 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct displayid_hdr { 56*4882a593Smuzhiyun u8 rev; 57*4882a593Smuzhiyun u8 bytes; 58*4882a593Smuzhiyun u8 prod_id; 59*4882a593Smuzhiyun u8 ext_count; 60*4882a593Smuzhiyun } __packed; 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun struct displayid_block { 63*4882a593Smuzhiyun u8 tag; 64*4882a593Smuzhiyun u8 rev; 65*4882a593Smuzhiyun u8 num_bytes; 66*4882a593Smuzhiyun } __packed; 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun struct displayid_tiled_block { 69*4882a593Smuzhiyun struct displayid_block base; 70*4882a593Smuzhiyun u8 tile_cap; 71*4882a593Smuzhiyun u8 topo[3]; 72*4882a593Smuzhiyun u8 tile_size[4]; 73*4882a593Smuzhiyun u8 tile_pixel_bezel[5]; 74*4882a593Smuzhiyun u8 topology_id[8]; 75*4882a593Smuzhiyun } __packed; 76*4882a593Smuzhiyun 77*4882a593Smuzhiyun struct displayid_detailed_timings_1 { 78*4882a593Smuzhiyun u8 pixel_clock[3]; 79*4882a593Smuzhiyun u8 flags; 80*4882a593Smuzhiyun u8 hactive[2]; 81*4882a593Smuzhiyun u8 hblank[2]; 82*4882a593Smuzhiyun u8 hsync[2]; 83*4882a593Smuzhiyun u8 hsw[2]; 84*4882a593Smuzhiyun u8 vactive[2]; 85*4882a593Smuzhiyun u8 vblank[2]; 86*4882a593Smuzhiyun u8 vsync[2]; 87*4882a593Smuzhiyun u8 vsw[2]; 88*4882a593Smuzhiyun } __packed; 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun struct displayid_detailed_timing_block { 91*4882a593Smuzhiyun struct displayid_block base; 92*4882a593Smuzhiyun struct displayid_detailed_timings_1 timings[]; 93*4882a593Smuzhiyun }; 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #define for_each_displayid_db(displayid, block, idx, length) \ 96*4882a593Smuzhiyun for ((block) = (struct displayid_block *)&(displayid)[idx]; \ 97*4882a593Smuzhiyun (idx) + sizeof(struct displayid_block) <= (length) && \ 98*4882a593Smuzhiyun (idx) + sizeof(struct displayid_block) + (block)->num_bytes <= (length) && \ 99*4882a593Smuzhiyun (block)->num_bytes > 0; \ 100*4882a593Smuzhiyun (idx) += sizeof(struct displayid_block) + (block)->num_bytes, \ 101*4882a593Smuzhiyun (block) = (struct displayid_block *)&(displayid)[idx]) 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun #endif 104