aboutsummaryrefslogtreecommitdiff
path: root/include/drm/bridge/mhl.h
blob: d96626a0e3fac990ad39a2db7ae71fe858f2494b (plain)
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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Defines for Mobile High-Definition Link (MHL) interface
 *
 * Copyright (C) 2015, Samsung Electronics, Co., Ltd.
 * Andrzej Hajda <a.hajda@samsung.com>
 *
 * Based on MHL driver for Android devices.
 * Copyright (C) 2013-2014 Silicon Image, Inc.
 */

#ifndef __MHL_H__
#define __MHL_H__

#include <linux/types.h>

/* Device Capabilities Registers */
enum {
	MHL_DCAP_DEV_STATE,
	MHL_DCAP_MHL_VERSION,
	MHL_DCAP_CAT,
	MHL_DCAP_ADOPTER_ID_H,
	MHL_DCAP_ADOPTER_ID_L,
	MHL_DCAP_VID_LINK_MODE,
	MHL_DCAP_AUD_LINK_MODE,
	MHL_DCAP_VIDEO_TYPE,
	MHL_DCAP_LOG_DEV_MAP,
	MHL_DCAP_BANDWIDTH,
	MHL_DCAP_FEATURE_FLAG,
	MHL_DCAP_DEVICE_ID_H,
	MHL_DCAP_DEVICE_ID_L,
	MHL_DCAP_SCRATCHPAD_SIZE,
	MHL_DCAP_INT_STAT_SIZE,
	MHL_DCAP_RESERVED,
	MHL_DCAP_SIZE
};

#define MHL_DCAP_CAT_SINK			0x01
#define MHL_DCAP_CAT_SOURCE			0x02
#define MHL_DCAP_CAT_POWER			0x10
#define MHL_DCAP_CAT_PLIM(x)			((x) << 5)

#define MHL_DCAP_VID_LINK_RGB444		0x01
#define MHL_DCAP_VID_LINK_YCBCR444		0x02
#define MHL_DCAP_VID_LINK_YCBCR422		0x04
#define MHL_DCAP_VID_LINK_PPIXEL		0x08
#define MHL_DCAP_VID_LINK_ISLANDS		0x10
#define MHL_DCAP_VID_LINK_VGA			0x20
#define MHL_DCAP_VID_LINK_16BPP			0x40

#define MHL_DCAP_AUD_LINK_2CH			0x01
#define MHL_DCAP_AUD_LINK_8CH			0x02

#define MHL_DCAP_VT_GRAPHICS			0x00
#define MHL_DCAP_VT_PHOTO			0x02
#define MHL_DCAP_VT_CINEMA			0x04
#define MHL_DCAP_VT_GAMES			0x08
#define MHL_DCAP_SUPP_VT			0x80

#define MHL_DCAP_LD_DISPLAY			0x01
#define MHL_DCAP_LD_VIDEO			0x02
#define MHL_DCAP_LD_AUDIO			0x04
#define MHL_DCAP_LD_MEDIA			0x08
#define MHL_DCAP_LD_TUNER			0x10
#define MHL_DCAP_LD_RECORD			0x20
#define MHL_DCAP_LD_SPEAKER			0x40
#define MHL_DCAP_LD_GUI				0x80
#define MHL_DCAP_LD_ALL				0xFF

#define MHL_DCAP_FEATURE_RCP_SUPPORT		0x01
#define MHL_DCAP_FEATURE_RAP_SUPPORT		0x02
#define MHL_DCAP_FEATURE_SP_SUPPORT		0x04
#define MHL_DCAP_FEATURE_UCP_SEND_SUPPOR	0x08
#define MHL_DCAP_FEATURE_UCP_RECV_SUPPORT	0x10
#define MHL_DCAP_FEATURE_RBP_SUPPORT		0x40

/* Extended Device Capabilities Registers */
enum {
	MHL_XDC_ECBUS_SPEEDS,
	MHL_XDC_TMDS_SPEEDS,
	MHL_XDC_ECBUS_ROLES,
	MHL_XDC_LOG_DEV_MAPX,
	MHL_XDC_SIZE
};

#define MHL_XDC_ECBUS_S_075			0x01
#define MHL_XDC_ECBUS_S_8BIT			0x02
#define MHL_XDC_ECBUS_S_12BIT			0x04
#define MHL_XDC_ECBUS_D_150			0x10
#define MHL_XDC_ECBUS_D_8BIT			0x20

#define MHL_XDC_TMDS_000			0x00
#define MHL_XDC_TMDS_150			0x01
#define MHL_XDC_TMDS_300			0x02
#define MHL_XDC_TMDS_600			0x04

/* MHL_XDC_ECBUS_ROLES flags */
#define MHL_XDC_DEV_HOST			0x01
#define MHL_XDC_DEV_DEVICE			0x02
#define MHL_XDC_DEV_CHARGER			0x04
#define MHL_XDC_HID_HOST			0x08
#define MHL_XDC_HID_DEVICE			0x10

/* MHL_XDC_LOG_DEV_MAPX flags */
#define MHL_XDC_LD_PHONE			0x01

/* Device Status Registers */
enum {
	MHL_DST_CONNECTED_RDY,
	MHL_DST_LINK_MODE,
	MHL_DST_VERSION,
	MHL_DST_SIZE
};

/* Offset of DEVSTAT registers */
#define MHL_DST_OFFSET				0x30
#define MHL_DST_REG(name) (MHL_DST_OFFSET + MHL_DST_##name)

#define MHL_DST_CONN_DCAP_RDY			0x01
#define MHL_DST_CONN_XDEVCAPP_SUPP		0x02
#define MHL_DST_CONN_POW_STAT			0x04
#define MHL_DST_CONN_PLIM_STAT_MASK		0x38

#define MHL_DST_LM_CLK_MODE_MASK		0x07
#define MHL_DST_LM_CLK_MODE_PACKED_PIXEL	0x02
#define MHL_DST_LM_CLK_MODE_NORMAL		0x03
#define MHL_DST_LM_PATH_EN_MASK			0x08
#define MHL_DST_LM_PATH_ENABLED			0x08
#define MHL_DST_LM_PATH_DISABLED		0x00
#define MHL_DST_LM_MUTED_MASK			0x10

/* Extended Device Status Registers */
enum {
	MHL_XDS_CURR_ECBUS_MODE,
	MHL_XDS_AVLINK_MODE_STATUS,
	MHL_XDS_AVLINK_MODE_CONTROL,
	MHL_XDS_MULTI_SINK_STATUS,
	MHL_XDS_SIZE
};

/* Offset of XDEVSTAT registers */
#define MHL_XDS_OFFSET				0x90
#define MHL_XDS_REG(name) (MHL_XDS_OFFSET + MHL_XDS_##name)

/* MHL_XDS_REG_CURR_ECBUS_MODE flags */
#define MHL_XDS_SLOT_MODE_8BIT			0x00
#define MHL_XDS_SLOT_MODE_6BIT			0x01
#define MHL_XDS_ECBUS_S				0x04
#define MHL_XDS_ECBUS_D				0x08

#define MHL_XDS_LINK_CLOCK_75MHZ		0x00
#define MHL_XDS_LINK_CLOCK_150MHZ		0x10
#define MHL_XDS_LINK_CLOCK_300MHZ		0x20
#define MHL_XDS_LINK_CLOCK_600MHZ		0x30

#define MHL_XDS_LINK_STATUS_NO_SIGNAL		0x00
#define MHL_XDS_LINK_STATUS_CRU_LOCKED		0x01
#define MHL_XDS_LINK_STATUS_TMDS_NORMAL		0x02
#define MHL_XDS_LINK_STATUS_TMDS_RESERVED	0x03

#define MHL_XDS_LINK_RATE_1_5_GBPS		0x00
#define MHL_XDS_LINK_RATE_3_0_GBPS		0x01
#define MHL_XDS_LINK_RATE_6_0_GBPS		0x02
#define MHL_XDS_ATT_CAPABLE			0x08

#define MHL_XDS_SINK_STATUS_1_HPD_LOW		0x00
#define MHL_XDS_SINK_STATUS_1_HPD_HIGH		0x01
#define MHL_XDS_SINK_STATUS_2_HPD_LOW		0x00
#define MHL_XDS_SINK_STATUS_2_HPD_HIGH		0x04
#define MHL_XDS_SINK_STATUS_3_HPD_LOW		0x00
#define MHL_XDS_SINK_STATUS_3_HPD_HIGH		0x10
#define MHL_XDS_SINK_STATUS_4_HPD_LOW		0x00
#define MHL_XDS_SINK_STATUS_4_HPD_HIGH		0x40

/* Interrupt Registers */
enum {
	MHL_INT_RCHANGE,
	MHL_INT_DCHANGE,
	MHL_INT_SIZE
};

/* Offset of DEVSTAT registers */
#define MHL_INT_OFFSET				0x20
#define MHL_INT_REG(name) (MHL_INT_OFFSET + MHL_INT_##name)

#define	MHL_INT_RC_DCAP_CHG			0x01
#define MHL_INT_RC_DSCR_CHG			0x02
#define MHL_INT_RC_REQ_WRT			0x04
#define MHL_INT_RC_GRT_WRT			0x08
#define MHL_INT_RC_3D_REQ			0x10
#define MHL_INT_RC_FEAT_REQ			0x20
#define MHL_INT_RC_FEAT_COMPLETE		0x40

#define MHL_INT_DC_EDID_CHG			0x02

enum {
	MHL_ACK = 0x33, /* Command or Data byte acknowledge */
	MHL_NACK = 0x34, /* Command or Data byte not acknowledge */
	MHL_ABORT = 0x35, /* Transaction abort */
	MHL_WRITE_STAT = 0xe0, /* Write one status register */
	MHL_SET_INT = 0x60, /* Write one interrupt register */
	MHL_READ_DEVCAP_REG = 0x61, /* Read one register */
	MHL_GET_STATE = 0x62, /* Read CBUS revision level from follower */
	MHL_GET_VENDOR_ID = 0x63, /* Read vendor ID value from follower */
	MHL_SET_HPD = 0x64, /* Set Hot Plug Detect in follower */
	MHL_CLR_HPD = 0x65, /* Clear Hot Plug Detect in follower */
	MHL_SET_CAP_ID = 0x66, /* Set Capture ID for downstream device */
	MHL_GET_CAP_ID = 0x67, /* Get Capture ID from downstream device */
	MHL_MSC_MSG = 0x68, /* VS command to send RCP sub-commands */
	MHL_GET_SC1_ERRORCODE = 0x69, /* Get Vendor-Specific error code */
	MHL_GET_DDC_ERRORCODE = 0x6A, /* Get DDC channel command error code */
	MHL_GET_MSC_ERRORCODE = 0x6B, /* Get MSC command error code */
	MHL_WRITE_BURST = 0x6C, /* Write 1-16 bytes to responder's scratchpad */
	MHL_GET_SC3_ERRORCODE = 0x6D, /* Get channel 3 command error code */
	MHL_WRITE_XSTAT = 0x70, /* Write one extended status register */
	MHL_READ_XDEVCAP_REG = 0x71, /* Read one extended devcap register */
	/* let the rest of these float, they are software specific */
	MHL_READ_EDID_BLOCK,
	MHL_SEND_3D_REQ_OR_FEAT_REQ,
	MHL_READ_DEVCAP,
	MHL_READ_XDEVCAP
};

/* MSC message types */
enum {
	MHL_MSC_MSG_RCP = 0x10, /* RCP sub-command */
	MHL_MSC_MSG_RCPK = 0x11, /* RCP Acknowledge sub-command */
	MHL_MSC_MSG_RCPE = 0x12, /* RCP Error sub-command */
	MHL_MSC_MSG_RAP = 0x20, /* Mode Change Warning sub-command */
	MHL_MSC_MSG_RAPK = 0x21, /* MCW Acknowledge sub-command */
	MHL_MSC_MSG_RBP = 0x22, /* Remote Button Protocol sub-command */
	MHL_MSC_MSG_RBPK = 0x23, /* RBP Acknowledge sub-command */
	MHL_MSC_MSG_RBPE = 0x24, /* RBP Error sub-command */
	MHL_MSC_MSG_UCP = 0x30, /* UCP sub-command */
	MHL_MSC_MSG_UCPK = 0x31, /* UCP Acknowledge sub-command */
	MHL_MSC_MSG_UCPE = 0x32, /* UCP Error sub-command */
	MHL_MSC_MSG_RUSB = 0x40, /* Request USB host role */
	MHL_MSC_MSG_RUSBK = 0x41, /* Acknowledge request for USB host role */
	MHL_MSC_MSG_RHID = 0x42, /* Request HID host role */
	MHL_MSC_MSG_RHIDK = 0x43, /* Acknowledge request for HID host role */
	MHL_MSC_MSG_ATT = 0x50, /* Request attention sub-command */
	MHL_MSC_MSG_ATTK = 0x51, /* ATT Acknowledge sub-command */
	MHL_MSC_MSG_BIST_TRIGGER = 0x60,
	MHL_MSC_MSG_BIST_REQUEST_STAT = 0x61,
	MHL_MSC_MSG_BIST_READY = 0x62,
	MHL_MSC_MSG_BIST_STOP = 0x63,
};

/* RAP action codes */
#define MHL_RAP_POLL		0x00	/* Just do an ack */
#define MHL_RAP_CONTENT_ON	0x10	/* Turn content stream ON */
#define MHL_RAP_CONTENT_OFF	0x11	/* Turn content stream OFF */
#define MHL_RAP_CBUS_MODE_DOWN	0x20
#define MHL_RAP_CBUS_MODE_UP	0x21

/* RAPK status codes */
#define MHL_RAPK_NO_ERR		0x00	/* RAP action recognized & supported */
#define MHL_RAPK_UNRECOGNIZED	0x01	/* Unknown RAP action code received */
#define MHL_RAPK_UNSUPPORTED	0x02	/* Rcvd RAP action code not supported */
#define MHL_RAPK_BUSY		0x03	/* Responder too busy to respond */

/* Bit masks for RCP messages */
#define MHL_RCP_KEY_RELEASED_MASK	0x80
#define MHL_RCP_KEY_ID_MASK		0x7F

/*
 * Error status codes for RCPE messages
 */
/* No error. (Not allowed in RCPE messages) */
#define MHL_RCPE_STATUS_NO_ERROR		0x00
/* Unsupported/unrecognized key code */
#define MHL_RCPE_STATUS_INEFFECTIVE_KEY_CODE	0x01
/* Responder busy. Initiator may retry message */
#define MHL_RCPE_STATUS_BUSY			0x02

/*
 * Error status codes for RBPE messages
 */
/* No error. (Not allowed in RBPE messages) */
#define MHL_RBPE_STATUS_NO_ERROR		0x00
/* Unsupported/unrecognized button code */
#define MHL_RBPE_STATUS_INEFFECTIVE_BUTTON_CODE	0x01
/* Responder busy. Initiator may retry message */
#define MHL_RBPE_STATUS_BUSY			0x02

/*
 * Error status codes for UCPE messages
 */
/* No error. (Not allowed in UCPE messages) */
#define MHL_UCPE_STATUS_NO_ERROR		0x00
/* Unsupported/unrecognized key code */
#define MHL_UCPE_STATUS_INEFFECTIVE_KEY_CODE	0x01

enum mhl_burst_id {
	MHL_BURST_ID_3D_VIC = 0x10,
	MHL_BURST_ID_3D_DTD = 0x11,
	MHL_BURST_ID_HEV_VIC = 0x20,
	MHL_BURST_ID_HEV_DTDA = 0x21,
	MHL_BURST_ID_HEV_DTDB = 0x22,
	MHL_BURST_ID_VC_ASSIGN = 0x38,
	MHL_BURST_ID_VC_CONFIRM = 0x39,
	MHL_BURST_ID_AUD_DELAY = 0x40,
	MHL_BURST_ID_ADT_BURSTID = 0x41,
	MHL_BURST_ID_BIST_SETUP = 0x51,
	MHL_BURST_ID_BIST_RETURN_STAT = 0x52,
	MHL_BURST_ID_EMSC_SUPPORT = 0x61,
	MHL_BURST_ID_HID_PAYLOAD = 0x62,
	MHL_BURST_ID_BLK_RCV_BUFFER_INFO = 0x63,
	MHL_BURST_ID_BITS_PER_PIXEL_FMT = 0x64,
};

struct mhl_burst_blk_rcv_buffer_info {
	__be16 id;
	__le16 size;
} __packed;

struct mhl3_burst_header {
	__be16 id;
	u8 checksum;
	u8 total_entries;
	u8 sequence_index;
} __packed;

struct mhl_burst_bits_per_pixel_fmt {
	struct mhl3_burst_header hdr;
	u8 num_entries;
	struct {
		u8 stream_id;
		u8 pixel_format;
	} __packed desc[];
} __packed;

struct mhl_burst_emsc_support {
	struct mhl3_burst_header hdr;
	u8 num_entries;
	__be16 burst_id[];
} __packed;

struct mhl_burst_audio_descr {
	struct mhl3_burst_header hdr;
	u8 flags;
	u8 short_desc[9];
} __packed;

/*
 * MHL3 infoframe related definitions
 */

#define MHL3_IEEE_OUI		0x7ca61d
#define MHL3_INFOFRAME_SIZE	15

enum mhl3_video_format {
	MHL3_VIDEO_FORMAT_NONE,
	MHL3_VIDEO_FORMAT_3D,
	MHL3_VIDEO_FORMAT_MULTI_VIEW,
	MHL3_VIDEO_FORMAT_DUAL_3D
};

enum mhl3_3d_format_type {
	MHL3_3D_FORMAT_TYPE_FS, /* frame sequential */
	MHL3_3D_FORMAT_TYPE_TB, /* top-bottom */
	MHL3_3D_FORMAT_TYPE_LR, /* left-right */
	MHL3_3D_FORMAT_TYPE_FS_TB, /* frame sequential, top-bottom */
	MHL3_3D_FORMAT_TYPE_FS_LR, /* frame sequential, left-right */
	MHL3_3D_FORMAT_TYPE_TB_LR /* top-bottom, left-right */
};

struct mhl3_infoframe {
	unsigned char version;
	enum mhl3_video_format video_format;
	enum mhl3_3d_format_type format_type;
	bool sep_audio;
	int hev_format;
	int av_delay;
};

#endif /* __MHL_H__ */