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