1*d83cc019SAndroid Build Coastguard Worker /* 2*d83cc019SAndroid Build Coastguard Worker * Copyright © 2019 Intel Corporation 3*d83cc019SAndroid Build Coastguard Worker * 4*d83cc019SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 5*d83cc019SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 6*d83cc019SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 7*d83cc019SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*d83cc019SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 9*d83cc019SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 10*d83cc019SAndroid Build Coastguard Worker * 11*d83cc019SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next 12*d83cc019SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the 13*d83cc019SAndroid Build Coastguard Worker * Software. 14*d83cc019SAndroid Build Coastguard Worker * 15*d83cc019SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*d83cc019SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*d83cc019SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*d83cc019SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*d83cc019SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20*d83cc019SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21*d83cc019SAndroid Build Coastguard Worker * IN THE SOFTWARE. 22*d83cc019SAndroid Build Coastguard Worker * 23*d83cc019SAndroid Build Coastguard Worker * Authors: Simon Ser <[email protected]> 24*d83cc019SAndroid Build Coastguard Worker */ 25*d83cc019SAndroid Build Coastguard Worker 26*d83cc019SAndroid Build Coastguard Worker #ifndef IGT_EDID_H 27*d83cc019SAndroid Build Coastguard Worker #define IGT_EDID_H 28*d83cc019SAndroid Build Coastguard Worker 29*d83cc019SAndroid Build Coastguard Worker #include "config.h" 30*d83cc019SAndroid Build Coastguard Worker 31*d83cc019SAndroid Build Coastguard Worker #include <stdint.h> 32*d83cc019SAndroid Build Coastguard Worker 33*d83cc019SAndroid Build Coastguard Worker #include <xf86drmMode.h> 34*d83cc019SAndroid Build Coastguard Worker 35*d83cc019SAndroid Build Coastguard Worker #define EDID_BLOCK_SIZE 128 36*d83cc019SAndroid Build Coastguard Worker 37*d83cc019SAndroid Build Coastguard Worker /** 38*d83cc019SAndroid Build Coastguard Worker * est_timings: set of established timings 39*d83cc019SAndroid Build Coastguard Worker */ 40*d83cc019SAndroid Build Coastguard Worker struct est_timings { 41*d83cc019SAndroid Build Coastguard Worker uint8_t t1; 42*d83cc019SAndroid Build Coastguard Worker uint8_t t2; 43*d83cc019SAndroid Build Coastguard Worker uint8_t mfg_rsvd; 44*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 45*d83cc019SAndroid Build Coastguard Worker 46*d83cc019SAndroid Build Coastguard Worker #define STD_TIMINGS_LEN 8 47*d83cc019SAndroid Build Coastguard Worker 48*d83cc019SAndroid Build Coastguard Worker enum std_timing_aspect { 49*d83cc019SAndroid Build Coastguard Worker STD_TIMING_16_10 = 0b00, 50*d83cc019SAndroid Build Coastguard Worker STD_TIMING_4_3 = 0b01, 51*d83cc019SAndroid Build Coastguard Worker STD_TIMING_5_4 = 0b10, 52*d83cc019SAndroid Build Coastguard Worker STD_TIMING_16_9 = 0b11, 53*d83cc019SAndroid Build Coastguard Worker }; 54*d83cc019SAndroid Build Coastguard Worker 55*d83cc019SAndroid Build Coastguard Worker /** 56*d83cc019SAndroid Build Coastguard Worker * std_timing: a standard timing 57*d83cc019SAndroid Build Coastguard Worker */ 58*d83cc019SAndroid Build Coastguard Worker struct std_timing { 59*d83cc019SAndroid Build Coastguard Worker uint8_t hsize; 60*d83cc019SAndroid Build Coastguard Worker uint8_t vfreq_aspect; 61*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 62*d83cc019SAndroid Build Coastguard Worker 63*d83cc019SAndroid Build Coastguard Worker #define DETAILED_TIMINGS_LEN 4 64*d83cc019SAndroid Build Coastguard Worker 65*d83cc019SAndroid Build Coastguard Worker #define EDID_PT_INTERLACED (1 << 7) 66*d83cc019SAndroid Build Coastguard Worker #define EDID_PT_STEREO (1 << 5) 67*d83cc019SAndroid Build Coastguard Worker 68*d83cc019SAndroid Build Coastguard Worker /* Sync type */ 69*d83cc019SAndroid Build Coastguard Worker #define EDID_PT_SYNC_ANALOG (0b00 << 3) 70*d83cc019SAndroid Build Coastguard Worker #define EDID_PT_SYNC_DIGITAL_COMPOSITE (0b10 << 3) 71*d83cc019SAndroid Build Coastguard Worker #define EDID_PT_SYNC_DIGITAL_SEPARATE (0b11 << 3) 72*d83cc019SAndroid Build Coastguard Worker 73*d83cc019SAndroid Build Coastguard Worker /* Applies to EDID_PT_SYNC_DIGITAL_SEPARATE only */ 74*d83cc019SAndroid Build Coastguard Worker #define EDID_PT_VSYNC_POSITIVE (1 << 2) 75*d83cc019SAndroid Build Coastguard Worker #define EDID_PT_HSYNC_POSITIVE (1 << 1) 76*d83cc019SAndroid Build Coastguard Worker 77*d83cc019SAndroid Build Coastguard Worker struct detailed_pixel_timing { 78*d83cc019SAndroid Build Coastguard Worker uint8_t hactive_lo; 79*d83cc019SAndroid Build Coastguard Worker uint8_t hblank_lo; 80*d83cc019SAndroid Build Coastguard Worker uint8_t hactive_hblank_hi; 81*d83cc019SAndroid Build Coastguard Worker uint8_t vactive_lo; 82*d83cc019SAndroid Build Coastguard Worker uint8_t vblank_lo; 83*d83cc019SAndroid Build Coastguard Worker uint8_t vactive_vblank_hi; 84*d83cc019SAndroid Build Coastguard Worker uint8_t hsync_offset_lo; 85*d83cc019SAndroid Build Coastguard Worker uint8_t hsync_pulse_width_lo; 86*d83cc019SAndroid Build Coastguard Worker uint8_t vsync_offset_pulse_width_lo; 87*d83cc019SAndroid Build Coastguard Worker uint8_t hsync_vsync_offset_pulse_width_hi; 88*d83cc019SAndroid Build Coastguard Worker uint8_t width_mm_lo; 89*d83cc019SAndroid Build Coastguard Worker uint8_t height_mm_lo; 90*d83cc019SAndroid Build Coastguard Worker uint8_t width_height_mm_hi; 91*d83cc019SAndroid Build Coastguard Worker uint8_t hborder; 92*d83cc019SAndroid Build Coastguard Worker uint8_t vborder; 93*d83cc019SAndroid Build Coastguard Worker uint8_t misc; /* EDID_PT_* */ 94*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 95*d83cc019SAndroid Build Coastguard Worker 96*d83cc019SAndroid Build Coastguard Worker struct detailed_data_string { 97*d83cc019SAndroid Build Coastguard Worker char str[13]; 98*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 99*d83cc019SAndroid Build Coastguard Worker 100*d83cc019SAndroid Build Coastguard Worker struct detailed_data_monitor_range { 101*d83cc019SAndroid Build Coastguard Worker uint8_t min_vfreq; 102*d83cc019SAndroid Build Coastguard Worker uint8_t max_vfreq; 103*d83cc019SAndroid Build Coastguard Worker uint8_t min_hfreq_khz; 104*d83cc019SAndroid Build Coastguard Worker uint8_t max_hfreq_khz; 105*d83cc019SAndroid Build Coastguard Worker uint8_t pixel_clock_mhz; /* need to multiply by 10 */ 106*d83cc019SAndroid Build Coastguard Worker uint8_t flags; 107*d83cc019SAndroid Build Coastguard Worker union { 108*d83cc019SAndroid Build Coastguard Worker char pad[7]; 109*d83cc019SAndroid Build Coastguard Worker struct { 110*d83cc019SAndroid Build Coastguard Worker uint8_t reserved; 111*d83cc019SAndroid Build Coastguard Worker uint8_t hfreq_start_khz; /* need to multiply by 2 */ 112*d83cc019SAndroid Build Coastguard Worker uint8_t c; /* need to divide by 2 */ 113*d83cc019SAndroid Build Coastguard Worker uint8_t m[2]; 114*d83cc019SAndroid Build Coastguard Worker uint8_t k; 115*d83cc019SAndroid Build Coastguard Worker uint8_t j; /* need to divide by 2 */ 116*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)) gtf2; 117*d83cc019SAndroid Build Coastguard Worker struct { 118*d83cc019SAndroid Build Coastguard Worker uint8_t version; 119*d83cc019SAndroid Build Coastguard Worker uint8_t data1; /* high 6 bits: extra clock resolution */ 120*d83cc019SAndroid Build Coastguard Worker uint8_t data2; /* plus low 2 of above: max hactive */ 121*d83cc019SAndroid Build Coastguard Worker uint8_t supported_aspects; 122*d83cc019SAndroid Build Coastguard Worker uint8_t flags; /* preferred aspect and blanking support */ 123*d83cc019SAndroid Build Coastguard Worker uint8_t supported_scalings; 124*d83cc019SAndroid Build Coastguard Worker uint8_t preferred_refresh; 125*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)) cvt; 126*d83cc019SAndroid Build Coastguard Worker } formula; 127*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 128*d83cc019SAndroid Build Coastguard Worker 129*d83cc019SAndroid Build Coastguard Worker enum detailed_non_pixel_type { 130*d83cc019SAndroid Build Coastguard Worker EDID_DETAIL_EST_TIMINGS = 0xf7, 131*d83cc019SAndroid Build Coastguard Worker EDID_DETAIL_CVT_3BYTE = 0xf8, 132*d83cc019SAndroid Build Coastguard Worker EDID_DETAIL_COLOR_MGMT_DATA = 0xf9, 133*d83cc019SAndroid Build Coastguard Worker EDID_DETAIL_STD_MODES = 0xfa, 134*d83cc019SAndroid Build Coastguard Worker EDID_DETAIL_MONITOR_CPDATA = 0xfb, 135*d83cc019SAndroid Build Coastguard Worker EDID_DETAIL_MONITOR_NAME = 0xfc, 136*d83cc019SAndroid Build Coastguard Worker EDID_DETAIL_MONITOR_RANGE = 0xfd, 137*d83cc019SAndroid Build Coastguard Worker EDID_DETAIL_MONITOR_STRING = 0xfe, 138*d83cc019SAndroid Build Coastguard Worker EDID_DETAIL_MONITOR_SERIAL = 0xff, 139*d83cc019SAndroid Build Coastguard Worker }; 140*d83cc019SAndroid Build Coastguard Worker 141*d83cc019SAndroid Build Coastguard Worker struct detailed_non_pixel { 142*d83cc019SAndroid Build Coastguard Worker uint8_t pad1; 143*d83cc019SAndroid Build Coastguard Worker uint8_t type; /* enum detailed_non_pixel_type */ 144*d83cc019SAndroid Build Coastguard Worker uint8_t pad2; 145*d83cc019SAndroid Build Coastguard Worker union { 146*d83cc019SAndroid Build Coastguard Worker struct detailed_data_string str; 147*d83cc019SAndroid Build Coastguard Worker struct detailed_data_monitor_range range; 148*d83cc019SAndroid Build Coastguard Worker struct detailed_data_string string; 149*d83cc019SAndroid Build Coastguard Worker /* TODO: other types */ 150*d83cc019SAndroid Build Coastguard Worker } data; 151*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 152*d83cc019SAndroid Build Coastguard Worker 153*d83cc019SAndroid Build Coastguard Worker struct detailed_timing { 154*d83cc019SAndroid Build Coastguard Worker uint8_t pixel_clock[2]; /* need to multiply by 10 KHz, zero if not a pixel timing */ 155*d83cc019SAndroid Build Coastguard Worker union { 156*d83cc019SAndroid Build Coastguard Worker struct detailed_pixel_timing pixel_data; 157*d83cc019SAndroid Build Coastguard Worker struct detailed_non_pixel other_data; 158*d83cc019SAndroid Build Coastguard Worker } data; 159*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 160*d83cc019SAndroid Build Coastguard Worker 161*d83cc019SAndroid Build Coastguard Worker enum cea_sad_format { 162*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_PCM = 1, 163*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_AC3 = 2, 164*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_MPEG1 = 3, /* Layers 1 & 2 */ 165*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_MP3 = 4, 166*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_MPEG2 = 5, 167*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_AAC = 6, 168*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_DTS = 7, 169*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_ATRAC = 8, 170*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_SACD = 9, /* One-bit audio */ 171*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_DD_PLUS = 10, 172*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_DTS_HD = 11, 173*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_DOLBY = 12, /* MLP/Dolby TrueHD */ 174*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_DST = 13, 175*d83cc019SAndroid Build Coastguard Worker CEA_SAD_FORMAT_WMA = 14, /* Microsoft WMA Pro */ 176*d83cc019SAndroid Build Coastguard Worker }; 177*d83cc019SAndroid Build Coastguard Worker 178*d83cc019SAndroid Build Coastguard Worker enum cea_sad_sampling_rate { 179*d83cc019SAndroid Build Coastguard Worker CEA_SAD_SAMPLING_RATE_32KHZ = 1 << 0, 180*d83cc019SAndroid Build Coastguard Worker CEA_SAD_SAMPLING_RATE_44KHZ = 1 << 1, 181*d83cc019SAndroid Build Coastguard Worker CEA_SAD_SAMPLING_RATE_48KHZ = 1 << 2, 182*d83cc019SAndroid Build Coastguard Worker CEA_SAD_SAMPLING_RATE_88KHZ = 1 << 3, 183*d83cc019SAndroid Build Coastguard Worker CEA_SAD_SAMPLING_RATE_96KHZ = 1 << 4, 184*d83cc019SAndroid Build Coastguard Worker CEA_SAD_SAMPLING_RATE_176KHZ = 1 << 5, 185*d83cc019SAndroid Build Coastguard Worker CEA_SAD_SAMPLING_RATE_192KHZ = 1 << 6, 186*d83cc019SAndroid Build Coastguard Worker }; 187*d83cc019SAndroid Build Coastguard Worker 188*d83cc019SAndroid Build Coastguard Worker /* for PCM only */ 189*d83cc019SAndroid Build Coastguard Worker enum cea_sad_pcm_sample_size { 190*d83cc019SAndroid Build Coastguard Worker CEA_SAD_SAMPLE_SIZE_16 = 1 << 0, 191*d83cc019SAndroid Build Coastguard Worker CEA_SAD_SAMPLE_SIZE_20 = 1 << 1, 192*d83cc019SAndroid Build Coastguard Worker CEA_SAD_SAMPLE_SIZE_24 = 1 << 2, 193*d83cc019SAndroid Build Coastguard Worker }; 194*d83cc019SAndroid Build Coastguard Worker 195*d83cc019SAndroid Build Coastguard Worker /* Short Audio Descriptor */ 196*d83cc019SAndroid Build Coastguard Worker struct cea_sad { 197*d83cc019SAndroid Build Coastguard Worker uint8_t format_channels; 198*d83cc019SAndroid Build Coastguard Worker uint8_t sampling_rates; 199*d83cc019SAndroid Build Coastguard Worker uint8_t bitrate; 200*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 201*d83cc019SAndroid Build Coastguard Worker 202*d83cc019SAndroid Build Coastguard Worker /* Indicates that a Short Video Descriptor is native */ 203*d83cc019SAndroid Build Coastguard Worker #define CEA_SVD_NATIVE (1 << 7) 204*d83cc019SAndroid Build Coastguard Worker 205*d83cc019SAndroid Build Coastguard Worker enum hdmi_vsdb_flags1 { 206*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_DVI_DUAL = 1 << 0, 207*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_DC_Y444 = 1 << 3, /* supports YCbCr 4:4:4 */ 208*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_DC_30BIT = 1 << 4, /* 30 bits per pixel */ 209*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_DC_36BIT = 1 << 5, /* 36 bits per pixel */ 210*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_DC_48BIT = 1 << 6, /* 48 bits per pixel */ 211*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_SUPPORTS_AI = 1 << 7, /* supports ACP, ISRC1 or ISRC2 packets */ 212*d83cc019SAndroid Build Coastguard Worker }; 213*d83cc019SAndroid Build Coastguard Worker 214*d83cc019SAndroid Build Coastguard Worker enum hdmi_vsdb_flags2 { 215*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_CNC_GRAPHICS = 1 << 0, 216*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_CNC_PHOTO = 1 << 1, 217*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_CNC_CINEMA = 1 << 2, 218*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_CNC_GAME = 1 << 3, 219*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_VIDEO_PRESENT = 1 << 5, 220*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_INTERLACED_LATENCY_PRESENT = 1 << 6, 221*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_LATENCY_PRESENT = 1 << 7, 222*d83cc019SAndroid Build Coastguard Worker }; 223*d83cc019SAndroid Build Coastguard Worker 224*d83cc019SAndroid Build Coastguard Worker enum hdmi_vsdb_video_flags { 225*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_VIDEO_3D_STRUCT_PRESENT = 0b01 << 5, 226*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_VIDEO_3D_STRUCT_MASK_PRESENT = 0b10 << 5, 227*d83cc019SAndroid Build Coastguard Worker HDMI_VSDB_VIDEO_3D_PRESENT = 1 << 7, 228*d83cc019SAndroid Build Coastguard Worker }; 229*d83cc019SAndroid Build Coastguard Worker 230*d83cc019SAndroid Build Coastguard Worker /* HDMI's IEEE Registration Identifier */ 231*d83cc019SAndroid Build Coastguard Worker extern const uint8_t hdmi_ieee_oui[3]; 232*d83cc019SAndroid Build Coastguard Worker 233*d83cc019SAndroid Build Coastguard Worker /* HDMI Vendor-Specific Data Block (defined in the HDMI spec) */ 234*d83cc019SAndroid Build Coastguard Worker struct hdmi_vsdb { 235*d83cc019SAndroid Build Coastguard Worker uint8_t src_phy_addr[2]; /* source physical address */ 236*d83cc019SAndroid Build Coastguard Worker 237*d83cc019SAndroid Build Coastguard Worker /* Extension fields */ 238*d83cc019SAndroid Build Coastguard Worker uint8_t flags1; /* enum hdmi_vsdb_flags1 */ 239*d83cc019SAndroid Build Coastguard Worker uint8_t max_tdms_clock; /* multiply by 5MHz */ 240*d83cc019SAndroid Build Coastguard Worker uint8_t flags2; /* enum hdmi_vsdb_flags2 */ 241*d83cc019SAndroid Build Coastguard Worker uint8_t data[]; /* latency, misc, VIC, 3D */ 242*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 243*d83cc019SAndroid Build Coastguard Worker 244*d83cc019SAndroid Build Coastguard Worker #define HDMI_VSDB_MIN_SIZE 2 /* just the source physical address */ 245*d83cc019SAndroid Build Coastguard Worker #define HDMI_VSDB_MAX_SIZE 28 246*d83cc019SAndroid Build Coastguard Worker #define CEA_VSDB_HEADER_SIZE 3 /* IEEE OUI */ 247*d83cc019SAndroid Build Coastguard Worker #define CEA_VSDB_HDMI_MIN_SIZE (CEA_VSDB_HEADER_SIZE + HDMI_VSDB_MIN_SIZE) 248*d83cc019SAndroid Build Coastguard Worker #define CEA_VSDB_HDMI_MAX_SIZE (CEA_VSDB_HEADER_SIZE + HDMI_VSDB_MAX_SIZE) 249*d83cc019SAndroid Build Coastguard Worker 250*d83cc019SAndroid Build Coastguard Worker /* Vendor-Specific Data Block */ 251*d83cc019SAndroid Build Coastguard Worker struct cea_vsdb { 252*d83cc019SAndroid Build Coastguard Worker uint8_t ieee_oui[3]; /* 24-bit IEEE Registration Identifier, LSB */ 253*d83cc019SAndroid Build Coastguard Worker union { 254*d83cc019SAndroid Build Coastguard Worker struct hdmi_vsdb hdmi; 255*d83cc019SAndroid Build Coastguard Worker } data; 256*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 257*d83cc019SAndroid Build Coastguard Worker 258*d83cc019SAndroid Build Coastguard Worker enum cea_speaker_alloc_item { 259*d83cc019SAndroid Build Coastguard Worker CEA_SPEAKER_FRONT_LEFT_RIGHT = 1 << 0, 260*d83cc019SAndroid Build Coastguard Worker CEA_SPEAKER_LFE = 1 << 1, 261*d83cc019SAndroid Build Coastguard Worker CEA_SPEAKER_FRONT_CENTER = 1 << 2, 262*d83cc019SAndroid Build Coastguard Worker CEA_SPEAKER_REAR_LEFT_RIGHT = 1 << 3, 263*d83cc019SAndroid Build Coastguard Worker CEA_SPEAKER_REAR_CENTER = 1 << 4, 264*d83cc019SAndroid Build Coastguard Worker CEA_SPEAKER_FRONT_LEFT_RIGHT_CENTER = 1 << 5, 265*d83cc019SAndroid Build Coastguard Worker CEA_SPEAKER_REAR_LEFT_RIGHT_CENTER = 1 << 6, 266*d83cc019SAndroid Build Coastguard Worker }; 267*d83cc019SAndroid Build Coastguard Worker 268*d83cc019SAndroid Build Coastguard Worker struct cea_speaker_alloc { 269*d83cc019SAndroid Build Coastguard Worker uint8_t speakers; /* enum cea_speaker_alloc_item */ 270*d83cc019SAndroid Build Coastguard Worker uint8_t reserved[2]; 271*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 272*d83cc019SAndroid Build Coastguard Worker 273*d83cc019SAndroid Build Coastguard Worker enum edid_cea_data_type { 274*d83cc019SAndroid Build Coastguard Worker EDID_CEA_DATA_AUDIO = 1, 275*d83cc019SAndroid Build Coastguard Worker EDID_CEA_DATA_VIDEO = 2, 276*d83cc019SAndroid Build Coastguard Worker EDID_CEA_DATA_VENDOR_SPECIFIC = 3, 277*d83cc019SAndroid Build Coastguard Worker EDID_CEA_DATA_SPEAKER_ALLOC = 4, 278*d83cc019SAndroid Build Coastguard Worker }; 279*d83cc019SAndroid Build Coastguard Worker 280*d83cc019SAndroid Build Coastguard Worker struct edid_cea_data_block { 281*d83cc019SAndroid Build Coastguard Worker uint8_t type_len; /* type is from enum edid_cea_data_type */ 282*d83cc019SAndroid Build Coastguard Worker union { 283*d83cc019SAndroid Build Coastguard Worker struct cea_sad sads[0]; 284*d83cc019SAndroid Build Coastguard Worker uint8_t svds[0]; /* Short Video Descriptors */ 285*d83cc019SAndroid Build Coastguard Worker struct cea_vsdb vsdbs[0]; 286*d83cc019SAndroid Build Coastguard Worker struct cea_speaker_alloc speakers[0]; 287*d83cc019SAndroid Build Coastguard Worker } data; 288*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 289*d83cc019SAndroid Build Coastguard Worker 290*d83cc019SAndroid Build Coastguard Worker enum edid_cea_flag { 291*d83cc019SAndroid Build Coastguard Worker EDID_CEA_YCBCR422 = 1 << 4, 292*d83cc019SAndroid Build Coastguard Worker EDID_CEA_YCBCR444 = 1 << 5, 293*d83cc019SAndroid Build Coastguard Worker EDID_CEA_BASIC_AUDIO = 1 << 6, 294*d83cc019SAndroid Build Coastguard Worker EDID_CEA_UNDERSCAN = 1 << 7, 295*d83cc019SAndroid Build Coastguard Worker }; 296*d83cc019SAndroid Build Coastguard Worker 297*d83cc019SAndroid Build Coastguard Worker struct edid_cea { 298*d83cc019SAndroid Build Coastguard Worker uint8_t revision; 299*d83cc019SAndroid Build Coastguard Worker uint8_t dtd_start; 300*d83cc019SAndroid Build Coastguard Worker uint8_t misc; 301*d83cc019SAndroid Build Coastguard Worker char data[123]; /* DBC & DTD collection, padded with zeros */ 302*d83cc019SAndroid Build Coastguard Worker uint8_t checksum; 303*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 304*d83cc019SAndroid Build Coastguard Worker 305*d83cc019SAndroid Build Coastguard Worker enum edid_ext_tag { 306*d83cc019SAndroid Build Coastguard Worker EDID_EXT_CEA = 0x02, 307*d83cc019SAndroid Build Coastguard Worker }; 308*d83cc019SAndroid Build Coastguard Worker 309*d83cc019SAndroid Build Coastguard Worker struct edid_ext { 310*d83cc019SAndroid Build Coastguard Worker uint8_t tag; /* enum edid_ext_tag */ 311*d83cc019SAndroid Build Coastguard Worker union { 312*d83cc019SAndroid Build Coastguard Worker struct edid_cea cea; 313*d83cc019SAndroid Build Coastguard Worker } data; 314*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 315*d83cc019SAndroid Build Coastguard Worker 316*d83cc019SAndroid Build Coastguard Worker struct edid { 317*d83cc019SAndroid Build Coastguard Worker char header[8]; 318*d83cc019SAndroid Build Coastguard Worker /* Vendor & product info */ 319*d83cc019SAndroid Build Coastguard Worker uint8_t mfg_id[2]; 320*d83cc019SAndroid Build Coastguard Worker uint8_t prod_code[2]; 321*d83cc019SAndroid Build Coastguard Worker uint8_t serial[4]; 322*d83cc019SAndroid Build Coastguard Worker uint8_t mfg_week; 323*d83cc019SAndroid Build Coastguard Worker uint8_t mfg_year; 324*d83cc019SAndroid Build Coastguard Worker /* EDID version */ 325*d83cc019SAndroid Build Coastguard Worker uint8_t version; 326*d83cc019SAndroid Build Coastguard Worker uint8_t revision; 327*d83cc019SAndroid Build Coastguard Worker /* Display info: */ 328*d83cc019SAndroid Build Coastguard Worker uint8_t input; 329*d83cc019SAndroid Build Coastguard Worker uint8_t width_cm; 330*d83cc019SAndroid Build Coastguard Worker uint8_t height_cm; 331*d83cc019SAndroid Build Coastguard Worker uint8_t gamma; 332*d83cc019SAndroid Build Coastguard Worker uint8_t features; 333*d83cc019SAndroid Build Coastguard Worker /* Color characteristics */ 334*d83cc019SAndroid Build Coastguard Worker uint8_t red_green_lo; 335*d83cc019SAndroid Build Coastguard Worker uint8_t black_white_lo; 336*d83cc019SAndroid Build Coastguard Worker uint8_t red_x; 337*d83cc019SAndroid Build Coastguard Worker uint8_t red_y; 338*d83cc019SAndroid Build Coastguard Worker uint8_t green_x; 339*d83cc019SAndroid Build Coastguard Worker uint8_t green_y; 340*d83cc019SAndroid Build Coastguard Worker uint8_t blue_x; 341*d83cc019SAndroid Build Coastguard Worker uint8_t blue_y; 342*d83cc019SAndroid Build Coastguard Worker uint8_t white_x; 343*d83cc019SAndroid Build Coastguard Worker uint8_t white_y; 344*d83cc019SAndroid Build Coastguard Worker /* Est. timings and mfg rsvd timings*/ 345*d83cc019SAndroid Build Coastguard Worker struct est_timings established_timings; 346*d83cc019SAndroid Build Coastguard Worker /* Standard timings 1-8*/ 347*d83cc019SAndroid Build Coastguard Worker struct std_timing standard_timings[STD_TIMINGS_LEN]; 348*d83cc019SAndroid Build Coastguard Worker /* Detailing timings 1-4 */ 349*d83cc019SAndroid Build Coastguard Worker struct detailed_timing detailed_timings[DETAILED_TIMINGS_LEN]; 350*d83cc019SAndroid Build Coastguard Worker /* Number of 128 byte ext. blocks */ 351*d83cc019SAndroid Build Coastguard Worker uint8_t extensions_len; 352*d83cc019SAndroid Build Coastguard Worker uint8_t checksum; 353*d83cc019SAndroid Build Coastguard Worker struct edid_ext extensions[]; 354*d83cc019SAndroid Build Coastguard Worker } __attribute__((packed)); 355*d83cc019SAndroid Build Coastguard Worker 356*d83cc019SAndroid Build Coastguard Worker void edid_init(struct edid *edid); 357*d83cc019SAndroid Build Coastguard Worker void edid_init_with_mode(struct edid *edid, drmModeModeInfo *mode); 358*d83cc019SAndroid Build Coastguard Worker void edid_update_checksum(struct edid *edid); 359*d83cc019SAndroid Build Coastguard Worker size_t edid_get_size(const struct edid *edid); 360*d83cc019SAndroid Build Coastguard Worker void edid_get_mfg(const struct edid *edid, char out[static 3]); 361*d83cc019SAndroid Build Coastguard Worker void detailed_timing_set_mode(struct detailed_timing *dt, drmModeModeInfo *mode, 362*d83cc019SAndroid Build Coastguard Worker int width_mm, int height_mm); 363*d83cc019SAndroid Build Coastguard Worker void detailed_timing_set_monitor_range_mode(struct detailed_timing *dt, 364*d83cc019SAndroid Build Coastguard Worker drmModeModeInfo *mode); 365*d83cc019SAndroid Build Coastguard Worker void detailed_timing_set_string(struct detailed_timing *dt, 366*d83cc019SAndroid Build Coastguard Worker enum detailed_non_pixel_type type, 367*d83cc019SAndroid Build Coastguard Worker const char *str); 368*d83cc019SAndroid Build Coastguard Worker 369*d83cc019SAndroid Build Coastguard Worker void cea_sad_init_pcm(struct cea_sad *sad, int channels, 370*d83cc019SAndroid Build Coastguard Worker uint8_t sampling_rates, uint8_t sample_sizes); 371*d83cc019SAndroid Build Coastguard Worker const struct cea_vsdb *cea_vsdb_get_hdmi_default(size_t *size); 372*d83cc019SAndroid Build Coastguard Worker size_t edid_cea_data_block_set_sad(struct edid_cea_data_block *block, 373*d83cc019SAndroid Build Coastguard Worker const struct cea_sad *sads, size_t sads_len); 374*d83cc019SAndroid Build Coastguard Worker size_t edid_cea_data_block_set_svd(struct edid_cea_data_block *block, 375*d83cc019SAndroid Build Coastguard Worker const uint8_t *svds, size_t svds_len); 376*d83cc019SAndroid Build Coastguard Worker size_t edid_cea_data_block_set_vsdb(struct edid_cea_data_block *block, 377*d83cc019SAndroid Build Coastguard Worker const struct cea_vsdb *vsdb, size_t vsdb_size); 378*d83cc019SAndroid Build Coastguard Worker size_t edid_cea_data_block_set_hdmi_vsdb(struct edid_cea_data_block *block, 379*d83cc019SAndroid Build Coastguard Worker const struct hdmi_vsdb *hdmi, 380*d83cc019SAndroid Build Coastguard Worker size_t hdmi_size); 381*d83cc019SAndroid Build Coastguard Worker size_t edid_cea_data_block_set_speaker_alloc(struct edid_cea_data_block *block, 382*d83cc019SAndroid Build Coastguard Worker const struct cea_speaker_alloc *speakers); 383*d83cc019SAndroid Build Coastguard Worker void edid_ext_set_cea(struct edid_ext *ext, size_t data_blocks_size, 384*d83cc019SAndroid Build Coastguard Worker uint8_t num_native_dtds, uint8_t flags); 385*d83cc019SAndroid Build Coastguard Worker 386*d83cc019SAndroid Build Coastguard Worker #endif 387