Blame view

include/drm/drm_dp_mst_helper.h 16.7 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
  /*
   * 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>
3f3353b7e   Pandiyan, Dhinakaran   drm/dp: Introduce...
27
  #include <drm/drm_atomic.h>
ad7f8a1f9   Dave Airlie   drm/helper: add D...
28
29
30
31
  
  struct drm_dp_mst_branch;
  
  /**
32197aab0   Masanari Iida   gpu:drm: Fix typo...
32
   * struct drm_dp_vcpi - Virtual Channel Payload Identifier
ad7f8a1f9   Dave Airlie   drm/helper: add D...
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
   * @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...
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
   * @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...
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
  	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...
89

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
90
91
92
93
94
95
96
97
98
  	/**
  	 * @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...
99
  	bool has_audio;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
  };
  
  /**
   * 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 ...
115
116
   * @guid: guid for DP 1.2 branch device. port under this branch can be
   * identified by port #.
ad7f8a1f9   Dave Airlie   drm/helper: add D...
117
118
   *
   * This structure represents an MST branch device, there is one
5e93b8208   Hersen Wu   drm/dp/mst: move ...
119
120
   * 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...
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
   */
  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 ...
139
140
141
  
  	/* global unique identifier to identify branch devices */
  	u8 guid[16];
ad7f8a1f9   Dave Airlie   drm/helper: add D...
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
  };
  
  
  /* 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...
225
  #define DRM_DP_MAX_SDP_STREAMS 16
ad7f8a1f9   Dave Airlie   drm/helper: add D...
226
227
228
229
230
  struct drm_dp_allocate_payload {
  	u8 port_number;
  	u8 number_sdp_streams;
  	u8 vcpi;
  	u16 pbn;
ef8f9bea1   Libin Yang   dp/mst: add SDP s...
231
  	u8 sdp_stream_sink[DRM_DP_MAX_SDP_STREAMS];
ad7f8a1f9   Dave Airlie   drm/helper: add D...
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
  };
  
  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 ...
262
  #define DP_REMOTE_I2C_READ_MAX_TRANSACTIONS 4
ad7f8a1f9   Dave Airlie   drm/helper: add D...
263
264
265
266
267
268
269
270
271
  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 ...
272
  	} transactions[DP_REMOTE_I2C_READ_MAX_TRANSACTIONS];
ad7f8a1f9   Dave Airlie   drm/helper: add D...
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
382
  	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...
383
  	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...
384
  	void (*register_connector)(struct drm_connector *connector);
ad7f8a1f9   Dave Airlie   drm/helper: add D...
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
  	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...
401
  	int vcpi;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
402
  };
a4370c777   Ville Syrjälä   drm/atomic: Make ...
403
  #define to_dp_mst_topology_state(x) container_of(x, struct drm_dp_mst_topology_state, base)
3f3353b7e   Pandiyan, Dhinakaran   drm/dp: Introduce...
404
  struct drm_dp_mst_topology_state {
a4370c777   Ville Syrjälä   drm/atomic: Make ...
405
  	struct drm_private_state base;
3f3353b7e   Pandiyan, Dhinakaran   drm/dp: Introduce...
406
407
408
409
  	int avail_slots;
  	struct drm_atomic_state *state;
  	struct drm_dp_mst_topology_mgr *mgr;
  };
a4370c777   Ville Syrjälä   drm/atomic: Make ...
410
  #define to_dp_mst_topology_mgr(x) container_of(x, struct drm_dp_mst_topology_mgr, base)
ad7f8a1f9   Dave Airlie   drm/helper: add D...
411
412
  /**
   * struct drm_dp_mst_topology_mgr - DisplayPort MST manager
ad7f8a1f9   Dave Airlie   drm/helper: add D...
413
414
415
416
417
418
   *
   * 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...
419
  	/**
a4370c777   Ville Syrjälä   drm/atomic: Make ...
420
421
422
423
424
  	 * @base: Base private object for atomic
  	 */
  	struct drm_private_obj base;
  
  	/**
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
425
426
  	 * @dev: device pointer for adding i2c devices etc.
  	 */
7b0a89a6d   Dhinakaran Pandiyan   drm/dp: Store drm...
427
  	struct drm_device *dev;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
428
429
430
  	/**
  	 * @cbs: callbacks for connector addition and destruction.
  	 */
69a0f89c0   Julia Lawall   drm/dp/mst: const...
431
  	const struct drm_dp_mst_topology_cbs *cbs;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
432
433
434
435
  	/**
  	 * @max_dpcd_transaction_bytes: maximum number of bytes to read/write
  	 * in one go.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
436
  	int max_dpcd_transaction_bytes;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
437
438
439
440
441
442
443
444
  	/**
  	 * @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...
445
  	int max_payloads;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
446
447
448
449
  	/**
  	 * @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...
450
  	int conn_base_id;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
451
452
453
454
455
  	/**
  	 * @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...
456
  	struct drm_dp_sideband_msg_rx down_rep_recv;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
457
458
459
460
461
  	/**
  	 * @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...
462
  	struct drm_dp_sideband_msg_rx up_req_recv;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
463
464
465
466
  	/**
  	 * @lock: protects mst state, primary, dpcd.
  	 */
  	struct mutex lock;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
467

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
468
469
470
471
  	/**
  	 * @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...
472
  	bool mst_state;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
473
474
475
  	/**
  	 * @mst_primary: Pointer to the primary/first branch device.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
476
  	struct drm_dp_mst_branch *mst_primary;
5e93b8208   Hersen Wu   drm/dp/mst: move ...
477

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
478
479
480
  	/**
  	 * @dpcd: Cache of DPCD for primary port.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
481
  	u8 dpcd[DP_RECEIVER_CAP_SIZE];
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
482
483
484
  	/**
  	 * @sink_count: Sink count from DEVICE_SERVICE_IRQ_VECTOR_ESI0.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
485
  	u8 sink_count;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
486
487
488
  	/**
  	 * @pbn_div: PBN to slots divisor.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
489
  	int pbn_div;
a538d6137   Pandiyan, Dhinakaran   drm/dp: Kill tota...
490

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
491
  	/**
3f3353b7e   Pandiyan, Dhinakaran   drm/dp: Introduce...
492
493
494
495
496
497
498
499
500
501
  	 * @state: State information for topology manager
  	 */
  	struct drm_dp_mst_topology_state *state;
  
  	/**
  	 * @funcs: Atomic helper callbacks
  	 */
  	const struct drm_private_state_funcs *funcs;
  
  	/**
6806cdf9a   Daniel Vetter   drm/kms-helpers: ...
502
503
  	 * @qlock: protects @tx_msg_downq, the &drm_dp_mst_branch.txslost and
  	 * &drm_dp_sideband_msg_tx.state once they are queued
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
504
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
505
  	struct mutex qlock;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
506
507
508
  	/**
  	 * @tx_msg_downq: List of pending down replies.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
509
  	struct list_head tx_msg_downq;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
510

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
511
512
513
  	/**
  	 * @payload_lock: Protect payload information.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
514
  	struct mutex payload_lock;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
515
516
  	/**
  	 * @proposed_vcpis: Array of pointers for the new VCPI allocation. The
6806cdf9a   Daniel Vetter   drm/kms-helpers: ...
517
  	 * VCPI structure itself is &drm_dp_mst_port.vcpi.
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
518
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
519
  	struct drm_dp_vcpi **proposed_vcpis;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
520
521
522
  	/**
  	 * @payloads: Array of payloads.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
523
  	struct drm_dp_payload *payloads;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
524
525
526
527
528
  	/**
  	 * @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...
529
  	unsigned long payload_mask;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
530
531
532
  	/**
  	 * @vcpi_mask: Similar to @payload_mask, but for @proposed_vcpis.
  	 */
dfda0df34   Dave Airlie   drm/mst: rework p...
533
  	unsigned long vcpi_mask;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
534

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
535
536
537
  	/**
  	 * @tx_waitq: Wait to queue stall for the tx worker.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
538
  	wait_queue_head_t tx_waitq;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
539
540
541
  	/**
  	 * @work: Probe work.
  	 */
ad7f8a1f9   Dave Airlie   drm/helper: add D...
542
  	struct work_struct work;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
543
544
545
546
  	/**
  	 * @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...
547
  	struct work_struct tx_work;
6b8eeca65   Dave Airlie   drm/dp/mst: close...
548

132d49d72   Daniel Vetter   drm/dp-mst: Missi...
549
550
551
  	/**
  	 * @destroy_connector_list: List of to be destroyed connectors.
  	 */
6b8eeca65   Dave Airlie   drm/dp/mst: close...
552
  	struct list_head destroy_connector_list;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
553
554
555
  	/**
  	 * @destroy_connector_lock: Protects @connector_list.
  	 */
6b8eeca65   Dave Airlie   drm/dp/mst: close...
556
  	struct mutex destroy_connector_lock;
132d49d72   Daniel Vetter   drm/dp-mst: Missi...
557
558
559
560
  	/**
  	 * @destroy_connector_work: Work item to destroy connectors. Needed to
  	 * avoid locking inversion.
  	 */
6b8eeca65   Dave Airlie   drm/dp/mst: close...
561
  	struct work_struct destroy_connector_work;
ad7f8a1f9   Dave Airlie   drm/helper: add D...
562
  };
7b0a89a6d   Dhinakaran Pandiyan   drm/dp: Store drm...
563
564
565
566
  int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
  				 struct drm_device *dev, struct drm_dp_aux *aux,
  				 int max_dpcd_transaction_bytes,
  				 int max_payloads, int conn_base_id);
ad7f8a1f9   Dave Airlie   drm/helper: add D...
567
568
569
570
571
572
573
574
  
  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...
575
  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...
576

ef8f9bea1   Libin Yang   dp/mst: add SDP s...
577
578
  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...
579
580
581
582
  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);
1e797f556   Pandiyan, Dhinakaran   drm/dp: Split drm...
583
584
  bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,
  			      struct drm_dp_mst_port *port, int pbn, int slots);
ad7f8a1f9   Dave Airlie   drm/helper: add D...
585

87f5942d1   Dave Airlie   drm/dp_mst: add a...
586
  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...
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
  
  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);
3f3353b7e   Pandiyan, Dhinakaran   drm/dp: Introduce...
611
612
  struct drm_dp_mst_topology_state *drm_atomic_get_mst_topology_state(struct drm_atomic_state *state,
  								    struct drm_dp_mst_topology_mgr *mgr);
edb1ed1ab   Pandiyan, Dhinakaran   drm/dp: Add DP MS...
613
614
615
616
617
618
  int drm_dp_atomic_find_vcpi_slots(struct drm_atomic_state *state,
  				  struct drm_dp_mst_topology_mgr *mgr,
  				  struct drm_dp_mst_port *port, int pbn);
  int drm_dp_atomic_release_vcpi_slots(struct drm_atomic_state *state,
  				     struct drm_dp_mst_topology_mgr *mgr,
  				     int slots);
3f3353b7e   Pandiyan, Dhinakaran   drm/dp: Introduce...
619

ad7f8a1f9   Dave Airlie   drm/helper: add D...
620
  #endif