Branch data Line data Source code
1 : : /*
2 : : * Copyright © 2008 Keith Packard
3 : : *
4 : : * Permission to use, copy, modify, distribute, and sell this software and its
5 : : * documentation for any purpose is hereby granted without fee, provided that
6 : : * the above copyright notice appear in all copies and that both that copyright
7 : : * notice and this permission notice appear in supporting documentation, and
8 : : * that the name of the copyright holders not be used in advertising or
9 : : * publicity pertaining to distribution of the software without specific,
10 : : * written prior permission. The copyright holders make no representations
11 : : * about the suitability of this software for any purpose. It is provided "as
12 : : * is" without express or implied warranty.
13 : : *
14 : : * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 : : * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 : : * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 : : * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 : : * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 : : * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
20 : : * OF THIS SOFTWARE.
21 : : */
22 : :
23 : : #ifndef _DRM_DP_HELPER_H_
24 : : #define _DRM_DP_HELPER_H_
25 : :
26 : : #include <linux/delay.h>
27 : : #include <linux/i2c.h>
28 : : #include <linux/types.h>
29 : :
30 : : /*
31 : : * Unless otherwise noted, all values are from the DP 1.1a spec. Note that
32 : : * DP and DPCD versions are independent. Differences from 1.0 are not noted,
33 : : * 1.0 devices basically don't exist in the wild.
34 : : *
35 : : * Abbreviations, in chronological order:
36 : : *
37 : : * eDP: Embedded DisplayPort version 1
38 : : * DPI: DisplayPort Interoperability Guideline v1.1a
39 : : * 1.2: DisplayPort 1.2
40 : : * MST: Multistream Transport - part of DP 1.2a
41 : : *
42 : : * 1.2 formally includes both eDP and DPI definitions.
43 : : */
44 : :
45 : : /* MSA (Main Stream Attribute) MISC bits (as MISC1<<8|MISC0) */
46 : : #define DP_MSA_MISC_SYNC_CLOCK (1 << 0)
47 : : #define DP_MSA_MISC_INTERLACE_VTOTAL_EVEN (1 << 8)
48 : : #define DP_MSA_MISC_STEREO_NO_3D (0 << 9)
49 : : #define DP_MSA_MISC_STEREO_PROG_RIGHT_EYE (1 << 9)
50 : : #define DP_MSA_MISC_STEREO_PROG_LEFT_EYE (3 << 9)
51 : : /* bits per component for non-RAW */
52 : : #define DP_MSA_MISC_6_BPC (0 << 5)
53 : : #define DP_MSA_MISC_8_BPC (1 << 5)
54 : : #define DP_MSA_MISC_10_BPC (2 << 5)
55 : : #define DP_MSA_MISC_12_BPC (3 << 5)
56 : : #define DP_MSA_MISC_16_BPC (4 << 5)
57 : : /* bits per component for RAW */
58 : : #define DP_MSA_MISC_RAW_6_BPC (1 << 5)
59 : : #define DP_MSA_MISC_RAW_7_BPC (2 << 5)
60 : : #define DP_MSA_MISC_RAW_8_BPC (3 << 5)
61 : : #define DP_MSA_MISC_RAW_10_BPC (4 << 5)
62 : : #define DP_MSA_MISC_RAW_12_BPC (5 << 5)
63 : : #define DP_MSA_MISC_RAW_14_BPC (6 << 5)
64 : : #define DP_MSA_MISC_RAW_16_BPC (7 << 5)
65 : : /* pixel encoding/colorimetry format */
66 : : #define _DP_MSA_MISC_COLOR(misc1_7, misc0_21, misc0_3, misc0_4) \
67 : : ((misc1_7) << 15 | (misc0_4) << 4 | (misc0_3) << 3 | ((misc0_21) << 1))
68 : : #define DP_MSA_MISC_COLOR_RGB _DP_MSA_MISC_COLOR(0, 0, 0, 0)
69 : : #define DP_MSA_MISC_COLOR_CEA_RGB _DP_MSA_MISC_COLOR(0, 0, 1, 0)
70 : : #define DP_MSA_MISC_COLOR_RGB_WIDE_FIXED _DP_MSA_MISC_COLOR(0, 3, 0, 0)
71 : : #define DP_MSA_MISC_COLOR_RGB_WIDE_FLOAT _DP_MSA_MISC_COLOR(0, 3, 0, 1)
72 : : #define DP_MSA_MISC_COLOR_Y_ONLY _DP_MSA_MISC_COLOR(1, 0, 0, 0)
73 : : #define DP_MSA_MISC_COLOR_RAW _DP_MSA_MISC_COLOR(1, 1, 0, 0)
74 : : #define DP_MSA_MISC_COLOR_YCBCR_422_BT601 _DP_MSA_MISC_COLOR(0, 1, 1, 0)
75 : : #define DP_MSA_MISC_COLOR_YCBCR_422_BT709 _DP_MSA_MISC_COLOR(0, 1, 1, 1)
76 : : #define DP_MSA_MISC_COLOR_YCBCR_444_BT601 _DP_MSA_MISC_COLOR(0, 2, 1, 0)
77 : : #define DP_MSA_MISC_COLOR_YCBCR_444_BT709 _DP_MSA_MISC_COLOR(0, 2, 1, 1)
78 : : #define DP_MSA_MISC_COLOR_XVYCC_422_BT601 _DP_MSA_MISC_COLOR(0, 1, 0, 0)
79 : : #define DP_MSA_MISC_COLOR_XVYCC_422_BT709 _DP_MSA_MISC_COLOR(0, 1, 0, 1)
80 : : #define DP_MSA_MISC_COLOR_XVYCC_444_BT601 _DP_MSA_MISC_COLOR(0, 2, 0, 0)
81 : : #define DP_MSA_MISC_COLOR_XVYCC_444_BT709 _DP_MSA_MISC_COLOR(0, 2, 0, 1)
82 : : #define DP_MSA_MISC_COLOR_OPRGB _DP_MSA_MISC_COLOR(0, 0, 1, 1)
83 : : #define DP_MSA_MISC_COLOR_DCI_P3 _DP_MSA_MISC_COLOR(0, 3, 1, 0)
84 : : #define DP_MSA_MISC_COLOR_COLOR_PROFILE _DP_MSA_MISC_COLOR(0, 3, 1, 1)
85 : : #define DP_MSA_MISC_COLOR_VSC_SDP (1 << 14)
86 : :
87 : : #define DP_AUX_MAX_PAYLOAD_BYTES 16
88 : :
89 : : #define DP_AUX_I2C_WRITE 0x0
90 : : #define DP_AUX_I2C_READ 0x1
91 : : #define DP_AUX_I2C_WRITE_STATUS_UPDATE 0x2
92 : : #define DP_AUX_I2C_MOT 0x4
93 : : #define DP_AUX_NATIVE_WRITE 0x8
94 : : #define DP_AUX_NATIVE_READ 0x9
95 : :
96 : : #define DP_AUX_NATIVE_REPLY_ACK (0x0 << 0)
97 : : #define DP_AUX_NATIVE_REPLY_NACK (0x1 << 0)
98 : : #define DP_AUX_NATIVE_REPLY_DEFER (0x2 << 0)
99 : : #define DP_AUX_NATIVE_REPLY_MASK (0x3 << 0)
100 : :
101 : : #define DP_AUX_I2C_REPLY_ACK (0x0 << 2)
102 : : #define DP_AUX_I2C_REPLY_NACK (0x1 << 2)
103 : : #define DP_AUX_I2C_REPLY_DEFER (0x2 << 2)
104 : : #define DP_AUX_I2C_REPLY_MASK (0x3 << 2)
105 : :
106 : : /* AUX CH addresses */
107 : : /* DPCD */
108 : : #define DP_DPCD_REV 0x000
109 : : # define DP_DPCD_REV_10 0x10
110 : : # define DP_DPCD_REV_11 0x11
111 : : # define DP_DPCD_REV_12 0x12
112 : : # define DP_DPCD_REV_13 0x13
113 : : # define DP_DPCD_REV_14 0x14
114 : :
115 : : #define DP_MAX_LINK_RATE 0x001
116 : :
117 : : #define DP_MAX_LANE_COUNT 0x002
118 : : # define DP_MAX_LANE_COUNT_MASK 0x1f
119 : : # define DP_TPS3_SUPPORTED (1 << 6) /* 1.2 */
120 : : # define DP_ENHANCED_FRAME_CAP (1 << 7)
121 : :
122 : : #define DP_MAX_DOWNSPREAD 0x003
123 : : # define DP_MAX_DOWNSPREAD_0_5 (1 << 0)
124 : : # define DP_NO_AUX_HANDSHAKE_LINK_TRAINING (1 << 6)
125 : : # define DP_TPS4_SUPPORTED (1 << 7)
126 : :
127 : : #define DP_NORP 0x004
128 : :
129 : : #define DP_DOWNSTREAMPORT_PRESENT 0x005
130 : : # define DP_DWN_STRM_PORT_PRESENT (1 << 0)
131 : : # define DP_DWN_STRM_PORT_TYPE_MASK 0x06
132 : : # define DP_DWN_STRM_PORT_TYPE_DP (0 << 1)
133 : : # define DP_DWN_STRM_PORT_TYPE_ANALOG (1 << 1)
134 : : # define DP_DWN_STRM_PORT_TYPE_TMDS (2 << 1)
135 : : # define DP_DWN_STRM_PORT_TYPE_OTHER (3 << 1)
136 : : # define DP_FORMAT_CONVERSION (1 << 3)
137 : : # define DP_DETAILED_CAP_INFO_AVAILABLE (1 << 4) /* DPI */
138 : :
139 : : #define DP_MAIN_LINK_CHANNEL_CODING 0x006
140 : : # define DP_CAP_ANSI_8B10B (1 << 0)
141 : :
142 : : #define DP_DOWN_STREAM_PORT_COUNT 0x007
143 : : # define DP_PORT_COUNT_MASK 0x0f
144 : : # define DP_MSA_TIMING_PAR_IGNORED (1 << 6) /* eDP */
145 : : # define DP_OUI_SUPPORT (1 << 7)
146 : :
147 : : #define DP_RECEIVE_PORT_0_CAP_0 0x008
148 : : # define DP_LOCAL_EDID_PRESENT (1 << 1)
149 : : # define DP_ASSOCIATED_TO_PRECEDING_PORT (1 << 2)
150 : :
151 : : #define DP_RECEIVE_PORT_0_BUFFER_SIZE 0x009
152 : :
153 : : #define DP_RECEIVE_PORT_1_CAP_0 0x00a
154 : : #define DP_RECEIVE_PORT_1_BUFFER_SIZE 0x00b
155 : :
156 : : #define DP_I2C_SPEED_CAP 0x00c /* DPI */
157 : : # define DP_I2C_SPEED_1K 0x01
158 : : # define DP_I2C_SPEED_5K 0x02
159 : : # define DP_I2C_SPEED_10K 0x04
160 : : # define DP_I2C_SPEED_100K 0x08
161 : : # define DP_I2C_SPEED_400K 0x10
162 : : # define DP_I2C_SPEED_1M 0x20
163 : :
164 : : #define DP_EDP_CONFIGURATION_CAP 0x00d /* XXX 1.2? */
165 : : # define DP_ALTERNATE_SCRAMBLER_RESET_CAP (1 << 0)
166 : : # define DP_FRAMING_CHANGE_CAP (1 << 1)
167 : : # define DP_DPCD_DISPLAY_CONTROL_CAPABLE (1 << 3) /* edp v1.2 or higher */
168 : :
169 : : #define DP_TRAINING_AUX_RD_INTERVAL 0x00e /* XXX 1.2? */
170 : : # define DP_TRAINING_AUX_RD_MASK 0x7F /* DP 1.3 */
171 : : # define DP_EXTENDED_RECEIVER_CAP_FIELD_PRESENT (1 << 7) /* DP 1.3 */
172 : :
173 : : #define DP_ADAPTER_CAP 0x00f /* 1.2 */
174 : : # define DP_FORCE_LOAD_SENSE_CAP (1 << 0)
175 : : # define DP_ALTERNATE_I2C_PATTERN_CAP (1 << 1)
176 : :
177 : : #define DP_SUPPORTED_LINK_RATES 0x010 /* eDP 1.4 */
178 : : # define DP_MAX_SUPPORTED_RATES 8 /* 16-bit little-endian */
179 : :
180 : : /* Multiple stream transport */
181 : : #define DP_FAUX_CAP 0x020 /* 1.2 */
182 : : # define DP_FAUX_CAP_1 (1 << 0)
183 : :
184 : : #define DP_MSTM_CAP 0x021 /* 1.2 */
185 : : # define DP_MST_CAP (1 << 0)
186 : :
187 : : #define DP_NUMBER_OF_AUDIO_ENDPOINTS 0x022 /* 1.2 */
188 : :
189 : : /* AV_SYNC_DATA_BLOCK 1.2 */
190 : : #define DP_AV_GRANULARITY 0x023
191 : : # define DP_AG_FACTOR_MASK (0xf << 0)
192 : : # define DP_AG_FACTOR_3MS (0 << 0)
193 : : # define DP_AG_FACTOR_2MS (1 << 0)
194 : : # define DP_AG_FACTOR_1MS (2 << 0)
195 : : # define DP_AG_FACTOR_500US (3 << 0)
196 : : # define DP_AG_FACTOR_200US (4 << 0)
197 : : # define DP_AG_FACTOR_100US (5 << 0)
198 : : # define DP_AG_FACTOR_10US (6 << 0)
199 : : # define DP_AG_FACTOR_1US (7 << 0)
200 : : # define DP_VG_FACTOR_MASK (0xf << 4)
201 : : # define DP_VG_FACTOR_3MS (0 << 4)
202 : : # define DP_VG_FACTOR_2MS (1 << 4)
203 : : # define DP_VG_FACTOR_1MS (2 << 4)
204 : : # define DP_VG_FACTOR_500US (3 << 4)
205 : : # define DP_VG_FACTOR_200US (4 << 4)
206 : : # define DP_VG_FACTOR_100US (5 << 4)
207 : :
208 : : #define DP_AUD_DEC_LAT0 0x024
209 : : #define DP_AUD_DEC_LAT1 0x025
210 : :
211 : : #define DP_AUD_PP_LAT0 0x026
212 : : #define DP_AUD_PP_LAT1 0x027
213 : :
214 : : #define DP_VID_INTER_LAT 0x028
215 : :
216 : : #define DP_VID_PROG_LAT 0x029
217 : :
218 : : #define DP_REP_LAT 0x02a
219 : :
220 : : #define DP_AUD_DEL_INS0 0x02b
221 : : #define DP_AUD_DEL_INS1 0x02c
222 : : #define DP_AUD_DEL_INS2 0x02d
223 : : /* End of AV_SYNC_DATA_BLOCK */
224 : :
225 : : #define DP_RECEIVER_ALPM_CAP 0x02e /* eDP 1.4 */
226 : : # define DP_ALPM_CAP (1 << 0)
227 : :
228 : : #define DP_SINK_DEVICE_AUX_FRAME_SYNC_CAP 0x02f /* eDP 1.4 */
229 : : # define DP_AUX_FRAME_SYNC_CAP (1 << 0)
230 : :
231 : : #define DP_GUID 0x030 /* 1.2 */
232 : :
233 : : #define DP_DSC_SUPPORT 0x060 /* DP 1.4 */
234 : : # define DP_DSC_DECOMPRESSION_IS_SUPPORTED (1 << 0)
235 : :
236 : : #define DP_DSC_REV 0x061
237 : : # define DP_DSC_MAJOR_MASK (0xf << 0)
238 : : # define DP_DSC_MINOR_MASK (0xf << 4)
239 : : # define DP_DSC_MAJOR_SHIFT 0
240 : : # define DP_DSC_MINOR_SHIFT 4
241 : :
242 : : #define DP_DSC_RC_BUF_BLK_SIZE 0x062
243 : : # define DP_DSC_RC_BUF_BLK_SIZE_1 0x0
244 : : # define DP_DSC_RC_BUF_BLK_SIZE_4 0x1
245 : : # define DP_DSC_RC_BUF_BLK_SIZE_16 0x2
246 : : # define DP_DSC_RC_BUF_BLK_SIZE_64 0x3
247 : :
248 : : #define DP_DSC_RC_BUF_SIZE 0x063
249 : :
250 : : #define DP_DSC_SLICE_CAP_1 0x064
251 : : # define DP_DSC_1_PER_DP_DSC_SINK (1 << 0)
252 : : # define DP_DSC_2_PER_DP_DSC_SINK (1 << 1)
253 : : # define DP_DSC_4_PER_DP_DSC_SINK (1 << 3)
254 : : # define DP_DSC_6_PER_DP_DSC_SINK (1 << 4)
255 : : # define DP_DSC_8_PER_DP_DSC_SINK (1 << 5)
256 : : # define DP_DSC_10_PER_DP_DSC_SINK (1 << 6)
257 : : # define DP_DSC_12_PER_DP_DSC_SINK (1 << 7)
258 : :
259 : : #define DP_DSC_LINE_BUF_BIT_DEPTH 0x065
260 : : # define DP_DSC_LINE_BUF_BIT_DEPTH_MASK (0xf << 0)
261 : : # define DP_DSC_LINE_BUF_BIT_DEPTH_9 0x0
262 : : # define DP_DSC_LINE_BUF_BIT_DEPTH_10 0x1
263 : : # define DP_DSC_LINE_BUF_BIT_DEPTH_11 0x2
264 : : # define DP_DSC_LINE_BUF_BIT_DEPTH_12 0x3
265 : : # define DP_DSC_LINE_BUF_BIT_DEPTH_13 0x4
266 : : # define DP_DSC_LINE_BUF_BIT_DEPTH_14 0x5
267 : : # define DP_DSC_LINE_BUF_BIT_DEPTH_15 0x6
268 : : # define DP_DSC_LINE_BUF_BIT_DEPTH_16 0x7
269 : : # define DP_DSC_LINE_BUF_BIT_DEPTH_8 0x8
270 : :
271 : : #define DP_DSC_BLK_PREDICTION_SUPPORT 0x066
272 : : # define DP_DSC_BLK_PREDICTION_IS_SUPPORTED (1 << 0)
273 : :
274 : : #define DP_DSC_MAX_BITS_PER_PIXEL_LOW 0x067 /* eDP 1.4 */
275 : :
276 : : #define DP_DSC_MAX_BITS_PER_PIXEL_HI 0x068 /* eDP 1.4 */
277 : : # define DP_DSC_MAX_BITS_PER_PIXEL_HI_MASK (0x3 << 0)
278 : : # define DP_DSC_MAX_BITS_PER_PIXEL_HI_SHIFT 8
279 : :
280 : : #define DP_DSC_DEC_COLOR_FORMAT_CAP 0x069
281 : : # define DP_DSC_RGB (1 << 0)
282 : : # define DP_DSC_YCbCr444 (1 << 1)
283 : : # define DP_DSC_YCbCr422_Simple (1 << 2)
284 : : # define DP_DSC_YCbCr422_Native (1 << 3)
285 : : # define DP_DSC_YCbCr420_Native (1 << 4)
286 : :
287 : : #define DP_DSC_DEC_COLOR_DEPTH_CAP 0x06A
288 : : # define DP_DSC_8_BPC (1 << 1)
289 : : # define DP_DSC_10_BPC (1 << 2)
290 : : # define DP_DSC_12_BPC (1 << 3)
291 : :
292 : : #define DP_DSC_PEAK_THROUGHPUT 0x06B
293 : : # define DP_DSC_THROUGHPUT_MODE_0_MASK (0xf << 0)
294 : : # define DP_DSC_THROUGHPUT_MODE_0_SHIFT 0
295 : : # define DP_DSC_THROUGHPUT_MODE_0_UPSUPPORTED 0
296 : : # define DP_DSC_THROUGHPUT_MODE_0_340 (1 << 0)
297 : : # define DP_DSC_THROUGHPUT_MODE_0_400 (2 << 0)
298 : : # define DP_DSC_THROUGHPUT_MODE_0_450 (3 << 0)
299 : : # define DP_DSC_THROUGHPUT_MODE_0_500 (4 << 0)
300 : : # define DP_DSC_THROUGHPUT_MODE_0_550 (5 << 0)
301 : : # define DP_DSC_THROUGHPUT_MODE_0_600 (6 << 0)
302 : : # define DP_DSC_THROUGHPUT_MODE_0_650 (7 << 0)
303 : : # define DP_DSC_THROUGHPUT_MODE_0_700 (8 << 0)
304 : : # define DP_DSC_THROUGHPUT_MODE_0_750 (9 << 0)
305 : : # define DP_DSC_THROUGHPUT_MODE_0_800 (10 << 0)
306 : : # define DP_DSC_THROUGHPUT_MODE_0_850 (11 << 0)
307 : : # define DP_DSC_THROUGHPUT_MODE_0_900 (12 << 0)
308 : : # define DP_DSC_THROUGHPUT_MODE_0_950 (13 << 0)
309 : : # define DP_DSC_THROUGHPUT_MODE_0_1000 (14 << 0)
310 : : # define DP_DSC_THROUGHPUT_MODE_0_170 (15 << 0) /* 1.4a */
311 : : # define DP_DSC_THROUGHPUT_MODE_1_MASK (0xf << 4)
312 : : # define DP_DSC_THROUGHPUT_MODE_1_SHIFT 4
313 : : # define DP_DSC_THROUGHPUT_MODE_1_UPSUPPORTED 0
314 : : # define DP_DSC_THROUGHPUT_MODE_1_340 (1 << 4)
315 : : # define DP_DSC_THROUGHPUT_MODE_1_400 (2 << 4)
316 : : # define DP_DSC_THROUGHPUT_MODE_1_450 (3 << 4)
317 : : # define DP_DSC_THROUGHPUT_MODE_1_500 (4 << 4)
318 : : # define DP_DSC_THROUGHPUT_MODE_1_550 (5 << 4)
319 : : # define DP_DSC_THROUGHPUT_MODE_1_600 (6 << 4)
320 : : # define DP_DSC_THROUGHPUT_MODE_1_650 (7 << 4)
321 : : # define DP_DSC_THROUGHPUT_MODE_1_700 (8 << 4)
322 : : # define DP_DSC_THROUGHPUT_MODE_1_750 (9 << 4)
323 : : # define DP_DSC_THROUGHPUT_MODE_1_800 (10 << 4)
324 : : # define DP_DSC_THROUGHPUT_MODE_1_850 (11 << 4)
325 : : # define DP_DSC_THROUGHPUT_MODE_1_900 (12 << 4)
326 : : # define DP_DSC_THROUGHPUT_MODE_1_950 (13 << 4)
327 : : # define DP_DSC_THROUGHPUT_MODE_1_1000 (14 << 4)
328 : : # define DP_DSC_THROUGHPUT_MODE_1_170 (15 << 4)
329 : :
330 : : #define DP_DSC_MAX_SLICE_WIDTH 0x06C
331 : : #define DP_DSC_MIN_SLICE_WIDTH_VALUE 2560
332 : : #define DP_DSC_SLICE_WIDTH_MULTIPLIER 320
333 : :
334 : : #define DP_DSC_SLICE_CAP_2 0x06D
335 : : # define DP_DSC_16_PER_DP_DSC_SINK (1 << 0)
336 : : # define DP_DSC_20_PER_DP_DSC_SINK (1 << 1)
337 : : # define DP_DSC_24_PER_DP_DSC_SINK (1 << 2)
338 : :
339 : : #define DP_DSC_BITS_PER_PIXEL_INC 0x06F
340 : : # define DP_DSC_BITS_PER_PIXEL_1_16 0x0
341 : : # define DP_DSC_BITS_PER_PIXEL_1_8 0x1
342 : : # define DP_DSC_BITS_PER_PIXEL_1_4 0x2
343 : : # define DP_DSC_BITS_PER_PIXEL_1_2 0x3
344 : : # define DP_DSC_BITS_PER_PIXEL_1 0x4
345 : :
346 : : #define DP_PSR_SUPPORT 0x070 /* XXX 1.2? */
347 : : # define DP_PSR_IS_SUPPORTED 1
348 : : # define DP_PSR2_IS_SUPPORTED 2 /* eDP 1.4 */
349 : : # define DP_PSR2_WITH_Y_COORD_IS_SUPPORTED 3 /* eDP 1.4a */
350 : :
351 : : #define DP_PSR_CAPS 0x071 /* XXX 1.2? */
352 : : # define DP_PSR_NO_TRAIN_ON_EXIT 1
353 : : # define DP_PSR_SETUP_TIME_330 (0 << 1)
354 : : # define DP_PSR_SETUP_TIME_275 (1 << 1)
355 : : # define DP_PSR_SETUP_TIME_220 (2 << 1)
356 : : # define DP_PSR_SETUP_TIME_165 (3 << 1)
357 : : # define DP_PSR_SETUP_TIME_110 (4 << 1)
358 : : # define DP_PSR_SETUP_TIME_55 (5 << 1)
359 : : # define DP_PSR_SETUP_TIME_0 (6 << 1)
360 : : # define DP_PSR_SETUP_TIME_MASK (7 << 1)
361 : : # define DP_PSR_SETUP_TIME_SHIFT 1
362 : : # define DP_PSR2_SU_Y_COORDINATE_REQUIRED (1 << 4) /* eDP 1.4a */
363 : : # define DP_PSR2_SU_GRANULARITY_REQUIRED (1 << 5) /* eDP 1.4b */
364 : :
365 : : #define DP_PSR2_SU_X_GRANULARITY 0x072 /* eDP 1.4b */
366 : : #define DP_PSR2_SU_Y_GRANULARITY 0x074 /* eDP 1.4b */
367 : :
368 : : /*
369 : : * 0x80-0x8f describe downstream port capabilities, but there are two layouts
370 : : * based on whether DP_DETAILED_CAP_INFO_AVAILABLE was set. If it was not,
371 : : * each port's descriptor is one byte wide. If it was set, each port's is
372 : : * four bytes wide, starting with the one byte from the base info. As of
373 : : * DP interop v1.1a only VGA defines additional detail.
374 : : */
375 : :
376 : : /* offset 0 */
377 : : #define DP_DOWNSTREAM_PORT_0 0x80
378 : : # define DP_DS_PORT_TYPE_MASK (7 << 0)
379 : : # define DP_DS_PORT_TYPE_DP 0
380 : : # define DP_DS_PORT_TYPE_VGA 1
381 : : # define DP_DS_PORT_TYPE_DVI 2
382 : : # define DP_DS_PORT_TYPE_HDMI 3
383 : : # define DP_DS_PORT_TYPE_NON_EDID 4
384 : : # define DP_DS_PORT_TYPE_DP_DUALMODE 5
385 : : # define DP_DS_PORT_TYPE_WIRELESS 6
386 : : # define DP_DS_PORT_HPD (1 << 3)
387 : : /* offset 1 for VGA is maximum megapixels per second / 8 */
388 : : /* offset 2 */
389 : : # define DP_DS_MAX_BPC_MASK (3 << 0)
390 : : # define DP_DS_8BPC 0
391 : : # define DP_DS_10BPC 1
392 : : # define DP_DS_12BPC 2
393 : : # define DP_DS_16BPC 3
394 : :
395 : : /* DP Forward error Correction Registers */
396 : : #define DP_FEC_CAPABILITY 0x090 /* 1.4 */
397 : : # define DP_FEC_CAPABLE (1 << 0)
398 : : # define DP_FEC_UNCORR_BLK_ERROR_COUNT_CAP (1 << 1)
399 : : # define DP_FEC_CORR_BLK_ERROR_COUNT_CAP (1 << 2)
400 : : # define DP_FEC_BIT_ERROR_COUNT_CAP (1 << 3)
401 : :
402 : : /* DP Extended DSC Capabilities */
403 : : #define DP_DSC_BRANCH_OVERALL_THROUGHPUT_0 0x0a0 /* DP 1.4a SCR */
404 : : #define DP_DSC_BRANCH_OVERALL_THROUGHPUT_1 0x0a1
405 : : #define DP_DSC_BRANCH_MAX_LINE_WIDTH 0x0a2
406 : :
407 : : /* link configuration */
408 : : #define DP_LINK_BW_SET 0x100
409 : : # define DP_LINK_RATE_TABLE 0x00 /* eDP 1.4 */
410 : : # define DP_LINK_BW_1_62 0x06
411 : : # define DP_LINK_BW_2_7 0x0a
412 : : # define DP_LINK_BW_5_4 0x14 /* 1.2 */
413 : : # define DP_LINK_BW_8_1 0x1e /* 1.4 */
414 : :
415 : : #define DP_LANE_COUNT_SET 0x101
416 : : # define DP_LANE_COUNT_MASK 0x0f
417 : : # define DP_LANE_COUNT_ENHANCED_FRAME_EN (1 << 7)
418 : :
419 : : #define DP_TRAINING_PATTERN_SET 0x102
420 : : # define DP_TRAINING_PATTERN_DISABLE 0
421 : : # define DP_TRAINING_PATTERN_1 1
422 : : # define DP_TRAINING_PATTERN_2 2
423 : : # define DP_TRAINING_PATTERN_3 3 /* 1.2 */
424 : : # define DP_TRAINING_PATTERN_4 7 /* 1.4 */
425 : : # define DP_TRAINING_PATTERN_MASK 0x3
426 : : # define DP_TRAINING_PATTERN_MASK_1_4 0xf
427 : :
428 : : /* DPCD 1.1 only. For DPCD >= 1.2 see per-lane DP_LINK_QUAL_LANEn_SET */
429 : : # define DP_LINK_QUAL_PATTERN_11_DISABLE (0 << 2)
430 : : # define DP_LINK_QUAL_PATTERN_11_D10_2 (1 << 2)
431 : : # define DP_LINK_QUAL_PATTERN_11_ERROR_RATE (2 << 2)
432 : : # define DP_LINK_QUAL_PATTERN_11_PRBS7 (3 << 2)
433 : : # define DP_LINK_QUAL_PATTERN_11_MASK (3 << 2)
434 : :
435 : : # define DP_RECOVERED_CLOCK_OUT_EN (1 << 4)
436 : : # define DP_LINK_SCRAMBLING_DISABLE (1 << 5)
437 : :
438 : : # define DP_SYMBOL_ERROR_COUNT_BOTH (0 << 6)
439 : : # define DP_SYMBOL_ERROR_COUNT_DISPARITY (1 << 6)
440 : : # define DP_SYMBOL_ERROR_COUNT_SYMBOL (2 << 6)
441 : : # define DP_SYMBOL_ERROR_COUNT_MASK (3 << 6)
442 : :
443 : : #define DP_TRAINING_LANE0_SET 0x103
444 : : #define DP_TRAINING_LANE1_SET 0x104
445 : : #define DP_TRAINING_LANE2_SET 0x105
446 : : #define DP_TRAINING_LANE3_SET 0x106
447 : :
448 : : # define DP_TRAIN_VOLTAGE_SWING_MASK 0x3
449 : : # define DP_TRAIN_VOLTAGE_SWING_SHIFT 0
450 : : # define DP_TRAIN_MAX_SWING_REACHED (1 << 2)
451 : : # define DP_TRAIN_VOLTAGE_SWING_LEVEL_0 (0 << 0)
452 : : # define DP_TRAIN_VOLTAGE_SWING_LEVEL_1 (1 << 0)
453 : : # define DP_TRAIN_VOLTAGE_SWING_LEVEL_2 (2 << 0)
454 : : # define DP_TRAIN_VOLTAGE_SWING_LEVEL_3 (3 << 0)
455 : :
456 : : # define DP_TRAIN_PRE_EMPHASIS_MASK (3 << 3)
457 : : # define DP_TRAIN_PRE_EMPH_LEVEL_0 (0 << 3)
458 : : # define DP_TRAIN_PRE_EMPH_LEVEL_1 (1 << 3)
459 : : # define DP_TRAIN_PRE_EMPH_LEVEL_2 (2 << 3)
460 : : # define DP_TRAIN_PRE_EMPH_LEVEL_3 (3 << 3)
461 : :
462 : : # define DP_TRAIN_PRE_EMPHASIS_SHIFT 3
463 : : # define DP_TRAIN_MAX_PRE_EMPHASIS_REACHED (1 << 5)
464 : :
465 : : #define DP_DOWNSPREAD_CTRL 0x107
466 : : # define DP_SPREAD_AMP_0_5 (1 << 4)
467 : : # define DP_MSA_TIMING_PAR_IGNORE_EN (1 << 7) /* eDP */
468 : :
469 : : #define DP_MAIN_LINK_CHANNEL_CODING_SET 0x108
470 : : # define DP_SET_ANSI_8B10B (1 << 0)
471 : :
472 : : #define DP_I2C_SPEED_CONTROL_STATUS 0x109 /* DPI */
473 : : /* bitmask as for DP_I2C_SPEED_CAP */
474 : :
475 : : #define DP_EDP_CONFIGURATION_SET 0x10a /* XXX 1.2? */
476 : : # define DP_ALTERNATE_SCRAMBLER_RESET_ENABLE (1 << 0)
477 : : # define DP_FRAMING_CHANGE_ENABLE (1 << 1)
478 : : # define DP_PANEL_SELF_TEST_ENABLE (1 << 7)
479 : :
480 : : #define DP_LINK_QUAL_LANE0_SET 0x10b /* DPCD >= 1.2 */
481 : : #define DP_LINK_QUAL_LANE1_SET 0x10c
482 : : #define DP_LINK_QUAL_LANE2_SET 0x10d
483 : : #define DP_LINK_QUAL_LANE3_SET 0x10e
484 : : # define DP_LINK_QUAL_PATTERN_DISABLE 0
485 : : # define DP_LINK_QUAL_PATTERN_D10_2 1
486 : : # define DP_LINK_QUAL_PATTERN_ERROR_RATE 2
487 : : # define DP_LINK_QUAL_PATTERN_PRBS7 3
488 : : # define DP_LINK_QUAL_PATTERN_80BIT_CUSTOM 4
489 : : # define DP_LINK_QUAL_PATTERN_HBR2_EYE 5
490 : : # define DP_LINK_QUAL_PATTERN_MASK 7
491 : :
492 : : #define DP_TRAINING_LANE0_1_SET2 0x10f
493 : : #define DP_TRAINING_LANE2_3_SET2 0x110
494 : : # define DP_LANE02_POST_CURSOR2_SET_MASK (3 << 0)
495 : : # define DP_LANE02_MAX_POST_CURSOR2_REACHED (1 << 2)
496 : : # define DP_LANE13_POST_CURSOR2_SET_MASK (3 << 4)
497 : : # define DP_LANE13_MAX_POST_CURSOR2_REACHED (1 << 6)
498 : :
499 : : #define DP_MSTM_CTRL 0x111 /* 1.2 */
500 : : # define DP_MST_EN (1 << 0)
501 : : # define DP_UP_REQ_EN (1 << 1)
502 : : # define DP_UPSTREAM_IS_SRC (1 << 2)
503 : :
504 : : #define DP_AUDIO_DELAY0 0x112 /* 1.2 */
505 : : #define DP_AUDIO_DELAY1 0x113
506 : : #define DP_AUDIO_DELAY2 0x114
507 : :
508 : : #define DP_LINK_RATE_SET 0x115 /* eDP 1.4 */
509 : : # define DP_LINK_RATE_SET_SHIFT 0
510 : : # define DP_LINK_RATE_SET_MASK (7 << 0)
511 : :
512 : : #define DP_RECEIVER_ALPM_CONFIG 0x116 /* eDP 1.4 */
513 : : # define DP_ALPM_ENABLE (1 << 0)
514 : : # define DP_ALPM_LOCK_ERROR_IRQ_HPD_ENABLE (1 << 1)
515 : :
516 : : #define DP_SINK_DEVICE_AUX_FRAME_SYNC_CONF 0x117 /* eDP 1.4 */
517 : : # define DP_AUX_FRAME_SYNC_ENABLE (1 << 0)
518 : : # define DP_IRQ_HPD_ENABLE (1 << 1)
519 : :
520 : : #define DP_UPSTREAM_DEVICE_DP_PWR_NEED 0x118 /* 1.2 */
521 : : # define DP_PWR_NOT_NEEDED (1 << 0)
522 : :
523 : : #define DP_FEC_CONFIGURATION 0x120 /* 1.4 */
524 : : # define DP_FEC_READY (1 << 0)
525 : : # define DP_FEC_ERR_COUNT_SEL_MASK (7 << 1)
526 : : # define DP_FEC_ERR_COUNT_DIS (0 << 1)
527 : : # define DP_FEC_UNCORR_BLK_ERROR_COUNT (1 << 1)
528 : : # define DP_FEC_CORR_BLK_ERROR_COUNT (2 << 1)
529 : : # define DP_FEC_BIT_ERROR_COUNT (3 << 1)
530 : : # define DP_FEC_LANE_SELECT_MASK (3 << 4)
531 : : # define DP_FEC_LANE_0_SELECT (0 << 4)
532 : : # define DP_FEC_LANE_1_SELECT (1 << 4)
533 : : # define DP_FEC_LANE_2_SELECT (2 << 4)
534 : : # define DP_FEC_LANE_3_SELECT (3 << 4)
535 : :
536 : : #define DP_AUX_FRAME_SYNC_VALUE 0x15c /* eDP 1.4 */
537 : : # define DP_AUX_FRAME_SYNC_VALID (1 << 0)
538 : :
539 : : #define DP_DSC_ENABLE 0x160 /* DP 1.4 */
540 : : # define DP_DECOMPRESSION_EN (1 << 0)
541 : :
542 : : #define DP_PSR_EN_CFG 0x170 /* XXX 1.2? */
543 : : # define DP_PSR_ENABLE (1 << 0)
544 : : # define DP_PSR_MAIN_LINK_ACTIVE (1 << 1)
545 : : # define DP_PSR_CRC_VERIFICATION (1 << 2)
546 : : # define DP_PSR_FRAME_CAPTURE (1 << 3)
547 : : # define DP_PSR_SELECTIVE_UPDATE (1 << 4)
548 : : # define DP_PSR_IRQ_HPD_WITH_CRC_ERRORS (1 << 5)
549 : : # define DP_PSR_ENABLE_PSR2 (1 << 6) /* eDP 1.4a */
550 : :
551 : : #define DP_ADAPTER_CTRL 0x1a0
552 : : # define DP_ADAPTER_CTRL_FORCE_LOAD_SENSE (1 << 0)
553 : :
554 : : #define DP_BRANCH_DEVICE_CTRL 0x1a1
555 : : # define DP_BRANCH_DEVICE_IRQ_HPD (1 << 0)
556 : :
557 : : #define DP_PAYLOAD_ALLOCATE_SET 0x1c0
558 : : #define DP_PAYLOAD_ALLOCATE_START_TIME_SLOT 0x1c1
559 : : #define DP_PAYLOAD_ALLOCATE_TIME_SLOT_COUNT 0x1c2
560 : :
561 : : #define DP_SINK_COUNT 0x200
562 : : /* prior to 1.2 bit 7 was reserved mbz */
563 : : # define DP_GET_SINK_COUNT(x) ((((x) & 0x80) >> 1) | ((x) & 0x3f))
564 : : # define DP_SINK_CP_READY (1 << 6)
565 : :
566 : : #define DP_DEVICE_SERVICE_IRQ_VECTOR 0x201
567 : : # define DP_REMOTE_CONTROL_COMMAND_PENDING (1 << 0)
568 : : # define DP_AUTOMATED_TEST_REQUEST (1 << 1)
569 : : # define DP_CP_IRQ (1 << 2)
570 : : # define DP_MCCS_IRQ (1 << 3)
571 : : # define DP_DOWN_REP_MSG_RDY (1 << 4) /* 1.2 MST */
572 : : # define DP_UP_REQ_MSG_RDY (1 << 5) /* 1.2 MST */
573 : : # define DP_SINK_SPECIFIC_IRQ (1 << 6)
574 : :
575 : : #define DP_LANE0_1_STATUS 0x202
576 : : #define DP_LANE2_3_STATUS 0x203
577 : : # define DP_LANE_CR_DONE (1 << 0)
578 : : # define DP_LANE_CHANNEL_EQ_DONE (1 << 1)
579 : : # define DP_LANE_SYMBOL_LOCKED (1 << 2)
580 : :
581 : : #define DP_CHANNEL_EQ_BITS (DP_LANE_CR_DONE | \
582 : : DP_LANE_CHANNEL_EQ_DONE | \
583 : : DP_LANE_SYMBOL_LOCKED)
584 : :
585 : : #define DP_LANE_ALIGN_STATUS_UPDATED 0x204
586 : :
587 : : #define DP_INTERLANE_ALIGN_DONE (1 << 0)
588 : : #define DP_DOWNSTREAM_PORT_STATUS_CHANGED (1 << 6)
589 : : #define DP_LINK_STATUS_UPDATED (1 << 7)
590 : :
591 : : #define DP_SINK_STATUS 0x205
592 : :
593 : : #define DP_RECEIVE_PORT_0_STATUS (1 << 0)
594 : : #define DP_RECEIVE_PORT_1_STATUS (1 << 1)
595 : :
596 : : #define DP_ADJUST_REQUEST_LANE0_1 0x206
597 : : #define DP_ADJUST_REQUEST_LANE2_3 0x207
598 : : # define DP_ADJUST_VOLTAGE_SWING_LANE0_MASK 0x03
599 : : # define DP_ADJUST_VOLTAGE_SWING_LANE0_SHIFT 0
600 : : # define DP_ADJUST_PRE_EMPHASIS_LANE0_MASK 0x0c
601 : : # define DP_ADJUST_PRE_EMPHASIS_LANE0_SHIFT 2
602 : : # define DP_ADJUST_VOLTAGE_SWING_LANE1_MASK 0x30
603 : : # define DP_ADJUST_VOLTAGE_SWING_LANE1_SHIFT 4
604 : : # define DP_ADJUST_PRE_EMPHASIS_LANE1_MASK 0xc0
605 : : # define DP_ADJUST_PRE_EMPHASIS_LANE1_SHIFT 6
606 : :
607 : : #define DP_ADJUST_REQUEST_POST_CURSOR2 0x20c
608 : : # define DP_ADJUST_POST_CURSOR2_LANE0_MASK 0x03
609 : : # define DP_ADJUST_POST_CURSOR2_LANE0_SHIFT 0
610 : : # define DP_ADJUST_POST_CURSOR2_LANE1_MASK 0x0c
611 : : # define DP_ADJUST_POST_CURSOR2_LANE1_SHIFT 2
612 : : # define DP_ADJUST_POST_CURSOR2_LANE2_MASK 0x30
613 : : # define DP_ADJUST_POST_CURSOR2_LANE2_SHIFT 4
614 : : # define DP_ADJUST_POST_CURSOR2_LANE3_MASK 0xc0
615 : : # define DP_ADJUST_POST_CURSOR2_LANE3_SHIFT 6
616 : :
617 : : #define DP_TEST_REQUEST 0x218
618 : : # define DP_TEST_LINK_TRAINING (1 << 0)
619 : : # define DP_TEST_LINK_VIDEO_PATTERN (1 << 1)
620 : : # define DP_TEST_LINK_EDID_READ (1 << 2)
621 : : # define DP_TEST_LINK_PHY_TEST_PATTERN (1 << 3) /* DPCD >= 1.1 */
622 : : # define DP_TEST_LINK_FAUX_PATTERN (1 << 4) /* DPCD >= 1.2 */
623 : : # define DP_TEST_LINK_AUDIO_PATTERN (1 << 5) /* DPCD >= 1.2 */
624 : : # define DP_TEST_LINK_AUDIO_DISABLED_VIDEO (1 << 6) /* DPCD >= 1.2 */
625 : :
626 : : #define DP_TEST_LINK_RATE 0x219
627 : : # define DP_LINK_RATE_162 (0x6)
628 : : # define DP_LINK_RATE_27 (0xa)
629 : :
630 : : #define DP_TEST_LANE_COUNT 0x220
631 : :
632 : : #define DP_TEST_PATTERN 0x221
633 : : # define DP_NO_TEST_PATTERN 0x0
634 : : # define DP_COLOR_RAMP 0x1
635 : : # define DP_BLACK_AND_WHITE_VERTICAL_LINES 0x2
636 : : # define DP_COLOR_SQUARE 0x3
637 : :
638 : : #define DP_TEST_H_TOTAL_HI 0x222
639 : : #define DP_TEST_H_TOTAL_LO 0x223
640 : :
641 : : #define DP_TEST_V_TOTAL_HI 0x224
642 : : #define DP_TEST_V_TOTAL_LO 0x225
643 : :
644 : : #define DP_TEST_H_START_HI 0x226
645 : : #define DP_TEST_H_START_LO 0x227
646 : :
647 : : #define DP_TEST_V_START_HI 0x228
648 : : #define DP_TEST_V_START_LO 0x229
649 : :
650 : : #define DP_TEST_HSYNC_HI 0x22A
651 : : # define DP_TEST_HSYNC_POLARITY (1 << 7)
652 : : # define DP_TEST_HSYNC_WIDTH_HI_MASK (127 << 0)
653 : : #define DP_TEST_HSYNC_WIDTH_LO 0x22B
654 : :
655 : : #define DP_TEST_VSYNC_HI 0x22C
656 : : # define DP_TEST_VSYNC_POLARITY (1 << 7)
657 : : # define DP_TEST_VSYNC_WIDTH_HI_MASK (127 << 0)
658 : : #define DP_TEST_VSYNC_WIDTH_LO 0x22D
659 : :
660 : : #define DP_TEST_H_WIDTH_HI 0x22E
661 : : #define DP_TEST_H_WIDTH_LO 0x22F
662 : :
663 : : #define DP_TEST_V_HEIGHT_HI 0x230
664 : : #define DP_TEST_V_HEIGHT_LO 0x231
665 : :
666 : : #define DP_TEST_MISC0 0x232
667 : : # define DP_TEST_SYNC_CLOCK (1 << 0)
668 : : # define DP_TEST_COLOR_FORMAT_MASK (3 << 1)
669 : : # define DP_TEST_COLOR_FORMAT_SHIFT 1
670 : : # define DP_COLOR_FORMAT_RGB (0 << 1)
671 : : # define DP_COLOR_FORMAT_YCbCr422 (1 << 1)
672 : : # define DP_COLOR_FORMAT_YCbCr444 (2 << 1)
673 : : # define DP_TEST_DYNAMIC_RANGE_VESA (0 << 3)
674 : : # define DP_TEST_DYNAMIC_RANGE_CEA (1 << 3)
675 : : # define DP_TEST_YCBCR_COEFFICIENTS (1 << 4)
676 : : # define DP_YCBCR_COEFFICIENTS_ITU601 (0 << 4)
677 : : # define DP_YCBCR_COEFFICIENTS_ITU709 (1 << 4)
678 : : # define DP_TEST_BIT_DEPTH_MASK (7 << 5)
679 : : # define DP_TEST_BIT_DEPTH_SHIFT 5
680 : : # define DP_TEST_BIT_DEPTH_6 (0 << 5)
681 : : # define DP_TEST_BIT_DEPTH_8 (1 << 5)
682 : : # define DP_TEST_BIT_DEPTH_10 (2 << 5)
683 : : # define DP_TEST_BIT_DEPTH_12 (3 << 5)
684 : : # define DP_TEST_BIT_DEPTH_16 (4 << 5)
685 : :
686 : : #define DP_TEST_MISC1 0x233
687 : : # define DP_TEST_REFRESH_DENOMINATOR (1 << 0)
688 : : # define DP_TEST_INTERLACED (1 << 1)
689 : :
690 : : #define DP_TEST_REFRESH_RATE_NUMERATOR 0x234
691 : :
692 : : #define DP_TEST_MISC0 0x232
693 : :
694 : : #define DP_TEST_CRC_R_CR 0x240
695 : : #define DP_TEST_CRC_G_Y 0x242
696 : : #define DP_TEST_CRC_B_CB 0x244
697 : :
698 : : #define DP_TEST_SINK_MISC 0x246
699 : : # define DP_TEST_CRC_SUPPORTED (1 << 5)
700 : : # define DP_TEST_COUNT_MASK 0xf
701 : :
702 : : #define DP_TEST_PHY_PATTERN 0x248
703 : : #define DP_TEST_80BIT_CUSTOM_PATTERN_7_0 0x250
704 : : #define DP_TEST_80BIT_CUSTOM_PATTERN_15_8 0x251
705 : : #define DP_TEST_80BIT_CUSTOM_PATTERN_23_16 0x252
706 : : #define DP_TEST_80BIT_CUSTOM_PATTERN_31_24 0x253
707 : : #define DP_TEST_80BIT_CUSTOM_PATTERN_39_32 0x254
708 : : #define DP_TEST_80BIT_CUSTOM_PATTERN_47_40 0x255
709 : : #define DP_TEST_80BIT_CUSTOM_PATTERN_55_48 0x256
710 : : #define DP_TEST_80BIT_CUSTOM_PATTERN_63_56 0x257
711 : : #define DP_TEST_80BIT_CUSTOM_PATTERN_71_64 0x258
712 : : #define DP_TEST_80BIT_CUSTOM_PATTERN_79_72 0x259
713 : :
714 : : #define DP_TEST_RESPONSE 0x260
715 : : # define DP_TEST_ACK (1 << 0)
716 : : # define DP_TEST_NAK (1 << 1)
717 : : # define DP_TEST_EDID_CHECKSUM_WRITE (1 << 2)
718 : :
719 : : #define DP_TEST_EDID_CHECKSUM 0x261
720 : :
721 : : #define DP_TEST_SINK 0x270
722 : : # define DP_TEST_SINK_START (1 << 0)
723 : : #define DP_TEST_AUDIO_MODE 0x271
724 : : #define DP_TEST_AUDIO_PATTERN_TYPE 0x272
725 : : #define DP_TEST_AUDIO_PERIOD_CH1 0x273
726 : : #define DP_TEST_AUDIO_PERIOD_CH2 0x274
727 : : #define DP_TEST_AUDIO_PERIOD_CH3 0x275
728 : : #define DP_TEST_AUDIO_PERIOD_CH4 0x276
729 : : #define DP_TEST_AUDIO_PERIOD_CH5 0x277
730 : : #define DP_TEST_AUDIO_PERIOD_CH6 0x278
731 : : #define DP_TEST_AUDIO_PERIOD_CH7 0x279
732 : : #define DP_TEST_AUDIO_PERIOD_CH8 0x27A
733 : :
734 : : #define DP_FEC_STATUS 0x280 /* 1.4 */
735 : : # define DP_FEC_DECODE_EN_DETECTED (1 << 0)
736 : : # define DP_FEC_DECODE_DIS_DETECTED (1 << 1)
737 : :
738 : : #define DP_FEC_ERROR_COUNT_LSB 0x0281 /* 1.4 */
739 : :
740 : : #define DP_FEC_ERROR_COUNT_MSB 0x0282 /* 1.4 */
741 : : # define DP_FEC_ERROR_COUNT_MASK 0x7F
742 : : # define DP_FEC_ERR_COUNT_VALID (1 << 7)
743 : :
744 : : #define DP_PAYLOAD_TABLE_UPDATE_STATUS 0x2c0 /* 1.2 MST */
745 : : # define DP_PAYLOAD_TABLE_UPDATED (1 << 0)
746 : : # define DP_PAYLOAD_ACT_HANDLED (1 << 1)
747 : :
748 : : #define DP_VC_PAYLOAD_ID_SLOT_1 0x2c1 /* 1.2 MST */
749 : : /* up to ID_SLOT_63 at 0x2ff */
750 : :
751 : : #define DP_SOURCE_OUI 0x300
752 : : #define DP_SINK_OUI 0x400
753 : : #define DP_BRANCH_OUI 0x500
754 : : #define DP_BRANCH_ID 0x503
755 : : #define DP_BRANCH_REVISION_START 0x509
756 : : #define DP_BRANCH_HW_REV 0x509
757 : : #define DP_BRANCH_SW_REV 0x50A
758 : :
759 : : #define DP_SET_POWER 0x600
760 : : # define DP_SET_POWER_D0 0x1
761 : : # define DP_SET_POWER_D3 0x2
762 : : # define DP_SET_POWER_MASK 0x3
763 : : # define DP_SET_POWER_D3_AUX_ON 0x5
764 : :
765 : : #define DP_EDP_DPCD_REV 0x700 /* eDP 1.2 */
766 : : # define DP_EDP_11 0x00
767 : : # define DP_EDP_12 0x01
768 : : # define DP_EDP_13 0x02
769 : : # define DP_EDP_14 0x03
770 : : # define DP_EDP_14a 0x04 /* eDP 1.4a */
771 : : # define DP_EDP_14b 0x05 /* eDP 1.4b */
772 : :
773 : : #define DP_EDP_GENERAL_CAP_1 0x701
774 : : # define DP_EDP_TCON_BACKLIGHT_ADJUSTMENT_CAP (1 << 0)
775 : : # define DP_EDP_BACKLIGHT_PIN_ENABLE_CAP (1 << 1)
776 : : # define DP_EDP_BACKLIGHT_AUX_ENABLE_CAP (1 << 2)
777 : : # define DP_EDP_PANEL_SELF_TEST_PIN_ENABLE_CAP (1 << 3)
778 : : # define DP_EDP_PANEL_SELF_TEST_AUX_ENABLE_CAP (1 << 4)
779 : : # define DP_EDP_FRC_ENABLE_CAP (1 << 5)
780 : : # define DP_EDP_COLOR_ENGINE_CAP (1 << 6)
781 : : # define DP_EDP_SET_POWER_CAP (1 << 7)
782 : :
783 : : #define DP_EDP_BACKLIGHT_ADJUSTMENT_CAP 0x702
784 : : # define DP_EDP_BACKLIGHT_BRIGHTNESS_PWM_PIN_CAP (1 << 0)
785 : : # define DP_EDP_BACKLIGHT_BRIGHTNESS_AUX_SET_CAP (1 << 1)
786 : : # define DP_EDP_BACKLIGHT_BRIGHTNESS_BYTE_COUNT (1 << 2)
787 : : # define DP_EDP_BACKLIGHT_AUX_PWM_PRODUCT_CAP (1 << 3)
788 : : # define DP_EDP_BACKLIGHT_FREQ_PWM_PIN_PASSTHRU_CAP (1 << 4)
789 : : # define DP_EDP_BACKLIGHT_FREQ_AUX_SET_CAP (1 << 5)
790 : : # define DP_EDP_DYNAMIC_BACKLIGHT_CAP (1 << 6)
791 : : # define DP_EDP_VBLANK_BACKLIGHT_UPDATE_CAP (1 << 7)
792 : :
793 : : #define DP_EDP_GENERAL_CAP_2 0x703
794 : : # define DP_EDP_OVERDRIVE_ENGINE_ENABLED (1 << 0)
795 : :
796 : : #define DP_EDP_GENERAL_CAP_3 0x704 /* eDP 1.4 */
797 : : # define DP_EDP_X_REGION_CAP_MASK (0xf << 0)
798 : : # define DP_EDP_X_REGION_CAP_SHIFT 0
799 : : # define DP_EDP_Y_REGION_CAP_MASK (0xf << 4)
800 : : # define DP_EDP_Y_REGION_CAP_SHIFT 4
801 : :
802 : : #define DP_EDP_DISPLAY_CONTROL_REGISTER 0x720
803 : : # define DP_EDP_BACKLIGHT_ENABLE (1 << 0)
804 : : # define DP_EDP_BLACK_VIDEO_ENABLE (1 << 1)
805 : : # define DP_EDP_FRC_ENABLE (1 << 2)
806 : : # define DP_EDP_COLOR_ENGINE_ENABLE (1 << 3)
807 : : # define DP_EDP_VBLANK_BACKLIGHT_UPDATE_ENABLE (1 << 7)
808 : :
809 : : #define DP_EDP_BACKLIGHT_MODE_SET_REGISTER 0x721
810 : : # define DP_EDP_BACKLIGHT_CONTROL_MODE_MASK (3 << 0)
811 : : # define DP_EDP_BACKLIGHT_CONTROL_MODE_PWM (0 << 0)
812 : : # define DP_EDP_BACKLIGHT_CONTROL_MODE_PRESET (1 << 0)
813 : : # define DP_EDP_BACKLIGHT_CONTROL_MODE_DPCD (2 << 0)
814 : : # define DP_EDP_BACKLIGHT_CONTROL_MODE_PRODUCT (3 << 0)
815 : : # define DP_EDP_BACKLIGHT_FREQ_PWM_PIN_PASSTHRU_ENABLE (1 << 2)
816 : : # define DP_EDP_BACKLIGHT_FREQ_AUX_SET_ENABLE (1 << 3)
817 : : # define DP_EDP_DYNAMIC_BACKLIGHT_ENABLE (1 << 4)
818 : : # define DP_EDP_REGIONAL_BACKLIGHT_ENABLE (1 << 5)
819 : : # define DP_EDP_UPDATE_REGION_BRIGHTNESS (1 << 6) /* eDP 1.4 */
820 : :
821 : : #define DP_EDP_BACKLIGHT_BRIGHTNESS_MSB 0x722
822 : : #define DP_EDP_BACKLIGHT_BRIGHTNESS_LSB 0x723
823 : :
824 : : #define DP_EDP_PWMGEN_BIT_COUNT 0x724
825 : : #define DP_EDP_PWMGEN_BIT_COUNT_CAP_MIN 0x725
826 : : #define DP_EDP_PWMGEN_BIT_COUNT_CAP_MAX 0x726
827 : : # define DP_EDP_PWMGEN_BIT_COUNT_MASK (0x1f << 0)
828 : :
829 : : #define DP_EDP_BACKLIGHT_CONTROL_STATUS 0x727
830 : :
831 : : #define DP_EDP_BACKLIGHT_FREQ_SET 0x728
832 : : # define DP_EDP_BACKLIGHT_FREQ_BASE_KHZ 27000
833 : :
834 : : #define DP_EDP_BACKLIGHT_FREQ_CAP_MIN_MSB 0x72a
835 : : #define DP_EDP_BACKLIGHT_FREQ_CAP_MIN_MID 0x72b
836 : : #define DP_EDP_BACKLIGHT_FREQ_CAP_MIN_LSB 0x72c
837 : :
838 : : #define DP_EDP_BACKLIGHT_FREQ_CAP_MAX_MSB 0x72d
839 : : #define DP_EDP_BACKLIGHT_FREQ_CAP_MAX_MID 0x72e
840 : : #define DP_EDP_BACKLIGHT_FREQ_CAP_MAX_LSB 0x72f
841 : :
842 : : #define DP_EDP_DBC_MINIMUM_BRIGHTNESS_SET 0x732
843 : : #define DP_EDP_DBC_MAXIMUM_BRIGHTNESS_SET 0x733
844 : :
845 : : #define DP_EDP_REGIONAL_BACKLIGHT_BASE 0x740 /* eDP 1.4 */
846 : : #define DP_EDP_REGIONAL_BACKLIGHT_0 0x741 /* eDP 1.4 */
847 : :
848 : : #define DP_SIDEBAND_MSG_DOWN_REQ_BASE 0x1000 /* 1.2 MST */
849 : : #define DP_SIDEBAND_MSG_UP_REP_BASE 0x1200 /* 1.2 MST */
850 : : #define DP_SIDEBAND_MSG_DOWN_REP_BASE 0x1400 /* 1.2 MST */
851 : : #define DP_SIDEBAND_MSG_UP_REQ_BASE 0x1600 /* 1.2 MST */
852 : :
853 : : #define DP_SINK_COUNT_ESI 0x2002 /* 1.2 */
854 : : /* 0-5 sink count */
855 : : # define DP_SINK_COUNT_CP_READY (1 << 6)
856 : :
857 : : #define DP_DEVICE_SERVICE_IRQ_VECTOR_ESI0 0x2003 /* 1.2 */
858 : :
859 : : #define DP_DEVICE_SERVICE_IRQ_VECTOR_ESI1 0x2004 /* 1.2 */
860 : : # define DP_RX_GTC_MSTR_REQ_STATUS_CHANGE (1 << 0)
861 : : # define DP_LOCK_ACQUISITION_REQUEST (1 << 1)
862 : : # define DP_CEC_IRQ (1 << 2)
863 : :
864 : : #define DP_LINK_SERVICE_IRQ_VECTOR_ESI0 0x2005 /* 1.2 */
865 : :
866 : : #define DP_PSR_ERROR_STATUS 0x2006 /* XXX 1.2? */
867 : : # define DP_PSR_LINK_CRC_ERROR (1 << 0)
868 : : # define DP_PSR_RFB_STORAGE_ERROR (1 << 1)
869 : : # define DP_PSR_VSC_SDP_UNCORRECTABLE_ERROR (1 << 2) /* eDP 1.4 */
870 : :
871 : : #define DP_PSR_ESI 0x2007 /* XXX 1.2? */
872 : : # define DP_PSR_CAPS_CHANGE (1 << 0)
873 : :
874 : : #define DP_PSR_STATUS 0x2008 /* XXX 1.2? */
875 : : # define DP_PSR_SINK_INACTIVE 0
876 : : # define DP_PSR_SINK_ACTIVE_SRC_SYNCED 1
877 : : # define DP_PSR_SINK_ACTIVE_RFB 2
878 : : # define DP_PSR_SINK_ACTIVE_SINK_SYNCED 3
879 : : # define DP_PSR_SINK_ACTIVE_RESYNC 4
880 : : # define DP_PSR_SINK_INTERNAL_ERROR 7
881 : : # define DP_PSR_SINK_STATE_MASK 0x07
882 : :
883 : : #define DP_SYNCHRONIZATION_LATENCY_IN_SINK 0x2009 /* edp 1.4 */
884 : : # define DP_MAX_RESYNC_FRAME_COUNT_MASK (0xf << 0)
885 : : # define DP_MAX_RESYNC_FRAME_COUNT_SHIFT 0
886 : : # define DP_LAST_ACTUAL_SYNCHRONIZATION_LATENCY_MASK (0xf << 4)
887 : : # define DP_LAST_ACTUAL_SYNCHRONIZATION_LATENCY_SHIFT 4
888 : :
889 : : #define DP_LAST_RECEIVED_PSR_SDP 0x200a /* eDP 1.2 */
890 : : # define DP_PSR_STATE_BIT (1 << 0) /* eDP 1.2 */
891 : : # define DP_UPDATE_RFB_BIT (1 << 1) /* eDP 1.2 */
892 : : # define DP_CRC_VALID_BIT (1 << 2) /* eDP 1.2 */
893 : : # define DP_SU_VALID (1 << 3) /* eDP 1.4 */
894 : : # define DP_FIRST_SCAN_LINE_SU_REGION (1 << 4) /* eDP 1.4 */
895 : : # define DP_LAST_SCAN_LINE_SU_REGION (1 << 5) /* eDP 1.4 */
896 : : # define DP_Y_COORDINATE_VALID (1 << 6) /* eDP 1.4a */
897 : :
898 : : #define DP_RECEIVER_ALPM_STATUS 0x200b /* eDP 1.4 */
899 : : # define DP_ALPM_LOCK_TIMEOUT_ERROR (1 << 0)
900 : :
901 : : #define DP_LANE0_1_STATUS_ESI 0x200c /* status same as 0x202 */
902 : : #define DP_LANE2_3_STATUS_ESI 0x200d /* status same as 0x203 */
903 : : #define DP_LANE_ALIGN_STATUS_UPDATED_ESI 0x200e /* status same as 0x204 */
904 : : #define DP_SINK_STATUS_ESI 0x200f /* status same as 0x205 */
905 : :
906 : : #define DP_DP13_DPCD_REV 0x2200
907 : : #define DP_DP13_MAX_LINK_RATE 0x2201
908 : :
909 : : #define DP_DPRX_FEATURE_ENUMERATION_LIST 0x2210 /* DP 1.3 */
910 : : # define DP_GTC_CAP (1 << 0) /* DP 1.3 */
911 : : # define DP_SST_SPLIT_SDP_CAP (1 << 1) /* DP 1.4 */
912 : : # define DP_AV_SYNC_CAP (1 << 2) /* DP 1.3 */
913 : : # define DP_VSC_SDP_EXT_FOR_COLORIMETRY_SUPPORTED (1 << 3) /* DP 1.3 */
914 : : # define DP_VSC_EXT_VESA_SDP_SUPPORTED (1 << 4) /* DP 1.4 */
915 : : # define DP_VSC_EXT_VESA_SDP_CHAINING_SUPPORTED (1 << 5) /* DP 1.4 */
916 : : # define DP_VSC_EXT_CEA_SDP_SUPPORTED (1 << 6) /* DP 1.4 */
917 : : # define DP_VSC_EXT_CEA_SDP_CHAINING_SUPPORTED (1 << 7) /* DP 1.4 */
918 : :
919 : : /* HDMI CEC tunneling over AUX DP 1.3 section 5.3.3.3.1 DPCD 1.4+ */
920 : : #define DP_CEC_TUNNELING_CAPABILITY 0x3000
921 : : # define DP_CEC_TUNNELING_CAPABLE (1 << 0)
922 : : # define DP_CEC_SNOOPING_CAPABLE (1 << 1)
923 : : # define DP_CEC_MULTIPLE_LA_CAPABLE (1 << 2)
924 : :
925 : : #define DP_CEC_TUNNELING_CONTROL 0x3001
926 : : # define DP_CEC_TUNNELING_ENABLE (1 << 0)
927 : : # define DP_CEC_SNOOPING_ENABLE (1 << 1)
928 : :
929 : : #define DP_CEC_RX_MESSAGE_INFO 0x3002
930 : : # define DP_CEC_RX_MESSAGE_LEN_MASK (0xf << 0)
931 : : # define DP_CEC_RX_MESSAGE_LEN_SHIFT 0
932 : : # define DP_CEC_RX_MESSAGE_HPD_STATE (1 << 4)
933 : : # define DP_CEC_RX_MESSAGE_HPD_LOST (1 << 5)
934 : : # define DP_CEC_RX_MESSAGE_ACKED (1 << 6)
935 : : # define DP_CEC_RX_MESSAGE_ENDED (1 << 7)
936 : :
937 : : #define DP_CEC_TX_MESSAGE_INFO 0x3003
938 : : # define DP_CEC_TX_MESSAGE_LEN_MASK (0xf << 0)
939 : : # define DP_CEC_TX_MESSAGE_LEN_SHIFT 0
940 : : # define DP_CEC_TX_RETRY_COUNT_MASK (0x7 << 4)
941 : : # define DP_CEC_TX_RETRY_COUNT_SHIFT 4
942 : : # define DP_CEC_TX_MESSAGE_SEND (1 << 7)
943 : :
944 : : #define DP_CEC_TUNNELING_IRQ_FLAGS 0x3004
945 : : # define DP_CEC_RX_MESSAGE_INFO_VALID (1 << 0)
946 : : # define DP_CEC_RX_MESSAGE_OVERFLOW (1 << 1)
947 : : # define DP_CEC_TX_MESSAGE_SENT (1 << 4)
948 : : # define DP_CEC_TX_LINE_ERROR (1 << 5)
949 : : # define DP_CEC_TX_ADDRESS_NACK_ERROR (1 << 6)
950 : : # define DP_CEC_TX_DATA_NACK_ERROR (1 << 7)
951 : :
952 : : #define DP_CEC_LOGICAL_ADDRESS_MASK 0x300E /* 0x300F word */
953 : : # define DP_CEC_LOGICAL_ADDRESS_0 (1 << 0)
954 : : # define DP_CEC_LOGICAL_ADDRESS_1 (1 << 1)
955 : : # define DP_CEC_LOGICAL_ADDRESS_2 (1 << 2)
956 : : # define DP_CEC_LOGICAL_ADDRESS_3 (1 << 3)
957 : : # define DP_CEC_LOGICAL_ADDRESS_4 (1 << 4)
958 : : # define DP_CEC_LOGICAL_ADDRESS_5 (1 << 5)
959 : : # define DP_CEC_LOGICAL_ADDRESS_6 (1 << 6)
960 : : # define DP_CEC_LOGICAL_ADDRESS_7 (1 << 7)
961 : : #define DP_CEC_LOGICAL_ADDRESS_MASK_2 0x300F /* 0x300E word */
962 : : # define DP_CEC_LOGICAL_ADDRESS_8 (1 << 0)
963 : : # define DP_CEC_LOGICAL_ADDRESS_9 (1 << 1)
964 : : # define DP_CEC_LOGICAL_ADDRESS_10 (1 << 2)
965 : : # define DP_CEC_LOGICAL_ADDRESS_11 (1 << 3)
966 : : # define DP_CEC_LOGICAL_ADDRESS_12 (1 << 4)
967 : : # define DP_CEC_LOGICAL_ADDRESS_13 (1 << 5)
968 : : # define DP_CEC_LOGICAL_ADDRESS_14 (1 << 6)
969 : : # define DP_CEC_LOGICAL_ADDRESS_15 (1 << 7)
970 : :
971 : : #define DP_CEC_RX_MESSAGE_BUFFER 0x3010
972 : : #define DP_CEC_TX_MESSAGE_BUFFER 0x3020
973 : : #define DP_CEC_MESSAGE_BUFFER_LENGTH 0x10
974 : :
975 : : #define DP_AUX_HDCP_BKSV 0x68000
976 : : #define DP_AUX_HDCP_RI_PRIME 0x68005
977 : : #define DP_AUX_HDCP_AKSV 0x68007
978 : : #define DP_AUX_HDCP_AN 0x6800C
979 : : #define DP_AUX_HDCP_V_PRIME(h) (0x68014 + h * 4)
980 : : #define DP_AUX_HDCP_BCAPS 0x68028
981 : : # define DP_BCAPS_REPEATER_PRESENT BIT(1)
982 : : # define DP_BCAPS_HDCP_CAPABLE BIT(0)
983 : : #define DP_AUX_HDCP_BSTATUS 0x68029
984 : : # define DP_BSTATUS_REAUTH_REQ BIT(3)
985 : : # define DP_BSTATUS_LINK_FAILURE BIT(2)
986 : : # define DP_BSTATUS_R0_PRIME_READY BIT(1)
987 : : # define DP_BSTATUS_READY BIT(0)
988 : : #define DP_AUX_HDCP_BINFO 0x6802A
989 : : #define DP_AUX_HDCP_KSV_FIFO 0x6802C
990 : : #define DP_AUX_HDCP_AINFO 0x6803B
991 : :
992 : : /* DP HDCP2.2 parameter offsets in DPCD address space */
993 : : #define DP_HDCP_2_2_REG_RTX_OFFSET 0x69000
994 : : #define DP_HDCP_2_2_REG_TXCAPS_OFFSET 0x69008
995 : : #define DP_HDCP_2_2_REG_CERT_RX_OFFSET 0x6900B
996 : : #define DP_HDCP_2_2_REG_RRX_OFFSET 0x69215
997 : : #define DP_HDCP_2_2_REG_RX_CAPS_OFFSET 0x6921D
998 : : #define DP_HDCP_2_2_REG_EKPUB_KM_OFFSET 0x69220
999 : : #define DP_HDCP_2_2_REG_EKH_KM_WR_OFFSET 0x692A0
1000 : : #define DP_HDCP_2_2_REG_M_OFFSET 0x692B0
1001 : : #define DP_HDCP_2_2_REG_HPRIME_OFFSET 0x692C0
1002 : : #define DP_HDCP_2_2_REG_EKH_KM_RD_OFFSET 0x692E0
1003 : : #define DP_HDCP_2_2_REG_RN_OFFSET 0x692F0
1004 : : #define DP_HDCP_2_2_REG_LPRIME_OFFSET 0x692F8
1005 : : #define DP_HDCP_2_2_REG_EDKEY_KS_OFFSET 0x69318
1006 : : #define DP_HDCP_2_2_REG_RIV_OFFSET 0x69328
1007 : : #define DP_HDCP_2_2_REG_RXINFO_OFFSET 0x69330
1008 : : #define DP_HDCP_2_2_REG_SEQ_NUM_V_OFFSET 0x69332
1009 : : #define DP_HDCP_2_2_REG_VPRIME_OFFSET 0x69335
1010 : : #define DP_HDCP_2_2_REG_RECV_ID_LIST_OFFSET 0x69345
1011 : : #define DP_HDCP_2_2_REG_V_OFFSET 0x693E0
1012 : : #define DP_HDCP_2_2_REG_SEQ_NUM_M_OFFSET 0x693F0
1013 : : #define DP_HDCP_2_2_REG_K_OFFSET 0x693F3
1014 : : #define DP_HDCP_2_2_REG_STREAM_ID_TYPE_OFFSET 0x693F5
1015 : : #define DP_HDCP_2_2_REG_MPRIME_OFFSET 0x69473
1016 : : #define DP_HDCP_2_2_REG_RXSTATUS_OFFSET 0x69493
1017 : : #define DP_HDCP_2_2_REG_STREAM_TYPE_OFFSET 0x69494
1018 : : #define DP_HDCP_2_2_REG_DBG_OFFSET 0x69518
1019 : :
1020 : : /* Link Training (LT)-tunable PHY Repeaters */
1021 : : #define DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV 0xf0000 /* 1.3 */
1022 : : #define DP_MAX_LINK_RATE_PHY_REPEATER 0xf0001 /* 1.4a */
1023 : : #define DP_PHY_REPEATER_CNT 0xf0002 /* 1.3 */
1024 : : #define DP_PHY_REPEATER_MODE 0xf0003 /* 1.3 */
1025 : : #define DP_MAX_LANE_COUNT_PHY_REPEATER 0xf0004 /* 1.4a */
1026 : : #define DP_Repeater_FEC_CAPABILITY 0xf0004 /* 1.4 */
1027 : : #define DP_PHY_REPEATER_EXTENDED_WAIT_TIMEOUT 0xf0005 /* 1.4a */
1028 : : #define DP_TRAINING_PATTERN_SET_PHY_REPEATER1 0xf0010 /* 1.3 */
1029 : : #define DP_TRAINING_LANE0_SET_PHY_REPEATER1 0xf0011 /* 1.3 */
1030 : : #define DP_TRAINING_LANE1_SET_PHY_REPEATER1 0xf0012 /* 1.3 */
1031 : : #define DP_TRAINING_LANE2_SET_PHY_REPEATER1 0xf0013 /* 1.3 */
1032 : : #define DP_TRAINING_LANE3_SET_PHY_REPEATER1 0xf0014 /* 1.3 */
1033 : : #define DP_TRAINING_AUX_RD_INTERVAL_PHY_REPEATER1 0xf0020 /* 1.4a */
1034 : : #define DP_TRANSMITTER_CAPABILITY_PHY_REPEATER1 0xf0021 /* 1.4a */
1035 : : #define DP_LANE0_1_STATUS_PHY_REPEATER1 0xf0030 /* 1.3 */
1036 : : #define DP_LANE2_3_STATUS_PHY_REPEATER1 0xf0031 /* 1.3 */
1037 : : #define DP_LANE_ALIGN_STATUS_UPDATED_PHY_REPEATER1 0xf0032 /* 1.3 */
1038 : : #define DP_ADJUST_REQUEST_LANE0_1_PHY_REPEATER1 0xf0033 /* 1.3 */
1039 : : #define DP_ADJUST_REQUEST_LANE2_3_PHY_REPEATER1 0xf0034 /* 1.3 */
1040 : : #define DP_SYMBOL_ERROR_COUNT_LANE0_PHY_REPEATER1 0xf0035 /* 1.3 */
1041 : : #define DP_SYMBOL_ERROR_COUNT_LANE1_PHY_REPEATER1 0xf0037 /* 1.3 */
1042 : : #define DP_SYMBOL_ERROR_COUNT_LANE2_PHY_REPEATER1 0xf0039 /* 1.3 */
1043 : : #define DP_SYMBOL_ERROR_COUNT_LANE3_PHY_REPEATER1 0xf003b /* 1.3 */
1044 : : #define DP_FEC_STATUS_PHY_REPEATER1 0xf0290 /* 1.4 */
1045 : : #define DP_FEC_ERROR_COUNT_PHY_REPEATER1 0xf0291 /* 1.4 */
1046 : : #define DP_FEC_CAPABILITY_PHY_REPEATER1 0xf0294 /* 1.4a */
1047 : :
1048 : : /* Repeater modes */
1049 : : #define DP_PHY_REPEATER_MODE_TRANSPARENT 0x55 /* 1.3 */
1050 : : #define DP_PHY_REPEATER_MODE_NON_TRANSPARENT 0xaa /* 1.3 */
1051 : :
1052 : : /* DP HDCP message start offsets in DPCD address space */
1053 : : #define DP_HDCP_2_2_AKE_INIT_OFFSET DP_HDCP_2_2_REG_RTX_OFFSET
1054 : : #define DP_HDCP_2_2_AKE_SEND_CERT_OFFSET DP_HDCP_2_2_REG_CERT_RX_OFFSET
1055 : : #define DP_HDCP_2_2_AKE_NO_STORED_KM_OFFSET DP_HDCP_2_2_REG_EKPUB_KM_OFFSET
1056 : : #define DP_HDCP_2_2_AKE_STORED_KM_OFFSET DP_HDCP_2_2_REG_EKH_KM_WR_OFFSET
1057 : : #define DP_HDCP_2_2_AKE_SEND_HPRIME_OFFSET DP_HDCP_2_2_REG_HPRIME_OFFSET
1058 : : #define DP_HDCP_2_2_AKE_SEND_PAIRING_INFO_OFFSET \
1059 : : DP_HDCP_2_2_REG_EKH_KM_RD_OFFSET
1060 : : #define DP_HDCP_2_2_LC_INIT_OFFSET DP_HDCP_2_2_REG_RN_OFFSET
1061 : : #define DP_HDCP_2_2_LC_SEND_LPRIME_OFFSET DP_HDCP_2_2_REG_LPRIME_OFFSET
1062 : : #define DP_HDCP_2_2_SKE_SEND_EKS_OFFSET DP_HDCP_2_2_REG_EDKEY_KS_OFFSET
1063 : : #define DP_HDCP_2_2_REP_SEND_RECVID_LIST_OFFSET DP_HDCP_2_2_REG_RXINFO_OFFSET
1064 : : #define DP_HDCP_2_2_REP_SEND_ACK_OFFSET DP_HDCP_2_2_REG_V_OFFSET
1065 : : #define DP_HDCP_2_2_REP_STREAM_MANAGE_OFFSET DP_HDCP_2_2_REG_SEQ_NUM_M_OFFSET
1066 : : #define DP_HDCP_2_2_REP_STREAM_READY_OFFSET DP_HDCP_2_2_REG_MPRIME_OFFSET
1067 : :
1068 : : #define HDCP_2_2_DP_RXSTATUS_LEN 1
1069 : : #define HDCP_2_2_DP_RXSTATUS_READY(x) ((x) & BIT(0))
1070 : : #define HDCP_2_2_DP_RXSTATUS_H_PRIME(x) ((x) & BIT(1))
1071 : : #define HDCP_2_2_DP_RXSTATUS_PAIRING(x) ((x) & BIT(2))
1072 : : #define HDCP_2_2_DP_RXSTATUS_REAUTH_REQ(x) ((x) & BIT(3))
1073 : : #define HDCP_2_2_DP_RXSTATUS_LINK_FAILED(x) ((x) & BIT(4))
1074 : :
1075 : : /* DP 1.2 Sideband message defines */
1076 : : /* peer device type - DP 1.2a Table 2-92 */
1077 : : #define DP_PEER_DEVICE_NONE 0x0
1078 : : #define DP_PEER_DEVICE_SOURCE_OR_SST 0x1
1079 : : #define DP_PEER_DEVICE_MST_BRANCHING 0x2
1080 : : #define DP_PEER_DEVICE_SST_SINK 0x3
1081 : : #define DP_PEER_DEVICE_DP_LEGACY_CONV 0x4
1082 : :
1083 : : /* DP 1.2 MST sideband request names DP 1.2a Table 2-80 */
1084 : : #define DP_GET_MSG_TRANSACTION_VERSION 0x00 /* DP 1.3 */
1085 : : #define DP_LINK_ADDRESS 0x01
1086 : : #define DP_CONNECTION_STATUS_NOTIFY 0x02
1087 : : #define DP_ENUM_PATH_RESOURCES 0x10
1088 : : #define DP_ALLOCATE_PAYLOAD 0x11
1089 : : #define DP_QUERY_PAYLOAD 0x12
1090 : : #define DP_RESOURCE_STATUS_NOTIFY 0x13
1091 : : #define DP_CLEAR_PAYLOAD_ID_TABLE 0x14
1092 : : #define DP_REMOTE_DPCD_READ 0x20
1093 : : #define DP_REMOTE_DPCD_WRITE 0x21
1094 : : #define DP_REMOTE_I2C_READ 0x22
1095 : : #define DP_REMOTE_I2C_WRITE 0x23
1096 : : #define DP_POWER_UP_PHY 0x24
1097 : : #define DP_POWER_DOWN_PHY 0x25
1098 : : #define DP_SINK_EVENT_NOTIFY 0x30
1099 : : #define DP_QUERY_STREAM_ENC_STATUS 0x38
1100 : :
1101 : : /* DP 1.2 MST sideband reply types */
1102 : : #define DP_SIDEBAND_REPLY_ACK 0x00
1103 : : #define DP_SIDEBAND_REPLY_NAK 0x01
1104 : :
1105 : : /* DP 1.2 MST sideband nak reasons - table 2.84 */
1106 : : #define DP_NAK_WRITE_FAILURE 0x01
1107 : : #define DP_NAK_INVALID_READ 0x02
1108 : : #define DP_NAK_CRC_FAILURE 0x03
1109 : : #define DP_NAK_BAD_PARAM 0x04
1110 : : #define DP_NAK_DEFER 0x05
1111 : : #define DP_NAK_LINK_FAILURE 0x06
1112 : : #define DP_NAK_NO_RESOURCES 0x07
1113 : : #define DP_NAK_DPCD_FAIL 0x08
1114 : : #define DP_NAK_I2C_NAK 0x09
1115 : : #define DP_NAK_ALLOCATE_FAIL 0x0a
1116 : :
1117 : : #define MODE_I2C_START 1
1118 : : #define MODE_I2C_WRITE 2
1119 : : #define MODE_I2C_READ 4
1120 : : #define MODE_I2C_STOP 8
1121 : :
1122 : : /* DP 1.2 MST PORTs - Section 2.5.1 v1.2a spec */
1123 : : #define DP_MST_PHYSICAL_PORT_0 0
1124 : : #define DP_MST_LOGICAL_PORT_0 8
1125 : :
1126 : : #define DP_LINK_STATUS_SIZE 6
1127 : : bool drm_dp_channel_eq_ok(const u8 link_status[DP_LINK_STATUS_SIZE],
1128 : : int lane_count);
1129 : : bool drm_dp_clock_recovery_ok(const u8 link_status[DP_LINK_STATUS_SIZE],
1130 : : int lane_count);
1131 : : u8 drm_dp_get_adjust_request_voltage(const u8 link_status[DP_LINK_STATUS_SIZE],
1132 : : int lane);
1133 : : u8 drm_dp_get_adjust_request_pre_emphasis(const u8 link_status[DP_LINK_STATUS_SIZE],
1134 : : int lane);
1135 : : u8 drm_dp_get_adjust_request_post_cursor(const u8 link_status[DP_LINK_STATUS_SIZE],
1136 : : unsigned int lane);
1137 : :
1138 : : #define DP_BRANCH_OUI_HEADER_SIZE 0xc
1139 : : #define DP_RECEIVER_CAP_SIZE 0xf
1140 : : #define DP_DSC_RECEIVER_CAP_SIZE 0xf
1141 : : #define EDP_PSR_RECEIVER_CAP_SIZE 2
1142 : : #define EDP_DISPLAY_CTL_CAP_SIZE 3
1143 : :
1144 : : void drm_dp_link_train_clock_recovery_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]);
1145 : : void drm_dp_link_train_channel_eq_delay(const u8 dpcd[DP_RECEIVER_CAP_SIZE]);
1146 : :
1147 : : u8 drm_dp_link_rate_to_bw_code(int link_rate);
1148 : : int drm_dp_bw_code_to_link_rate(u8 link_bw);
1149 : :
1150 : : #define DP_SDP_AUDIO_TIMESTAMP 0x01
1151 : : #define DP_SDP_AUDIO_STREAM 0x02
1152 : : #define DP_SDP_EXTENSION 0x04 /* DP 1.1 */
1153 : : #define DP_SDP_AUDIO_COPYMANAGEMENT 0x05 /* DP 1.2 */
1154 : : #define DP_SDP_ISRC 0x06 /* DP 1.2 */
1155 : : #define DP_SDP_VSC 0x07 /* DP 1.2 */
1156 : : #define DP_SDP_CAMERA_GENERIC(i) (0x08 + (i)) /* 0-7, DP 1.3 */
1157 : : #define DP_SDP_PPS 0x10 /* DP 1.4 */
1158 : : #define DP_SDP_VSC_EXT_VESA 0x20 /* DP 1.4 */
1159 : : #define DP_SDP_VSC_EXT_CEA 0x21 /* DP 1.4 */
1160 : : /* 0x80+ CEA-861 infoframe types */
1161 : :
1162 : : /**
1163 : : * struct dp_sdp_header - DP secondary data packet header
1164 : : * @HB0: Secondary Data Packet ID
1165 : : * @HB1: Secondary Data Packet Type
1166 : : * @HB2: Secondary Data Packet Specific header, Byte 0
1167 : : * @HB3: Secondary Data packet Specific header, Byte 1
1168 : : */
1169 : : struct dp_sdp_header {
1170 : : u8 HB0;
1171 : : u8 HB1;
1172 : : u8 HB2;
1173 : : u8 HB3;
1174 : : } __packed;
1175 : :
1176 : : #define EDP_SDP_HEADER_REVISION_MASK 0x1F
1177 : : #define EDP_SDP_HEADER_VALID_PAYLOAD_BYTES 0x1F
1178 : : #define DP_SDP_PPS_HEADER_PAYLOAD_BYTES_MINUS_1 0x7F
1179 : :
1180 : : /**
1181 : : * struct dp_sdp - DP secondary data packet
1182 : : * @sdp_header: DP secondary data packet header
1183 : : * @db: DP secondaray data packet data blocks
1184 : : * VSC SDP Payload for PSR
1185 : : * db[0]: Stereo Interface
1186 : : * db[1]: 0 - PSR State; 1 - Update RFB; 2 - CRC Valid
1187 : : * db[2]: CRC value bits 7:0 of the R or Cr component
1188 : : * db[3]: CRC value bits 15:8 of the R or Cr component
1189 : : * db[4]: CRC value bits 7:0 of the G or Y component
1190 : : * db[5]: CRC value bits 15:8 of the G or Y component
1191 : : * db[6]: CRC value bits 7:0 of the B or Cb component
1192 : : * db[7]: CRC value bits 15:8 of the B or Cb component
1193 : : * db[8] - db[31]: Reserved
1194 : : * VSC SDP Payload for Pixel Encoding/Colorimetry Format
1195 : : * db[0] - db[15]: Reserved
1196 : : * db[16]: Pixel Encoding and Colorimetry Formats
1197 : : * db[17]: Dynamic Range and Component Bit Depth
1198 : : * db[18]: Content Type
1199 : : * db[19] - db[31]: Reserved
1200 : : */
1201 : : struct dp_sdp {
1202 : : struct dp_sdp_header sdp_header;
1203 : : u8 db[32];
1204 : : } __packed;
1205 : :
1206 : : #define EDP_VSC_PSR_STATE_ACTIVE (1<<0)
1207 : : #define EDP_VSC_PSR_UPDATE_RFB (1<<1)
1208 : : #define EDP_VSC_PSR_CRC_VALUES_VALID (1<<2)
1209 : :
1210 : : int drm_dp_psr_setup_time(const u8 psr_cap[EDP_PSR_RECEIVER_CAP_SIZE]);
1211 : :
1212 : : static inline int
1213 : : drm_dp_max_link_rate(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
1214 : : {
1215 : : return drm_dp_bw_code_to_link_rate(dpcd[DP_MAX_LINK_RATE]);
1216 : : }
1217 : :
1218 : : static inline u8
1219 : 0 : drm_dp_max_lane_count(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
1220 : : {
1221 : 0 : return dpcd[DP_MAX_LANE_COUNT] & DP_MAX_LANE_COUNT_MASK;
1222 : : }
1223 : :
1224 : : static inline bool
1225 : 0 : drm_dp_enhanced_frame_cap(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
1226 : : {
1227 [ # # # # : 0 : return dpcd[DP_DPCD_REV] >= 0x11 &&
# # # # #
# # # ]
1228 [ # # # # : 0 : (dpcd[DP_MAX_LANE_COUNT] & DP_ENHANCED_FRAME_CAP);
# # ]
1229 : : }
1230 : :
1231 : : static inline bool
1232 : : drm_dp_fast_training_cap(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
1233 : : {
1234 : : return dpcd[DP_DPCD_REV] >= 0x11 &&
1235 : : (dpcd[DP_MAX_DOWNSPREAD] & DP_NO_AUX_HANDSHAKE_LINK_TRAINING);
1236 : : }
1237 : :
1238 : : static inline bool
1239 : 0 : drm_dp_tps3_supported(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
1240 : : {
1241 [ # # # # ]: 0 : return dpcd[DP_DPCD_REV] >= 0x12 &&
1242 [ # # ]: 0 : dpcd[DP_MAX_LANE_COUNT] & DP_TPS3_SUPPORTED;
1243 : : }
1244 : :
1245 : : static inline bool
1246 : 0 : drm_dp_tps4_supported(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
1247 : : {
1248 [ # # # # ]: 0 : return dpcd[DP_DPCD_REV] >= 0x14 &&
1249 [ # # ]: 0 : dpcd[DP_MAX_DOWNSPREAD] & DP_TPS4_SUPPORTED;
1250 : : }
1251 : :
1252 : : static inline u8
1253 : 0 : drm_dp_training_pattern_mask(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
1254 : : {
1255 [ # # ]: 0 : return (dpcd[DP_DPCD_REV] >= 0x14) ? DP_TRAINING_PATTERN_MASK_1_4 :
1256 : : DP_TRAINING_PATTERN_MASK;
1257 : : }
1258 : :
1259 : : static inline bool
1260 : 0 : drm_dp_is_branch(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
1261 : : {
1262 [ # # # # ]: 0 : return dpcd[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT;
1263 : : }
1264 : :
1265 : : /* DP/eDP DSC support */
1266 : : u8 drm_dp_dsc_sink_max_slice_count(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE],
1267 : : bool is_edp);
1268 : : u8 drm_dp_dsc_sink_line_buf_depth(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE]);
1269 : : int drm_dp_dsc_sink_supported_input_bpcs(const u8 dsc_dpc[DP_DSC_RECEIVER_CAP_SIZE],
1270 : : u8 dsc_bpc[3]);
1271 : :
1272 : : static inline bool
1273 : 0 : drm_dp_sink_supports_dsc(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
1274 : : {
1275 [ # # # # ]: 0 : return dsc_dpcd[DP_DSC_SUPPORT - DP_DSC_SUPPORT] &
1276 : : DP_DSC_DECOMPRESSION_IS_SUPPORTED;
1277 : : }
1278 : :
1279 : : static inline u16
1280 : 0 : drm_edp_dsc_sink_output_bpp(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
1281 : : {
1282 : 0 : return dsc_dpcd[DP_DSC_MAX_BITS_PER_PIXEL_LOW - DP_DSC_SUPPORT] |
1283 : : (dsc_dpcd[DP_DSC_MAX_BITS_PER_PIXEL_HI - DP_DSC_SUPPORT] &
1284 : : DP_DSC_MAX_BITS_PER_PIXEL_HI_MASK <<
1285 : : DP_DSC_MAX_BITS_PER_PIXEL_HI_SHIFT);
1286 : : }
1287 : :
1288 : : static inline u32
1289 : 0 : drm_dp_dsc_sink_max_slice_width(const u8 dsc_dpcd[DP_DSC_RECEIVER_CAP_SIZE])
1290 : : {
1291 : : /* Max Slicewidth = Number of Pixels * 320 */
1292 [ # # ]: 0 : return dsc_dpcd[DP_DSC_MAX_SLICE_WIDTH - DP_DSC_SUPPORT] *
1293 : : DP_DSC_SLICE_WIDTH_MULTIPLIER;
1294 : : }
1295 : :
1296 : : /* Forward Error Correction Support on DP 1.4 */
1297 : : static inline bool
1298 : 0 : drm_dp_sink_supports_fec(const u8 fec_capable)
1299 : : {
1300 [ # # ]: 0 : return fec_capable & DP_FEC_CAPABLE;
1301 : : }
1302 : :
1303 : : static inline bool
1304 : : drm_dp_channel_coding_supported(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
1305 : : {
1306 : : return dpcd[DP_MAIN_LINK_CHANNEL_CODING] & DP_CAP_ANSI_8B10B;
1307 : : }
1308 : :
1309 : : static inline bool
1310 : : drm_dp_alternate_scrambler_reset_cap(const u8 dpcd[DP_RECEIVER_CAP_SIZE])
1311 : : {
1312 : : return dpcd[DP_EDP_CONFIGURATION_CAP] &
1313 : : DP_ALTERNATE_SCRAMBLER_RESET_CAP;
1314 : : }
1315 : :
1316 : : /*
1317 : : * DisplayPort AUX channel
1318 : : */
1319 : :
1320 : : /**
1321 : : * struct drm_dp_aux_msg - DisplayPort AUX channel transaction
1322 : : * @address: address of the (first) register to access
1323 : : * @request: contains the type of transaction (see DP_AUX_* macros)
1324 : : * @reply: upon completion, contains the reply type of the transaction
1325 : : * @buffer: pointer to a transmission or reception buffer
1326 : : * @size: size of @buffer
1327 : : */
1328 : : struct drm_dp_aux_msg {
1329 : : unsigned int address;
1330 : : u8 request;
1331 : : u8 reply;
1332 : : void *buffer;
1333 : : size_t size;
1334 : : };
1335 : :
1336 : : struct cec_adapter;
1337 : : struct edid;
1338 : : struct drm_connector;
1339 : :
1340 : : /**
1341 : : * struct drm_dp_aux_cec - DisplayPort CEC-Tunneling-over-AUX
1342 : : * @lock: mutex protecting this struct
1343 : : * @adap: the CEC adapter for CEC-Tunneling-over-AUX support.
1344 : : * @connector: the connector this CEC adapter is associated with
1345 : : * @unregister_work: unregister the CEC adapter
1346 : : */
1347 : : struct drm_dp_aux_cec {
1348 : : struct mutex lock;
1349 : : struct cec_adapter *adap;
1350 : : struct drm_connector *connector;
1351 : : struct delayed_work unregister_work;
1352 : : };
1353 : :
1354 : : /**
1355 : : * struct drm_dp_aux - DisplayPort AUX channel
1356 : : * @name: user-visible name of this AUX channel and the I2C-over-AUX adapter
1357 : : * @ddc: I2C adapter that can be used for I2C-over-AUX communication
1358 : : * @dev: pointer to struct device that is the parent for this AUX channel
1359 : : * @crtc: backpointer to the crtc that is currently using this AUX channel
1360 : : * @hw_mutex: internal mutex used for locking transfers
1361 : : * @crc_work: worker that captures CRCs for each frame
1362 : : * @crc_count: counter of captured frame CRCs
1363 : : * @transfer: transfers a message representing a single AUX transaction
1364 : : *
1365 : : * The .dev field should be set to a pointer to the device that implements
1366 : : * the AUX channel.
1367 : : *
1368 : : * The .name field may be used to specify the name of the I2C adapter. If set to
1369 : : * NULL, dev_name() of .dev will be used.
1370 : : *
1371 : : * Drivers provide a hardware-specific implementation of how transactions
1372 : : * are executed via the .transfer() function. A pointer to a drm_dp_aux_msg
1373 : : * structure describing the transaction is passed into this function. Upon
1374 : : * success, the implementation should return the number of payload bytes
1375 : : * that were transferred, or a negative error-code on failure. Helpers
1376 : : * propagate errors from the .transfer() function, with the exception of
1377 : : * the -EBUSY error, which causes a transaction to be retried. On a short,
1378 : : * helpers will return -EPROTO to make it simpler to check for failure.
1379 : : *
1380 : : * An AUX channel can also be used to transport I2C messages to a sink. A
1381 : : * typical application of that is to access an EDID that's present in the
1382 : : * sink device. The .transfer() function can also be used to execute such
1383 : : * transactions. The drm_dp_aux_register() function registers an I2C
1384 : : * adapter that can be passed to drm_probe_ddc(). Upon removal, drivers
1385 : : * should call drm_dp_aux_unregister() to remove the I2C adapter.
1386 : : * The I2C adapter uses long transfers by default; if a partial response is
1387 : : * received, the adapter will drop down to the size given by the partial
1388 : : * response for this transaction only.
1389 : : *
1390 : : * Note that the aux helper code assumes that the .transfer() function
1391 : : * only modifies the reply field of the drm_dp_aux_msg structure. The
1392 : : * retry logic and i2c helpers assume this is the case.
1393 : : */
1394 : : struct drm_dp_aux {
1395 : : const char *name;
1396 : : struct i2c_adapter ddc;
1397 : : struct device *dev;
1398 : : struct drm_crtc *crtc;
1399 : : struct mutex hw_mutex;
1400 : : struct work_struct crc_work;
1401 : : u8 crc_count;
1402 : : ssize_t (*transfer)(struct drm_dp_aux *aux,
1403 : : struct drm_dp_aux_msg *msg);
1404 : : /**
1405 : : * @i2c_nack_count: Counts I2C NACKs, used for DP validation.
1406 : : */
1407 : : unsigned i2c_nack_count;
1408 : : /**
1409 : : * @i2c_defer_count: Counts I2C DEFERs, used for DP validation.
1410 : : */
1411 : : unsigned i2c_defer_count;
1412 : : /**
1413 : : * @cec: struct containing fields used for CEC-Tunneling-over-AUX.
1414 : : */
1415 : : struct drm_dp_aux_cec cec;
1416 : : /**
1417 : : * @is_remote: Is this AUX CH actually using sideband messaging.
1418 : : */
1419 : : bool is_remote;
1420 : : };
1421 : :
1422 : : ssize_t drm_dp_dpcd_read(struct drm_dp_aux *aux, unsigned int offset,
1423 : : void *buffer, size_t size);
1424 : : ssize_t drm_dp_dpcd_write(struct drm_dp_aux *aux, unsigned int offset,
1425 : : void *buffer, size_t size);
1426 : :
1427 : : /**
1428 : : * drm_dp_dpcd_readb() - read a single byte from the DPCD
1429 : : * @aux: DisplayPort AUX channel
1430 : : * @offset: address of the register to read
1431 : : * @valuep: location where the value of the register will be stored
1432 : : *
1433 : : * Returns the number of bytes transferred (1) on success, or a negative
1434 : : * error code on failure.
1435 : : */
1436 : 0 : static inline ssize_t drm_dp_dpcd_readb(struct drm_dp_aux *aux,
1437 : : unsigned int offset, u8 *valuep)
1438 : : {
1439 : 0 : return drm_dp_dpcd_read(aux, offset, valuep, 1);
1440 : : }
1441 : :
1442 : : /**
1443 : : * drm_dp_dpcd_writeb() - write a single byte to the DPCD
1444 : : * @aux: DisplayPort AUX channel
1445 : : * @offset: address of the register to write
1446 : : * @value: value to write to the register
1447 : : *
1448 : : * Returns the number of bytes transferred (1) on success, or a negative
1449 : : * error code on failure.
1450 : : */
1451 : 0 : static inline ssize_t drm_dp_dpcd_writeb(struct drm_dp_aux *aux,
1452 : : unsigned int offset, u8 value)
1453 : : {
1454 : 0 : return drm_dp_dpcd_write(aux, offset, &value, 1);
1455 : : }
1456 : :
1457 : : int drm_dp_dpcd_read_link_status(struct drm_dp_aux *aux,
1458 : : u8 status[DP_LINK_STATUS_SIZE]);
1459 : :
1460 : : int drm_dp_downstream_max_clock(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
1461 : : const u8 port_cap[4]);
1462 : : int drm_dp_downstream_max_bpc(const u8 dpcd[DP_RECEIVER_CAP_SIZE],
1463 : : const u8 port_cap[4]);
1464 : : int drm_dp_downstream_id(struct drm_dp_aux *aux, char id[6]);
1465 : : void drm_dp_downstream_debug(struct seq_file *m, const u8 dpcd[DP_RECEIVER_CAP_SIZE],
1466 : : const u8 port_cap[4], struct drm_dp_aux *aux);
1467 : :
1468 : : void drm_dp_remote_aux_init(struct drm_dp_aux *aux);
1469 : : void drm_dp_aux_init(struct drm_dp_aux *aux);
1470 : : int drm_dp_aux_register(struct drm_dp_aux *aux);
1471 : : void drm_dp_aux_unregister(struct drm_dp_aux *aux);
1472 : :
1473 : : int drm_dp_start_crc(struct drm_dp_aux *aux, struct drm_crtc *crtc);
1474 : : int drm_dp_stop_crc(struct drm_dp_aux *aux);
1475 : :
1476 : : struct drm_dp_dpcd_ident {
1477 : : u8 oui[3];
1478 : : u8 device_id[6];
1479 : : u8 hw_rev;
1480 : : u8 sw_major_rev;
1481 : : u8 sw_minor_rev;
1482 : : } __packed;
1483 : :
1484 : : /**
1485 : : * struct drm_dp_desc - DP branch/sink device descriptor
1486 : : * @ident: DP device identification from DPCD 0x400 (sink) or 0x500 (branch).
1487 : : * @quirks: Quirks; use drm_dp_has_quirk() to query for the quirks.
1488 : : */
1489 : : struct drm_dp_desc {
1490 : : struct drm_dp_dpcd_ident ident;
1491 : : u32 quirks;
1492 : : };
1493 : :
1494 : : int drm_dp_read_desc(struct drm_dp_aux *aux, struct drm_dp_desc *desc,
1495 : : bool is_branch);
1496 : :
1497 : : /**
1498 : : * enum drm_dp_quirk - Display Port sink/branch device specific quirks
1499 : : *
1500 : : * Display Port sink and branch devices in the wild have a variety of bugs, try
1501 : : * to collect them here. The quirks are shared, but it's up to the drivers to
1502 : : * implement workarounds for them.
1503 : : */
1504 : : enum drm_dp_quirk {
1505 : : /**
1506 : : * @DP_DPCD_QUIRK_CONSTANT_N:
1507 : : *
1508 : : * The device requires main link attributes Mvid and Nvid to be limited
1509 : : * to 16 bits. So will give a constant value (0x8000) for compatability.
1510 : : */
1511 : : DP_DPCD_QUIRK_CONSTANT_N,
1512 : : /**
1513 : : * @DP_DPCD_QUIRK_NO_PSR:
1514 : : *
1515 : : * The device does not support PSR even if reports that it supports or
1516 : : * driver still need to implement proper handling for such device.
1517 : : */
1518 : : DP_DPCD_QUIRK_NO_PSR,
1519 : : /**
1520 : : * @DP_DPCD_QUIRK_NO_SINK_COUNT:
1521 : : *
1522 : : * The device does not set SINK_COUNT to a non-zero value.
1523 : : * The driver should ignore SINK_COUNT during detection.
1524 : : */
1525 : : DP_DPCD_QUIRK_NO_SINK_COUNT,
1526 : : /**
1527 : : * @DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD:
1528 : : *
1529 : : * The device supports MST DSC despite not supporting Virtual DPCD.
1530 : : * The DSC caps can be read from the physical aux instead.
1531 : : */
1532 : : DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD,
1533 : : };
1534 : :
1535 : : /**
1536 : : * drm_dp_has_quirk() - does the DP device have a specific quirk
1537 : : * @desc: Device decriptor filled by drm_dp_read_desc()
1538 : : * @quirk: Quirk to query for
1539 : : *
1540 : : * Return true if DP device identified by @desc has @quirk.
1541 : : */
1542 : : static inline bool
1543 : 0 : drm_dp_has_quirk(const struct drm_dp_desc *desc, enum drm_dp_quirk quirk)
1544 : : {
1545 [ # # # # ]: 0 : return desc->quirks & BIT(quirk);
1546 : : }
1547 : :
1548 : : #ifdef CONFIG_DRM_DP_CEC
1549 : : void drm_dp_cec_irq(struct drm_dp_aux *aux);
1550 : : void drm_dp_cec_register_connector(struct drm_dp_aux *aux,
1551 : : struct drm_connector *connector);
1552 : : void drm_dp_cec_unregister_connector(struct drm_dp_aux *aux);
1553 : : void drm_dp_cec_set_edid(struct drm_dp_aux *aux, const struct edid *edid);
1554 : : void drm_dp_cec_unset_edid(struct drm_dp_aux *aux);
1555 : : #else
1556 : 0 : static inline void drm_dp_cec_irq(struct drm_dp_aux *aux)
1557 : : {
1558 : 0 : }
1559 : :
1560 : : static inline void
1561 : : drm_dp_cec_register_connector(struct drm_dp_aux *aux,
1562 : : struct drm_connector *connector)
1563 : : {
1564 : : }
1565 : :
1566 : 0 : static inline void drm_dp_cec_unregister_connector(struct drm_dp_aux *aux)
1567 : : {
1568 : 0 : }
1569 : :
1570 : 0 : static inline void drm_dp_cec_set_edid(struct drm_dp_aux *aux,
1571 : : const struct edid *edid)
1572 : : {
1573 : 0 : }
1574 : :
1575 : 0 : static inline void drm_dp_cec_unset_edid(struct drm_dp_aux *aux)
1576 : : {
1577 : 0 : }
1578 : :
1579 : : #endif
1580 : :
1581 : : #endif /* _DRM_DP_HELPER_H_ */
|