1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22#ifndef _DRM_DP_MST_HELPER_H_
23#define _DRM_DP_MST_HELPER_H_
24
25#include <linux/types.h>
26#include <drm/drm_dp_helper.h>
27
28struct drm_dp_mst_branch;
29
30
31
32
33
34
35
36
37struct drm_dp_vcpi {
38 int vcpi;
39 int pbn;
40 int aligned_pbn;
41 int num_slots;
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
68struct drm_dp_mst_port {
69 struct kref kref;
70
71 u8 port_num;
72 bool input;
73 bool mcs;
74 bool ddps;
75 u8 pdt;
76 bool ldps;
77 u8 dpcd_rev;
78 u8 num_sdp_streams;
79 u8 num_sdp_stream_sinks;
80 uint16_t available_pbn;
81 struct list_head next;
82 struct drm_dp_mst_branch *mstb;
83 struct drm_dp_aux aux;
84 struct drm_dp_mst_branch *parent;
85
86 struct drm_dp_vcpi vcpi;
87 struct drm_connector *connector;
88 struct drm_dp_mst_topology_mgr *mgr;
89
90
91
92
93
94 struct edid *cached_edid;
95
96
97
98
99 bool has_audio;
100};
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122struct drm_dp_mst_branch {
123 struct kref kref;
124 u8 rad[8];
125 u8 lct;
126 int num_ports;
127
128 int msg_slots;
129 struct list_head ports;
130
131
132 struct drm_dp_mst_port *port_parent;
133 struct drm_dp_mst_topology_mgr *mgr;
134
135
136 struct drm_dp_sideband_msg_tx *tx_slots[2];
137 int last_seqno;
138 bool link_address_sent;
139
140
141 u8 guid[16];
142};
143
144
145
146struct drm_dp_sideband_msg_hdr {
147 u8 lct;
148 u8 lcr;
149 u8 rad[8];
150 bool broadcast;
151 bool path_msg;
152 u8 msg_len;
153 bool somt;
154 bool eomt;
155 bool seqno;
156};
157
158struct drm_dp_nak_reply {
159 u8 guid[16];
160 u8 reason;
161 u8 nak_data;
162};
163
164struct drm_dp_link_address_ack_reply {
165 u8 guid[16];
166 u8 nports;
167 struct drm_dp_link_addr_reply_port {
168 bool input_port;
169 u8 peer_device_type;
170 u8 port_number;
171 bool mcs;
172 bool ddps;
173 bool legacy_device_plug_status;
174 u8 dpcd_revision;
175 u8 peer_guid[16];
176 u8 num_sdp_streams;
177 u8 num_sdp_stream_sinks;
178 } ports[16];
179};
180
181struct drm_dp_remote_dpcd_read_ack_reply {
182 u8 port_number;
183 u8 num_bytes;
184 u8 bytes[255];
185};
186
187struct drm_dp_remote_dpcd_write_ack_reply {
188 u8 port_number;
189};
190
191struct drm_dp_remote_dpcd_write_nak_reply {
192 u8 port_number;
193 u8 reason;
194 u8 bytes_written_before_failure;
195};
196
197struct drm_dp_remote_i2c_read_ack_reply {
198 u8 port_number;
199 u8 num_bytes;
200 u8 bytes[255];
201};
202
203struct drm_dp_remote_i2c_read_nak_reply {
204 u8 port_number;
205 u8 nak_reason;
206 u8 i2c_nak_transaction;
207};
208
209struct drm_dp_remote_i2c_write_ack_reply {
210 u8 port_number;
211};
212
213
214struct drm_dp_sideband_msg_rx {
215 u8 chunk[48];
216 u8 msg[256];
217 u8 curchunk_len;
218 u8 curchunk_idx;
219 u8 curchunk_hdrlen;
220 u8 curlen;
221 bool have_somt;
222 bool have_eomt;
223 struct drm_dp_sideband_msg_hdr initial_hdr;
224};
225
226#define DRM_DP_MAX_SDP_STREAMS 16
227struct drm_dp_allocate_payload {
228 u8 port_number;
229 u8 number_sdp_streams;
230 u8 vcpi;
231 u16 pbn;
232 u8 sdp_stream_sink[DRM_DP_MAX_SDP_STREAMS];
233};
234
235struct drm_dp_allocate_payload_ack_reply {
236 u8 port_number;
237 u8 vcpi;
238 u16 allocated_pbn;
239};
240
241struct drm_dp_connection_status_notify {
242 u8 guid[16];
243 u8 port_number;
244 bool legacy_device_plug_status;
245 bool displayport_device_plug_status;
246 bool message_capability_status;
247 bool input_port;
248 u8 peer_device_type;
249};
250
251struct drm_dp_remote_dpcd_read {
252 u8 port_number;
253 u32 dpcd_address;
254 u8 num_bytes;
255};
256
257struct drm_dp_remote_dpcd_write {
258 u8 port_number;
259 u32 dpcd_address;
260 u8 num_bytes;
261 u8 *bytes;
262};
263
264#define DP_REMOTE_I2C_READ_MAX_TRANSACTIONS 4
265struct drm_dp_remote_i2c_read {
266 u8 num_transactions;
267 u8 port_number;
268 struct {
269 u8 i2c_dev_id;
270 u8 num_bytes;
271 u8 *bytes;
272 u8 no_stop_bit;
273 u8 i2c_transaction_delay;
274 } transactions[DP_REMOTE_I2C_READ_MAX_TRANSACTIONS];
275 u8 read_i2c_device_id;
276 u8 num_bytes_read;
277};
278
279struct drm_dp_remote_i2c_write {
280 u8 port_number;
281 u8 write_i2c_device_id;
282 u8 num_bytes;
283 u8 *bytes;
284};
285
286
287struct drm_dp_port_number_req {
288 u8 port_number;
289};
290
291struct drm_dp_enum_path_resources_ack_reply {
292 u8 port_number;
293 u16 full_payload_bw_number;
294 u16 avail_payload_bw_number;
295};
296
297
298struct drm_dp_port_number_rep {
299 u8 port_number;
300};
301
302struct drm_dp_query_payload {
303 u8 port_number;
304 u8 vcpi;
305};
306
307struct drm_dp_resource_status_notify {
308 u8 port_number;
309 u8 guid[16];
310 u16 available_pbn;
311};
312
313struct drm_dp_query_payload_ack_reply {
314 u8 port_number;
315 u8 allocated_pbn;
316};
317
318struct drm_dp_sideband_msg_req_body {
319 u8 req_type;
320 union ack_req {
321 struct drm_dp_connection_status_notify conn_stat;
322 struct drm_dp_port_number_req port_num;
323 struct drm_dp_resource_status_notify resource_stat;
324
325 struct drm_dp_query_payload query_payload;
326 struct drm_dp_allocate_payload allocate_payload;
327
328 struct drm_dp_remote_dpcd_read dpcd_read;
329 struct drm_dp_remote_dpcd_write dpcd_write;
330
331 struct drm_dp_remote_i2c_read i2c_read;
332 struct drm_dp_remote_i2c_write i2c_write;
333 } u;
334};
335
336struct drm_dp_sideband_msg_reply_body {
337 u8 reply_type;
338 u8 req_type;
339 union ack_replies {
340 struct drm_dp_nak_reply nak;
341 struct drm_dp_link_address_ack_reply link_addr;
342 struct drm_dp_port_number_rep port_number;
343
344 struct drm_dp_enum_path_resources_ack_reply path_resources;
345 struct drm_dp_allocate_payload_ack_reply allocate_payload;
346 struct drm_dp_query_payload_ack_reply query_payload;
347
348 struct drm_dp_remote_dpcd_read_ack_reply remote_dpcd_read_ack;
349 struct drm_dp_remote_dpcd_write_ack_reply remote_dpcd_write_ack;
350 struct drm_dp_remote_dpcd_write_nak_reply remote_dpcd_write_nack;
351
352 struct drm_dp_remote_i2c_read_ack_reply remote_i2c_read_ack;
353 struct drm_dp_remote_i2c_read_nak_reply remote_i2c_read_nack;
354 struct drm_dp_remote_i2c_write_ack_reply remote_i2c_write_ack;
355 } u;
356};
357
358
359#define DRM_DP_SIDEBAND_TX_QUEUED 0
360
361#define DRM_DP_SIDEBAND_TX_START_SEND 1
362
363#define DRM_DP_SIDEBAND_TX_SENT 2
364
365#define DRM_DP_SIDEBAND_TX_RX 3
366#define DRM_DP_SIDEBAND_TX_TIMEOUT 4
367
368struct drm_dp_sideband_msg_tx {
369 u8 msg[256];
370 u8 chunk[48];
371 u8 cur_offset;
372 u8 cur_len;
373 struct drm_dp_mst_branch *dst;
374 struct list_head next;
375 int seqno;
376 int state;
377 bool path_msg;
378 struct drm_dp_sideband_msg_reply_body reply;
379};
380
381
382struct drm_dp_mst_topology_mgr;
383struct drm_dp_mst_topology_cbs {
384
385 struct drm_connector *(*add_connector)(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, const char *path);
386 void (*register_connector)(struct drm_connector *connector);
387 void (*destroy_connector)(struct drm_dp_mst_topology_mgr *mgr,
388 struct drm_connector *connector);
389 void (*hotplug)(struct drm_dp_mst_topology_mgr *mgr);
390
391};
392
393#define DP_MAX_PAYLOAD (sizeof(unsigned long) * 8)
394
395#define DP_PAYLOAD_LOCAL 1
396#define DP_PAYLOAD_REMOTE 2
397#define DP_PAYLOAD_DELETE_LOCAL 3
398
399struct drm_dp_payload {
400 int payload_state;
401 int start_slot;
402 int num_slots;
403 int vcpi;
404};
405
406
407
408
409
410
411
412
413struct drm_dp_mst_topology_mgr {
414
415
416
417 struct device *dev;
418
419
420
421 const struct drm_dp_mst_topology_cbs *cbs;
422
423
424
425
426 int max_dpcd_transaction_bytes;
427
428
429
430
431 struct drm_dp_aux *aux;
432
433
434
435 int max_payloads;
436
437
438
439
440 int conn_base_id;
441
442
443
444
445
446
447 struct drm_dp_sideband_msg_rx down_rep_recv;
448
449
450
451
452
453 struct drm_dp_sideband_msg_rx up_req_recv;
454
455
456
457
458 struct mutex lock;
459
460
461
462
463
464 bool mst_state;
465
466
467
468 struct drm_dp_mst_branch *mst_primary;
469
470
471
472
473 u8 dpcd[DP_RECEIVER_CAP_SIZE];
474
475
476
477 u8 sink_count;
478
479
480
481 int pbn_div;
482
483
484
485 int total_slots;
486
487
488
489 int avail_slots;
490
491
492
493 int total_pbn;
494
495
496
497
498
499 struct mutex qlock;
500
501
502
503 struct list_head tx_msg_downq;
504
505
506
507
508 struct mutex payload_lock;
509
510
511
512
513
514 struct drm_dp_vcpi **proposed_vcpis;
515
516
517
518 struct drm_dp_payload *payloads;
519
520
521
522
523
524 unsigned long payload_mask;
525
526
527
528 unsigned long vcpi_mask;
529
530
531
532
533 wait_queue_head_t tx_waitq;
534
535
536
537 struct work_struct work;
538
539
540
541
542 struct work_struct tx_work;
543
544
545
546
547 struct list_head destroy_connector_list;
548
549
550
551 struct mutex destroy_connector_lock;
552
553
554
555
556 struct work_struct destroy_connector_work;
557};
558
559int 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);
560
561void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr);
562
563
564int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state);
565
566
567int drm_dp_mst_hpd_irq(struct drm_dp_mst_topology_mgr *mgr, u8 *esi, bool *handled);
568
569
570enum 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);
571
572bool drm_dp_mst_port_has_audio(struct drm_dp_mst_topology_mgr *mgr,
573 struct drm_dp_mst_port *port);
574struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
575
576
577int drm_dp_calc_pbn_mode(int clock, int bpp);
578
579
580bool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int pbn, int *slots);
581
582int drm_dp_mst_get_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
583
584
585void drm_dp_mst_reset_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
586
587
588void drm_dp_mst_deallocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,
589 struct drm_dp_mst_port *port);
590
591
592int drm_dp_find_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr,
593 int pbn);
594
595
596int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr);
597
598
599int drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr);
600
601int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr);
602
603void drm_dp_mst_dump_topology(struct seq_file *m,
604 struct drm_dp_mst_topology_mgr *mgr);
605
606void drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr);
607int drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr);
608#endif
609