Blame view

include/drm/drm_dp_mst_helper.h 15.9 KB
ad7f8a1f9   Dave Airlie   drm/helper: add D...
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
  /*
   * Copyright © 2014 Red Hat.
   *
   * Permission to use, copy, modify, distribute, and sell this software and its
   * documentation for any purpose is hereby granted without fee, provided that
   * the above copyright notice appear in all copies and that both that copyright
   * notice and this permission notice appear in supporting documentation, and
   * that the name of the copyright holders not be used in advertising or
   * publicity pertaining to distribution of the software without specific,
   * written prior permission.  The copyright holders make no representations
   * about the suitability of this software for any purpose.  It is provided "as
   * is" without express or implied warranty.
   *
   * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
   * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
   * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
   * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
   * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
   * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
   * OF THIS SOFTWARE.
   */
  #ifndef _DRM_DP_MST_HELPER_H_
  #define _DRM_DP_MST_HELPER_H_
  
  #include <linux/types.h>
  #include <drm/drm_dp_helper.h>
  
  struct drm_dp_mst_branch;
  
  /**
32197aab0   Masanari Iida   gpu:drm: Fix typo...
31
   * struct drm_dp_vcpi - Virtual Channel Payload Identifier
ad7f8a1f9   Dave Airlie   drm/helper: add D...
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
   * @vcpi: Virtual channel ID.
   * @pbn: Payload Bandwidth Number for this channel
   * @aligned_pbn: PBN aligned with slot size
   * @num_slots: number of slots for this PBN
   */
  struct drm_dp_vcpi {
  	int vcpi;
  	int pbn;
  	int aligned_pbn;
  	int num_slots;
  };
  
  /**
   * struct drm_dp_mst_port - MST port
   * @kref: reference count for this port.
ad7f8a1f9   Dave Airlie   drm/helper: add D...
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
   * @port_num: port number
   * @input: if this port is an input port.
   * @mcs: message capability status - DP 1.2 spec.
   * @ddps: DisplayPort Device Plug Status - DP 1.2
   * @pdt: Peer Device Type
   * @ldps: Legacy Device Plug Status
   * @dpcd_rev: DPCD revision of device on this port
   * @num_sdp_streams: Number of simultaneous streams
   * @num_sdp_stream_sinks: Number of stream sinks
   * @available_pbn: Available bandwidth for this port.
   * @next: link to next port on this branch device
   * @mstb: branch device attach below this port
   * @aux: i2c aux transport to talk to device connected to this port.
   * @parent: branch device parent of this port
   * @vcpi: Virtual Channel Payload info for this port.
   * @connector: DRM connector this port is connected to.
   * @mgr: topology manager this port lives under.
   *
   * This structure represents an MST port endpoint on a device somewhere
   * in the MST topology.
   */
  struct drm_dp_mst_port {
  	struct kref kref;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  	u8 port_num;
  	bool input;
  	bool mcs;
  	bool ddps;
  	u8 pdt;
  	bool ldps;
  	u8 dpcd_rev;
  	u8 num_sdp_streams;
  	u8 num_sdp_stream_sinks;
  	uint16_t available_pbn;
  	struct list_head next;
  	struct drm_dp_mst_branch *mstb; /* pointer to an mstb if this port has one */
  	struct drm_dp_aux aux; /* i2c bus for this port? */
  	struct drm_dp_mst_branch *parent;
  
  	struct drm_dp_vcpi vcpi;
  	struct drm_connector *connector;
  	struct drm_dp_mst_topology_mgr *mgr;
c6a0aed4d   Dave Airlie   drm/mst: cached E...
88

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
89
90
91
92
93
94
95
96
97
  	/**
  	 * @cached_edid: for DP logical ports - make tiling work by ensuring
  	 * that the EDID for all connectors is read immediately.
  	 */
  	struct edid *cached_edid;
  	/**
  	 * @has_audio: Tracks whether the sink connector to this port is
  	 * audio-capable.
  	 */
ef8f9bea1   Libin Yang   dp/mst: add SDP s...
98
  	bool has_audio;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
  };
  
  /**
   * struct drm_dp_mst_branch - MST branch device.
   * @kref: reference count for this port.
   * @rad: Relative Address to talk to this branch device.
   * @lct: Link count total to talk to this branch device.
   * @num_ports: number of ports on the branch.
   * @msg_slots: one bit per transmitted msg slot.
   * @ports: linked list of ports on this branch.
   * @port_parent: pointer to the port parent, NULL if toplevel.
   * @mgr: topology manager for this branch device.
   * @tx_slots: transmission slots for this device.
   * @last_seqno: last sequence number used to talk to this.
   * @link_address_sent: if a link address message has been sent to this device yet.
5e93b8208   Hersen Wu   drm/dp/mst: move ...
114
115
   * @guid: guid for DP 1.2 branch device. port under this branch can be
   * identified by port #.
ad7f8a1f9   Dave Airlie   drm/helper: add D...
116
117
   *
   * This structure represents an MST branch device, there is one
5e93b8208   Hersen Wu   drm/dp/mst: move ...
118
119
   * primary branch device at the root, along with any other branches connected
   * to downstream port of parent branches.
ad7f8a1f9   Dave Airlie   drm/helper: add D...
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
   */
  struct drm_dp_mst_branch {
  	struct kref kref;
  	u8 rad[8];
  	u8 lct;
  	int num_ports;
  
  	int msg_slots;
  	struct list_head ports;
  
  	/* list of tx ops queue for this port */
  	struct drm_dp_mst_port *port_parent;
  	struct drm_dp_mst_topology_mgr *mgr;
  
  	/* slots are protected by mstb->mgr->qlock */
  	struct drm_dp_sideband_msg_tx *tx_slots[2];
  	int last_seqno;
  	bool link_address_sent;
5e93b8208   Hersen Wu   drm/dp/mst: move ...
138
139
140
  
  	/* global unique identifier to identify branch devices */
  	u8 guid[16];
ad7f8a1f9   Dave Airlie   drm/helper: add D...
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
  };
  
  
  /* sideband msg header - not bit struct */
  struct drm_dp_sideband_msg_hdr {
  	u8 lct;
  	u8 lcr;
  	u8 rad[8];
  	bool broadcast;
  	bool path_msg;
  	u8 msg_len;
  	bool somt;
  	bool eomt;
  	bool seqno;
  };
  
  struct drm_dp_nak_reply {
  	u8 guid[16];
  	u8 reason;
  	u8 nak_data;
  };
  
  struct drm_dp_link_address_ack_reply {
  	u8 guid[16];
  	u8 nports;
  	struct drm_dp_link_addr_reply_port {
  		bool input_port;
  		u8 peer_device_type;
  		u8 port_number;
  		bool mcs;
  		bool ddps;
  		bool legacy_device_plug_status;
  		u8 dpcd_revision;
  		u8 peer_guid[16];
  		u8 num_sdp_streams;
  		u8 num_sdp_stream_sinks;
  	} ports[16];
  };
  
  struct drm_dp_remote_dpcd_read_ack_reply {
  	u8 port_number;
  	u8 num_bytes;
  	u8 bytes[255];
  };
  
  struct drm_dp_remote_dpcd_write_ack_reply {
  	u8 port_number;
  };
  
  struct drm_dp_remote_dpcd_write_nak_reply {
  	u8 port_number;
  	u8 reason;
  	u8 bytes_written_before_failure;
  };
  
  struct drm_dp_remote_i2c_read_ack_reply {
  	u8 port_number;
  	u8 num_bytes;
  	u8 bytes[255];
  };
  
  struct drm_dp_remote_i2c_read_nak_reply {
  	u8 port_number;
  	u8 nak_reason;
  	u8 i2c_nak_transaction;
  };
  
  struct drm_dp_remote_i2c_write_ack_reply {
  	u8 port_number;
  };
  
  
  struct drm_dp_sideband_msg_rx {
  	u8 chunk[48];
  	u8 msg[256];
  	u8 curchunk_len;
  	u8 curchunk_idx; /* chunk we are parsing now */
  	u8 curchunk_hdrlen;
  	u8 curlen; /* total length of the msg */
  	bool have_somt;
  	bool have_eomt;
  	struct drm_dp_sideband_msg_hdr initial_hdr;
  };
ef8f9bea1   Libin Yang   dp/mst: add SDP s...
224
  #define DRM_DP_MAX_SDP_STREAMS 16
ad7f8a1f9   Dave Airlie   drm/helper: add D...
225
226
227
228
229
  struct drm_dp_allocate_payload {
  	u8 port_number;
  	u8 number_sdp_streams;
  	u8 vcpi;
  	u16 pbn;
ef8f9bea1   Libin Yang   dp/mst: add SDP s...
230
  	u8 sdp_stream_sink[DRM_DP_MAX_SDP_STREAMS];
ad7f8a1f9   Dave Airlie   drm/helper: add D...
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
  };
  
  struct drm_dp_allocate_payload_ack_reply {
  	u8 port_number;
  	u8 vcpi;
  	u16 allocated_pbn;
  };
  
  struct drm_dp_connection_status_notify {
  	u8 guid[16];
  	u8 port_number;
  	bool legacy_device_plug_status;
  	bool displayport_device_plug_status;
  	bool message_capability_status;
  	bool input_port;
  	u8 peer_device_type;
  };
  
  struct drm_dp_remote_dpcd_read {
  	u8 port_number;
  	u32 dpcd_address;
  	u8 num_bytes;
  };
  
  struct drm_dp_remote_dpcd_write {
  	u8 port_number;
  	u32 dpcd_address;
  	u8 num_bytes;
  	u8 *bytes;
  };
ae491542c   Dave Airlie   drm/dp/mst: make ...
261
  #define DP_REMOTE_I2C_READ_MAX_TRANSACTIONS 4
ad7f8a1f9   Dave Airlie   drm/helper: add D...
262
263
264
265
266
267
268
269
270
  struct drm_dp_remote_i2c_read {
  	u8 num_transactions;
  	u8 port_number;
  	struct {
  		u8 i2c_dev_id;
  		u8 num_bytes;
  		u8 *bytes;
  		u8 no_stop_bit;
  		u8 i2c_transaction_delay;
ae491542c   Dave Airlie   drm/dp/mst: make ...
271
  	} transactions[DP_REMOTE_I2C_READ_MAX_TRANSACTIONS];
ad7f8a1f9   Dave Airlie   drm/helper: add D...
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
378
379
380
381
  	u8 read_i2c_device_id;
  	u8 num_bytes_read;
  };
  
  struct drm_dp_remote_i2c_write {
  	u8 port_number;
  	u8 write_i2c_device_id;
  	u8 num_bytes;
  	u8 *bytes;
  };
  
  /* this covers ENUM_RESOURCES, POWER_DOWN_PHY, POWER_UP_PHY */
  struct drm_dp_port_number_req {
  	u8 port_number;
  };
  
  struct drm_dp_enum_path_resources_ack_reply {
  	u8 port_number;
  	u16 full_payload_bw_number;
  	u16 avail_payload_bw_number;
  };
  
  /* covers POWER_DOWN_PHY, POWER_UP_PHY */
  struct drm_dp_port_number_rep {
  	u8 port_number;
  };
  
  struct drm_dp_query_payload {
  	u8 port_number;
  	u8 vcpi;
  };
  
  struct drm_dp_resource_status_notify {
  	u8 port_number;
  	u8 guid[16];
  	u16 available_pbn;
  };
  
  struct drm_dp_query_payload_ack_reply {
  	u8 port_number;
  	u8 allocated_pbn;
  };
  
  struct drm_dp_sideband_msg_req_body {
  	u8 req_type;
  	union ack_req {
  		struct drm_dp_connection_status_notify conn_stat;
  		struct drm_dp_port_number_req port_num;
  		struct drm_dp_resource_status_notify resource_stat;
  
  		struct drm_dp_query_payload query_payload;
  		struct drm_dp_allocate_payload allocate_payload;
  
  		struct drm_dp_remote_dpcd_read dpcd_read;
  		struct drm_dp_remote_dpcd_write dpcd_write;
  
  		struct drm_dp_remote_i2c_read i2c_read;
  		struct drm_dp_remote_i2c_write i2c_write;
  	} u;
  };
  
  struct drm_dp_sideband_msg_reply_body {
  	u8 reply_type;
  	u8 req_type;
  	union ack_replies {
  		struct drm_dp_nak_reply nak;
  		struct drm_dp_link_address_ack_reply link_addr;
  		struct drm_dp_port_number_rep port_number;
  
  		struct drm_dp_enum_path_resources_ack_reply path_resources;
  		struct drm_dp_allocate_payload_ack_reply allocate_payload;
  		struct drm_dp_query_payload_ack_reply query_payload;
  
  		struct drm_dp_remote_dpcd_read_ack_reply remote_dpcd_read_ack;
  		struct drm_dp_remote_dpcd_write_ack_reply remote_dpcd_write_ack;
  		struct drm_dp_remote_dpcd_write_nak_reply remote_dpcd_write_nack;
  
  		struct drm_dp_remote_i2c_read_ack_reply remote_i2c_read_ack;
  		struct drm_dp_remote_i2c_read_nak_reply remote_i2c_read_nack;
  		struct drm_dp_remote_i2c_write_ack_reply remote_i2c_write_ack;
  	} u;
  };
  
  /* msg is queued to be put into a slot */
  #define DRM_DP_SIDEBAND_TX_QUEUED 0
  /* msg has started transmitting on a slot - still on msgq */
  #define DRM_DP_SIDEBAND_TX_START_SEND 1
  /* msg has finished transmitting on a slot - removed from msgq only in slot */
  #define DRM_DP_SIDEBAND_TX_SENT 2
  /* msg has received a response - removed from slot */
  #define DRM_DP_SIDEBAND_TX_RX 3
  #define DRM_DP_SIDEBAND_TX_TIMEOUT 4
  
  struct drm_dp_sideband_msg_tx {
  	u8 msg[256];
  	u8 chunk[48];
  	u8 cur_offset;
  	u8 cur_len;
  	struct drm_dp_mst_branch *dst;
  	struct list_head next;
  	int seqno;
  	int state;
  	bool path_msg;
  	struct drm_dp_sideband_msg_reply_body reply;
  };
  
  /* sideband msg handler */
  struct drm_dp_mst_topology_mgr;
  struct drm_dp_mst_topology_cbs {
  	/* create a connector for a port */
12e6cecd5   Thierry Reding   drm: Use const da...
382
  	struct drm_connector *(*add_connector)(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, const char *path);
d9515c5ec   Dave Airlie   drm/dp/mst: split...
383
  	void (*register_connector)(struct drm_connector *connector);
ad7f8a1f9   Dave Airlie   drm/helper: add D...
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
  	void (*destroy_connector)(struct drm_dp_mst_topology_mgr *mgr,
  				  struct drm_connector *connector);
  	void (*hotplug)(struct drm_dp_mst_topology_mgr *mgr);
  
  };
  
  #define DP_MAX_PAYLOAD (sizeof(unsigned long) * 8)
  
  #define DP_PAYLOAD_LOCAL 1
  #define DP_PAYLOAD_REMOTE 2
  #define DP_PAYLOAD_DELETE_LOCAL 3
  
  struct drm_dp_payload {
  	int payload_state;
  	int start_slot;
  	int num_slots;
dfda0df34   Dave Airlie   drm/mst: rework p...
400
  	int vcpi;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
401
402
403
404
  };
  
  /**
   * struct drm_dp_mst_topology_mgr - DisplayPort MST manager
ad7f8a1f9   Dave Airlie   drm/helper: add D...
405
406
407
408
409
410
   *
   * This struct represents the toplevel displayport MST topology manager.
   * There should be one instance of this for every MST capable DP connector
   * on the GPU.
   */
  struct drm_dp_mst_topology_mgr {
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
411
412
413
  	/**
  	 * @dev: device pointer for adding i2c devices etc.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
414
  	struct device *dev;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
415
416
417
  	/**
  	 * @cbs: callbacks for connector addition and destruction.
  	 */
69a0f89c0   Julia Lawall   drm/dp/mst: const...
418
  	const struct drm_dp_mst_topology_cbs *cbs;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
419
420
421
422
  	/**
  	 * @max_dpcd_transaction_bytes: maximum number of bytes to read/write
  	 * in one go.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
423
  	int max_dpcd_transaction_bytes;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
424
425
426
427
428
429
430
431
  	/**
  	 * @aux: AUX channel for the DP MST connector this topolgy mgr is
  	 * controlling.
  	 */
  	struct drm_dp_aux *aux;
  	/**
  	 * @max_payloads: maximum number of payloads the GPU can generate.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
432
  	int max_payloads;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
433
434
435
436
  	/**
  	 * @conn_base_id: DRM connector ID this mgr is connected to. Only used
  	 * to build the MST connector path value.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
437
  	int conn_base_id;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
438
439
440
441
442
  	/**
  	 * @down_rep_recv: Message receiver state for down replies. This and
  	 * @up_req_recv are only ever access from the work item, which is
  	 * serialised.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
443
  	struct drm_dp_sideband_msg_rx down_rep_recv;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
444
445
446
447
448
  	/**
  	 * @up_req_recv: Message receiver state for up requests. This and
  	 * @down_rep_recv are only ever access from the work item, which is
  	 * serialised.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
449
  	struct drm_dp_sideband_msg_rx up_req_recv;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
450
451
452
453
  	/**
  	 * @lock: protects mst state, primary, dpcd.
  	 */
  	struct mutex lock;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
454

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
455
456
457
458
  	/**
  	 * @mst_state: If this manager is enabled for an MST capable port. False
  	 * if no MST sink/branch devices is connected.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
459
  	bool mst_state;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
460
461
462
  	/**
  	 * @mst_primary: Pointer to the primary/first branch device.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
463
  	struct drm_dp_mst_branch *mst_primary;
5e93b8208   Hersen Wu   drm/dp/mst: move ...
464

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
465
466
467
  	/**
  	 * @dpcd: Cache of DPCD for primary port.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
468
  	u8 dpcd[DP_RECEIVER_CAP_SIZE];
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
469
470
471
  	/**
  	 * @sink_count: Sink count from DEVICE_SERVICE_IRQ_VECTOR_ESI0.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
472
  	u8 sink_count;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
473
474
475
  	/**
  	 * @pbn_div: PBN to slots divisor.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
476
  	int pbn_div;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
477
478
479
  	/**
  	 * @total_slots: Total slots that can be allocated.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
480
  	int total_slots;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
481
482
483
  	/**
  	 * @avail_slots: Still available slots that can be allocated.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
484
  	int avail_slots;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
485
486
487
  	/**
  	 * @total_pbn: Total PBN count.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
488
  	int total_pbn;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
489
490
491
492
  	/**
  	 * @qlock: protects @tx_msg_downq, the tx_slots in struct
  	 * &drm_dp_mst_branch and txmsg->state once they are queued
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
493
  	struct mutex qlock;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
494
495
496
  	/**
  	 * @tx_msg_downq: List of pending down replies.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
497
  	struct list_head tx_msg_downq;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
498

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
499
500
501
  	/**
  	 * @payload_lock: Protect payload information.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
502
  	struct mutex payload_lock;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
503
504
505
506
507
  	/**
  	 * @proposed_vcpis: Array of pointers for the new VCPI allocation. The
  	 * VCPI structure itself is embedded into the corresponding
  	 * &drm_dp_mst_port structure.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
508
  	struct drm_dp_vcpi **proposed_vcpis;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
509
510
511
  	/**
  	 * @payloads: Array of payloads.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
512
  	struct drm_dp_payload *payloads;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
513
514
515
516
517
  	/**
  	 * @payload_mask: Elements of @payloads actually in use. Since
  	 * reallocation of active outputs isn't possible gaps can be created by
  	 * disabling outputs out of order compared to how they've been enabled.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
518
  	unsigned long payload_mask;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
519
520
521
  	/**
  	 * @vcpi_mask: Similar to @payload_mask, but for @proposed_vcpis.
  	 */
dfda0df34   Dave Airlie   drm/mst: rework p...
522
  	unsigned long vcpi_mask;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
523

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
524
525
526
  	/**
  	 * @tx_waitq: Wait to queue stall for the tx worker.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
527
  	wait_queue_head_t tx_waitq;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
528
529
530
  	/**
  	 * @work: Probe work.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
531
  	struct work_struct work;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
532
533
534
535
  	/**
  	 * @tx_work: Sideband transmit worker. This can nest within the main
  	 * @work worker for each transaction @work launches.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
536
  	struct work_struct tx_work;
6b8eeca65   Dave Airlie   drm/dp/mst: close...
537

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
538
539
540
  	/**
  	 * @destroy_connector_list: List of to be destroyed connectors.
  	 */
6b8eeca65   Dave Airlie   drm/dp/mst: close...
541
  	struct list_head destroy_connector_list;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
542
543
544
  	/**
  	 * @destroy_connector_lock: Protects @connector_list.
  	 */
6b8eeca65   Dave Airlie   drm/dp/mst: close...
545
  	struct mutex destroy_connector_lock;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
546
547
548
549
  	/**
  	 * @destroy_connector_work: Work item to destroy connectors. Needed to
  	 * avoid locking inversion.
  	 */
6b8eeca65   Dave Airlie   drm/dp/mst: close...
550
  	struct work_struct destroy_connector_work;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
551
552
553
554
555
556
557
558
559
560
561
  };
  
  int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr, struct device *dev, struct drm_dp_aux *aux, int max_dpcd_transaction_bytes, int max_payloads, int conn_base_id);
  
  void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr);
  
  
  int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state);
  
  
  int drm_dp_mst_hpd_irq(struct drm_dp_mst_topology_mgr *mgr, u8 *esi, bool *handled);
c6a0aed4d   Dave Airlie   drm/mst: cached E...
562
  enum drm_connector_status drm_dp_mst_detect_port(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
ad7f8a1f9   Dave Airlie   drm/helper: add D...
563

ef8f9bea1   Libin Yang   dp/mst: add SDP s...
564
565
  bool drm_dp_mst_port_has_audio(struct drm_dp_mst_topology_mgr *mgr,
  					struct drm_dp_mst_port *port);
ad7f8a1f9   Dave Airlie   drm/helper: add D...
566
567
568
569
570
571
572
  struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
  
  
  int drm_dp_calc_pbn_mode(int clock, int bpp);
  
  
  bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int pbn, int *slots);
87f5942d1   Dave Airlie   drm/dp_mst: add a...
573
  int drm_dp_mst_get_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
ad7f8a1f9   Dave Airlie   drm/helper: add D...
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
  
  void drm_dp_mst_reset_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
  
  
  void drm_dp_mst_deallocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,
  				struct drm_dp_mst_port *port);
  
  
  int drm_dp_find_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr,
  			   int pbn);
  
  
  int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr);
  
  
  int drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr);
  
  int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr);
  
  void drm_dp_mst_dump_topology(struct seq_file *m,
  			      struct drm_dp_mst_topology_mgr *mgr);
  
  void drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr);
  int drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr);
  #endif