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