xref: /aosp_15_r20/external/igt-gpu-tools/lib/igt_edid.h (revision d83cc019efdc2edc6c4b16e9034a3ceb8d35d77c)
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