Blame view

include/drm/drm_edid.h 7.17 KB
f453ba046   Dave Airlie   DRM: add mode set...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
  /*
   * Copyright © 2007-2008 Intel Corporation
   *   Jesse Barnes <jesse.barnes@intel.com>
   *
   * Permission is hereby granted, free of charge, to any person obtaining a
   * copy of this software and associated documentation files (the "Software"),
   * to deal in the Software without restriction, including without limitation
   * the rights to use, copy, modify, merge, publish, distribute, sublicense,
   * and/or sell copies of the Software, and to permit persons to whom the
   * Software is furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be included in
   * all copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
   * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
   * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
   * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
   * OTHER DEALINGS IN THE SOFTWARE.
   */
  #ifndef __DRM_EDID_H__
  #define __DRM_EDID_H__
  
  #include <linux/types.h>
  
  #define EDID_LENGTH 128
  #define DDC_ADDR 0x50
4d76a2213   Adam Jackson   drm/edid: Add det...
30
31
32
33
34
  #define CEA_EXT	    0x02
  #define VTB_EXT	    0x10
  #define DI_EXT	    0x40
  #define LS_EXT	    0x50
  #define MI_EXT	    0x60
f453ba046   Dave Airlie   DRM: add mode set...
35
36
37
38
39
  struct est_timings {
  	u8 t1;
  	u8 t2;
  	u8 mfg_rsvd;
  } __attribute__((packed));
0454beab0   Michel Dänzer   drm: EDID endiann...
40
  /* 00=16:10, 01=4:3, 10=5:4, 11=16:9 */
e14cbee40   Michel Dänzer   drm: Fix shifts w...
41
  #define EDID_TIMING_ASPECT_SHIFT 6
0454beab0   Michel Dänzer   drm: EDID endiann...
42
43
44
  #define EDID_TIMING_ASPECT_MASK  (0x3 << EDID_TIMING_ASPECT_SHIFT)
  
  /* need to add 60 */
e14cbee40   Michel Dänzer   drm: Fix shifts w...
45
  #define EDID_TIMING_VFREQ_SHIFT  0
0454beab0   Michel Dänzer   drm: EDID endiann...
46
  #define EDID_TIMING_VFREQ_MASK   (0x3f << EDID_TIMING_VFREQ_SHIFT)
f453ba046   Dave Airlie   DRM: add mode set...
47
48
  struct std_timing {
  	u8 hsize; /* need to multiply by 8 then add 248 */
0454beab0   Michel Dänzer   drm: EDID endiann...
49
  	u8 vfreq_aspect;
f453ba046   Dave Airlie   DRM: add mode set...
50
  } __attribute__((packed));
e14cbee40   Michel Dänzer   drm: Fix shifts w...
51
52
  #define DRM_EDID_PT_HSYNC_POSITIVE (1 << 1)
  #define DRM_EDID_PT_VSYNC_POSITIVE (1 << 2)
0454beab0   Michel Dänzer   drm: EDID endiann...
53
  #define DRM_EDID_PT_SEPARATE_SYNC  (3 << 3)
e14cbee40   Michel Dänzer   drm: Fix shifts w...
54
55
  #define DRM_EDID_PT_STEREO         (1 << 5)
  #define DRM_EDID_PT_INTERLACED     (1 << 7)
0454beab0   Michel Dänzer   drm: EDID endiann...
56

f453ba046   Dave Airlie   DRM: add mode set...
57
58
59
60
  /* If detailed data is pixel timing */
  struct detailed_pixel_timing {
  	u8 hactive_lo;
  	u8 hblank_lo;
0454beab0   Michel Dänzer   drm: EDID endiann...
61
  	u8 hactive_hblank_hi;
f453ba046   Dave Airlie   DRM: add mode set...
62
63
  	u8 vactive_lo;
  	u8 vblank_lo;
0454beab0   Michel Dänzer   drm: EDID endiann...
64
  	u8 vactive_vblank_hi;
f453ba046   Dave Airlie   DRM: add mode set...
65
66
  	u8 hsync_offset_lo;
  	u8 hsync_pulse_width_lo;
0454beab0   Michel Dänzer   drm: EDID endiann...
67
68
  	u8 vsync_offset_pulse_width_lo;
  	u8 hsync_vsync_offset_pulse_width_hi;
f453ba046   Dave Airlie   DRM: add mode set...
69
70
  	u8 width_mm_lo;
  	u8 height_mm_lo;
0454beab0   Michel Dänzer   drm: EDID endiann...
71
  	u8 width_height_mm_hi;
f453ba046   Dave Airlie   DRM: add mode set...
72
73
  	u8 hborder;
  	u8 vborder;
0454beab0   Michel Dänzer   drm: EDID endiann...
74
  	u8 misc;
f453ba046   Dave Airlie   DRM: add mode set...
75
76
77
78
79
80
81
82
83
84
85
86
87
  } __attribute__((packed));
  
  /* If it's not pixel timing, it'll be one of the below */
  struct detailed_data_string {
  	u8 str[13];
  } __attribute__((packed));
  
  struct detailed_data_monitor_range {
  	u8 min_vfreq;
  	u8 max_vfreq;
  	u8 min_hfreq_khz;
  	u8 max_hfreq_khz;
  	u8 pixel_clock_mhz; /* need to multiply by 10 */
0454beab0   Michel Dänzer   drm: EDID endiann...
88
  	__le16 sec_gtf_toggle; /* A000=use above, 20=use below */
f453ba046   Dave Airlie   DRM: add mode set...
89
90
  	u8 hfreq_start_khz; /* need to multiply by 2 */
  	u8 c; /* need to divide by 2 */
0454beab0   Michel Dänzer   drm: EDID endiann...
91
  	__le16 m;
f453ba046   Dave Airlie   DRM: add mode set...
92
93
94
95
96
  	u8 k;
  	u8 j; /* need to divide by 2 */
  } __attribute__((packed));
  
  struct detailed_data_wpindex {
e14cbee40   Michel Dänzer   drm: Fix shifts w...
97
  	u8 white_yx_lo; /* Lower 2 bits each */
f453ba046   Dave Airlie   DRM: add mode set...
98
99
100
101
102
103
104
105
106
107
108
  	u8 white_x_hi;
  	u8 white_y_hi;
  	u8 gamma; /* need to divide by 100 then add 1 */
  } __attribute__((packed));
  
  struct detailed_data_color_point {
  	u8 windex1;
  	u8 wpindex1[3];
  	u8 windex2;
  	u8 wpindex2[3];
  } __attribute__((packed));
9340d8cfe   Adam Jackson   drm/edid: Decode ...
109
110
111
  struct cvt_timing {
  	u8 code[3];
  } __attribute__((packed));
f453ba046   Dave Airlie   DRM: add mode set...
112
113
114
115
116
117
118
119
120
121
  struct detailed_non_pixel {
  	u8 pad1;
  	u8 type; /* ff=serial, fe=string, fd=monitor range, fc=monitor name
  		    fb=color point data, fa=standard timing data,
  		    f9=undefined, f8=mfg. reserved */
  	u8 pad2;
  	union {
  		struct detailed_data_string str;
  		struct detailed_data_monitor_range range;
  		struct detailed_data_wpindex color;
96525a2f7   Dan Carpenter   drm_edid: There s...
122
  		struct std_timing timings[6];
9340d8cfe   Adam Jackson   drm/edid: Decode ...
123
  		struct cvt_timing cvt[4];
f453ba046   Dave Airlie   DRM: add mode set...
124
125
  	} data;
  } __attribute__((packed));
2dbdc52c8   Adam Jackson   drm/edid: Add new...
126
127
128
  #define EDID_DETAIL_EST_TIMINGS 0xf7
  #define EDID_DETAIL_CVT_3BYTE 0xf8
  #define EDID_DETAIL_COLOR_MGMT_DATA 0xf9
f453ba046   Dave Airlie   DRM: add mode set...
129
130
131
132
133
134
135
136
  #define EDID_DETAIL_STD_MODES 0xfa
  #define EDID_DETAIL_MONITOR_CPDATA 0xfb
  #define EDID_DETAIL_MONITOR_NAME 0xfc
  #define EDID_DETAIL_MONITOR_RANGE 0xfd
  #define EDID_DETAIL_MONITOR_STRING 0xfe
  #define EDID_DETAIL_MONITOR_SERIAL 0xff
  
  struct detailed_timing {
0454beab0   Michel Dänzer   drm: EDID endiann...
137
  	__le16 pixel_clock; /* need to multiply by 10 KHz */
f453ba046   Dave Airlie   DRM: add mode set...
138
139
140
141
142
  	union {
  		struct detailed_pixel_timing pixel_data;
  		struct detailed_non_pixel other_data;
  	} data;
  } __attribute__((packed));
e14cbee40   Michel Dänzer   drm: Fix shifts w...
143
144
145
  #define DRM_EDID_INPUT_SERRATION_VSYNC (1 << 0)
  #define DRM_EDID_INPUT_SYNC_ON_GREEN   (1 << 1)
  #define DRM_EDID_INPUT_COMPOSITE_SYNC  (1 << 2)
0454beab0   Michel Dänzer   drm: EDID endiann...
146
  #define DRM_EDID_INPUT_SEPARATE_SYNCS  (1 << 3)
e14cbee40   Michel Dänzer   drm: Fix shifts w...
147
148
  #define DRM_EDID_INPUT_BLANK_TO_BLACK  (1 << 4)
  #define DRM_EDID_INPUT_VIDEO_LEVEL     (3 << 5)
3b11228b5   Jesse Barnes   drm: add bit dept...
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
  #define DRM_EDID_INPUT_DIGITAL         (1 << 7)
  #define DRM_EDID_DIGITAL_DEPTH_MASK    (7 << 4)
  #define DRM_EDID_DIGITAL_DEPTH_UNDEF   (0 << 4)
  #define DRM_EDID_DIGITAL_DEPTH_6       (1 << 4)
  #define DRM_EDID_DIGITAL_DEPTH_8       (2 << 4)
  #define DRM_EDID_DIGITAL_DEPTH_10      (3 << 4)
  #define DRM_EDID_DIGITAL_DEPTH_12      (4 << 4)
  #define DRM_EDID_DIGITAL_DEPTH_14      (5 << 4)
  #define DRM_EDID_DIGITAL_DEPTH_16      (6 << 4)
  #define DRM_EDID_DIGITAL_DEPTH_RSVD    (7 << 4)
  #define DRM_EDID_DIGITAL_TYPE_UNDEF    (0)
  #define DRM_EDID_DIGITAL_TYPE_DVI      (1)
  #define DRM_EDID_DIGITAL_TYPE_HDMI_A   (2)
  #define DRM_EDID_DIGITAL_TYPE_HDMI_B   (3)
  #define DRM_EDID_DIGITAL_TYPE_MDDI     (4)
  #define DRM_EDID_DIGITAL_TYPE_DP       (5)
0454beab0   Michel Dänzer   drm: EDID endiann...
165

e14cbee40   Michel Dänzer   drm: Fix shifts w...
166
167
168
  #define DRM_EDID_FEATURE_DEFAULT_GTF      (1 << 0)
  #define DRM_EDID_FEATURE_PREFERRED_TIMING (1 << 1)
  #define DRM_EDID_FEATURE_STANDARD_COLOR   (1 << 2)
da05a5a71   Jesse Barnes   drm: parse color ...
169
  /* If analog */
0454beab0   Michel Dänzer   drm: EDID endiann...
170
  #define DRM_EDID_FEATURE_DISPLAY_TYPE     (3 << 3) /* 00=mono, 01=rgb, 10=non-rgb, 11=unknown */
da05a5a71   Jesse Barnes   drm: parse color ...
171
172
173
174
175
176
  /* If digital */
  #define DRM_EDID_FEATURE_COLOR_MASK	  (3 << 3)
  #define DRM_EDID_FEATURE_RGB		  (0 << 3)
  #define DRM_EDID_FEATURE_RGB_YCRCB444	  (1 << 3)
  #define DRM_EDID_FEATURE_RGB_YCRCB422	  (2 << 3)
  #define DRM_EDID_FEATURE_RGB_YCRCB	  (3 << 3) /* both 4:4:4 and 4:2:2 */
e14cbee40   Michel Dänzer   drm: Fix shifts w...
177
178
179
  #define DRM_EDID_FEATURE_PM_ACTIVE_OFF    (1 << 5)
  #define DRM_EDID_FEATURE_PM_SUSPEND       (1 << 6)
  #define DRM_EDID_FEATURE_PM_STANDBY       (1 << 7)
0454beab0   Michel Dänzer   drm: EDID endiann...
180

f453ba046   Dave Airlie   DRM: add mode set...
181
182
183
184
185
186
187
188
189
190
191
192
  struct edid {
  	u8 header[8];
  	/* Vendor & product info */
  	u8 mfg_id[2];
  	u8 prod_code[2];
  	u32 serial; /* FIXME: byte order */
  	u8 mfg_week;
  	u8 mfg_year;
  	/* EDID version */
  	u8 version;
  	u8 revision;
  	/* Display info: */
0454beab0   Michel Dänzer   drm: EDID endiann...
193
  	u8 input;
f453ba046   Dave Airlie   DRM: add mode set...
194
195
196
  	u8 width_cm;
  	u8 height_cm;
  	u8 gamma;
0454beab0   Michel Dänzer   drm: EDID endiann...
197
  	u8 features;
f453ba046   Dave Airlie   DRM: add mode set...
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
  	/* Color characteristics */
  	u8 red_green_lo;
  	u8 black_white_lo;
  	u8 red_x;
  	u8 red_y;
  	u8 green_x;
  	u8 green_y;
  	u8 blue_x;
  	u8 blue_y;
  	u8 white_x;
  	u8 white_y;
  	/* Est. timings and mfg rsvd timings*/
  	struct est_timings established_timings;
  	/* Standard timings 1-8*/
  	struct std_timing standard_timings[8];
  	/* Detailing timings 1-4 */
  	struct detailed_timing detailed_timings[4];
  	/* Number of 128 byte ext. blocks */
  	u8 extensions;
  	/* Checksum */
  	u8 checksum;
  } __attribute__((packed));
f453ba046   Dave Airlie   DRM: add mode set...
220
  #define EDID_PRODUCT_ID(e) ((e)->prod_code[0] | ((e)->prod_code[1] << 8))
76adaa34d   Wu Fengguang   drm: support rout...
221
222
223
224
225
226
227
228
  struct drm_encoder;
  struct drm_connector;
  struct drm_display_mode;
  void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid);
  int drm_av_sync_delay(struct drm_connector *connector,
  		      struct drm_display_mode *mode);
  struct drm_connector *drm_select_eld(struct drm_encoder *encoder,
  				     struct drm_display_mode *mode);
f453ba046   Dave Airlie   DRM: add mode set...
229
  #endif /* __DRM_EDID_H__ */