1ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/*
2ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * Copyright © 2014 Red Hat.
3ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie *
4ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * Permission to use, copy, modify, distribute, and sell this software and its
5ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * documentation for any purpose is hereby granted without fee, provided that
6ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * the above copyright notice appear in all copies and that both that copyright
7ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * notice and this permission notice appear in supporting documentation, and
8ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * that the name of the copyright holders not be used in advertising or
9ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * publicity pertaining to distribution of the software without specific,
10ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * written prior permission.  The copyright holders make no representations
11ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * about the suitability of this software for any purpose.  It is provided "as
12ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * is" without express or implied warranty.
13ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie *
14ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
20ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * OF THIS SOFTWARE.
21ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie */
22ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#ifndef _DRM_DP_MST_HELPER_H_
23ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#define _DRM_DP_MST_HELPER_H_
24ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
25ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#include <linux/types.h>
26ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#include <drm/drm_dp_helper.h>
27ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
28ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_mst_branch;
29ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
30ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/**
31ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * struct drm_dp_vcpi - Virtual Channel Payload Identifer
32ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @vcpi: Virtual channel ID.
33ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @pbn: Payload Bandwidth Number for this channel
34ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @aligned_pbn: PBN aligned with slot size
35ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @num_slots: number of slots for this PBN
36ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie */
37ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_vcpi {
38ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int vcpi;
39ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int pbn;
40ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int aligned_pbn;
41ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int num_slots;
42ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
43ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
44ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/**
45ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * struct drm_dp_mst_port - MST port
46ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @kref: reference count for this port.
47ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @guid_valid: for DP 1.2 devices if we have validated the GUID.
48ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @guid: guid for DP 1.2 device on this port.
49ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @port_num: port number
50ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @input: if this port is an input port.
51ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @mcs: message capability status - DP 1.2 spec.
52ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @ddps: DisplayPort Device Plug Status - DP 1.2
53ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @pdt: Peer Device Type
54ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @ldps: Legacy Device Plug Status
55ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @dpcd_rev: DPCD revision of device on this port
56ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @num_sdp_streams: Number of simultaneous streams
57ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @num_sdp_stream_sinks: Number of stream sinks
58ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @available_pbn: Available bandwidth for this port.
59ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @next: link to next port on this branch device
60ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @mstb: branch device attach below this port
61ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @aux: i2c aux transport to talk to device connected to this port.
62ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @parent: branch device parent of this port
63ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @vcpi: Virtual Channel Payload info for this port.
64ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @connector: DRM connector this port is connected to.
65ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @mgr: topology manager this port lives under.
66ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie *
67ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * This structure represents an MST port endpoint on a device somewhere
68ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * in the MST topology.
69ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie */
70ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_mst_port {
71ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct kref kref;
72ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
73ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	/* if dpcd 1.2 device is on this port - its GUID info */
74ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool guid_valid;
75ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 guid[16];
76ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
77ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_num;
78ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool input;
79ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool mcs;
80ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool ddps;
81ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 pdt;
82ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool ldps;
83ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 dpcd_rev;
84ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 num_sdp_streams;
85ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 num_sdp_stream_sinks;
86ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	uint16_t available_pbn;
87ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct list_head next;
88ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_mst_branch *mstb; /* pointer to an mstb if this port has one */
89ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_aux aux; /* i2c bus for this port? */
90ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_mst_branch *parent;
91ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
92ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_vcpi vcpi;
93ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_connector *connector;
94ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_mst_topology_mgr *mgr;
95ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
96ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
97ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/**
98ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * struct drm_dp_mst_branch - MST branch device.
99ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @kref: reference count for this port.
100ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @rad: Relative Address to talk to this branch device.
101ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @lct: Link count total to talk to this branch device.
102ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @num_ports: number of ports on the branch.
103ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @msg_slots: one bit per transmitted msg slot.
104ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @ports: linked list of ports on this branch.
105ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @port_parent: pointer to the port parent, NULL if toplevel.
106ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @mgr: topology manager for this branch device.
107ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @tx_slots: transmission slots for this device.
108ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @last_seqno: last sequence number used to talk to this.
109ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @link_address_sent: if a link address message has been sent to this device yet.
110ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie *
111ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * This structure represents an MST branch device, there is one
112ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * primary branch device at the root, along with any others connected
113ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * to downstream ports
114ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie */
115ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_mst_branch {
116ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct kref kref;
117ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 rad[8];
118ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 lct;
119ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int num_ports;
120ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
121ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int msg_slots;
122ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct list_head ports;
123ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
124ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	/* list of tx ops queue for this port */
125ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_mst_port *port_parent;
126ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_mst_topology_mgr *mgr;
127ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
128ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	/* slots are protected by mstb->mgr->qlock */
129ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_sideband_msg_tx *tx_slots[2];
130ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int last_seqno;
131ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool link_address_sent;
132ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
133ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
134ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
135ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/* sideband msg header - not bit struct */
136ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_sideband_msg_hdr {
137ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 lct;
138ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 lcr;
139ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 rad[8];
140ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool broadcast;
141ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool path_msg;
142ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 msg_len;
143ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool somt;
144ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool eomt;
145ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool seqno;
146ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
147ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
148ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_nak_reply {
149ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 guid[16];
150ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 reason;
151ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 nak_data;
152ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
153ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
154ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_link_address_ack_reply {
155ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 guid[16];
156ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 nports;
157ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_link_addr_reply_port {
158ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		bool input_port;
159ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		u8 peer_device_type;
160ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		u8 port_number;
161ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		bool mcs;
162ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		bool ddps;
163ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		bool legacy_device_plug_status;
164ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		u8 dpcd_revision;
165ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		u8 peer_guid[16];
166ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		u8 num_sdp_streams;
167ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		u8 num_sdp_stream_sinks;
168ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	} ports[16];
169ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
170ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
171ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_remote_dpcd_read_ack_reply {
172ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
173ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 num_bytes;
174ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 bytes[255];
175ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
176ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
177ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_remote_dpcd_write_ack_reply {
178ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
179ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
180ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
181ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_remote_dpcd_write_nak_reply {
182ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
183ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 reason;
184ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 bytes_written_before_failure;
185ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
186ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
187ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_remote_i2c_read_ack_reply {
188ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
189ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 num_bytes;
190ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 bytes[255];
191ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
192ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
193ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_remote_i2c_read_nak_reply {
194ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
195ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 nak_reason;
196ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 i2c_nak_transaction;
197ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
198ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
199ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_remote_i2c_write_ack_reply {
200ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
201ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
202ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
203ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
204ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_sideband_msg_rx {
205ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 chunk[48];
206ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 msg[256];
207ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 curchunk_len;
208ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 curchunk_idx; /* chunk we are parsing now */
209ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 curchunk_hdrlen;
210ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 curlen; /* total length of the msg */
211ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool have_somt;
212ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool have_eomt;
213ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_sideband_msg_hdr initial_hdr;
214ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
215ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
216ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
217ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_allocate_payload {
218ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
219ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 number_sdp_streams;
220ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 vcpi;
221ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u16 pbn;
222ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 sdp_stream_sink[8];
223ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
224ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
225ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_allocate_payload_ack_reply {
226ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
227ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 vcpi;
228ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u16 allocated_pbn;
229ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
230ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
231ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_connection_status_notify {
232ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 guid[16];
233ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
234ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool legacy_device_plug_status;
235ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool displayport_device_plug_status;
236ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool message_capability_status;
237ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool input_port;
238ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 peer_device_type;
239ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
240ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
241ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_remote_dpcd_read {
242ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
243ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u32 dpcd_address;
244ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 num_bytes;
245ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
246ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
247ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_remote_dpcd_write {
248ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
249ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u32 dpcd_address;
250ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 num_bytes;
251ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 *bytes;
252ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
253ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
254ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_remote_i2c_read {
255ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 num_transactions;
256ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
257ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct {
258ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		u8 i2c_dev_id;
259ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		u8 num_bytes;
260ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		u8 *bytes;
261ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		u8 no_stop_bit;
262ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		u8 i2c_transaction_delay;
263ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	} transactions[4];
264ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 read_i2c_device_id;
265ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 num_bytes_read;
266ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
267ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
268ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_remote_i2c_write {
269ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
270ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 write_i2c_device_id;
271ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 num_bytes;
272ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 *bytes;
273ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
274ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
275ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/* this covers ENUM_RESOURCES, POWER_DOWN_PHY, POWER_UP_PHY */
276ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_port_number_req {
277ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
278ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
279ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
280ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_enum_path_resources_ack_reply {
281ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
282ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u16 full_payload_bw_number;
283ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u16 avail_payload_bw_number;
284ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
285ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
286ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/* covers POWER_DOWN_PHY, POWER_UP_PHY */
287ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_port_number_rep {
288ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
289ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
290ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
291ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_query_payload {
292ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
293ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 vcpi;
294ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
295ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
296ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_resource_status_notify {
297ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
298ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 guid[16];
299ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u16 available_pbn;
300ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
301ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
302ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_query_payload_ack_reply {
303ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 port_number;
304ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 allocated_pbn;
305ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
306ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
307ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_sideband_msg_req_body {
308ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 req_type;
309ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	union ack_req {
310ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_connection_status_notify conn_stat;
311ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_port_number_req port_num;
312ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_resource_status_notify resource_stat;
313ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
314ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_query_payload query_payload;
315ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_allocate_payload allocate_payload;
316ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
317ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_remote_dpcd_read dpcd_read;
318ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_remote_dpcd_write dpcd_write;
319ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
320ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_remote_i2c_read i2c_read;
321ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_remote_i2c_write i2c_write;
322ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	} u;
323ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
324ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
325ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_sideband_msg_reply_body {
326ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 reply_type;
327ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 req_type;
328ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	union ack_replies {
329ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_nak_reply nak;
330ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_link_address_ack_reply link_addr;
331ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_port_number_rep port_number;
332ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
333ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_enum_path_resources_ack_reply path_resources;
334ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_allocate_payload_ack_reply allocate_payload;
335ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_query_payload_ack_reply query_payload;
336ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
337ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_remote_dpcd_read_ack_reply remote_dpcd_read_ack;
338ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_remote_dpcd_write_ack_reply remote_dpcd_write_ack;
339ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_remote_dpcd_write_nak_reply remote_dpcd_write_nack;
340ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
341ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_remote_i2c_read_ack_reply remote_i2c_read_ack;
342ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_remote_i2c_read_nak_reply remote_i2c_read_nack;
343ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie		struct drm_dp_remote_i2c_write_ack_reply remote_i2c_write_ack;
344ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	} u;
345ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
346ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
347ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/* msg is queued to be put into a slot */
348ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#define DRM_DP_SIDEBAND_TX_QUEUED 0
349ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/* msg has started transmitting on a slot - still on msgq */
350ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#define DRM_DP_SIDEBAND_TX_START_SEND 1
351ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/* msg has finished transmitting on a slot - removed from msgq only in slot */
352ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#define DRM_DP_SIDEBAND_TX_SENT 2
353ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/* msg has received a response - removed from slot */
354ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#define DRM_DP_SIDEBAND_TX_RX 3
355ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#define DRM_DP_SIDEBAND_TX_TIMEOUT 4
356ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
357ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_sideband_msg_tx {
358ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 msg[256];
359ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 chunk[48];
360ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 cur_offset;
361ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 cur_len;
362ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_mst_branch *dst;
363ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct list_head next;
364ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int seqno;
365ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int state;
366ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool path_msg;
367ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_sideband_msg_reply_body reply;
368ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
369ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
370ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/* sideband msg handler */
371ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_mst_topology_mgr;
372ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_mst_topology_cbs {
373ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	/* create a connector for a port */
374ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_connector *(*add_connector)(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, char *path);
375ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	void (*destroy_connector)(struct drm_dp_mst_topology_mgr *mgr,
376ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie				  struct drm_connector *connector);
377ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	void (*hotplug)(struct drm_dp_mst_topology_mgr *mgr);
378ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
379ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
380ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
381ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#define DP_MAX_PAYLOAD (sizeof(unsigned long) * 8)
382ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
383ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#define DP_PAYLOAD_LOCAL 1
384ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#define DP_PAYLOAD_REMOTE 2
385ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#define DP_PAYLOAD_DELETE_LOCAL 3
386ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
387ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_payload {
388ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int payload_state;
389ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int start_slot;
390ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int num_slots;
391dfda0df3426483cf5fc7441f23f318edbabecb03Dave Airlie	int vcpi;
392ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
393ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
394ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie/**
395ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * struct drm_dp_mst_topology_mgr - DisplayPort MST manager
396ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @dev: device pointer for adding i2c devices etc.
397ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @cbs: callbacks for connector addition and destruction.
398ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @max_dpcd_transaction_bytes - maximum number of bytes to read/write in one go.
399ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @aux: aux channel for the DP connector.
400ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @max_payloads: maximum number of payloads the GPU can generate.
401ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @conn_base_id: DRM connector ID this mgr is connected to.
402ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @down_rep_recv: msg receiver state for down replies.
403ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @up_req_recv: msg receiver state for up requests.
404ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @lock: protects mst state, primary, guid, dpcd.
405ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @mst_state: if this manager is enabled for an MST capable port.
406ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @mst_primary: pointer to the primary branch device.
407ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @guid_valid: GUID valid for the primary branch device.
408ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @guid: GUID for primary port.
409ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @dpcd: cache of DPCD for primary port.
410ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * @pbn_div: PBN to slots divisor.
411ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie *
412ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * This struct represents the toplevel displayport MST topology manager.
413ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * There should be one instance of this for every MST capable DP connector
414ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie * on the GPU.
415ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie */
416ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct drm_dp_mst_topology_mgr {
417ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
418ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct device *dev;
419ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_mst_topology_cbs *cbs;
420ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int max_dpcd_transaction_bytes;
421ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_aux *aux; /* auxch for this topology mgr to use */
422ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int max_payloads;
423ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int conn_base_id;
424ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
425ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	/* only ever accessed from the workqueue - which should be serialised */
426ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_sideband_msg_rx down_rep_recv;
427ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_sideband_msg_rx up_req_recv;
428ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
429ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	/* pointer to info about the initial MST device */
430ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct mutex lock; /* protects mst_state + primary + guid + dpcd */
431ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
432ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool mst_state;
433ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_mst_branch *mst_primary;
434ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	/* primary MST device GUID */
435ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool guid_valid;
436ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 guid[16];
437ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 dpcd[DP_RECEIVER_CAP_SIZE];
438ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	u8 sink_count;
439ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int pbn_div;
440ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int total_slots;
441ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int avail_slots;
442ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	int total_pbn;
443ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
444ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	/* messages to be transmitted */
445ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	/* qlock protects the upq/downq and in_progress,
446ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	   the mstb tx_slots and txmsg->state once they are queued */
447ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct mutex qlock;
448ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct list_head tx_msg_downq;
449ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct list_head tx_msg_upq;
450ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool tx_down_in_progress;
451ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	bool tx_up_in_progress;
452ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
453ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	/* payload info + lock for it */
454ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct mutex payload_lock;
455ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_vcpi **proposed_vcpis;
456ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct drm_dp_payload *payloads;
457ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	unsigned long payload_mask;
458dfda0df3426483cf5fc7441f23f318edbabecb03Dave Airlie	unsigned long vcpi_mask;
459ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
460ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	wait_queue_head_t tx_waitq;
461ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct work_struct work;
462ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
463ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie	struct work_struct tx_work;
464ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie};
465ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
466ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlieint 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);
467ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
468ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlievoid drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr);
469ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
470ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
471ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlieint drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state);
472ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
473ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
474ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlieint drm_dp_mst_hpd_irq(struct drm_dp_mst_topology_mgr *mgr, u8 *esi, bool *handled);
475ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
476ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
477ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlieenum drm_connector_status drm_dp_mst_detect_port(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
478ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
479ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliestruct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
480ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
481ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
482ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlieint drm_dp_calc_pbn_mode(int clock, int bpp);
483ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
484ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
485ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airliebool drm_dp_mst_allocate_vcpi(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port, int pbn, int *slots);
486ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
487ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
488ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlievoid drm_dp_mst_reset_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port);
489ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
490ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
491ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlievoid drm_dp_mst_deallocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,
492ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie				struct drm_dp_mst_port *port);
493ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
494ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
495ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlieint drm_dp_find_vcpi_slots(struct drm_dp_mst_topology_mgr *mgr,
496ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie			   int pbn);
497ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
498ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
499ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlieint drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr);
500ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
501ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
502ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlieint drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr);
503ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
504ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlieint drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr);
505ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
506ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlievoid drm_dp_mst_dump_topology(struct seq_file *m,
507ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie			      struct drm_dp_mst_topology_mgr *mgr);
508ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie
509ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlievoid drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr);
510ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlieint drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr);
511ad7f8a1f9ced7f049f9b66d588723f243a7034cdDave Airlie#endif
512