LCOV - code coverage report
Current view: top level - drivers/gpu/drm/display - drm_dp_mst_topology.c (source / functions) Hit Total Coverage
Test: coverage.info Lines: 165 2253 7.3 %
Date: 2023-04-06 08:38:28 Functions: 3 146 2.1 %

          Line data    Source code
       1             : /*
       2             :  * Copyright © 2014 Red Hat
       3             :  *
       4             :  * Permission to use, copy, modify, distribute, and sell this software and its
       5             :  * documentation for any purpose is hereby granted without fee, provided that
       6             :  * the above copyright notice appear in all copies and that both that copyright
       7             :  * notice and this permission notice appear in supporting documentation, and
       8             :  * that the name of the copyright holders not be used in advertising or
       9             :  * publicity pertaining to distribution of the software without specific,
      10             :  * written prior permission.  The copyright holders make no representations
      11             :  * about the suitability of this software for any purpose.  It is provided "as
      12             :  * is" without express or implied warranty.
      13             :  *
      14             :  * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
      15             :  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
      16             :  * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
      17             :  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
      18             :  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
      19             :  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
      20             :  * OF THIS SOFTWARE.
      21             :  */
      22             : 
      23             : #include <linux/bitfield.h>
      24             : #include <linux/delay.h>
      25             : #include <linux/errno.h>
      26             : #include <linux/i2c.h>
      27             : #include <linux/init.h>
      28             : #include <linux/kernel.h>
      29             : #include <linux/random.h>
      30             : #include <linux/sched.h>
      31             : #include <linux/seq_file.h>
      32             : #include <linux/iopoll.h>
      33             : 
      34             : #if IS_ENABLED(CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS)
      35             : #include <linux/stacktrace.h>
      36             : #include <linux/sort.h>
      37             : #include <linux/timekeeping.h>
      38             : #include <linux/math64.h>
      39             : #endif
      40             : 
      41             : #include <drm/display/drm_dp_mst_helper.h>
      42             : #include <drm/drm_atomic.h>
      43             : #include <drm/drm_atomic_helper.h>
      44             : #include <drm/drm_drv.h>
      45             : #include <drm/drm_edid.h>
      46             : #include <drm/drm_print.h>
      47             : #include <drm/drm_probe_helper.h>
      48             : 
      49             : #include "drm_dp_helper_internal.h"
      50             : #include "drm_dp_mst_topology_internal.h"
      51             : 
      52             : /**
      53             :  * DOC: dp mst helper
      54             :  *
      55             :  * These functions contain parts of the DisplayPort 1.2a MultiStream Transport
      56             :  * protocol. The helpers contain a topology manager and bandwidth manager.
      57             :  * The helpers encapsulate the sending and received of sideband msgs.
      58             :  */
      59             : struct drm_dp_pending_up_req {
      60             :         struct drm_dp_sideband_msg_hdr hdr;
      61             :         struct drm_dp_sideband_msg_req_body msg;
      62             :         struct list_head next;
      63             : };
      64             : 
      65             : static bool dump_dp_payload_table(struct drm_dp_mst_topology_mgr *mgr,
      66             :                                   char *buf);
      67             : 
      68             : static void drm_dp_mst_topology_put_port(struct drm_dp_mst_port *port);
      69             : 
      70             : static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr,
      71             :                                      int id, u8 start_slot, u8 num_slots);
      72             : 
      73             : static int drm_dp_send_dpcd_read(struct drm_dp_mst_topology_mgr *mgr,
      74             :                                  struct drm_dp_mst_port *port,
      75             :                                  int offset, int size, u8 *bytes);
      76             : static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr,
      77             :                                   struct drm_dp_mst_port *port,
      78             :                                   int offset, int size, u8 *bytes);
      79             : 
      80             : static int drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr,
      81             :                                     struct drm_dp_mst_branch *mstb);
      82             : 
      83             : static void
      84             : drm_dp_send_clear_payload_id_table(struct drm_dp_mst_topology_mgr *mgr,
      85             :                                    struct drm_dp_mst_branch *mstb);
      86             : 
      87             : static int drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr,
      88             :                                            struct drm_dp_mst_branch *mstb,
      89             :                                            struct drm_dp_mst_port *port);
      90             : static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr,
      91             :                                  u8 *guid);
      92             : 
      93             : static int drm_dp_mst_register_i2c_bus(struct drm_dp_mst_port *port);
      94             : static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_mst_port *port);
      95             : static void drm_dp_mst_kick_tx(struct drm_dp_mst_topology_mgr *mgr);
      96             : 
      97             : static bool drm_dp_mst_port_downstream_of_branch(struct drm_dp_mst_port *port,
      98             :                                                  struct drm_dp_mst_branch *branch);
      99             : 
     100             : #define DBG_PREFIX "[dp_mst]"
     101             : 
     102             : #define DP_STR(x) [DP_ ## x] = #x
     103             : 
     104             : static const char *drm_dp_mst_req_type_str(u8 req_type)
     105             : {
     106             :         static const char * const req_type_str[] = {
     107             :                 DP_STR(GET_MSG_TRANSACTION_VERSION),
     108             :                 DP_STR(LINK_ADDRESS),
     109             :                 DP_STR(CONNECTION_STATUS_NOTIFY),
     110             :                 DP_STR(ENUM_PATH_RESOURCES),
     111             :                 DP_STR(ALLOCATE_PAYLOAD),
     112             :                 DP_STR(QUERY_PAYLOAD),
     113             :                 DP_STR(RESOURCE_STATUS_NOTIFY),
     114             :                 DP_STR(CLEAR_PAYLOAD_ID_TABLE),
     115             :                 DP_STR(REMOTE_DPCD_READ),
     116             :                 DP_STR(REMOTE_DPCD_WRITE),
     117             :                 DP_STR(REMOTE_I2C_READ),
     118             :                 DP_STR(REMOTE_I2C_WRITE),
     119             :                 DP_STR(POWER_UP_PHY),
     120             :                 DP_STR(POWER_DOWN_PHY),
     121             :                 DP_STR(SINK_EVENT_NOTIFY),
     122             :                 DP_STR(QUERY_STREAM_ENC_STATUS),
     123             :         };
     124             : 
     125           0 :         if (req_type >= ARRAY_SIZE(req_type_str) ||
     126           0 :             !req_type_str[req_type])
     127             :                 return "unknown";
     128             : 
     129             :         return req_type_str[req_type];
     130             : }
     131             : 
     132             : #undef DP_STR
     133             : #define DP_STR(x) [DP_NAK_ ## x] = #x
     134             : 
     135             : static const char *drm_dp_mst_nak_reason_str(u8 nak_reason)
     136             : {
     137             :         static const char * const nak_reason_str[] = {
     138             :                 DP_STR(WRITE_FAILURE),
     139             :                 DP_STR(INVALID_READ),
     140             :                 DP_STR(CRC_FAILURE),
     141             :                 DP_STR(BAD_PARAM),
     142             :                 DP_STR(DEFER),
     143             :                 DP_STR(LINK_FAILURE),
     144             :                 DP_STR(NO_RESOURCES),
     145             :                 DP_STR(DPCD_FAIL),
     146             :                 DP_STR(I2C_NAK),
     147             :                 DP_STR(ALLOCATE_FAIL),
     148             :         };
     149             : 
     150           0 :         if (nak_reason >= ARRAY_SIZE(nak_reason_str) ||
     151           0 :             !nak_reason_str[nak_reason])
     152             :                 return "unknown";
     153             : 
     154             :         return nak_reason_str[nak_reason];
     155             : }
     156             : 
     157             : #undef DP_STR
     158             : #define DP_STR(x) [DRM_DP_SIDEBAND_TX_ ## x] = #x
     159             : 
     160             : static const char *drm_dp_mst_sideband_tx_state_str(int state)
     161             : {
     162             :         static const char * const sideband_reason_str[] = {
     163             :                 DP_STR(QUEUED),
     164             :                 DP_STR(START_SEND),
     165             :                 DP_STR(SENT),
     166             :                 DP_STR(RX),
     167             :                 DP_STR(TIMEOUT),
     168             :         };
     169             : 
     170           0 :         if (state >= ARRAY_SIZE(sideband_reason_str) ||
     171           0 :             !sideband_reason_str[state])
     172             :                 return "unknown";
     173             : 
     174             :         return sideband_reason_str[state];
     175             : }
     176             : 
     177             : static int
     178           0 : drm_dp_mst_rad_to_str(const u8 rad[8], u8 lct, char *out, size_t len)
     179             : {
     180             :         int i;
     181             :         u8 unpacked_rad[16];
     182             : 
     183           0 :         for (i = 0; i < lct; i++) {
     184           0 :                 if (i % 2)
     185           0 :                         unpacked_rad[i] = rad[i / 2] >> 4;
     186             :                 else
     187           0 :                         unpacked_rad[i] = rad[i / 2] & BIT_MASK(4);
     188             :         }
     189             : 
     190             :         /* TODO: Eventually add something to printk so we can format the rad
     191             :          * like this: 1.2.3
     192             :          */
     193           0 :         return snprintf(out, len, "%*phC", lct, unpacked_rad);
     194             : }
     195             : 
     196             : /* sideband msg handling */
     197           0 : static u8 drm_dp_msg_header_crc4(const uint8_t *data, size_t num_nibbles)
     198             : {
     199           0 :         u8 bitmask = 0x80;
     200           0 :         u8 bitshift = 7;
     201           0 :         u8 array_index = 0;
     202           0 :         int number_of_bits = num_nibbles * 4;
     203           0 :         u8 remainder = 0;
     204             : 
     205           0 :         while (number_of_bits != 0) {
     206           0 :                 number_of_bits--;
     207           0 :                 remainder <<= 1;
     208           0 :                 remainder |= (data[array_index] & bitmask) >> bitshift;
     209           0 :                 bitmask >>= 1;
     210           0 :                 bitshift--;
     211           0 :                 if (bitmask == 0) {
     212           0 :                         bitmask = 0x80;
     213           0 :                         bitshift = 7;
     214           0 :                         array_index++;
     215             :                 }
     216           0 :                 if ((remainder & 0x10) == 0x10)
     217           0 :                         remainder ^= 0x13;
     218             :         }
     219             : 
     220             :         number_of_bits = 4;
     221           0 :         while (number_of_bits != 0) {
     222           0 :                 number_of_bits--;
     223           0 :                 remainder <<= 1;
     224           0 :                 if ((remainder & 0x10) != 0)
     225           0 :                         remainder ^= 0x13;
     226             :         }
     227             : 
     228           0 :         return remainder;
     229             : }
     230             : 
     231           0 : static u8 drm_dp_msg_data_crc4(const uint8_t *data, u8 number_of_bytes)
     232             : {
     233           0 :         u8 bitmask = 0x80;
     234           0 :         u8 bitshift = 7;
     235           0 :         u8 array_index = 0;
     236           0 :         int number_of_bits = number_of_bytes * 8;
     237           0 :         u16 remainder = 0;
     238             : 
     239           0 :         while (number_of_bits != 0) {
     240           0 :                 number_of_bits--;
     241           0 :                 remainder <<= 1;
     242           0 :                 remainder |= (data[array_index] & bitmask) >> bitshift;
     243           0 :                 bitmask >>= 1;
     244           0 :                 bitshift--;
     245           0 :                 if (bitmask == 0) {
     246           0 :                         bitmask = 0x80;
     247           0 :                         bitshift = 7;
     248           0 :                         array_index++;
     249             :                 }
     250           0 :                 if ((remainder & 0x100) == 0x100)
     251           0 :                         remainder ^= 0xd5;
     252             :         }
     253             : 
     254             :         number_of_bits = 8;
     255           0 :         while (number_of_bits != 0) {
     256           0 :                 number_of_bits--;
     257           0 :                 remainder <<= 1;
     258           0 :                 if ((remainder & 0x100) != 0)
     259           0 :                         remainder ^= 0xd5;
     260             :         }
     261             : 
     262           0 :         return remainder & 0xff;
     263             : }
     264             : static inline u8 drm_dp_calc_sb_hdr_size(struct drm_dp_sideband_msg_hdr *hdr)
     265             : {
     266           0 :         u8 size = 3;
     267             : 
     268           0 :         size += (hdr->lct / 2);
     269             :         return size;
     270             : }
     271             : 
     272           0 : static void drm_dp_encode_sideband_msg_hdr(struct drm_dp_sideband_msg_hdr *hdr,
     273             :                                            u8 *buf, int *len)
     274             : {
     275           0 :         int idx = 0;
     276             :         int i;
     277             :         u8 crc4;
     278             : 
     279           0 :         buf[idx++] = ((hdr->lct & 0xf) << 4) | (hdr->lcr & 0xf);
     280           0 :         for (i = 0; i < (hdr->lct / 2); i++)
     281           0 :                 buf[idx++] = hdr->rad[i];
     282           0 :         buf[idx++] = (hdr->broadcast << 7) | (hdr->path_msg << 6) |
     283           0 :                 (hdr->msg_len & 0x3f);
     284           0 :         buf[idx++] = (hdr->somt << 7) | (hdr->eomt << 6) | (hdr->seqno << 4);
     285             : 
     286           0 :         crc4 = drm_dp_msg_header_crc4(buf, (idx * 2) - 1);
     287           0 :         buf[idx - 1] |= (crc4 & 0xf);
     288             : 
     289           0 :         *len = idx;
     290           0 : }
     291             : 
     292           0 : static bool drm_dp_decode_sideband_msg_hdr(const struct drm_dp_mst_topology_mgr *mgr,
     293             :                                            struct drm_dp_sideband_msg_hdr *hdr,
     294             :                                            u8 *buf, int buflen, u8 *hdrlen)
     295             : {
     296             :         u8 crc4;
     297             :         u8 len;
     298             :         int i;
     299             :         u8 idx;
     300             : 
     301           0 :         if (buf[0] == 0)
     302             :                 return false;
     303           0 :         len = 3;
     304           0 :         len += ((buf[0] & 0xf0) >> 4) / 2;
     305           0 :         if (len > buflen)
     306             :                 return false;
     307           0 :         crc4 = drm_dp_msg_header_crc4(buf, (len * 2) - 1);
     308             : 
     309           0 :         if ((crc4 & 0xf) != (buf[len - 1] & 0xf)) {
     310           0 :                 drm_dbg_kms(mgr->dev, "crc4 mismatch 0x%x 0x%x\n", crc4, buf[len - 1]);
     311             :                 return false;
     312             :         }
     313             : 
     314           0 :         hdr->lct = (buf[0] & 0xf0) >> 4;
     315           0 :         hdr->lcr = (buf[0] & 0xf);
     316           0 :         idx = 1;
     317           0 :         for (i = 0; i < (hdr->lct / 2); i++)
     318           0 :                 hdr->rad[i] = buf[idx++];
     319           0 :         hdr->broadcast = (buf[idx] >> 7) & 0x1;
     320           0 :         hdr->path_msg = (buf[idx] >> 6) & 0x1;
     321           0 :         hdr->msg_len = buf[idx] & 0x3f;
     322           0 :         idx++;
     323           0 :         hdr->somt = (buf[idx] >> 7) & 0x1;
     324           0 :         hdr->eomt = (buf[idx] >> 6) & 0x1;
     325           0 :         hdr->seqno = (buf[idx] >> 4) & 0x1;
     326           0 :         idx++;
     327           0 :         *hdrlen = idx;
     328             :         return true;
     329             : }
     330             : 
     331             : void
     332          27 : drm_dp_encode_sideband_req(const struct drm_dp_sideband_msg_req_body *req,
     333             :                            struct drm_dp_sideband_msg_tx *raw)
     334             : {
     335          27 :         int idx = 0;
     336             :         int i;
     337          27 :         u8 *buf = raw->msg;
     338             : 
     339          27 :         buf[idx++] = req->req_type & 0x7f;
     340             : 
     341          27 :         switch (req->req_type) {
     342             :         case DP_ENUM_PATH_RESOURCES:
     343             :         case DP_POWER_DOWN_PHY:
     344             :         case DP_POWER_UP_PHY:
     345           3 :                 buf[idx] = (req->u.port_num.port_number & 0xf) << 4;
     346           3 :                 idx++;
     347           3 :                 break;
     348             :         case DP_ALLOCATE_PAYLOAD:
     349           8 :                 buf[idx] = (req->u.allocate_payload.port_number & 0xf) << 4 |
     350           4 :                         (req->u.allocate_payload.number_sdp_streams & 0xf);
     351           4 :                 idx++;
     352           4 :                 buf[idx] = (req->u.allocate_payload.vcpi & 0x7f);
     353           4 :                 idx++;
     354           4 :                 buf[idx] = (req->u.allocate_payload.pbn >> 8);
     355           4 :                 idx++;
     356           4 :                 buf[idx] = (req->u.allocate_payload.pbn & 0xff);
     357           4 :                 idx++;
     358           5 :                 for (i = 0; i < req->u.allocate_payload.number_sdp_streams / 2; i++) {
     359           2 :                         buf[idx] = ((req->u.allocate_payload.sdp_stream_sink[i * 2] & 0xf) << 4) |
     360           1 :                                 (req->u.allocate_payload.sdp_stream_sink[i * 2 + 1] & 0xf);
     361           1 :                         idx++;
     362             :                 }
     363           4 :                 if (req->u.allocate_payload.number_sdp_streams & 1) {
     364           1 :                         i = req->u.allocate_payload.number_sdp_streams - 1;
     365           1 :                         buf[idx] = (req->u.allocate_payload.sdp_stream_sink[i] & 0xf) << 4;
     366           1 :                         idx++;
     367             :                 }
     368             :                 break;
     369             :         case DP_QUERY_PAYLOAD:
     370           2 :                 buf[idx] = (req->u.query_payload.port_number & 0xf) << 4;
     371           2 :                 idx++;
     372           2 :                 buf[idx] = (req->u.query_payload.vcpi & 0x7f);
     373           2 :                 idx++;
     374           2 :                 break;
     375             :         case DP_REMOTE_DPCD_READ:
     376           3 :                 buf[idx] = (req->u.dpcd_read.port_number & 0xf) << 4;
     377           3 :                 buf[idx] |= ((req->u.dpcd_read.dpcd_address & 0xf0000) >> 16) & 0xf;
     378           3 :                 idx++;
     379           3 :                 buf[idx] = (req->u.dpcd_read.dpcd_address & 0xff00) >> 8;
     380           3 :                 idx++;
     381           3 :                 buf[idx] = (req->u.dpcd_read.dpcd_address & 0xff);
     382           3 :                 idx++;
     383           3 :                 buf[idx] = (req->u.dpcd_read.num_bytes);
     384           3 :                 idx++;
     385           3 :                 break;
     386             : 
     387             :         case DP_REMOTE_DPCD_WRITE:
     388           3 :                 buf[idx] = (req->u.dpcd_write.port_number & 0xf) << 4;
     389           3 :                 buf[idx] |= ((req->u.dpcd_write.dpcd_address & 0xf0000) >> 16) & 0xf;
     390           3 :                 idx++;
     391           3 :                 buf[idx] = (req->u.dpcd_write.dpcd_address & 0xff00) >> 8;
     392           3 :                 idx++;
     393           3 :                 buf[idx] = (req->u.dpcd_write.dpcd_address & 0xff);
     394           3 :                 idx++;
     395           3 :                 buf[idx] = (req->u.dpcd_write.num_bytes);
     396           3 :                 idx++;
     397           3 :                 memcpy(&buf[idx], req->u.dpcd_write.bytes, req->u.dpcd_write.num_bytes);
     398           3 :                 idx += req->u.dpcd_write.num_bytes;
     399           3 :                 break;
     400             :         case DP_REMOTE_I2C_READ:
     401           3 :                 buf[idx] = (req->u.i2c_read.port_number & 0xf) << 4;
     402           3 :                 buf[idx] |= (req->u.i2c_read.num_transactions & 0x3);
     403           3 :                 idx++;
     404           6 :                 for (i = 0; i < (req->u.i2c_read.num_transactions & 0x3); i++) {
     405           3 :                         buf[idx] = req->u.i2c_read.transactions[i].i2c_dev_id & 0x7f;
     406           3 :                         idx++;
     407           3 :                         buf[idx] = req->u.i2c_read.transactions[i].num_bytes;
     408           3 :                         idx++;
     409           3 :                         memcpy(&buf[idx], req->u.i2c_read.transactions[i].bytes, req->u.i2c_read.transactions[i].num_bytes);
     410           3 :                         idx += req->u.i2c_read.transactions[i].num_bytes;
     411             : 
     412           3 :                         buf[idx] = (req->u.i2c_read.transactions[i].no_stop_bit & 0x1) << 4;
     413           3 :                         buf[idx] |= (req->u.i2c_read.transactions[i].i2c_transaction_delay & 0xf);
     414           3 :                         idx++;
     415             :                 }
     416           3 :                 buf[idx] = (req->u.i2c_read.read_i2c_device_id) & 0x7f;
     417           3 :                 idx++;
     418           3 :                 buf[idx] = (req->u.i2c_read.num_bytes_read);
     419           3 :                 idx++;
     420           3 :                 break;
     421             : 
     422             :         case DP_REMOTE_I2C_WRITE:
     423           3 :                 buf[idx] = (req->u.i2c_write.port_number & 0xf) << 4;
     424           3 :                 idx++;
     425           3 :                 buf[idx] = (req->u.i2c_write.write_i2c_device_id) & 0x7f;
     426           3 :                 idx++;
     427           3 :                 buf[idx] = (req->u.i2c_write.num_bytes);
     428           3 :                 idx++;
     429           3 :                 memcpy(&buf[idx], req->u.i2c_write.bytes, req->u.i2c_write.num_bytes);
     430           3 :                 idx += req->u.i2c_write.num_bytes;
     431           3 :                 break;
     432             :         case DP_QUERY_STREAM_ENC_STATUS: {
     433             :                 const struct drm_dp_query_stream_enc_status *msg;
     434             : 
     435           6 :                 msg = &req->u.enc_status;
     436           6 :                 buf[idx] = msg->stream_id;
     437           6 :                 idx++;
     438           6 :                 memcpy(&buf[idx], msg->client_id, sizeof(msg->client_id));
     439           6 :                 idx += sizeof(msg->client_id);
     440           6 :                 buf[idx] = 0;
     441           6 :                 buf[idx] |= FIELD_PREP(GENMASK(1, 0), msg->stream_event);
     442           6 :                 buf[idx] |= msg->valid_stream_event ? BIT(2) : 0;
     443           6 :                 buf[idx] |= FIELD_PREP(GENMASK(4, 3), msg->stream_behavior);
     444           6 :                 buf[idx] |= msg->valid_stream_behavior ? BIT(5) : 0;
     445           6 :                 idx++;
     446             :                 }
     447           6 :                 break;
     448             :         }
     449          27 :         raw->cur_len = idx;
     450          27 : }
     451             : EXPORT_SYMBOL_FOR_TESTS_ONLY(drm_dp_encode_sideband_req);
     452             : 
     453             : /* Decode a sideband request we've encoded, mainly used for debugging */
     454             : int
     455          27 : drm_dp_decode_sideband_req(const struct drm_dp_sideband_msg_tx *raw,
     456             :                            struct drm_dp_sideband_msg_req_body *req)
     457             : {
     458          27 :         const u8 *buf = raw->msg;
     459          27 :         int i, idx = 0;
     460             : 
     461          27 :         req->req_type = buf[idx++] & 0x7f;
     462          27 :         switch (req->req_type) {
     463             :         case DP_ENUM_PATH_RESOURCES:
     464             :         case DP_POWER_DOWN_PHY:
     465             :         case DP_POWER_UP_PHY:
     466           3 :                 req->u.port_num.port_number = (buf[idx] >> 4) & 0xf;
     467           3 :                 break;
     468             :         case DP_ALLOCATE_PAYLOAD:
     469             :                 {
     470           4 :                         struct drm_dp_allocate_payload *a =
     471             :                                 &req->u.allocate_payload;
     472             : 
     473           4 :                         a->number_sdp_streams = buf[idx] & 0xf;
     474           4 :                         a->port_number = (buf[idx] >> 4) & 0xf;
     475             : 
     476           4 :                         WARN_ON(buf[++idx] & 0x80);
     477           4 :                         a->vcpi = buf[idx] & 0x7f;
     478             : 
     479           4 :                         a->pbn = buf[++idx] << 8;
     480           4 :                         a->pbn |= buf[++idx];
     481             : 
     482           4 :                         idx++;
     483           7 :                         for (i = 0; i < a->number_sdp_streams; i++) {
     484           3 :                                 a->sdp_stream_sink[i] =
     485           3 :                                         (buf[idx + (i / 2)] >> ((i % 2) ? 0 : 4)) & 0xf;
     486             :                         }
     487             :                 }
     488             :                 break;
     489             :         case DP_QUERY_PAYLOAD:
     490           2 :                 req->u.query_payload.port_number = (buf[idx] >> 4) & 0xf;
     491           2 :                 WARN_ON(buf[++idx] & 0x80);
     492           2 :                 req->u.query_payload.vcpi = buf[idx] & 0x7f;
     493           2 :                 break;
     494             :         case DP_REMOTE_DPCD_READ:
     495             :                 {
     496           3 :                         struct drm_dp_remote_dpcd_read *r = &req->u.dpcd_read;
     497             : 
     498           3 :                         r->port_number = (buf[idx] >> 4) & 0xf;
     499             : 
     500           3 :                         r->dpcd_address = (buf[idx] << 16) & 0xf0000;
     501           3 :                         r->dpcd_address |= (buf[++idx] << 8) & 0xff00;
     502           3 :                         r->dpcd_address |= buf[++idx] & 0xff;
     503             : 
     504           3 :                         r->num_bytes = buf[++idx];
     505             :                 }
     506           3 :                 break;
     507             :         case DP_REMOTE_DPCD_WRITE:
     508             :                 {
     509           3 :                         struct drm_dp_remote_dpcd_write *w =
     510             :                                 &req->u.dpcd_write;
     511             : 
     512           3 :                         w->port_number = (buf[idx] >> 4) & 0xf;
     513             : 
     514           3 :                         w->dpcd_address = (buf[idx] << 16) & 0xf0000;
     515           3 :                         w->dpcd_address |= (buf[++idx] << 8) & 0xff00;
     516           3 :                         w->dpcd_address |= buf[++idx] & 0xff;
     517             : 
     518           3 :                         w->num_bytes = buf[++idx];
     519             : 
     520           3 :                         w->bytes = kmemdup(&buf[++idx], w->num_bytes,
     521             :                                            GFP_KERNEL);
     522           3 :                         if (!w->bytes)
     523             :                                 return -ENOMEM;
     524             :                 }
     525             :                 break;
     526             :         case DP_REMOTE_I2C_READ:
     527             :                 {
     528           3 :                         struct drm_dp_remote_i2c_read *r = &req->u.i2c_read;
     529             :                         struct drm_dp_remote_i2c_read_tx *tx;
     530           3 :                         bool failed = false;
     531             : 
     532           3 :                         r->num_transactions = buf[idx] & 0x3;
     533           3 :                         r->port_number = (buf[idx] >> 4) & 0xf;
     534           6 :                         for (i = 0; i < r->num_transactions; i++) {
     535           3 :                                 tx = &r->transactions[i];
     536             : 
     537           3 :                                 tx->i2c_dev_id = buf[++idx] & 0x7f;
     538           3 :                                 tx->num_bytes = buf[++idx];
     539           3 :                                 tx->bytes = kmemdup(&buf[++idx],
     540             :                                                     tx->num_bytes,
     541             :                                                     GFP_KERNEL);
     542           3 :                                 if (!tx->bytes) {
     543             :                                         failed = true;
     544             :                                         break;
     545             :                                 }
     546           3 :                                 idx += tx->num_bytes;
     547           3 :                                 tx->no_stop_bit = (buf[idx] >> 5) & 0x1;
     548           3 :                                 tx->i2c_transaction_delay = buf[idx] & 0xf;
     549             :                         }
     550             : 
     551           3 :                         if (failed) {
     552           0 :                                 for (i = 0; i < r->num_transactions; i++) {
     553           0 :                                         tx = &r->transactions[i];
     554           0 :                                         kfree(tx->bytes);
     555             :                                 }
     556             :                                 return -ENOMEM;
     557             :                         }
     558             : 
     559           3 :                         r->read_i2c_device_id = buf[++idx] & 0x7f;
     560           3 :                         r->num_bytes_read = buf[++idx];
     561             :                 }
     562           3 :                 break;
     563             :         case DP_REMOTE_I2C_WRITE:
     564             :                 {
     565           3 :                         struct drm_dp_remote_i2c_write *w = &req->u.i2c_write;
     566             : 
     567           3 :                         w->port_number = (buf[idx] >> 4) & 0xf;
     568           3 :                         w->write_i2c_device_id = buf[++idx] & 0x7f;
     569           3 :                         w->num_bytes = buf[++idx];
     570           3 :                         w->bytes = kmemdup(&buf[++idx], w->num_bytes,
     571             :                                            GFP_KERNEL);
     572           3 :                         if (!w->bytes)
     573             :                                 return -ENOMEM;
     574             :                 }
     575             :                 break;
     576             :         case DP_QUERY_STREAM_ENC_STATUS:
     577           6 :                 req->u.enc_status.stream_id = buf[idx++];
     578          48 :                 for (i = 0; i < sizeof(req->u.enc_status.client_id); i++)
     579          42 :                         req->u.enc_status.client_id[i] = buf[idx++];
     580             : 
     581           6 :                 req->u.enc_status.stream_event = FIELD_GET(GENMASK(1, 0),
     582             :                                                            buf[idx]);
     583           6 :                 req->u.enc_status.valid_stream_event = FIELD_GET(BIT(2),
     584             :                                                                  buf[idx]);
     585           6 :                 req->u.enc_status.stream_behavior = FIELD_GET(GENMASK(4, 3),
     586             :                                                               buf[idx]);
     587           6 :                 req->u.enc_status.valid_stream_behavior = FIELD_GET(BIT(5),
     588             :                                                                     buf[idx]);
     589           6 :                 break;
     590             :         }
     591             : 
     592             :         return 0;
     593             : }
     594             : EXPORT_SYMBOL_FOR_TESTS_ONLY(drm_dp_decode_sideband_req);
     595             : 
     596             : void
     597           0 : drm_dp_dump_sideband_msg_req_body(const struct drm_dp_sideband_msg_req_body *req,
     598             :                                   int indent, struct drm_printer *printer)
     599             : {
     600             :         int i;
     601             : 
     602             : #define P(f, ...) drm_printf_indent(printer, indent, f, ##__VA_ARGS__)
     603           0 :         if (req->req_type == DP_LINK_ADDRESS) {
     604             :                 /* No contents to print */
     605           0 :                 P("type=%s\n", drm_dp_mst_req_type_str(req->req_type));
     606           0 :                 return;
     607             :         }
     608             : 
     609           0 :         P("type=%s contents:\n", drm_dp_mst_req_type_str(req->req_type));
     610           0 :         indent++;
     611             : 
     612           0 :         switch (req->req_type) {
     613             :         case DP_ENUM_PATH_RESOURCES:
     614             :         case DP_POWER_DOWN_PHY:
     615             :         case DP_POWER_UP_PHY:
     616           0 :                 P("port=%d\n", req->u.port_num.port_number);
     617           0 :                 break;
     618             :         case DP_ALLOCATE_PAYLOAD:
     619           0 :                 P("port=%d vcpi=%d pbn=%d sdp_streams=%d %*ph\n",
     620             :                   req->u.allocate_payload.port_number,
     621             :                   req->u.allocate_payload.vcpi, req->u.allocate_payload.pbn,
     622             :                   req->u.allocate_payload.number_sdp_streams,
     623             :                   req->u.allocate_payload.number_sdp_streams,
     624             :                   req->u.allocate_payload.sdp_stream_sink);
     625           0 :                 break;
     626             :         case DP_QUERY_PAYLOAD:
     627           0 :                 P("port=%d vcpi=%d\n",
     628             :                   req->u.query_payload.port_number,
     629             :                   req->u.query_payload.vcpi);
     630           0 :                 break;
     631             :         case DP_REMOTE_DPCD_READ:
     632           0 :                 P("port=%d dpcd_addr=%05x len=%d\n",
     633             :                   req->u.dpcd_read.port_number, req->u.dpcd_read.dpcd_address,
     634             :                   req->u.dpcd_read.num_bytes);
     635           0 :                 break;
     636             :         case DP_REMOTE_DPCD_WRITE:
     637           0 :                 P("port=%d addr=%05x len=%d: %*ph\n",
     638             :                   req->u.dpcd_write.port_number,
     639             :                   req->u.dpcd_write.dpcd_address,
     640             :                   req->u.dpcd_write.num_bytes, req->u.dpcd_write.num_bytes,
     641             :                   req->u.dpcd_write.bytes);
     642           0 :                 break;
     643             :         case DP_REMOTE_I2C_READ:
     644           0 :                 P("port=%d num_tx=%d id=%d size=%d:\n",
     645             :                   req->u.i2c_read.port_number,
     646             :                   req->u.i2c_read.num_transactions,
     647             :                   req->u.i2c_read.read_i2c_device_id,
     648             :                   req->u.i2c_read.num_bytes_read);
     649             : 
     650           0 :                 indent++;
     651           0 :                 for (i = 0; i < req->u.i2c_read.num_transactions; i++) {
     652           0 :                         const struct drm_dp_remote_i2c_read_tx *rtx =
     653             :                                 &req->u.i2c_read.transactions[i];
     654             : 
     655           0 :                         P("%d: id=%03d size=%03d no_stop_bit=%d tx_delay=%03d: %*ph\n",
     656             :                           i, rtx->i2c_dev_id, rtx->num_bytes,
     657             :                           rtx->no_stop_bit, rtx->i2c_transaction_delay,
     658             :                           rtx->num_bytes, rtx->bytes);
     659             :                 }
     660             :                 break;
     661             :         case DP_REMOTE_I2C_WRITE:
     662           0 :                 P("port=%d id=%d size=%d: %*ph\n",
     663             :                   req->u.i2c_write.port_number,
     664             :                   req->u.i2c_write.write_i2c_device_id,
     665             :                   req->u.i2c_write.num_bytes, req->u.i2c_write.num_bytes,
     666             :                   req->u.i2c_write.bytes);
     667           0 :                 break;
     668             :         case DP_QUERY_STREAM_ENC_STATUS:
     669           0 :                 P("stream_id=%u client_id=%*ph stream_event=%x "
     670             :                   "valid_event=%d stream_behavior=%x valid_behavior=%d",
     671             :                   req->u.enc_status.stream_id,
     672             :                   (int)ARRAY_SIZE(req->u.enc_status.client_id),
     673             :                   req->u.enc_status.client_id, req->u.enc_status.stream_event,
     674             :                   req->u.enc_status.valid_stream_event,
     675             :                   req->u.enc_status.stream_behavior,
     676             :                   req->u.enc_status.valid_stream_behavior);
     677           0 :                 break;
     678             :         default:
     679           0 :                 P("???\n");
     680           0 :                 break;
     681             :         }
     682             : #undef P
     683             : }
     684             : EXPORT_SYMBOL_FOR_TESTS_ONLY(drm_dp_dump_sideband_msg_req_body);
     685             : 
     686             : static inline void
     687           0 : drm_dp_mst_dump_sideband_msg_tx(struct drm_printer *p,
     688             :                                 const struct drm_dp_sideband_msg_tx *txmsg)
     689             : {
     690             :         struct drm_dp_sideband_msg_req_body req;
     691             :         char buf[64];
     692             :         int ret;
     693             :         int i;
     694             : 
     695           0 :         drm_dp_mst_rad_to_str(txmsg->dst->rad, txmsg->dst->lct, buf,
     696             :                               sizeof(buf));
     697           0 :         drm_printf(p, "txmsg cur_offset=%x cur_len=%x seqno=%x state=%s path_msg=%d dst=%s\n",
     698           0 :                    txmsg->cur_offset, txmsg->cur_len, txmsg->seqno,
     699             :                    drm_dp_mst_sideband_tx_state_str(txmsg->state),
     700           0 :                    txmsg->path_msg, buf);
     701             : 
     702           0 :         ret = drm_dp_decode_sideband_req(txmsg, &req);
     703           0 :         if (ret) {
     704           0 :                 drm_printf(p, "<failed to decode sideband req: %d>\n", ret);
     705           0 :                 return;
     706             :         }
     707           0 :         drm_dp_dump_sideband_msg_req_body(&req, 1, p);
     708             : 
     709           0 :         switch (req.req_type) {
     710             :         case DP_REMOTE_DPCD_WRITE:
     711           0 :                 kfree(req.u.dpcd_write.bytes);
     712           0 :                 break;
     713             :         case DP_REMOTE_I2C_READ:
     714           0 :                 for (i = 0; i < req.u.i2c_read.num_transactions; i++)
     715           0 :                         kfree(req.u.i2c_read.transactions[i].bytes);
     716             :                 break;
     717             :         case DP_REMOTE_I2C_WRITE:
     718           0 :                 kfree(req.u.i2c_write.bytes);
     719           0 :                 break;
     720             :         }
     721             : }
     722             : 
     723             : static void drm_dp_crc_sideband_chunk_req(u8 *msg, u8 len)
     724             : {
     725             :         u8 crc4;
     726             : 
     727           0 :         crc4 = drm_dp_msg_data_crc4(msg, len);
     728           0 :         msg[len] = crc4;
     729             : }
     730             : 
     731             : static void drm_dp_encode_sideband_reply(struct drm_dp_sideband_msg_reply_body *rep,
     732             :                                          struct drm_dp_sideband_msg_tx *raw)
     733             : {
     734           0 :         int idx = 0;
     735           0 :         u8 *buf = raw->msg;
     736             : 
     737           0 :         buf[idx++] = (rep->reply_type & 0x1) << 7 | (rep->req_type & 0x7f);
     738             : 
     739           0 :         raw->cur_len = idx;
     740             : }
     741             : 
     742           0 : static int drm_dp_sideband_msg_set_header(struct drm_dp_sideband_msg_rx *msg,
     743             :                                           struct drm_dp_sideband_msg_hdr *hdr,
     744             :                                           u8 hdrlen)
     745             : {
     746             :         /*
     747             :          * ignore out-of-order messages or messages that are part of a
     748             :          * failed transaction
     749             :          */
     750           0 :         if (!hdr->somt && !msg->have_somt)
     751             :                 return false;
     752             : 
     753             :         /* get length contained in this portion */
     754           0 :         msg->curchunk_idx = 0;
     755           0 :         msg->curchunk_len = hdr->msg_len;
     756           0 :         msg->curchunk_hdrlen = hdrlen;
     757             : 
     758             :         /* we have already gotten an somt - don't bother parsing */
     759           0 :         if (hdr->somt && msg->have_somt)
     760             :                 return false;
     761             : 
     762           0 :         if (hdr->somt) {
     763           0 :                 memcpy(&msg->initial_hdr, hdr,
     764             :                        sizeof(struct drm_dp_sideband_msg_hdr));
     765           0 :                 msg->have_somt = true;
     766             :         }
     767           0 :         if (hdr->eomt)
     768           0 :                 msg->have_eomt = true;
     769             : 
     770             :         return true;
     771             : }
     772             : 
     773             : /* this adds a chunk of msg to the builder to get the final msg */
     774           0 : static bool drm_dp_sideband_append_payload(struct drm_dp_sideband_msg_rx *msg,
     775             :                                            u8 *replybuf, u8 replybuflen)
     776             : {
     777             :         u8 crc4;
     778             : 
     779           0 :         memcpy(&msg->chunk[msg->curchunk_idx], replybuf, replybuflen);
     780           0 :         msg->curchunk_idx += replybuflen;
     781             : 
     782           0 :         if (msg->curchunk_idx >= msg->curchunk_len) {
     783             :                 /* do CRC */
     784           0 :                 crc4 = drm_dp_msg_data_crc4(msg->chunk, msg->curchunk_len - 1);
     785           0 :                 if (crc4 != msg->chunk[msg->curchunk_len - 1])
     786           0 :                         print_hex_dump(KERN_DEBUG, "wrong crc",
     787             :                                        DUMP_PREFIX_NONE, 16, 1,
     788             :                                        msg->chunk,  msg->curchunk_len, false);
     789             :                 /* copy chunk into bigger msg */
     790           0 :                 memcpy(&msg->msg[msg->curlen], msg->chunk, msg->curchunk_len - 1);
     791           0 :                 msg->curlen += msg->curchunk_len - 1;
     792             :         }
     793           0 :         return true;
     794             : }
     795             : 
     796           0 : static bool drm_dp_sideband_parse_link_address(const struct drm_dp_mst_topology_mgr *mgr,
     797             :                                                struct drm_dp_sideband_msg_rx *raw,
     798             :                                                struct drm_dp_sideband_msg_reply_body *repmsg)
     799             : {
     800           0 :         int idx = 1;
     801             :         int i;
     802             : 
     803           0 :         memcpy(repmsg->u.link_addr.guid, &raw->msg[idx], 16);
     804           0 :         idx += 16;
     805           0 :         repmsg->u.link_addr.nports = raw->msg[idx] & 0xf;
     806           0 :         idx++;
     807           0 :         if (idx > raw->curlen)
     808             :                 goto fail_len;
     809           0 :         for (i = 0; i < repmsg->u.link_addr.nports; i++) {
     810           0 :                 if (raw->msg[idx] & 0x80)
     811           0 :                         repmsg->u.link_addr.ports[i].input_port = 1;
     812             : 
     813           0 :                 repmsg->u.link_addr.ports[i].peer_device_type = (raw->msg[idx] >> 4) & 0x7;
     814           0 :                 repmsg->u.link_addr.ports[i].port_number = (raw->msg[idx] & 0xf);
     815             : 
     816           0 :                 idx++;
     817           0 :                 if (idx > raw->curlen)
     818             :                         goto fail_len;
     819           0 :                 repmsg->u.link_addr.ports[i].mcs = (raw->msg[idx] >> 7) & 0x1;
     820           0 :                 repmsg->u.link_addr.ports[i].ddps = (raw->msg[idx] >> 6) & 0x1;
     821           0 :                 if (repmsg->u.link_addr.ports[i].input_port == 0)
     822           0 :                         repmsg->u.link_addr.ports[i].legacy_device_plug_status = (raw->msg[idx] >> 5) & 0x1;
     823           0 :                 idx++;
     824           0 :                 if (idx > raw->curlen)
     825             :                         goto fail_len;
     826           0 :                 if (repmsg->u.link_addr.ports[i].input_port == 0) {
     827           0 :                         repmsg->u.link_addr.ports[i].dpcd_revision = (raw->msg[idx]);
     828           0 :                         idx++;
     829           0 :                         if (idx > raw->curlen)
     830             :                                 goto fail_len;
     831           0 :                         memcpy(repmsg->u.link_addr.ports[i].peer_guid, &raw->msg[idx], 16);
     832           0 :                         idx += 16;
     833           0 :                         if (idx > raw->curlen)
     834             :                                 goto fail_len;
     835           0 :                         repmsg->u.link_addr.ports[i].num_sdp_streams = (raw->msg[idx] >> 4) & 0xf;
     836           0 :                         repmsg->u.link_addr.ports[i].num_sdp_stream_sinks = (raw->msg[idx] & 0xf);
     837           0 :                         idx++;
     838             : 
     839             :                 }
     840           0 :                 if (idx > raw->curlen)
     841             :                         goto fail_len;
     842             :         }
     843             : 
     844             :         return true;
     845             : fail_len:
     846           0 :         DRM_DEBUG_KMS("link address reply parse length fail %d %d\n", idx, raw->curlen);
     847             :         return false;
     848             : }
     849             : 
     850           0 : static bool drm_dp_sideband_parse_remote_dpcd_read(struct drm_dp_sideband_msg_rx *raw,
     851             :                                                    struct drm_dp_sideband_msg_reply_body *repmsg)
     852             : {
     853           0 :         int idx = 1;
     854             : 
     855           0 :         repmsg->u.remote_dpcd_read_ack.port_number = raw->msg[idx] & 0xf;
     856           0 :         idx++;
     857           0 :         if (idx > raw->curlen)
     858             :                 goto fail_len;
     859           0 :         repmsg->u.remote_dpcd_read_ack.num_bytes = raw->msg[idx];
     860           0 :         idx++;
     861           0 :         if (idx > raw->curlen)
     862             :                 goto fail_len;
     863             : 
     864           0 :         memcpy(repmsg->u.remote_dpcd_read_ack.bytes, &raw->msg[idx], repmsg->u.remote_dpcd_read_ack.num_bytes);
     865           0 :         return true;
     866             : fail_len:
     867           0 :         DRM_DEBUG_KMS("link address reply parse length fail %d %d\n", idx, raw->curlen);
     868           0 :         return false;
     869             : }
     870             : 
     871             : static bool drm_dp_sideband_parse_remote_dpcd_write(struct drm_dp_sideband_msg_rx *raw,
     872             :                                                       struct drm_dp_sideband_msg_reply_body *repmsg)
     873             : {
     874           0 :         int idx = 1;
     875             : 
     876           0 :         repmsg->u.remote_dpcd_write_ack.port_number = raw->msg[idx] & 0xf;
     877           0 :         idx++;
     878           0 :         if (idx > raw->curlen)
     879             :                 goto fail_len;
     880             :         return true;
     881             : fail_len:
     882           0 :         DRM_DEBUG_KMS("parse length fail %d %d\n", idx, raw->curlen);
     883             :         return false;
     884             : }
     885             : 
     886           0 : static bool drm_dp_sideband_parse_remote_i2c_read_ack(struct drm_dp_sideband_msg_rx *raw,
     887             :                                                       struct drm_dp_sideband_msg_reply_body *repmsg)
     888             : {
     889           0 :         int idx = 1;
     890             : 
     891           0 :         repmsg->u.remote_i2c_read_ack.port_number = (raw->msg[idx] & 0xf);
     892           0 :         idx++;
     893           0 :         if (idx > raw->curlen)
     894             :                 goto fail_len;
     895           0 :         repmsg->u.remote_i2c_read_ack.num_bytes = raw->msg[idx];
     896           0 :         idx++;
     897             :         /* TODO check */
     898           0 :         memcpy(repmsg->u.remote_i2c_read_ack.bytes, &raw->msg[idx], repmsg->u.remote_i2c_read_ack.num_bytes);
     899           0 :         return true;
     900             : fail_len:
     901           0 :         DRM_DEBUG_KMS("remote i2c reply parse length fail %d %d\n", idx, raw->curlen);
     902           0 :         return false;
     903             : }
     904             : 
     905           0 : static bool drm_dp_sideband_parse_enum_path_resources_ack(struct drm_dp_sideband_msg_rx *raw,
     906             :                                                           struct drm_dp_sideband_msg_reply_body *repmsg)
     907             : {
     908           0 :         int idx = 1;
     909             : 
     910           0 :         repmsg->u.path_resources.port_number = (raw->msg[idx] >> 4) & 0xf;
     911           0 :         repmsg->u.path_resources.fec_capable = raw->msg[idx] & 0x1;
     912           0 :         idx++;
     913           0 :         if (idx > raw->curlen)
     914             :                 goto fail_len;
     915           0 :         repmsg->u.path_resources.full_payload_bw_number = (raw->msg[idx] << 8) | (raw->msg[idx+1]);
     916           0 :         idx += 2;
     917           0 :         if (idx > raw->curlen)
     918             :                 goto fail_len;
     919           0 :         repmsg->u.path_resources.avail_payload_bw_number = (raw->msg[idx] << 8) | (raw->msg[idx+1]);
     920           0 :         idx += 2;
     921           0 :         if (idx > raw->curlen)
     922             :                 goto fail_len;
     923             :         return true;
     924             : fail_len:
     925           0 :         DRM_DEBUG_KMS("enum resource parse length fail %d %d\n", idx, raw->curlen);
     926           0 :         return false;
     927             : }
     928             : 
     929           0 : static bool drm_dp_sideband_parse_allocate_payload_ack(struct drm_dp_sideband_msg_rx *raw,
     930             :                                                           struct drm_dp_sideband_msg_reply_body *repmsg)
     931             : {
     932           0 :         int idx = 1;
     933             : 
     934           0 :         repmsg->u.allocate_payload.port_number = (raw->msg[idx] >> 4) & 0xf;
     935           0 :         idx++;
     936           0 :         if (idx > raw->curlen)
     937             :                 goto fail_len;
     938           0 :         repmsg->u.allocate_payload.vcpi = raw->msg[idx];
     939           0 :         idx++;
     940           0 :         if (idx > raw->curlen)
     941             :                 goto fail_len;
     942           0 :         repmsg->u.allocate_payload.allocated_pbn = (raw->msg[idx] << 8) | (raw->msg[idx+1]);
     943           0 :         idx += 2;
     944           0 :         if (idx > raw->curlen)
     945             :                 goto fail_len;
     946             :         return true;
     947             : fail_len:
     948           0 :         DRM_DEBUG_KMS("allocate payload parse length fail %d %d\n", idx, raw->curlen);
     949           0 :         return false;
     950             : }
     951             : 
     952           0 : static bool drm_dp_sideband_parse_query_payload_ack(struct drm_dp_sideband_msg_rx *raw,
     953             :                                                     struct drm_dp_sideband_msg_reply_body *repmsg)
     954             : {
     955           0 :         int idx = 1;
     956             : 
     957           0 :         repmsg->u.query_payload.port_number = (raw->msg[idx] >> 4) & 0xf;
     958           0 :         idx++;
     959           0 :         if (idx > raw->curlen)
     960             :                 goto fail_len;
     961           0 :         repmsg->u.query_payload.allocated_pbn = (raw->msg[idx] << 8) | (raw->msg[idx + 1]);
     962           0 :         idx += 2;
     963           0 :         if (idx > raw->curlen)
     964             :                 goto fail_len;
     965             :         return true;
     966             : fail_len:
     967           0 :         DRM_DEBUG_KMS("query payload parse length fail %d %d\n", idx, raw->curlen);
     968             :         return false;
     969             : }
     970             : 
     971             : static bool drm_dp_sideband_parse_power_updown_phy_ack(struct drm_dp_sideband_msg_rx *raw,
     972             :                                                        struct drm_dp_sideband_msg_reply_body *repmsg)
     973             : {
     974           0 :         int idx = 1;
     975             : 
     976           0 :         repmsg->u.port_number.port_number = (raw->msg[idx] >> 4) & 0xf;
     977           0 :         idx++;
     978           0 :         if (idx > raw->curlen) {
     979           0 :                 DRM_DEBUG_KMS("power up/down phy parse length fail %d %d\n",
     980             :                               idx, raw->curlen);
     981             :                 return false;
     982             :         }
     983             :         return true;
     984             : }
     985             : 
     986             : static bool
     987           0 : drm_dp_sideband_parse_query_stream_enc_status(
     988             :                                 struct drm_dp_sideband_msg_rx *raw,
     989             :                                 struct drm_dp_sideband_msg_reply_body *repmsg)
     990             : {
     991             :         struct drm_dp_query_stream_enc_status_ack_reply *reply;
     992             : 
     993           0 :         reply = &repmsg->u.enc_status;
     994             : 
     995           0 :         reply->stream_id = raw->msg[3];
     996             : 
     997           0 :         reply->reply_signed = raw->msg[2] & BIT(0);
     998             : 
     999             :         /*
    1000             :          * NOTE: It's my impression from reading the spec that the below parsing
    1001             :          * is correct. However I noticed while testing with an HDCP 1.4 display
    1002             :          * through an HDCP 2.2 hub that only bit 3 was set. In that case, I
    1003             :          * would expect both bits to be set. So keep the parsing following the
    1004             :          * spec, but beware reality might not match the spec (at least for some
    1005             :          * configurations).
    1006             :          */
    1007           0 :         reply->hdcp_1x_device_present = raw->msg[2] & BIT(4);
    1008           0 :         reply->hdcp_2x_device_present = raw->msg[2] & BIT(3);
    1009             : 
    1010           0 :         reply->query_capable_device_present = raw->msg[2] & BIT(5);
    1011           0 :         reply->legacy_device_present = raw->msg[2] & BIT(6);
    1012           0 :         reply->unauthorizable_device_present = raw->msg[2] & BIT(7);
    1013             : 
    1014           0 :         reply->auth_completed = !!(raw->msg[1] & BIT(3));
    1015           0 :         reply->encryption_enabled = !!(raw->msg[1] & BIT(4));
    1016           0 :         reply->repeater_present = !!(raw->msg[1] & BIT(5));
    1017           0 :         reply->state = (raw->msg[1] & GENMASK(7, 6)) >> 6;
    1018             : 
    1019           0 :         return true;
    1020             : }
    1021             : 
    1022           0 : static bool drm_dp_sideband_parse_reply(const struct drm_dp_mst_topology_mgr *mgr,
    1023             :                                         struct drm_dp_sideband_msg_rx *raw,
    1024             :                                         struct drm_dp_sideband_msg_reply_body *msg)
    1025             : {
    1026           0 :         memset(msg, 0, sizeof(*msg));
    1027           0 :         msg->reply_type = (raw->msg[0] & 0x80) >> 7;
    1028           0 :         msg->req_type = (raw->msg[0] & 0x7f);
    1029             : 
    1030           0 :         if (msg->reply_type == DP_SIDEBAND_REPLY_NAK) {
    1031           0 :                 memcpy(msg->u.nak.guid, &raw->msg[1], 16);
    1032           0 :                 msg->u.nak.reason = raw->msg[17];
    1033           0 :                 msg->u.nak.nak_data = raw->msg[18];
    1034             :                 return false;
    1035             :         }
    1036             : 
    1037           0 :         switch (msg->req_type) {
    1038             :         case DP_LINK_ADDRESS:
    1039           0 :                 return drm_dp_sideband_parse_link_address(mgr, raw, msg);
    1040             :         case DP_QUERY_PAYLOAD:
    1041           0 :                 return drm_dp_sideband_parse_query_payload_ack(raw, msg);
    1042             :         case DP_REMOTE_DPCD_READ:
    1043           0 :                 return drm_dp_sideband_parse_remote_dpcd_read(raw, msg);
    1044             :         case DP_REMOTE_DPCD_WRITE:
    1045           0 :                 return drm_dp_sideband_parse_remote_dpcd_write(raw, msg);
    1046             :         case DP_REMOTE_I2C_READ:
    1047           0 :                 return drm_dp_sideband_parse_remote_i2c_read_ack(raw, msg);
    1048             :         case DP_REMOTE_I2C_WRITE:
    1049             :                 return true; /* since there's nothing to parse */
    1050             :         case DP_ENUM_PATH_RESOURCES:
    1051           0 :                 return drm_dp_sideband_parse_enum_path_resources_ack(raw, msg);
    1052             :         case DP_ALLOCATE_PAYLOAD:
    1053           0 :                 return drm_dp_sideband_parse_allocate_payload_ack(raw, msg);
    1054             :         case DP_POWER_DOWN_PHY:
    1055             :         case DP_POWER_UP_PHY:
    1056           0 :                 return drm_dp_sideband_parse_power_updown_phy_ack(raw, msg);
    1057             :         case DP_CLEAR_PAYLOAD_ID_TABLE:
    1058             :                 return true; /* since there's nothing to parse */
    1059             :         case DP_QUERY_STREAM_ENC_STATUS:
    1060           0 :                 return drm_dp_sideband_parse_query_stream_enc_status(raw, msg);
    1061             :         default:
    1062           0 :                 drm_err(mgr->dev, "Got unknown reply 0x%02x (%s)\n",
    1063             :                         msg->req_type, drm_dp_mst_req_type_str(msg->req_type));
    1064             :                 return false;
    1065             :         }
    1066             : }
    1067             : 
    1068             : static bool
    1069           0 : drm_dp_sideband_parse_connection_status_notify(const struct drm_dp_mst_topology_mgr *mgr,
    1070             :                                                struct drm_dp_sideband_msg_rx *raw,
    1071             :                                                struct drm_dp_sideband_msg_req_body *msg)
    1072             : {
    1073           0 :         int idx = 1;
    1074             : 
    1075           0 :         msg->u.conn_stat.port_number = (raw->msg[idx] & 0xf0) >> 4;
    1076           0 :         idx++;
    1077           0 :         if (idx > raw->curlen)
    1078             :                 goto fail_len;
    1079             : 
    1080           0 :         memcpy(msg->u.conn_stat.guid, &raw->msg[idx], 16);
    1081           0 :         idx += 16;
    1082           0 :         if (idx > raw->curlen)
    1083             :                 goto fail_len;
    1084             : 
    1085           0 :         msg->u.conn_stat.legacy_device_plug_status = (raw->msg[idx] >> 6) & 0x1;
    1086           0 :         msg->u.conn_stat.displayport_device_plug_status = (raw->msg[idx] >> 5) & 0x1;
    1087           0 :         msg->u.conn_stat.message_capability_status = (raw->msg[idx] >> 4) & 0x1;
    1088           0 :         msg->u.conn_stat.input_port = (raw->msg[idx] >> 3) & 0x1;
    1089           0 :         msg->u.conn_stat.peer_device_type = (raw->msg[idx] & 0x7);
    1090           0 :         idx++;
    1091             :         return true;
    1092             : fail_len:
    1093           0 :         drm_dbg_kms(mgr->dev, "connection status reply parse length fail %d %d\n",
    1094             :                     idx, raw->curlen);
    1095             :         return false;
    1096             : }
    1097             : 
    1098           0 : static bool drm_dp_sideband_parse_resource_status_notify(const struct drm_dp_mst_topology_mgr *mgr,
    1099             :                                                          struct drm_dp_sideband_msg_rx *raw,
    1100             :                                                          struct drm_dp_sideband_msg_req_body *msg)
    1101             : {
    1102           0 :         int idx = 1;
    1103             : 
    1104           0 :         msg->u.resource_stat.port_number = (raw->msg[idx] & 0xf0) >> 4;
    1105           0 :         idx++;
    1106           0 :         if (idx > raw->curlen)
    1107             :                 goto fail_len;
    1108             : 
    1109           0 :         memcpy(msg->u.resource_stat.guid, &raw->msg[idx], 16);
    1110           0 :         idx += 16;
    1111           0 :         if (idx > raw->curlen)
    1112             :                 goto fail_len;
    1113             : 
    1114           0 :         msg->u.resource_stat.available_pbn = (raw->msg[idx] << 8) | (raw->msg[idx + 1]);
    1115           0 :         idx++;
    1116             :         return true;
    1117             : fail_len:
    1118           0 :         drm_dbg_kms(mgr->dev, "resource status reply parse length fail %d %d\n", idx, raw->curlen);
    1119             :         return false;
    1120             : }
    1121             : 
    1122           0 : static bool drm_dp_sideband_parse_req(const struct drm_dp_mst_topology_mgr *mgr,
    1123             :                                       struct drm_dp_sideband_msg_rx *raw,
    1124             :                                       struct drm_dp_sideband_msg_req_body *msg)
    1125             : {
    1126           0 :         memset(msg, 0, sizeof(*msg));
    1127           0 :         msg->req_type = (raw->msg[0] & 0x7f);
    1128             : 
    1129           0 :         switch (msg->req_type) {
    1130             :         case DP_CONNECTION_STATUS_NOTIFY:
    1131           0 :                 return drm_dp_sideband_parse_connection_status_notify(mgr, raw, msg);
    1132             :         case DP_RESOURCE_STATUS_NOTIFY:
    1133           0 :                 return drm_dp_sideband_parse_resource_status_notify(mgr, raw, msg);
    1134             :         default:
    1135           0 :                 drm_err(mgr->dev, "Got unknown request 0x%02x (%s)\n",
    1136             :                         msg->req_type, drm_dp_mst_req_type_str(msg->req_type));
    1137           0 :                 return false;
    1138             :         }
    1139             : }
    1140             : 
    1141           0 : static void build_dpcd_write(struct drm_dp_sideband_msg_tx *msg,
    1142             :                              u8 port_num, u32 offset, u8 num_bytes, u8 *bytes)
    1143             : {
    1144             :         struct drm_dp_sideband_msg_req_body req;
    1145             : 
    1146           0 :         req.req_type = DP_REMOTE_DPCD_WRITE;
    1147           0 :         req.u.dpcd_write.port_number = port_num;
    1148           0 :         req.u.dpcd_write.dpcd_address = offset;
    1149           0 :         req.u.dpcd_write.num_bytes = num_bytes;
    1150           0 :         req.u.dpcd_write.bytes = bytes;
    1151           0 :         drm_dp_encode_sideband_req(&req, msg);
    1152           0 : }
    1153             : 
    1154           0 : static void build_link_address(struct drm_dp_sideband_msg_tx *msg)
    1155             : {
    1156             :         struct drm_dp_sideband_msg_req_body req;
    1157             : 
    1158           0 :         req.req_type = DP_LINK_ADDRESS;
    1159           0 :         drm_dp_encode_sideband_req(&req, msg);
    1160           0 : }
    1161             : 
    1162           0 : static void build_clear_payload_id_table(struct drm_dp_sideband_msg_tx *msg)
    1163             : {
    1164             :         struct drm_dp_sideband_msg_req_body req;
    1165             : 
    1166           0 :         req.req_type = DP_CLEAR_PAYLOAD_ID_TABLE;
    1167           0 :         drm_dp_encode_sideband_req(&req, msg);
    1168           0 :         msg->path_msg = true;
    1169           0 : }
    1170             : 
    1171           0 : static int build_enum_path_resources(struct drm_dp_sideband_msg_tx *msg,
    1172             :                                      int port_num)
    1173             : {
    1174             :         struct drm_dp_sideband_msg_req_body req;
    1175             : 
    1176           0 :         req.req_type = DP_ENUM_PATH_RESOURCES;
    1177           0 :         req.u.port_num.port_number = port_num;
    1178           0 :         drm_dp_encode_sideband_req(&req, msg);
    1179           0 :         msg->path_msg = true;
    1180           0 :         return 0;
    1181             : }
    1182             : 
    1183           0 : static void build_allocate_payload(struct drm_dp_sideband_msg_tx *msg,
    1184             :                                    int port_num,
    1185             :                                    u8 vcpi, uint16_t pbn,
    1186             :                                    u8 number_sdp_streams,
    1187             :                                    u8 *sdp_stream_sink)
    1188             : {
    1189             :         struct drm_dp_sideband_msg_req_body req;
    1190             : 
    1191           0 :         memset(&req, 0, sizeof(req));
    1192           0 :         req.req_type = DP_ALLOCATE_PAYLOAD;
    1193           0 :         req.u.allocate_payload.port_number = port_num;
    1194           0 :         req.u.allocate_payload.vcpi = vcpi;
    1195           0 :         req.u.allocate_payload.pbn = pbn;
    1196           0 :         req.u.allocate_payload.number_sdp_streams = number_sdp_streams;
    1197           0 :         memcpy(req.u.allocate_payload.sdp_stream_sink, sdp_stream_sink,
    1198             :                    number_sdp_streams);
    1199           0 :         drm_dp_encode_sideband_req(&req, msg);
    1200           0 :         msg->path_msg = true;
    1201           0 : }
    1202             : 
    1203           0 : static void build_power_updown_phy(struct drm_dp_sideband_msg_tx *msg,
    1204             :                                    int port_num, bool power_up)
    1205             : {
    1206             :         struct drm_dp_sideband_msg_req_body req;
    1207             : 
    1208           0 :         if (power_up)
    1209           0 :                 req.req_type = DP_POWER_UP_PHY;
    1210             :         else
    1211           0 :                 req.req_type = DP_POWER_DOWN_PHY;
    1212             : 
    1213           0 :         req.u.port_num.port_number = port_num;
    1214           0 :         drm_dp_encode_sideband_req(&req, msg);
    1215           0 :         msg->path_msg = true;
    1216           0 : }
    1217             : 
    1218             : static int
    1219           0 : build_query_stream_enc_status(struct drm_dp_sideband_msg_tx *msg, u8 stream_id,
    1220             :                               u8 *q_id)
    1221             : {
    1222             :         struct drm_dp_sideband_msg_req_body req;
    1223             : 
    1224           0 :         req.req_type = DP_QUERY_STREAM_ENC_STATUS;
    1225           0 :         req.u.enc_status.stream_id = stream_id;
    1226           0 :         memcpy(req.u.enc_status.client_id, q_id,
    1227             :                sizeof(req.u.enc_status.client_id));
    1228           0 :         req.u.enc_status.stream_event = 0;
    1229           0 :         req.u.enc_status.valid_stream_event = false;
    1230           0 :         req.u.enc_status.stream_behavior = 0;
    1231           0 :         req.u.enc_status.valid_stream_behavior = false;
    1232             : 
    1233           0 :         drm_dp_encode_sideband_req(&req, msg);
    1234           0 :         return 0;
    1235             : }
    1236             : 
    1237             : static bool check_txmsg_state(struct drm_dp_mst_topology_mgr *mgr,
    1238             :                               struct drm_dp_sideband_msg_tx *txmsg)
    1239             : {
    1240             :         unsigned int state;
    1241             : 
    1242             :         /*
    1243             :          * All updates to txmsg->state are protected by mgr->qlock, and the two
    1244             :          * cases we check here are terminal states. For those the barriers
    1245             :          * provided by the wake_up/wait_event pair are enough.
    1246             :          */
    1247           0 :         state = READ_ONCE(txmsg->state);
    1248           0 :         return (state == DRM_DP_SIDEBAND_TX_RX ||
    1249             :                 state == DRM_DP_SIDEBAND_TX_TIMEOUT);
    1250             : }
    1251             : 
    1252           0 : static int drm_dp_mst_wait_tx_reply(struct drm_dp_mst_branch *mstb,
    1253             :                                     struct drm_dp_sideband_msg_tx *txmsg)
    1254             : {
    1255           0 :         struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
    1256           0 :         unsigned long wait_timeout = msecs_to_jiffies(4000);
    1257           0 :         unsigned long wait_expires = jiffies + wait_timeout;
    1258             :         int ret;
    1259             : 
    1260             :         for (;;) {
    1261             :                 /*
    1262             :                  * If the driver provides a way for this, change to
    1263             :                  * poll-waiting for the MST reply interrupt if we didn't receive
    1264             :                  * it for 50 msec. This would cater for cases where the HPD
    1265             :                  * pulse signal got lost somewhere, even though the sink raised
    1266             :                  * the corresponding MST interrupt correctly. One example is the
    1267             :                  * Club 3D CAC-1557 TypeC -> DP adapter which for some reason
    1268             :                  * filters out short pulses with a duration less than ~540 usec.
    1269             :                  *
    1270             :                  * The poll period is 50 msec to avoid missing an interrupt
    1271             :                  * after the sink has cleared it (after a 110msec timeout
    1272             :                  * since it raised the interrupt).
    1273             :                  */
    1274           0 :                 ret = wait_event_timeout(mgr->tx_waitq,
    1275             :                                          check_txmsg_state(mgr, txmsg),
    1276             :                                          mgr->cbs->poll_hpd_irq ?
    1277             :                                                 msecs_to_jiffies(50) :
    1278             :                                                 wait_timeout);
    1279             : 
    1280           0 :                 if (ret || !mgr->cbs->poll_hpd_irq ||
    1281           0 :                     time_after(jiffies, wait_expires))
    1282             :                         break;
    1283             : 
    1284           0 :                 mgr->cbs->poll_hpd_irq(mgr);
    1285             :         }
    1286             : 
    1287           0 :         mutex_lock(&mgr->qlock);
    1288           0 :         if (ret > 0) {
    1289           0 :                 if (txmsg->state == DRM_DP_SIDEBAND_TX_TIMEOUT) {
    1290           0 :                         ret = -EIO;
    1291             :                         goto out;
    1292             :                 }
    1293             :         } else {
    1294           0 :                 drm_dbg_kms(mgr->dev, "timedout msg send %p %d %d\n",
    1295             :                             txmsg, txmsg->state, txmsg->seqno);
    1296             : 
    1297             :                 /* dump some state */
    1298           0 :                 ret = -EIO;
    1299             : 
    1300             :                 /* remove from q */
    1301           0 :                 if (txmsg->state == DRM_DP_SIDEBAND_TX_QUEUED ||
    1302           0 :                     txmsg->state == DRM_DP_SIDEBAND_TX_START_SEND ||
    1303             :                     txmsg->state == DRM_DP_SIDEBAND_TX_SENT)
    1304           0 :                         list_del(&txmsg->next);
    1305             :         }
    1306             : out:
    1307           0 :         if (unlikely(ret == -EIO) && drm_debug_enabled(DRM_UT_DP)) {
    1308           0 :                 struct drm_printer p = drm_debug_printer(DBG_PREFIX);
    1309             : 
    1310           0 :                 drm_dp_mst_dump_sideband_msg_tx(&p, txmsg);
    1311             :         }
    1312           0 :         mutex_unlock(&mgr->qlock);
    1313             : 
    1314           0 :         drm_dp_mst_kick_tx(mgr);
    1315           0 :         return ret;
    1316             : }
    1317             : 
    1318           0 : static struct drm_dp_mst_branch *drm_dp_add_mst_branch_device(u8 lct, u8 *rad)
    1319             : {
    1320             :         struct drm_dp_mst_branch *mstb;
    1321             : 
    1322           0 :         mstb = kzalloc(sizeof(*mstb), GFP_KERNEL);
    1323           0 :         if (!mstb)
    1324             :                 return NULL;
    1325             : 
    1326           0 :         mstb->lct = lct;
    1327           0 :         if (lct > 1)
    1328           0 :                 memcpy(mstb->rad, rad, lct / 2);
    1329           0 :         INIT_LIST_HEAD(&mstb->ports);
    1330           0 :         kref_init(&mstb->topology_kref);
    1331           0 :         kref_init(&mstb->malloc_kref);
    1332           0 :         return mstb;
    1333             : }
    1334             : 
    1335           0 : static void drm_dp_free_mst_branch_device(struct kref *kref)
    1336             : {
    1337           0 :         struct drm_dp_mst_branch *mstb =
    1338           0 :                 container_of(kref, struct drm_dp_mst_branch, malloc_kref);
    1339             : 
    1340           0 :         if (mstb->port_parent)
    1341           0 :                 drm_dp_mst_put_port_malloc(mstb->port_parent);
    1342             : 
    1343           0 :         kfree(mstb);
    1344           0 : }
    1345             : 
    1346             : /**
    1347             :  * DOC: Branch device and port refcounting
    1348             :  *
    1349             :  * Topology refcount overview
    1350             :  * ~~~~~~~~~~~~~~~~~~~~~~~~~~
    1351             :  *
    1352             :  * The refcounting schemes for &struct drm_dp_mst_branch and &struct
    1353             :  * drm_dp_mst_port are somewhat unusual. Both ports and branch devices have
    1354             :  * two different kinds of refcounts: topology refcounts, and malloc refcounts.
    1355             :  *
    1356             :  * Topology refcounts are not exposed to drivers, and are handled internally
    1357             :  * by the DP MST helpers. The helpers use them in order to prevent the
    1358             :  * in-memory topology state from being changed in the middle of critical
    1359             :  * operations like changing the internal state of payload allocations. This
    1360             :  * means each branch and port will be considered to be connected to the rest
    1361             :  * of the topology until its topology refcount reaches zero. Additionally,
    1362             :  * for ports this means that their associated &struct drm_connector will stay
    1363             :  * registered with userspace until the port's refcount reaches 0.
    1364             :  *
    1365             :  * Malloc refcount overview
    1366             :  * ~~~~~~~~~~~~~~~~~~~~~~~~
    1367             :  *
    1368             :  * Malloc references are used to keep a &struct drm_dp_mst_port or &struct
    1369             :  * drm_dp_mst_branch allocated even after all of its topology references have
    1370             :  * been dropped, so that the driver or MST helpers can safely access each
    1371             :  * branch's last known state before it was disconnected from the topology.
    1372             :  * When the malloc refcount of a port or branch reaches 0, the memory
    1373             :  * allocation containing the &struct drm_dp_mst_branch or &struct
    1374             :  * drm_dp_mst_port respectively will be freed.
    1375             :  *
    1376             :  * For &struct drm_dp_mst_branch, malloc refcounts are not currently exposed
    1377             :  * to drivers. As of writing this documentation, there are no drivers that
    1378             :  * have a usecase for accessing &struct drm_dp_mst_branch outside of the MST
    1379             :  * helpers. Exposing this API to drivers in a race-free manner would take more
    1380             :  * tweaking of the refcounting scheme, however patches are welcome provided
    1381             :  * there is a legitimate driver usecase for this.
    1382             :  *
    1383             :  * Refcount relationships in a topology
    1384             :  * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    1385             :  *
    1386             :  * Let's take a look at why the relationship between topology and malloc
    1387             :  * refcounts is designed the way it is.
    1388             :  *
    1389             :  * .. kernel-figure:: dp-mst/topology-figure-1.dot
    1390             :  *
    1391             :  *    An example of topology and malloc refs in a DP MST topology with two
    1392             :  *    active payloads. Topology refcount increments are indicated by solid
    1393             :  *    lines, and malloc refcount increments are indicated by dashed lines.
    1394             :  *    Each starts from the branch which incremented the refcount, and ends at
    1395             :  *    the branch to which the refcount belongs to, i.e. the arrow points the
    1396             :  *    same way as the C pointers used to reference a structure.
    1397             :  *
    1398             :  * As you can see in the above figure, every branch increments the topology
    1399             :  * refcount of its children, and increments the malloc refcount of its
    1400             :  * parent. Additionally, every payload increments the malloc refcount of its
    1401             :  * assigned port by 1.
    1402             :  *
    1403             :  * So, what would happen if MSTB #3 from the above figure was unplugged from
    1404             :  * the system, but the driver hadn't yet removed payload #2 from port #3? The
    1405             :  * topology would start to look like the figure below.
    1406             :  *
    1407             :  * .. kernel-figure:: dp-mst/topology-figure-2.dot
    1408             :  *
    1409             :  *    Ports and branch devices which have been released from memory are
    1410             :  *    colored grey, and references which have been removed are colored red.
    1411             :  *
    1412             :  * Whenever a port or branch device's topology refcount reaches zero, it will
    1413             :  * decrement the topology refcounts of all its children, the malloc refcount
    1414             :  * of its parent, and finally its own malloc refcount. For MSTB #4 and port
    1415             :  * #4, this means they both have been disconnected from the topology and freed
    1416             :  * from memory. But, because payload #2 is still holding a reference to port
    1417             :  * #3, port #3 is removed from the topology but its &struct drm_dp_mst_port
    1418             :  * is still accessible from memory. This also means port #3 has not yet
    1419             :  * decremented the malloc refcount of MSTB #3, so its &struct
    1420             :  * drm_dp_mst_branch will also stay allocated in memory until port #3's
    1421             :  * malloc refcount reaches 0.
    1422             :  *
    1423             :  * This relationship is necessary because in order to release payload #2, we
    1424             :  * need to be able to figure out the last relative of port #3 that's still
    1425             :  * connected to the topology. In this case, we would travel up the topology as
    1426             :  * shown below.
    1427             :  *
    1428             :  * .. kernel-figure:: dp-mst/topology-figure-3.dot
    1429             :  *
    1430             :  * And finally, remove payload #2 by communicating with port #2 through
    1431             :  * sideband transactions.
    1432             :  */
    1433             : 
    1434             : /**
    1435             :  * drm_dp_mst_get_mstb_malloc() - Increment the malloc refcount of a branch
    1436             :  * device
    1437             :  * @mstb: The &struct drm_dp_mst_branch to increment the malloc refcount of
    1438             :  *
    1439             :  * Increments &drm_dp_mst_branch.malloc_kref. When
    1440             :  * &drm_dp_mst_branch.malloc_kref reaches 0, the memory allocation for @mstb
    1441             :  * will be released and @mstb may no longer be used.
    1442             :  *
    1443             :  * See also: drm_dp_mst_put_mstb_malloc()
    1444             :  */
    1445             : static void
    1446           0 : drm_dp_mst_get_mstb_malloc(struct drm_dp_mst_branch *mstb)
    1447             : {
    1448           0 :         kref_get(&mstb->malloc_kref);
    1449           0 :         drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->malloc_kref));
    1450           0 : }
    1451             : 
    1452             : /**
    1453             :  * drm_dp_mst_put_mstb_malloc() - Decrement the malloc refcount of a branch
    1454             :  * device
    1455             :  * @mstb: The &struct drm_dp_mst_branch to decrement the malloc refcount of
    1456             :  *
    1457             :  * Decrements &drm_dp_mst_branch.malloc_kref. When
    1458             :  * &drm_dp_mst_branch.malloc_kref reaches 0, the memory allocation for @mstb
    1459             :  * will be released and @mstb may no longer be used.
    1460             :  *
    1461             :  * See also: drm_dp_mst_get_mstb_malloc()
    1462             :  */
    1463             : static void
    1464           0 : drm_dp_mst_put_mstb_malloc(struct drm_dp_mst_branch *mstb)
    1465             : {
    1466           0 :         drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->malloc_kref) - 1);
    1467           0 :         kref_put(&mstb->malloc_kref, drm_dp_free_mst_branch_device);
    1468           0 : }
    1469             : 
    1470           0 : static void drm_dp_free_mst_port(struct kref *kref)
    1471             : {
    1472           0 :         struct drm_dp_mst_port *port =
    1473           0 :                 container_of(kref, struct drm_dp_mst_port, malloc_kref);
    1474             : 
    1475           0 :         drm_dp_mst_put_mstb_malloc(port->parent);
    1476           0 :         kfree(port);
    1477           0 : }
    1478             : 
    1479             : /**
    1480             :  * drm_dp_mst_get_port_malloc() - Increment the malloc refcount of an MST port
    1481             :  * @port: The &struct drm_dp_mst_port to increment the malloc refcount of
    1482             :  *
    1483             :  * Increments &drm_dp_mst_port.malloc_kref. When &drm_dp_mst_port.malloc_kref
    1484             :  * reaches 0, the memory allocation for @port will be released and @port may
    1485             :  * no longer be used.
    1486             :  *
    1487             :  * Because @port could potentially be freed at any time by the DP MST helpers
    1488             :  * if &drm_dp_mst_port.malloc_kref reaches 0, including during a call to this
    1489             :  * function, drivers that which to make use of &struct drm_dp_mst_port should
    1490             :  * ensure that they grab at least one main malloc reference to their MST ports
    1491             :  * in &drm_dp_mst_topology_cbs.add_connector. This callback is called before
    1492             :  * there is any chance for &drm_dp_mst_port.malloc_kref to reach 0.
    1493             :  *
    1494             :  * See also: drm_dp_mst_put_port_malloc()
    1495             :  */
    1496             : void
    1497           0 : drm_dp_mst_get_port_malloc(struct drm_dp_mst_port *port)
    1498             : {
    1499           0 :         kref_get(&port->malloc_kref);
    1500           0 :         drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->malloc_kref));
    1501           0 : }
    1502             : EXPORT_SYMBOL(drm_dp_mst_get_port_malloc);
    1503             : 
    1504             : /**
    1505             :  * drm_dp_mst_put_port_malloc() - Decrement the malloc refcount of an MST port
    1506             :  * @port: The &struct drm_dp_mst_port to decrement the malloc refcount of
    1507             :  *
    1508             :  * Decrements &drm_dp_mst_port.malloc_kref. When &drm_dp_mst_port.malloc_kref
    1509             :  * reaches 0, the memory allocation for @port will be released and @port may
    1510             :  * no longer be used.
    1511             :  *
    1512             :  * See also: drm_dp_mst_get_port_malloc()
    1513             :  */
    1514             : void
    1515           0 : drm_dp_mst_put_port_malloc(struct drm_dp_mst_port *port)
    1516             : {
    1517           0 :         drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->malloc_kref) - 1);
    1518           0 :         kref_put(&port->malloc_kref, drm_dp_free_mst_port);
    1519           0 : }
    1520             : EXPORT_SYMBOL(drm_dp_mst_put_port_malloc);
    1521             : 
    1522             : #if IS_ENABLED(CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS)
    1523             : 
    1524             : #define STACK_DEPTH 8
    1525             : 
    1526             : static noinline void
    1527             : __topology_ref_save(struct drm_dp_mst_topology_mgr *mgr,
    1528             :                     struct drm_dp_mst_topology_ref_history *history,
    1529             :                     enum drm_dp_mst_topology_ref_type type)
    1530             : {
    1531             :         struct drm_dp_mst_topology_ref_entry *entry = NULL;
    1532             :         depot_stack_handle_t backtrace;
    1533             :         ulong stack_entries[STACK_DEPTH];
    1534             :         uint n;
    1535             :         int i;
    1536             : 
    1537             :         n = stack_trace_save(stack_entries, ARRAY_SIZE(stack_entries), 1);
    1538             :         backtrace = stack_depot_save(stack_entries, n, GFP_KERNEL);
    1539             :         if (!backtrace)
    1540             :                 return;
    1541             : 
    1542             :         /* Try to find an existing entry for this backtrace */
    1543             :         for (i = 0; i < history->len; i++) {
    1544             :                 if (history->entries[i].backtrace == backtrace) {
    1545             :                         entry = &history->entries[i];
    1546             :                         break;
    1547             :                 }
    1548             :         }
    1549             : 
    1550             :         /* Otherwise add one */
    1551             :         if (!entry) {
    1552             :                 struct drm_dp_mst_topology_ref_entry *new;
    1553             :                 int new_len = history->len + 1;
    1554             : 
    1555             :                 new = krealloc(history->entries, sizeof(*new) * new_len,
    1556             :                                GFP_KERNEL);
    1557             :                 if (!new)
    1558             :                         return;
    1559             : 
    1560             :                 entry = &new[history->len];
    1561             :                 history->len = new_len;
    1562             :                 history->entries = new;
    1563             : 
    1564             :                 entry->backtrace = backtrace;
    1565             :                 entry->type = type;
    1566             :                 entry->count = 0;
    1567             :         }
    1568             :         entry->count++;
    1569             :         entry->ts_nsec = ktime_get_ns();
    1570             : }
    1571             : 
    1572             : static int
    1573             : topology_ref_history_cmp(const void *a, const void *b)
    1574             : {
    1575             :         const struct drm_dp_mst_topology_ref_entry *entry_a = a, *entry_b = b;
    1576             : 
    1577             :         if (entry_a->ts_nsec > entry_b->ts_nsec)
    1578             :                 return 1;
    1579             :         else if (entry_a->ts_nsec < entry_b->ts_nsec)
    1580             :                 return -1;
    1581             :         else
    1582             :                 return 0;
    1583             : }
    1584             : 
    1585             : static inline const char *
    1586             : topology_ref_type_to_str(enum drm_dp_mst_topology_ref_type type)
    1587             : {
    1588             :         if (type == DRM_DP_MST_TOPOLOGY_REF_GET)
    1589             :                 return "get";
    1590             :         else
    1591             :                 return "put";
    1592             : }
    1593             : 
    1594             : static void
    1595             : __dump_topology_ref_history(struct drm_dp_mst_topology_ref_history *history,
    1596             :                             void *ptr, const char *type_str)
    1597             : {
    1598             :         struct drm_printer p = drm_debug_printer(DBG_PREFIX);
    1599             :         char *buf = kzalloc(PAGE_SIZE, GFP_KERNEL);
    1600             :         int i;
    1601             : 
    1602             :         if (!buf)
    1603             :                 return;
    1604             : 
    1605             :         if (!history->len)
    1606             :                 goto out;
    1607             : 
    1608             :         /* First, sort the list so that it goes from oldest to newest
    1609             :          * reference entry
    1610             :          */
    1611             :         sort(history->entries, history->len, sizeof(*history->entries),
    1612             :              topology_ref_history_cmp, NULL);
    1613             : 
    1614             :         drm_printf(&p, "%s (%p) topology count reached 0, dumping history:\n",
    1615             :                    type_str, ptr);
    1616             : 
    1617             :         for (i = 0; i < history->len; i++) {
    1618             :                 const struct drm_dp_mst_topology_ref_entry *entry =
    1619             :                         &history->entries[i];
    1620             :                 u64 ts_nsec = entry->ts_nsec;
    1621             :                 u32 rem_nsec = do_div(ts_nsec, 1000000000);
    1622             : 
    1623             :                 stack_depot_snprint(entry->backtrace, buf, PAGE_SIZE, 4);
    1624             : 
    1625             :                 drm_printf(&p, "  %d %ss (last at %5llu.%06u):\n%s",
    1626             :                            entry->count,
    1627             :                            topology_ref_type_to_str(entry->type),
    1628             :                            ts_nsec, rem_nsec / 1000, buf);
    1629             :         }
    1630             : 
    1631             :         /* Now free the history, since this is the only time we expose it */
    1632             :         kfree(history->entries);
    1633             : out:
    1634             :         kfree(buf);
    1635             : }
    1636             : 
    1637             : static __always_inline void
    1638             : drm_dp_mst_dump_mstb_topology_history(struct drm_dp_mst_branch *mstb)
    1639             : {
    1640             :         __dump_topology_ref_history(&mstb->topology_ref_history, mstb,
    1641             :                                     "MSTB");
    1642             : }
    1643             : 
    1644             : static __always_inline void
    1645             : drm_dp_mst_dump_port_topology_history(struct drm_dp_mst_port *port)
    1646             : {
    1647             :         __dump_topology_ref_history(&port->topology_ref_history, port,
    1648             :                                     "Port");
    1649             : }
    1650             : 
    1651             : static __always_inline void
    1652             : save_mstb_topology_ref(struct drm_dp_mst_branch *mstb,
    1653             :                        enum drm_dp_mst_topology_ref_type type)
    1654             : {
    1655             :         __topology_ref_save(mstb->mgr, &mstb->topology_ref_history, type);
    1656             : }
    1657             : 
    1658             : static __always_inline void
    1659             : save_port_topology_ref(struct drm_dp_mst_port *port,
    1660             :                        enum drm_dp_mst_topology_ref_type type)
    1661             : {
    1662             :         __topology_ref_save(port->mgr, &port->topology_ref_history, type);
    1663             : }
    1664             : 
    1665             : static inline void
    1666             : topology_ref_history_lock(struct drm_dp_mst_topology_mgr *mgr)
    1667             : {
    1668             :         mutex_lock(&mgr->topology_ref_history_lock);
    1669             : }
    1670             : 
    1671             : static inline void
    1672             : topology_ref_history_unlock(struct drm_dp_mst_topology_mgr *mgr)
    1673             : {
    1674             :         mutex_unlock(&mgr->topology_ref_history_lock);
    1675             : }
    1676             : #else
    1677             : static inline void
    1678             : topology_ref_history_lock(struct drm_dp_mst_topology_mgr *mgr) {}
    1679             : static inline void
    1680             : topology_ref_history_unlock(struct drm_dp_mst_topology_mgr *mgr) {}
    1681             : static inline void
    1682             : drm_dp_mst_dump_mstb_topology_history(struct drm_dp_mst_branch *mstb) {}
    1683             : static inline void
    1684             : drm_dp_mst_dump_port_topology_history(struct drm_dp_mst_port *port) {}
    1685             : #define save_mstb_topology_ref(mstb, type)
    1686             : #define save_port_topology_ref(port, type)
    1687             : #endif
    1688             : 
    1689             : struct drm_dp_mst_atomic_payload *
    1690           0 : drm_atomic_get_mst_payload_state(struct drm_dp_mst_topology_state *state,
    1691             :                                  struct drm_dp_mst_port *port)
    1692             : {
    1693             :         struct drm_dp_mst_atomic_payload *payload;
    1694             : 
    1695           0 :         list_for_each_entry(payload, &state->payloads, next)
    1696           0 :                 if (payload->port == port)
    1697             :                         return payload;
    1698             : 
    1699             :         return NULL;
    1700             : }
    1701             : EXPORT_SYMBOL(drm_atomic_get_mst_payload_state);
    1702             : 
    1703           0 : static void drm_dp_destroy_mst_branch_device(struct kref *kref)
    1704             : {
    1705           0 :         struct drm_dp_mst_branch *mstb =
    1706           0 :                 container_of(kref, struct drm_dp_mst_branch, topology_kref);
    1707           0 :         struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
    1708             : 
    1709           0 :         drm_dp_mst_dump_mstb_topology_history(mstb);
    1710             : 
    1711           0 :         INIT_LIST_HEAD(&mstb->destroy_next);
    1712             : 
    1713             :         /*
    1714             :          * This can get called under mgr->mutex, so we need to perform the
    1715             :          * actual destruction of the mstb in another worker
    1716             :          */
    1717           0 :         mutex_lock(&mgr->delayed_destroy_lock);
    1718           0 :         list_add(&mstb->destroy_next, &mgr->destroy_branch_device_list);
    1719           0 :         mutex_unlock(&mgr->delayed_destroy_lock);
    1720           0 :         queue_work(mgr->delayed_destroy_wq, &mgr->delayed_destroy_work);
    1721           0 : }
    1722             : 
    1723             : /**
    1724             :  * drm_dp_mst_topology_try_get_mstb() - Increment the topology refcount of a
    1725             :  * branch device unless it's zero
    1726             :  * @mstb: &struct drm_dp_mst_branch to increment the topology refcount of
    1727             :  *
    1728             :  * Attempts to grab a topology reference to @mstb, if it hasn't yet been
    1729             :  * removed from the topology (e.g. &drm_dp_mst_branch.topology_kref has
    1730             :  * reached 0). Holding a topology reference implies that a malloc reference
    1731             :  * will be held to @mstb as long as the user holds the topology reference.
    1732             :  *
    1733             :  * Care should be taken to ensure that the user has at least one malloc
    1734             :  * reference to @mstb. If you already have a topology reference to @mstb, you
    1735             :  * should use drm_dp_mst_topology_get_mstb() instead.
    1736             :  *
    1737             :  * See also:
    1738             :  * drm_dp_mst_topology_get_mstb()
    1739             :  * drm_dp_mst_topology_put_mstb()
    1740             :  *
    1741             :  * Returns:
    1742             :  * * 1: A topology reference was grabbed successfully
    1743             :  * * 0: @port is no longer in the topology, no reference was grabbed
    1744             :  */
    1745             : static int __must_check
    1746           0 : drm_dp_mst_topology_try_get_mstb(struct drm_dp_mst_branch *mstb)
    1747             : {
    1748             :         int ret;
    1749             : 
    1750           0 :         topology_ref_history_lock(mstb->mgr);
    1751           0 :         ret = kref_get_unless_zero(&mstb->topology_kref);
    1752           0 :         if (ret) {
    1753           0 :                 drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->topology_kref));
    1754             :                 save_mstb_topology_ref(mstb, DRM_DP_MST_TOPOLOGY_REF_GET);
    1755             :         }
    1756             : 
    1757           0 :         topology_ref_history_unlock(mstb->mgr);
    1758             : 
    1759           0 :         return ret;
    1760             : }
    1761             : 
    1762             : /**
    1763             :  * drm_dp_mst_topology_get_mstb() - Increment the topology refcount of a
    1764             :  * branch device
    1765             :  * @mstb: The &struct drm_dp_mst_branch to increment the topology refcount of
    1766             :  *
    1767             :  * Increments &drm_dp_mst_branch.topology_refcount without checking whether or
    1768             :  * not it's already reached 0. This is only valid to use in scenarios where
    1769             :  * you are already guaranteed to have at least one active topology reference
    1770             :  * to @mstb. Otherwise, drm_dp_mst_topology_try_get_mstb() must be used.
    1771             :  *
    1772             :  * See also:
    1773             :  * drm_dp_mst_topology_try_get_mstb()
    1774             :  * drm_dp_mst_topology_put_mstb()
    1775             :  */
    1776           0 : static void drm_dp_mst_topology_get_mstb(struct drm_dp_mst_branch *mstb)
    1777             : {
    1778           0 :         topology_ref_history_lock(mstb->mgr);
    1779             : 
    1780             :         save_mstb_topology_ref(mstb, DRM_DP_MST_TOPOLOGY_REF_GET);
    1781           0 :         WARN_ON(kref_read(&mstb->topology_kref) == 0);
    1782           0 :         kref_get(&mstb->topology_kref);
    1783           0 :         drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->topology_kref));
    1784             : 
    1785           0 :         topology_ref_history_unlock(mstb->mgr);
    1786           0 : }
    1787             : 
    1788             : /**
    1789             :  * drm_dp_mst_topology_put_mstb() - release a topology reference to a branch
    1790             :  * device
    1791             :  * @mstb: The &struct drm_dp_mst_branch to release the topology reference from
    1792             :  *
    1793             :  * Releases a topology reference from @mstb by decrementing
    1794             :  * &drm_dp_mst_branch.topology_kref.
    1795             :  *
    1796             :  * See also:
    1797             :  * drm_dp_mst_topology_try_get_mstb()
    1798             :  * drm_dp_mst_topology_get_mstb()
    1799             :  */
    1800             : static void
    1801           0 : drm_dp_mst_topology_put_mstb(struct drm_dp_mst_branch *mstb)
    1802             : {
    1803           0 :         topology_ref_history_lock(mstb->mgr);
    1804             : 
    1805           0 :         drm_dbg(mstb->mgr->dev, "mstb %p (%d)\n", mstb, kref_read(&mstb->topology_kref) - 1);
    1806             :         save_mstb_topology_ref(mstb, DRM_DP_MST_TOPOLOGY_REF_PUT);
    1807             : 
    1808           0 :         topology_ref_history_unlock(mstb->mgr);
    1809           0 :         kref_put(&mstb->topology_kref, drm_dp_destroy_mst_branch_device);
    1810           0 : }
    1811             : 
    1812           0 : static void drm_dp_destroy_port(struct kref *kref)
    1813             : {
    1814           0 :         struct drm_dp_mst_port *port =
    1815           0 :                 container_of(kref, struct drm_dp_mst_port, topology_kref);
    1816           0 :         struct drm_dp_mst_topology_mgr *mgr = port->mgr;
    1817             : 
    1818           0 :         drm_dp_mst_dump_port_topology_history(port);
    1819             : 
    1820             :         /* There's nothing that needs locking to destroy an input port yet */
    1821           0 :         if (port->input) {
    1822           0 :                 drm_dp_mst_put_port_malloc(port);
    1823           0 :                 return;
    1824             :         }
    1825             : 
    1826           0 :         kfree(port->cached_edid);
    1827             : 
    1828             :         /*
    1829             :          * we can't destroy the connector here, as we might be holding the
    1830             :          * mode_config.mutex from an EDID retrieval
    1831             :          */
    1832           0 :         mutex_lock(&mgr->delayed_destroy_lock);
    1833           0 :         list_add(&port->next, &mgr->destroy_port_list);
    1834           0 :         mutex_unlock(&mgr->delayed_destroy_lock);
    1835           0 :         queue_work(mgr->delayed_destroy_wq, &mgr->delayed_destroy_work);
    1836             : }
    1837             : 
    1838             : /**
    1839             :  * drm_dp_mst_topology_try_get_port() - Increment the topology refcount of a
    1840             :  * port unless it's zero
    1841             :  * @port: &struct drm_dp_mst_port to increment the topology refcount of
    1842             :  *
    1843             :  * Attempts to grab a topology reference to @port, if it hasn't yet been
    1844             :  * removed from the topology (e.g. &drm_dp_mst_port.topology_kref has reached
    1845             :  * 0). Holding a topology reference implies that a malloc reference will be
    1846             :  * held to @port as long as the user holds the topology reference.
    1847             :  *
    1848             :  * Care should be taken to ensure that the user has at least one malloc
    1849             :  * reference to @port. If you already have a topology reference to @port, you
    1850             :  * should use drm_dp_mst_topology_get_port() instead.
    1851             :  *
    1852             :  * See also:
    1853             :  * drm_dp_mst_topology_get_port()
    1854             :  * drm_dp_mst_topology_put_port()
    1855             :  *
    1856             :  * Returns:
    1857             :  * * 1: A topology reference was grabbed successfully
    1858             :  * * 0: @port is no longer in the topology, no reference was grabbed
    1859             :  */
    1860             : static int __must_check
    1861           0 : drm_dp_mst_topology_try_get_port(struct drm_dp_mst_port *port)
    1862             : {
    1863             :         int ret;
    1864             : 
    1865           0 :         topology_ref_history_lock(port->mgr);
    1866           0 :         ret = kref_get_unless_zero(&port->topology_kref);
    1867           0 :         if (ret) {
    1868           0 :                 drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->topology_kref));
    1869             :                 save_port_topology_ref(port, DRM_DP_MST_TOPOLOGY_REF_GET);
    1870             :         }
    1871             : 
    1872           0 :         topology_ref_history_unlock(port->mgr);
    1873           0 :         return ret;
    1874             : }
    1875             : 
    1876             : /**
    1877             :  * drm_dp_mst_topology_get_port() - Increment the topology refcount of a port
    1878             :  * @port: The &struct drm_dp_mst_port to increment the topology refcount of
    1879             :  *
    1880             :  * Increments &drm_dp_mst_port.topology_refcount without checking whether or
    1881             :  * not it's already reached 0. This is only valid to use in scenarios where
    1882             :  * you are already guaranteed to have at least one active topology reference
    1883             :  * to @port. Otherwise, drm_dp_mst_topology_try_get_port() must be used.
    1884             :  *
    1885             :  * See also:
    1886             :  * drm_dp_mst_topology_try_get_port()
    1887             :  * drm_dp_mst_topology_put_port()
    1888             :  */
    1889           0 : static void drm_dp_mst_topology_get_port(struct drm_dp_mst_port *port)
    1890             : {
    1891           0 :         topology_ref_history_lock(port->mgr);
    1892             : 
    1893           0 :         WARN_ON(kref_read(&port->topology_kref) == 0);
    1894           0 :         kref_get(&port->topology_kref);
    1895           0 :         drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->topology_kref));
    1896             :         save_port_topology_ref(port, DRM_DP_MST_TOPOLOGY_REF_GET);
    1897             : 
    1898           0 :         topology_ref_history_unlock(port->mgr);
    1899           0 : }
    1900             : 
    1901             : /**
    1902             :  * drm_dp_mst_topology_put_port() - release a topology reference to a port
    1903             :  * @port: The &struct drm_dp_mst_port to release the topology reference from
    1904             :  *
    1905             :  * Releases a topology reference from @port by decrementing
    1906             :  * &drm_dp_mst_port.topology_kref.
    1907             :  *
    1908             :  * See also:
    1909             :  * drm_dp_mst_topology_try_get_port()
    1910             :  * drm_dp_mst_topology_get_port()
    1911             :  */
    1912           0 : static void drm_dp_mst_topology_put_port(struct drm_dp_mst_port *port)
    1913             : {
    1914           0 :         topology_ref_history_lock(port->mgr);
    1915             : 
    1916           0 :         drm_dbg(port->mgr->dev, "port %p (%d)\n", port, kref_read(&port->topology_kref) - 1);
    1917             :         save_port_topology_ref(port, DRM_DP_MST_TOPOLOGY_REF_PUT);
    1918             : 
    1919           0 :         topology_ref_history_unlock(port->mgr);
    1920           0 :         kref_put(&port->topology_kref, drm_dp_destroy_port);
    1921           0 : }
    1922             : 
    1923             : static struct drm_dp_mst_branch *
    1924           0 : drm_dp_mst_topology_get_mstb_validated_locked(struct drm_dp_mst_branch *mstb,
    1925             :                                               struct drm_dp_mst_branch *to_find)
    1926             : {
    1927             :         struct drm_dp_mst_port *port;
    1928             :         struct drm_dp_mst_branch *rmstb;
    1929             : 
    1930           0 :         if (to_find == mstb)
    1931             :                 return mstb;
    1932             : 
    1933           0 :         list_for_each_entry(port, &mstb->ports, next) {
    1934           0 :                 if (port->mstb) {
    1935           0 :                         rmstb = drm_dp_mst_topology_get_mstb_validated_locked(
    1936             :                             port->mstb, to_find);
    1937           0 :                         if (rmstb)
    1938             :                                 return rmstb;
    1939             :                 }
    1940             :         }
    1941             :         return NULL;
    1942             : }
    1943             : 
    1944             : static struct drm_dp_mst_branch *
    1945           0 : drm_dp_mst_topology_get_mstb_validated(struct drm_dp_mst_topology_mgr *mgr,
    1946             :                                        struct drm_dp_mst_branch *mstb)
    1947             : {
    1948           0 :         struct drm_dp_mst_branch *rmstb = NULL;
    1949             : 
    1950           0 :         mutex_lock(&mgr->lock);
    1951           0 :         if (mgr->mst_primary) {
    1952           0 :                 rmstb = drm_dp_mst_topology_get_mstb_validated_locked(
    1953             :                     mgr->mst_primary, mstb);
    1954             : 
    1955           0 :                 if (rmstb && !drm_dp_mst_topology_try_get_mstb(rmstb))
    1956           0 :                         rmstb = NULL;
    1957             :         }
    1958           0 :         mutex_unlock(&mgr->lock);
    1959           0 :         return rmstb;
    1960             : }
    1961             : 
    1962             : static struct drm_dp_mst_port *
    1963           0 : drm_dp_mst_topology_get_port_validated_locked(struct drm_dp_mst_branch *mstb,
    1964             :                                               struct drm_dp_mst_port *to_find)
    1965             : {
    1966             :         struct drm_dp_mst_port *port, *mport;
    1967             : 
    1968           0 :         list_for_each_entry(port, &mstb->ports, next) {
    1969           0 :                 if (port == to_find)
    1970             :                         return port;
    1971             : 
    1972           0 :                 if (port->mstb) {
    1973           0 :                         mport = drm_dp_mst_topology_get_port_validated_locked(
    1974             :                             port->mstb, to_find);
    1975           0 :                         if (mport)
    1976             :                                 return mport;
    1977             :                 }
    1978             :         }
    1979             :         return NULL;
    1980             : }
    1981             : 
    1982             : static struct drm_dp_mst_port *
    1983           0 : drm_dp_mst_topology_get_port_validated(struct drm_dp_mst_topology_mgr *mgr,
    1984             :                                        struct drm_dp_mst_port *port)
    1985             : {
    1986           0 :         struct drm_dp_mst_port *rport = NULL;
    1987             : 
    1988           0 :         mutex_lock(&mgr->lock);
    1989           0 :         if (mgr->mst_primary) {
    1990           0 :                 rport = drm_dp_mst_topology_get_port_validated_locked(
    1991             :                     mgr->mst_primary, port);
    1992             : 
    1993           0 :                 if (rport && !drm_dp_mst_topology_try_get_port(rport))
    1994           0 :                         rport = NULL;
    1995             :         }
    1996           0 :         mutex_unlock(&mgr->lock);
    1997           0 :         return rport;
    1998             : }
    1999             : 
    2000           0 : static struct drm_dp_mst_port *drm_dp_get_port(struct drm_dp_mst_branch *mstb, u8 port_num)
    2001             : {
    2002             :         struct drm_dp_mst_port *port;
    2003             :         int ret;
    2004             : 
    2005           0 :         list_for_each_entry(port, &mstb->ports, next) {
    2006           0 :                 if (port->port_num == port_num) {
    2007           0 :                         ret = drm_dp_mst_topology_try_get_port(port);
    2008           0 :                         return ret ? port : NULL;
    2009             :                 }
    2010             :         }
    2011             : 
    2012             :         return NULL;
    2013             : }
    2014             : 
    2015             : /*
    2016             :  * calculate a new RAD for this MST branch device
    2017             :  * if parent has an LCT of 2 then it has 1 nibble of RAD,
    2018             :  * if parent has an LCT of 3 then it has 2 nibbles of RAD,
    2019             :  */
    2020           0 : static u8 drm_dp_calculate_rad(struct drm_dp_mst_port *port,
    2021             :                                  u8 *rad)
    2022             : {
    2023           0 :         int parent_lct = port->parent->lct;
    2024           0 :         int shift = 4;
    2025           0 :         int idx = (parent_lct - 1) / 2;
    2026             : 
    2027           0 :         if (parent_lct > 1) {
    2028           0 :                 memcpy(rad, port->parent->rad, idx + 1);
    2029           0 :                 shift = (parent_lct % 2) ? 4 : 0;
    2030             :         } else
    2031           0 :                 rad[0] = 0;
    2032             : 
    2033           0 :         rad[idx] |= port->port_num << shift;
    2034           0 :         return parent_lct + 1;
    2035             : }
    2036             : 
    2037             : static bool drm_dp_mst_is_end_device(u8 pdt, bool mcs)
    2038             : {
    2039           0 :         switch (pdt) {
    2040             :         case DP_PEER_DEVICE_DP_LEGACY_CONV:
    2041             :         case DP_PEER_DEVICE_SST_SINK:
    2042             :                 return true;
    2043             :         case DP_PEER_DEVICE_MST_BRANCHING:
    2044             :                 /* For sst branch device */
    2045           0 :                 if (!mcs)
    2046             :                         return true;
    2047             : 
    2048             :                 return false;
    2049             :         }
    2050             :         return true;
    2051             : }
    2052             : 
    2053             : static int
    2054           0 : drm_dp_port_set_pdt(struct drm_dp_mst_port *port, u8 new_pdt,
    2055             :                     bool new_mcs)
    2056             : {
    2057           0 :         struct drm_dp_mst_topology_mgr *mgr = port->mgr;
    2058             :         struct drm_dp_mst_branch *mstb;
    2059             :         u8 rad[8], lct;
    2060           0 :         int ret = 0;
    2061             : 
    2062           0 :         if (port->pdt == new_pdt && port->mcs == new_mcs)
    2063             :                 return 0;
    2064             : 
    2065             :         /* Teardown the old pdt, if there is one */
    2066           0 :         if (port->pdt != DP_PEER_DEVICE_NONE) {
    2067           0 :                 if (drm_dp_mst_is_end_device(port->pdt, port->mcs)) {
    2068             :                         /*
    2069             :                          * If the new PDT would also have an i2c bus,
    2070             :                          * don't bother with reregistering it
    2071             :                          */
    2072           0 :                         if (new_pdt != DP_PEER_DEVICE_NONE &&
    2073           0 :                             drm_dp_mst_is_end_device(new_pdt, new_mcs)) {
    2074           0 :                                 port->pdt = new_pdt;
    2075           0 :                                 port->mcs = new_mcs;
    2076           0 :                                 return 0;
    2077             :                         }
    2078             : 
    2079             :                         /* remove i2c over sideband */
    2080             :                         drm_dp_mst_unregister_i2c_bus(port);
    2081             :                 } else {
    2082           0 :                         mutex_lock(&mgr->lock);
    2083           0 :                         drm_dp_mst_topology_put_mstb(port->mstb);
    2084           0 :                         port->mstb = NULL;
    2085           0 :                         mutex_unlock(&mgr->lock);
    2086             :                 }
    2087             :         }
    2088             : 
    2089           0 :         port->pdt = new_pdt;
    2090           0 :         port->mcs = new_mcs;
    2091             : 
    2092           0 :         if (port->pdt != DP_PEER_DEVICE_NONE) {
    2093           0 :                 if (drm_dp_mst_is_end_device(port->pdt, port->mcs)) {
    2094             :                         /* add i2c over sideband */
    2095           0 :                         ret = drm_dp_mst_register_i2c_bus(port);
    2096             :                 } else {
    2097           0 :                         lct = drm_dp_calculate_rad(port, rad);
    2098           0 :                         mstb = drm_dp_add_mst_branch_device(lct, rad);
    2099           0 :                         if (!mstb) {
    2100           0 :                                 ret = -ENOMEM;
    2101           0 :                                 drm_err(mgr->dev, "Failed to create MSTB for port %p", port);
    2102           0 :                                 goto out;
    2103             :                         }
    2104             : 
    2105           0 :                         mutex_lock(&mgr->lock);
    2106           0 :                         port->mstb = mstb;
    2107           0 :                         mstb->mgr = port->mgr;
    2108           0 :                         mstb->port_parent = port;
    2109             : 
    2110             :                         /*
    2111             :                          * Make sure this port's memory allocation stays
    2112             :                          * around until its child MSTB releases it
    2113             :                          */
    2114           0 :                         drm_dp_mst_get_port_malloc(port);
    2115           0 :                         mutex_unlock(&mgr->lock);
    2116             : 
    2117             :                         /* And make sure we send a link address for this */
    2118           0 :                         ret = 1;
    2119             :                 }
    2120             :         }
    2121             : 
    2122             : out:
    2123           0 :         if (ret < 0)
    2124           0 :                 port->pdt = DP_PEER_DEVICE_NONE;
    2125             :         return ret;
    2126             : }
    2127             : 
    2128             : /**
    2129             :  * drm_dp_mst_dpcd_read() - read a series of bytes from the DPCD via sideband
    2130             :  * @aux: Fake sideband AUX CH
    2131             :  * @offset: address of the (first) register to read
    2132             :  * @buffer: buffer to store the register values
    2133             :  * @size: number of bytes in @buffer
    2134             :  *
    2135             :  * Performs the same functionality for remote devices via
    2136             :  * sideband messaging as drm_dp_dpcd_read() does for local
    2137             :  * devices via actual AUX CH.
    2138             :  *
    2139             :  * Return: Number of bytes read, or negative error code on failure.
    2140             :  */
    2141           0 : ssize_t drm_dp_mst_dpcd_read(struct drm_dp_aux *aux,
    2142             :                              unsigned int offset, void *buffer, size_t size)
    2143             : {
    2144           0 :         struct drm_dp_mst_port *port = container_of(aux, struct drm_dp_mst_port,
    2145             :                                                     aux);
    2146             : 
    2147           0 :         return drm_dp_send_dpcd_read(port->mgr, port,
    2148             :                                      offset, size, buffer);
    2149             : }
    2150             : 
    2151             : /**
    2152             :  * drm_dp_mst_dpcd_write() - write a series of bytes to the DPCD via sideband
    2153             :  * @aux: Fake sideband AUX CH
    2154             :  * @offset: address of the (first) register to write
    2155             :  * @buffer: buffer containing the values to write
    2156             :  * @size: number of bytes in @buffer
    2157             :  *
    2158             :  * Performs the same functionality for remote devices via
    2159             :  * sideband messaging as drm_dp_dpcd_write() does for local
    2160             :  * devices via actual AUX CH.
    2161             :  *
    2162             :  * Return: number of bytes written on success, negative error code on failure.
    2163             :  */
    2164           0 : ssize_t drm_dp_mst_dpcd_write(struct drm_dp_aux *aux,
    2165             :                               unsigned int offset, void *buffer, size_t size)
    2166             : {
    2167           0 :         struct drm_dp_mst_port *port = container_of(aux, struct drm_dp_mst_port,
    2168             :                                                     aux);
    2169             : 
    2170           0 :         return drm_dp_send_dpcd_write(port->mgr, port,
    2171             :                                       offset, size, buffer);
    2172             : }
    2173             : 
    2174           0 : static int drm_dp_check_mstb_guid(struct drm_dp_mst_branch *mstb, u8 *guid)
    2175             : {
    2176           0 :         int ret = 0;
    2177             : 
    2178           0 :         memcpy(mstb->guid, guid, 16);
    2179             : 
    2180           0 :         if (!drm_dp_validate_guid(mstb->mgr, mstb->guid)) {
    2181           0 :                 if (mstb->port_parent) {
    2182           0 :                         ret = drm_dp_send_dpcd_write(mstb->mgr,
    2183             :                                                      mstb->port_parent,
    2184             :                                                      DP_GUID, 16, mstb->guid);
    2185             :                 } else {
    2186           0 :                         ret = drm_dp_dpcd_write(mstb->mgr->aux,
    2187             :                                                 DP_GUID, mstb->guid, 16);
    2188             :                 }
    2189             :         }
    2190             : 
    2191           0 :         if (ret < 16 && ret > 0)
    2192             :                 return -EPROTO;
    2193             : 
    2194           0 :         return ret == 16 ? 0 : ret;
    2195             : }
    2196             : 
    2197           0 : static void build_mst_prop_path(const struct drm_dp_mst_branch *mstb,
    2198             :                                 int pnum,
    2199             :                                 char *proppath,
    2200             :                                 size_t proppath_size)
    2201             : {
    2202             :         int i;
    2203             :         char temp[8];
    2204             : 
    2205           0 :         snprintf(proppath, proppath_size, "mst:%d", mstb->mgr->conn_base_id);
    2206           0 :         for (i = 0; i < (mstb->lct - 1); i++) {
    2207           0 :                 int shift = (i % 2) ? 0 : 4;
    2208           0 :                 int port_num = (mstb->rad[i / 2] >> shift) & 0xf;
    2209             : 
    2210           0 :                 snprintf(temp, sizeof(temp), "-%d", port_num);
    2211           0 :                 strlcat(proppath, temp, proppath_size);
    2212             :         }
    2213           0 :         snprintf(temp, sizeof(temp), "-%d", pnum);
    2214           0 :         strlcat(proppath, temp, proppath_size);
    2215           0 : }
    2216             : 
    2217             : /**
    2218             :  * drm_dp_mst_connector_late_register() - Late MST connector registration
    2219             :  * @connector: The MST connector
    2220             :  * @port: The MST port for this connector
    2221             :  *
    2222             :  * Helper to register the remote aux device for this MST port. Drivers should
    2223             :  * call this from their mst connector's late_register hook to enable MST aux
    2224             :  * devices.
    2225             :  *
    2226             :  * Return: 0 on success, negative error code on failure.
    2227             :  */
    2228           0 : int drm_dp_mst_connector_late_register(struct drm_connector *connector,
    2229             :                                        struct drm_dp_mst_port *port)
    2230             : {
    2231           0 :         drm_dbg_kms(port->mgr->dev, "registering %s remote bus for %s\n",
    2232             :                     port->aux.name, connector->kdev->kobj.name);
    2233             : 
    2234           0 :         port->aux.dev = connector->kdev;
    2235           0 :         return drm_dp_aux_register_devnode(&port->aux);
    2236             : }
    2237             : EXPORT_SYMBOL(drm_dp_mst_connector_late_register);
    2238             : 
    2239             : /**
    2240             :  * drm_dp_mst_connector_early_unregister() - Early MST connector unregistration
    2241             :  * @connector: The MST connector
    2242             :  * @port: The MST port for this connector
    2243             :  *
    2244             :  * Helper to unregister the remote aux device for this MST port, registered by
    2245             :  * drm_dp_mst_connector_late_register(). Drivers should call this from their mst
    2246             :  * connector's early_unregister hook.
    2247             :  */
    2248           0 : void drm_dp_mst_connector_early_unregister(struct drm_connector *connector,
    2249             :                                            struct drm_dp_mst_port *port)
    2250             : {
    2251           0 :         drm_dbg_kms(port->mgr->dev, "unregistering %s remote bus for %s\n",
    2252             :                     port->aux.name, connector->kdev->kobj.name);
    2253           0 :         drm_dp_aux_unregister_devnode(&port->aux);
    2254           0 : }
    2255             : EXPORT_SYMBOL(drm_dp_mst_connector_early_unregister);
    2256             : 
    2257             : static void
    2258           0 : drm_dp_mst_port_add_connector(struct drm_dp_mst_branch *mstb,
    2259             :                               struct drm_dp_mst_port *port)
    2260             : {
    2261           0 :         struct drm_dp_mst_topology_mgr *mgr = port->mgr;
    2262             :         char proppath[255];
    2263             :         int ret;
    2264             : 
    2265           0 :         build_mst_prop_path(mstb, port->port_num, proppath, sizeof(proppath));
    2266           0 :         port->connector = mgr->cbs->add_connector(mgr, port, proppath);
    2267           0 :         if (!port->connector) {
    2268           0 :                 ret = -ENOMEM;
    2269             :                 goto error;
    2270             :         }
    2271             : 
    2272           0 :         if (port->pdt != DP_PEER_DEVICE_NONE &&
    2273           0 :             drm_dp_mst_is_end_device(port->pdt, port->mcs) &&
    2274           0 :             port->port_num >= DP_MST_LOGICAL_PORT_0)
    2275           0 :                 port->cached_edid = drm_get_edid(port->connector,
    2276             :                                                  &port->aux.ddc);
    2277             : 
    2278           0 :         drm_connector_register(port->connector);
    2279           0 :         return;
    2280             : 
    2281             : error:
    2282           0 :         drm_err(mgr->dev, "Failed to create connector for port %p: %d\n", port, ret);
    2283             : }
    2284             : 
    2285             : /*
    2286             :  * Drop a topology reference, and unlink the port from the in-memory topology
    2287             :  * layout
    2288             :  */
    2289             : static void
    2290           0 : drm_dp_mst_topology_unlink_port(struct drm_dp_mst_topology_mgr *mgr,
    2291             :                                 struct drm_dp_mst_port *port)
    2292             : {
    2293           0 :         mutex_lock(&mgr->lock);
    2294           0 :         port->parent->num_ports--;
    2295           0 :         list_del(&port->next);
    2296           0 :         mutex_unlock(&mgr->lock);
    2297           0 :         drm_dp_mst_topology_put_port(port);
    2298           0 : }
    2299             : 
    2300             : static struct drm_dp_mst_port *
    2301           0 : drm_dp_mst_add_port(struct drm_device *dev,
    2302             :                     struct drm_dp_mst_topology_mgr *mgr,
    2303             :                     struct drm_dp_mst_branch *mstb, u8 port_number)
    2304             : {
    2305           0 :         struct drm_dp_mst_port *port = kzalloc(sizeof(*port), GFP_KERNEL);
    2306             : 
    2307           0 :         if (!port)
    2308             :                 return NULL;
    2309             : 
    2310           0 :         kref_init(&port->topology_kref);
    2311           0 :         kref_init(&port->malloc_kref);
    2312           0 :         port->parent = mstb;
    2313           0 :         port->port_num = port_number;
    2314           0 :         port->mgr = mgr;
    2315           0 :         port->aux.name = "DPMST";
    2316           0 :         port->aux.dev = dev->dev;
    2317           0 :         port->aux.is_remote = true;
    2318             : 
    2319             :         /* initialize the MST downstream port's AUX crc work queue */
    2320           0 :         port->aux.drm_dev = dev;
    2321           0 :         drm_dp_remote_aux_init(&port->aux);
    2322             : 
    2323             :         /*
    2324             :          * Make sure the memory allocation for our parent branch stays
    2325             :          * around until our own memory allocation is released
    2326             :          */
    2327           0 :         drm_dp_mst_get_mstb_malloc(mstb);
    2328             : 
    2329           0 :         return port;
    2330             : }
    2331             : 
    2332             : static int
    2333           0 : drm_dp_mst_handle_link_address_port(struct drm_dp_mst_branch *mstb,
    2334             :                                     struct drm_device *dev,
    2335             :                                     struct drm_dp_link_addr_reply_port *port_msg)
    2336             : {
    2337           0 :         struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
    2338             :         struct drm_dp_mst_port *port;
    2339           0 :         int old_ddps = 0, ret;
    2340           0 :         u8 new_pdt = DP_PEER_DEVICE_NONE;
    2341           0 :         bool new_mcs = 0;
    2342           0 :         bool created = false, send_link_addr = false, changed = false;
    2343             : 
    2344           0 :         port = drm_dp_get_port(mstb, port_msg->port_number);
    2345           0 :         if (!port) {
    2346           0 :                 port = drm_dp_mst_add_port(dev, mgr, mstb,
    2347           0 :                                            port_msg->port_number);
    2348           0 :                 if (!port)
    2349             :                         return -ENOMEM;
    2350             :                 created = true;
    2351             :                 changed = true;
    2352           0 :         } else if (!port->input && port_msg->input_port && port->connector) {
    2353             :                 /* Since port->connector can't be changed here, we create a
    2354             :                  * new port if input_port changes from 0 to 1
    2355             :                  */
    2356           0 :                 drm_dp_mst_topology_unlink_port(mgr, port);
    2357           0 :                 drm_dp_mst_topology_put_port(port);
    2358           0 :                 port = drm_dp_mst_add_port(dev, mgr, mstb,
    2359           0 :                                            port_msg->port_number);
    2360           0 :                 if (!port)
    2361             :                         return -ENOMEM;
    2362             :                 changed = true;
    2363             :                 created = true;
    2364           0 :         } else if (port->input && !port_msg->input_port) {
    2365             :                 changed = true;
    2366           0 :         } else if (port->connector) {
    2367             :                 /* We're updating a port that's exposed to userspace, so do it
    2368             :                  * under lock
    2369             :                  */
    2370           0 :                 drm_modeset_lock(&mgr->base.lock, NULL);
    2371             : 
    2372           0 :                 old_ddps = port->ddps;
    2373           0 :                 changed = port->ddps != port_msg->ddps ||
    2374           0 :                         (port->ddps &&
    2375           0 :                          (port->ldps != port_msg->legacy_device_plug_status ||
    2376           0 :                           port->dpcd_rev != port_msg->dpcd_revision ||
    2377           0 :                           port->mcs != port_msg->mcs ||
    2378           0 :                           port->pdt != port_msg->peer_device_type ||
    2379           0 :                           port->num_sdp_stream_sinks !=
    2380           0 :                           port_msg->num_sdp_stream_sinks));
    2381             :         }
    2382             : 
    2383           0 :         port->input = port_msg->input_port;
    2384           0 :         if (!port->input)
    2385           0 :                 new_pdt = port_msg->peer_device_type;
    2386           0 :         new_mcs = port_msg->mcs;
    2387           0 :         port->ddps = port_msg->ddps;
    2388           0 :         port->ldps = port_msg->legacy_device_plug_status;
    2389           0 :         port->dpcd_rev = port_msg->dpcd_revision;
    2390           0 :         port->num_sdp_streams = port_msg->num_sdp_streams;
    2391           0 :         port->num_sdp_stream_sinks = port_msg->num_sdp_stream_sinks;
    2392             : 
    2393             :         /* manage mstb port lists with mgr lock - take a reference
    2394             :            for this list */
    2395           0 :         if (created) {
    2396           0 :                 mutex_lock(&mgr->lock);
    2397           0 :                 drm_dp_mst_topology_get_port(port);
    2398           0 :                 list_add(&port->next, &mstb->ports);
    2399           0 :                 mstb->num_ports++;
    2400           0 :                 mutex_unlock(&mgr->lock);
    2401             :         }
    2402             : 
    2403             :         /*
    2404             :          * Reprobe PBN caps on both hotplug, and when re-probing the link
    2405             :          * for our parent mstb
    2406             :          */
    2407           0 :         if (old_ddps != port->ddps || !created) {
    2408           0 :                 if (port->ddps && !port->input) {
    2409           0 :                         ret = drm_dp_send_enum_path_resources(mgr, mstb,
    2410             :                                                               port);
    2411           0 :                         if (ret == 1)
    2412           0 :                                 changed = true;
    2413             :                 } else {
    2414           0 :                         port->full_pbn = 0;
    2415             :                 }
    2416             :         }
    2417             : 
    2418           0 :         ret = drm_dp_port_set_pdt(port, new_pdt, new_mcs);
    2419           0 :         if (ret == 1) {
    2420             :                 send_link_addr = true;
    2421           0 :         } else if (ret < 0) {
    2422           0 :                 drm_err(dev, "Failed to change PDT on port %p: %d\n", port, ret);
    2423             :                 goto fail;
    2424             :         }
    2425             : 
    2426             :         /*
    2427             :          * If this port wasn't just created, then we're reprobing because
    2428             :          * we're coming out of suspend. In this case, always resend the link
    2429             :          * address if there's an MSTB on this port
    2430             :          */
    2431           0 :         if (!created && port->pdt == DP_PEER_DEVICE_MST_BRANCHING &&
    2432           0 :             port->mcs)
    2433           0 :                 send_link_addr = true;
    2434             : 
    2435           0 :         if (port->connector)
    2436           0 :                 drm_modeset_unlock(&mgr->base.lock);
    2437           0 :         else if (!port->input)
    2438           0 :                 drm_dp_mst_port_add_connector(mstb, port);
    2439             : 
    2440           0 :         if (send_link_addr && port->mstb) {
    2441           0 :                 ret = drm_dp_send_link_address(mgr, port->mstb);
    2442           0 :                 if (ret == 1) /* MSTB below us changed */
    2443             :                         changed = true;
    2444           0 :                 else if (ret < 0)
    2445             :                         goto fail_put;
    2446             :         }
    2447             : 
    2448             :         /* put reference to this port */
    2449           0 :         drm_dp_mst_topology_put_port(port);
    2450           0 :         return changed;
    2451             : 
    2452             : fail:
    2453           0 :         drm_dp_mst_topology_unlink_port(mgr, port);
    2454           0 :         if (port->connector)
    2455           0 :                 drm_modeset_unlock(&mgr->base.lock);
    2456             : fail_put:
    2457           0 :         drm_dp_mst_topology_put_port(port);
    2458           0 :         return ret;
    2459             : }
    2460             : 
    2461             : static int
    2462           0 : drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
    2463             :                             struct drm_dp_connection_status_notify *conn_stat)
    2464             : {
    2465           0 :         struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
    2466             :         struct drm_dp_mst_port *port;
    2467             :         int old_ddps, ret;
    2468             :         u8 new_pdt;
    2469             :         bool new_mcs;
    2470           0 :         bool dowork = false, create_connector = false;
    2471             : 
    2472           0 :         port = drm_dp_get_port(mstb, conn_stat->port_number);
    2473           0 :         if (!port)
    2474             :                 return 0;
    2475             : 
    2476           0 :         if (port->connector) {
    2477           0 :                 if (!port->input && conn_stat->input_port) {
    2478             :                         /*
    2479             :                          * We can't remove a connector from an already exposed
    2480             :                          * port, so just throw the port out and make sure we
    2481             :                          * reprobe the link address of it's parent MSTB
    2482             :                          */
    2483           0 :                         drm_dp_mst_topology_unlink_port(mgr, port);
    2484           0 :                         mstb->link_address_sent = false;
    2485           0 :                         dowork = true;
    2486           0 :                         goto out;
    2487             :                 }
    2488             : 
    2489             :                 /* Locking is only needed if the port's exposed to userspace */
    2490           0 :                 drm_modeset_lock(&mgr->base.lock, NULL);
    2491           0 :         } else if (port->input && !conn_stat->input_port) {
    2492           0 :                 create_connector = true;
    2493             :                 /* Reprobe link address so we get num_sdp_streams */
    2494           0 :                 mstb->link_address_sent = false;
    2495           0 :                 dowork = true;
    2496             :         }
    2497             : 
    2498           0 :         old_ddps = port->ddps;
    2499           0 :         port->input = conn_stat->input_port;
    2500           0 :         port->ldps = conn_stat->legacy_device_plug_status;
    2501           0 :         port->ddps = conn_stat->displayport_device_plug_status;
    2502             : 
    2503           0 :         if (old_ddps != port->ddps) {
    2504           0 :                 if (port->ddps && !port->input)
    2505           0 :                         drm_dp_send_enum_path_resources(mgr, mstb, port);
    2506             :                 else
    2507           0 :                         port->full_pbn = 0;
    2508             :         }
    2509             : 
    2510           0 :         new_pdt = port->input ? DP_PEER_DEVICE_NONE : conn_stat->peer_device_type;
    2511           0 :         new_mcs = conn_stat->message_capability_status;
    2512           0 :         ret = drm_dp_port_set_pdt(port, new_pdt, new_mcs);
    2513           0 :         if (ret == 1) {
    2514             :                 dowork = true;
    2515           0 :         } else if (ret < 0) {
    2516           0 :                 drm_err(mgr->dev, "Failed to change PDT for port %p: %d\n", port, ret);
    2517           0 :                 dowork = false;
    2518             :         }
    2519             : 
    2520           0 :         if (port->connector)
    2521           0 :                 drm_modeset_unlock(&mgr->base.lock);
    2522           0 :         else if (create_connector)
    2523           0 :                 drm_dp_mst_port_add_connector(mstb, port);
    2524             : 
    2525             : out:
    2526           0 :         drm_dp_mst_topology_put_port(port);
    2527           0 :         return dowork;
    2528             : }
    2529             : 
    2530           0 : static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device(struct drm_dp_mst_topology_mgr *mgr,
    2531             :                                                                u8 lct, u8 *rad)
    2532             : {
    2533             :         struct drm_dp_mst_branch *mstb;
    2534             :         struct drm_dp_mst_port *port;
    2535             :         int i, ret;
    2536             :         /* find the port by iterating down */
    2537             : 
    2538           0 :         mutex_lock(&mgr->lock);
    2539           0 :         mstb = mgr->mst_primary;
    2540             : 
    2541           0 :         if (!mstb)
    2542             :                 goto out;
    2543             : 
    2544           0 :         for (i = 0; i < lct - 1; i++) {
    2545           0 :                 int shift = (i % 2) ? 0 : 4;
    2546           0 :                 int port_num = (rad[i / 2] >> shift) & 0xf;
    2547             : 
    2548           0 :                 list_for_each_entry(port, &mstb->ports, next) {
    2549           0 :                         if (port->port_num == port_num) {
    2550           0 :                                 mstb = port->mstb;
    2551           0 :                                 if (!mstb) {
    2552           0 :                                         drm_err(mgr->dev,
    2553             :                                                 "failed to lookup MSTB with lct %d, rad %02x\n",
    2554             :                                                 lct, rad[0]);
    2555           0 :                                         goto out;
    2556             :                                 }
    2557             : 
    2558             :                                 break;
    2559             :                         }
    2560             :                 }
    2561             :         }
    2562           0 :         ret = drm_dp_mst_topology_try_get_mstb(mstb);
    2563           0 :         if (!ret)
    2564           0 :                 mstb = NULL;
    2565             : out:
    2566           0 :         mutex_unlock(&mgr->lock);
    2567           0 :         return mstb;
    2568             : }
    2569             : 
    2570           0 : static struct drm_dp_mst_branch *get_mst_branch_device_by_guid_helper(
    2571             :         struct drm_dp_mst_branch *mstb,
    2572             :         const uint8_t *guid)
    2573             : {
    2574             :         struct drm_dp_mst_branch *found_mstb;
    2575             :         struct drm_dp_mst_port *port;
    2576             : 
    2577           0 :         if (memcmp(mstb->guid, guid, 16) == 0)
    2578             :                 return mstb;
    2579             : 
    2580             : 
    2581           0 :         list_for_each_entry(port, &mstb->ports, next) {
    2582           0 :                 if (!port->mstb)
    2583           0 :                         continue;
    2584             : 
    2585           0 :                 found_mstb = get_mst_branch_device_by_guid_helper(port->mstb, guid);
    2586             : 
    2587           0 :                 if (found_mstb)
    2588             :                         return found_mstb;
    2589             :         }
    2590             : 
    2591             :         return NULL;
    2592             : }
    2593             : 
    2594             : static struct drm_dp_mst_branch *
    2595           0 : drm_dp_get_mst_branch_device_by_guid(struct drm_dp_mst_topology_mgr *mgr,
    2596             :                                      const uint8_t *guid)
    2597             : {
    2598             :         struct drm_dp_mst_branch *mstb;
    2599             :         int ret;
    2600             : 
    2601             :         /* find the port by iterating down */
    2602           0 :         mutex_lock(&mgr->lock);
    2603             : 
    2604           0 :         mstb = get_mst_branch_device_by_guid_helper(mgr->mst_primary, guid);
    2605           0 :         if (mstb) {
    2606           0 :                 ret = drm_dp_mst_topology_try_get_mstb(mstb);
    2607           0 :                 if (!ret)
    2608           0 :                         mstb = NULL;
    2609             :         }
    2610             : 
    2611           0 :         mutex_unlock(&mgr->lock);
    2612           0 :         return mstb;
    2613             : }
    2614             : 
    2615           0 : static int drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *mgr,
    2616             :                                                struct drm_dp_mst_branch *mstb)
    2617             : {
    2618             :         struct drm_dp_mst_port *port;
    2619             :         int ret;
    2620           0 :         bool changed = false;
    2621             : 
    2622           0 :         if (!mstb->link_address_sent) {
    2623           0 :                 ret = drm_dp_send_link_address(mgr, mstb);
    2624           0 :                 if (ret == 1)
    2625             :                         changed = true;
    2626           0 :                 else if (ret < 0)
    2627             :                         return ret;
    2628             :         }
    2629             : 
    2630           0 :         list_for_each_entry(port, &mstb->ports, next) {
    2631           0 :                 if (port->input || !port->ddps || !port->mstb)
    2632           0 :                         continue;
    2633             : 
    2634           0 :                 ret = drm_dp_check_and_send_link_address(mgr, port->mstb);
    2635           0 :                 if (ret == 1)
    2636             :                         changed = true;
    2637           0 :                 else if (ret < 0)
    2638             :                         return ret;
    2639             :         }
    2640             : 
    2641           0 :         return changed;
    2642             : }
    2643             : 
    2644           0 : static void drm_dp_mst_link_probe_work(struct work_struct *work)
    2645             : {
    2646           0 :         struct drm_dp_mst_topology_mgr *mgr =
    2647           0 :                 container_of(work, struct drm_dp_mst_topology_mgr, work);
    2648           0 :         struct drm_device *dev = mgr->dev;
    2649             :         struct drm_dp_mst_branch *mstb;
    2650             :         int ret;
    2651             :         bool clear_payload_id_table;
    2652             : 
    2653           0 :         mutex_lock(&mgr->probe_lock);
    2654             : 
    2655           0 :         mutex_lock(&mgr->lock);
    2656           0 :         clear_payload_id_table = !mgr->payload_id_table_cleared;
    2657           0 :         mgr->payload_id_table_cleared = true;
    2658             : 
    2659           0 :         mstb = mgr->mst_primary;
    2660           0 :         if (mstb) {
    2661           0 :                 ret = drm_dp_mst_topology_try_get_mstb(mstb);
    2662           0 :                 if (!ret)
    2663           0 :                         mstb = NULL;
    2664             :         }
    2665           0 :         mutex_unlock(&mgr->lock);
    2666           0 :         if (!mstb) {
    2667           0 :                 mutex_unlock(&mgr->probe_lock);
    2668           0 :                 return;
    2669             :         }
    2670             : 
    2671             :         /*
    2672             :          * Certain branch devices seem to incorrectly report an available_pbn
    2673             :          * of 0 on downstream sinks, even after clearing the
    2674             :          * DP_PAYLOAD_ALLOCATE_* registers in
    2675             :          * drm_dp_mst_topology_mgr_set_mst(). Namely, the CableMatters USB-C
    2676             :          * 2x DP hub. Sending a CLEAR_PAYLOAD_ID_TABLE message seems to make
    2677             :          * things work again.
    2678             :          */
    2679           0 :         if (clear_payload_id_table) {
    2680           0 :                 drm_dbg_kms(dev, "Clearing payload ID table\n");
    2681           0 :                 drm_dp_send_clear_payload_id_table(mgr, mstb);
    2682             :         }
    2683             : 
    2684           0 :         ret = drm_dp_check_and_send_link_address(mgr, mstb);
    2685           0 :         drm_dp_mst_topology_put_mstb(mstb);
    2686             : 
    2687           0 :         mutex_unlock(&mgr->probe_lock);
    2688           0 :         if (ret > 0)
    2689           0 :                 drm_kms_helper_hotplug_event(dev);
    2690             : }
    2691             : 
    2692           0 : static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr,
    2693             :                                  u8 *guid)
    2694             : {
    2695             :         u64 salt;
    2696             : 
    2697           0 :         if (memchr_inv(guid, 0, 16))
    2698             :                 return true;
    2699             : 
    2700           0 :         salt = get_jiffies_64();
    2701             : 
    2702           0 :         memcpy(&guid[0], &salt, sizeof(u64));
    2703           0 :         memcpy(&guid[8], &salt, sizeof(u64));
    2704             : 
    2705             :         return false;
    2706             : }
    2707             : 
    2708           0 : static void build_dpcd_read(struct drm_dp_sideband_msg_tx *msg,
    2709             :                             u8 port_num, u32 offset, u8 num_bytes)
    2710             : {
    2711             :         struct drm_dp_sideband_msg_req_body req;
    2712             : 
    2713           0 :         req.req_type = DP_REMOTE_DPCD_READ;
    2714           0 :         req.u.dpcd_read.port_number = port_num;
    2715           0 :         req.u.dpcd_read.dpcd_address = offset;
    2716           0 :         req.u.dpcd_read.num_bytes = num_bytes;
    2717           0 :         drm_dp_encode_sideband_req(&req, msg);
    2718           0 : }
    2719             : 
    2720           0 : static int drm_dp_send_sideband_msg(struct drm_dp_mst_topology_mgr *mgr,
    2721             :                                     bool up, u8 *msg, int len)
    2722             : {
    2723             :         int ret;
    2724           0 :         int regbase = up ? DP_SIDEBAND_MSG_UP_REP_BASE : DP_SIDEBAND_MSG_DOWN_REQ_BASE;
    2725             :         int tosend, total, offset;
    2726           0 :         int retries = 0;
    2727             : 
    2728             : retry:
    2729           0 :         total = len;
    2730           0 :         offset = 0;
    2731             :         do {
    2732           0 :                 tosend = min3(mgr->max_dpcd_transaction_bytes, 16, total);
    2733             : 
    2734           0 :                 ret = drm_dp_dpcd_write(mgr->aux, regbase + offset,
    2735           0 :                                         &msg[offset],
    2736             :                                         tosend);
    2737           0 :                 if (ret != tosend) {
    2738           0 :                         if (ret == -EIO && retries < 5) {
    2739           0 :                                 retries++;
    2740           0 :                                 goto retry;
    2741             :                         }
    2742           0 :                         drm_dbg_kms(mgr->dev, "failed to dpcd write %d %d\n", tosend, ret);
    2743             : 
    2744           0 :                         return -EIO;
    2745             :                 }
    2746           0 :                 offset += tosend;
    2747           0 :                 total -= tosend;
    2748           0 :         } while (total > 0);
    2749             :         return 0;
    2750             : }
    2751             : 
    2752           0 : static int set_hdr_from_dst_qlock(struct drm_dp_sideband_msg_hdr *hdr,
    2753             :                                   struct drm_dp_sideband_msg_tx *txmsg)
    2754             : {
    2755           0 :         struct drm_dp_mst_branch *mstb = txmsg->dst;
    2756             :         u8 req_type;
    2757             : 
    2758           0 :         req_type = txmsg->msg[0] & 0x7f;
    2759           0 :         if (req_type == DP_CONNECTION_STATUS_NOTIFY ||
    2760           0 :                 req_type == DP_RESOURCE_STATUS_NOTIFY ||
    2761             :                 req_type == DP_CLEAR_PAYLOAD_ID_TABLE)
    2762           0 :                 hdr->broadcast = 1;
    2763             :         else
    2764           0 :                 hdr->broadcast = 0;
    2765           0 :         hdr->path_msg = txmsg->path_msg;
    2766           0 :         if (hdr->broadcast) {
    2767           0 :                 hdr->lct = 1;
    2768           0 :                 hdr->lcr = 6;
    2769             :         } else {
    2770           0 :                 hdr->lct = mstb->lct;
    2771           0 :                 hdr->lcr = mstb->lct - 1;
    2772             :         }
    2773             : 
    2774           0 :         memcpy(hdr->rad, mstb->rad, hdr->lct / 2);
    2775             : 
    2776           0 :         return 0;
    2777             : }
    2778             : /*
    2779             :  * process a single block of the next message in the sideband queue
    2780             :  */
    2781           0 : static int process_single_tx_qlock(struct drm_dp_mst_topology_mgr *mgr,
    2782             :                                    struct drm_dp_sideband_msg_tx *txmsg,
    2783             :                                    bool up)
    2784             : {
    2785             :         u8 chunk[48];
    2786             :         struct drm_dp_sideband_msg_hdr hdr;
    2787             :         int len, space, idx, tosend;
    2788             :         int ret;
    2789             : 
    2790           0 :         if (txmsg->state == DRM_DP_SIDEBAND_TX_SENT)
    2791             :                 return 0;
    2792             : 
    2793           0 :         memset(&hdr, 0, sizeof(struct drm_dp_sideband_msg_hdr));
    2794             : 
    2795           0 :         if (txmsg->state == DRM_DP_SIDEBAND_TX_QUEUED)
    2796           0 :                 txmsg->state = DRM_DP_SIDEBAND_TX_START_SEND;
    2797             : 
    2798             :         /* make hdr from dst mst */
    2799           0 :         ret = set_hdr_from_dst_qlock(&hdr, txmsg);
    2800           0 :         if (ret < 0)
    2801             :                 return ret;
    2802             : 
    2803             :         /* amount left to send in this message */
    2804           0 :         len = txmsg->cur_len - txmsg->cur_offset;
    2805             : 
    2806             :         /* 48 - sideband msg size - 1 byte for data CRC, x header bytes */
    2807           0 :         space = 48 - 1 - drm_dp_calc_sb_hdr_size(&hdr);
    2808             : 
    2809           0 :         tosend = min(len, space);
    2810           0 :         if (len == txmsg->cur_len)
    2811           0 :                 hdr.somt = 1;
    2812           0 :         if (space >= len)
    2813           0 :                 hdr.eomt = 1;
    2814             : 
    2815             : 
    2816           0 :         hdr.msg_len = tosend + 1;
    2817           0 :         drm_dp_encode_sideband_msg_hdr(&hdr, chunk, &idx);
    2818           0 :         memcpy(&chunk[idx], &txmsg->msg[txmsg->cur_offset], tosend);
    2819             :         /* add crc at end */
    2820           0 :         drm_dp_crc_sideband_chunk_req(&chunk[idx], tosend);
    2821           0 :         idx += tosend + 1;
    2822             : 
    2823           0 :         ret = drm_dp_send_sideband_msg(mgr, up, chunk, idx);
    2824           0 :         if (ret) {
    2825           0 :                 if (drm_debug_enabled(DRM_UT_DP)) {
    2826           0 :                         struct drm_printer p = drm_debug_printer(DBG_PREFIX);
    2827             : 
    2828           0 :                         drm_printf(&p, "sideband msg failed to send\n");
    2829           0 :                         drm_dp_mst_dump_sideband_msg_tx(&p, txmsg);
    2830             :                 }
    2831             :                 return ret;
    2832             :         }
    2833             : 
    2834           0 :         txmsg->cur_offset += tosend;
    2835           0 :         if (txmsg->cur_offset == txmsg->cur_len) {
    2836           0 :                 txmsg->state = DRM_DP_SIDEBAND_TX_SENT;
    2837           0 :                 return 1;
    2838             :         }
    2839             :         return 0;
    2840             : }
    2841             : 
    2842           0 : static void process_single_down_tx_qlock(struct drm_dp_mst_topology_mgr *mgr)
    2843             : {
    2844             :         struct drm_dp_sideband_msg_tx *txmsg;
    2845             :         int ret;
    2846             : 
    2847           0 :         WARN_ON(!mutex_is_locked(&mgr->qlock));
    2848             : 
    2849             :         /* construct a chunk from the first msg in the tx_msg queue */
    2850           0 :         if (list_empty(&mgr->tx_msg_downq))
    2851             :                 return;
    2852             : 
    2853           0 :         txmsg = list_first_entry(&mgr->tx_msg_downq,
    2854             :                                  struct drm_dp_sideband_msg_tx, next);
    2855           0 :         ret = process_single_tx_qlock(mgr, txmsg, false);
    2856           0 :         if (ret < 0) {
    2857           0 :                 drm_dbg_kms(mgr->dev, "failed to send msg in q %d\n", ret);
    2858           0 :                 list_del(&txmsg->next);
    2859           0 :                 txmsg->state = DRM_DP_SIDEBAND_TX_TIMEOUT;
    2860           0 :                 wake_up_all(&mgr->tx_waitq);
    2861             :         }
    2862             : }
    2863             : 
    2864           0 : static void drm_dp_queue_down_tx(struct drm_dp_mst_topology_mgr *mgr,
    2865             :                                  struct drm_dp_sideband_msg_tx *txmsg)
    2866             : {
    2867           0 :         mutex_lock(&mgr->qlock);
    2868           0 :         list_add_tail(&txmsg->next, &mgr->tx_msg_downq);
    2869             : 
    2870           0 :         if (drm_debug_enabled(DRM_UT_DP)) {
    2871           0 :                 struct drm_printer p = drm_debug_printer(DBG_PREFIX);
    2872             : 
    2873           0 :                 drm_dp_mst_dump_sideband_msg_tx(&p, txmsg);
    2874             :         }
    2875             : 
    2876           0 :         if (list_is_singular(&mgr->tx_msg_downq))
    2877           0 :                 process_single_down_tx_qlock(mgr);
    2878           0 :         mutex_unlock(&mgr->qlock);
    2879           0 : }
    2880             : 
    2881             : static void
    2882           0 : drm_dp_dump_link_address(const struct drm_dp_mst_topology_mgr *mgr,
    2883             :                          struct drm_dp_link_address_ack_reply *reply)
    2884             : {
    2885             :         struct drm_dp_link_addr_reply_port *port_reply;
    2886             :         int i;
    2887             : 
    2888           0 :         for (i = 0; i < reply->nports; i++) {
    2889           0 :                 port_reply = &reply->ports[i];
    2890           0 :                 drm_dbg_kms(mgr->dev,
    2891             :                             "port %d: input %d, pdt: %d, pn: %d, dpcd_rev: %02x, mcs: %d, ddps: %d, ldps %d, sdp %d/%d\n",
    2892             :                             i,
    2893             :                             port_reply->input_port,
    2894             :                             port_reply->peer_device_type,
    2895             :                             port_reply->port_number,
    2896             :                             port_reply->dpcd_revision,
    2897             :                             port_reply->mcs,
    2898             :                             port_reply->ddps,
    2899             :                             port_reply->legacy_device_plug_status,
    2900             :                             port_reply->num_sdp_streams,
    2901             :                             port_reply->num_sdp_stream_sinks);
    2902             :         }
    2903           0 : }
    2904             : 
    2905           0 : static int drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr,
    2906             :                                      struct drm_dp_mst_branch *mstb)
    2907             : {
    2908             :         struct drm_dp_sideband_msg_tx *txmsg;
    2909             :         struct drm_dp_link_address_ack_reply *reply;
    2910             :         struct drm_dp_mst_port *port, *tmp;
    2911           0 :         int i, ret, port_mask = 0;
    2912           0 :         bool changed = false;
    2913             : 
    2914           0 :         txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
    2915           0 :         if (!txmsg)
    2916             :                 return -ENOMEM;
    2917             : 
    2918           0 :         txmsg->dst = mstb;
    2919           0 :         build_link_address(txmsg);
    2920             : 
    2921           0 :         mstb->link_address_sent = true;
    2922           0 :         drm_dp_queue_down_tx(mgr, txmsg);
    2923             : 
    2924             :         /* FIXME: Actually do some real error handling here */
    2925           0 :         ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
    2926           0 :         if (ret <= 0) {
    2927           0 :                 drm_err(mgr->dev, "Sending link address failed with %d\n", ret);
    2928           0 :                 goto out;
    2929             :         }
    2930           0 :         if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) {
    2931           0 :                 drm_err(mgr->dev, "link address NAK received\n");
    2932           0 :                 ret = -EIO;
    2933           0 :                 goto out;
    2934             :         }
    2935             : 
    2936           0 :         reply = &txmsg->reply.u.link_addr;
    2937           0 :         drm_dbg_kms(mgr->dev, "link address reply: %d\n", reply->nports);
    2938           0 :         drm_dp_dump_link_address(mgr, reply);
    2939             : 
    2940           0 :         ret = drm_dp_check_mstb_guid(mstb, reply->guid);
    2941           0 :         if (ret) {
    2942             :                 char buf[64];
    2943             : 
    2944           0 :                 drm_dp_mst_rad_to_str(mstb->rad, mstb->lct, buf, sizeof(buf));
    2945           0 :                 drm_err(mgr->dev, "GUID check on %s failed: %d\n", buf, ret);
    2946             :                 goto out;
    2947             :         }
    2948             : 
    2949           0 :         for (i = 0; i < reply->nports; i++) {
    2950           0 :                 port_mask |= BIT(reply->ports[i].port_number);
    2951           0 :                 ret = drm_dp_mst_handle_link_address_port(mstb, mgr->dev,
    2952             :                                                           &reply->ports[i]);
    2953           0 :                 if (ret == 1)
    2954             :                         changed = true;
    2955           0 :                 else if (ret < 0)
    2956             :                         goto out;
    2957             :         }
    2958             : 
    2959             :         /* Prune any ports that are currently a part of mstb in our in-memory
    2960             :          * topology, but were not seen in this link address. Usually this
    2961             :          * means that they were removed while the topology was out of sync,
    2962             :          * e.g. during suspend/resume
    2963             :          */
    2964           0 :         mutex_lock(&mgr->lock);
    2965           0 :         list_for_each_entry_safe(port, tmp, &mstb->ports, next) {
    2966           0 :                 if (port_mask & BIT(port->port_num))
    2967           0 :                         continue;
    2968             : 
    2969           0 :                 drm_dbg_kms(mgr->dev, "port %d was not in link address, removing\n",
    2970             :                             port->port_num);
    2971           0 :                 list_del(&port->next);
    2972           0 :                 drm_dp_mst_topology_put_port(port);
    2973           0 :                 changed = true;
    2974             :         }
    2975           0 :         mutex_unlock(&mgr->lock);
    2976             : 
    2977             : out:
    2978           0 :         if (ret <= 0)
    2979           0 :                 mstb->link_address_sent = false;
    2980           0 :         kfree(txmsg);
    2981           0 :         return ret < 0 ? ret : changed;
    2982             : }
    2983             : 
    2984             : static void
    2985           0 : drm_dp_send_clear_payload_id_table(struct drm_dp_mst_topology_mgr *mgr,
    2986             :                                    struct drm_dp_mst_branch *mstb)
    2987             : {
    2988             :         struct drm_dp_sideband_msg_tx *txmsg;
    2989             :         int ret;
    2990             : 
    2991           0 :         txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
    2992           0 :         if (!txmsg)
    2993             :                 return;
    2994             : 
    2995           0 :         txmsg->dst = mstb;
    2996           0 :         build_clear_payload_id_table(txmsg);
    2997             : 
    2998           0 :         drm_dp_queue_down_tx(mgr, txmsg);
    2999             : 
    3000           0 :         ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
    3001           0 :         if (ret > 0 && txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK)
    3002           0 :                 drm_dbg_kms(mgr->dev, "clear payload table id nak received\n");
    3003             : 
    3004           0 :         kfree(txmsg);
    3005             : }
    3006             : 
    3007             : static int
    3008           0 : drm_dp_send_enum_path_resources(struct drm_dp_mst_topology_mgr *mgr,
    3009             :                                 struct drm_dp_mst_branch *mstb,
    3010             :                                 struct drm_dp_mst_port *port)
    3011             : {
    3012             :         struct drm_dp_enum_path_resources_ack_reply *path_res;
    3013             :         struct drm_dp_sideband_msg_tx *txmsg;
    3014             :         int ret;
    3015             : 
    3016           0 :         txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
    3017           0 :         if (!txmsg)
    3018             :                 return -ENOMEM;
    3019             : 
    3020           0 :         txmsg->dst = mstb;
    3021           0 :         build_enum_path_resources(txmsg, port->port_num);
    3022             : 
    3023           0 :         drm_dp_queue_down_tx(mgr, txmsg);
    3024             : 
    3025           0 :         ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
    3026           0 :         if (ret > 0) {
    3027           0 :                 ret = 0;
    3028           0 :                 path_res = &txmsg->reply.u.path_resources;
    3029             : 
    3030           0 :                 if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) {
    3031           0 :                         drm_dbg_kms(mgr->dev, "enum path resources nak received\n");
    3032             :                 } else {
    3033           0 :                         if (port->port_num != path_res->port_number)
    3034           0 :                                 DRM_ERROR("got incorrect port in response\n");
    3035             : 
    3036           0 :                         drm_dbg_kms(mgr->dev, "enum path resources %d: %d %d\n",
    3037             :                                     path_res->port_number,
    3038             :                                     path_res->full_payload_bw_number,
    3039             :                                     path_res->avail_payload_bw_number);
    3040             : 
    3041             :                         /*
    3042             :                          * If something changed, make sure we send a
    3043             :                          * hotplug
    3044             :                          */
    3045           0 :                         if (port->full_pbn != path_res->full_payload_bw_number ||
    3046           0 :                             port->fec_capable != path_res->fec_capable)
    3047           0 :                                 ret = 1;
    3048             : 
    3049           0 :                         port->full_pbn = path_res->full_payload_bw_number;
    3050           0 :                         port->fec_capable = path_res->fec_capable;
    3051             :                 }
    3052             :         }
    3053             : 
    3054           0 :         kfree(txmsg);
    3055           0 :         return ret;
    3056             : }
    3057             : 
    3058           0 : static struct drm_dp_mst_port *drm_dp_get_last_connected_port_to_mstb(struct drm_dp_mst_branch *mstb)
    3059             : {
    3060           0 :         if (!mstb->port_parent)
    3061             :                 return NULL;
    3062             : 
    3063           0 :         if (mstb->port_parent->mstb != mstb)
    3064             :                 return mstb->port_parent;
    3065             : 
    3066           0 :         return drm_dp_get_last_connected_port_to_mstb(mstb->port_parent->parent);
    3067             : }
    3068             : 
    3069             : /*
    3070             :  * Searches upwards in the topology starting from mstb to try to find the
    3071             :  * closest available parent of mstb that's still connected to the rest of the
    3072             :  * topology. This can be used in order to perform operations like releasing
    3073             :  * payloads, where the branch device which owned the payload may no longer be
    3074             :  * around and thus would require that the payload on the last living relative
    3075             :  * be freed instead.
    3076             :  */
    3077             : static struct drm_dp_mst_branch *
    3078           0 : drm_dp_get_last_connected_port_and_mstb(struct drm_dp_mst_topology_mgr *mgr,
    3079             :                                         struct drm_dp_mst_branch *mstb,
    3080             :                                         int *port_num)
    3081             : {
    3082           0 :         struct drm_dp_mst_branch *rmstb = NULL;
    3083             :         struct drm_dp_mst_port *found_port;
    3084             : 
    3085           0 :         mutex_lock(&mgr->lock);
    3086           0 :         if (!mgr->mst_primary)
    3087             :                 goto out;
    3088             : 
    3089             :         do {
    3090           0 :                 found_port = drm_dp_get_last_connected_port_to_mstb(mstb);
    3091           0 :                 if (!found_port)
    3092             :                         break;
    3093             : 
    3094           0 :                 if (drm_dp_mst_topology_try_get_mstb(found_port->parent)) {
    3095           0 :                         rmstb = found_port->parent;
    3096           0 :                         *port_num = found_port->port_num;
    3097             :                 } else {
    3098             :                         /* Search again, starting from this parent */
    3099           0 :                         mstb = found_port->parent;
    3100             :                 }
    3101           0 :         } while (!rmstb);
    3102             : out:
    3103           0 :         mutex_unlock(&mgr->lock);
    3104           0 :         return rmstb;
    3105             : }
    3106             : 
    3107           0 : static int drm_dp_payload_send_msg(struct drm_dp_mst_topology_mgr *mgr,
    3108             :                                    struct drm_dp_mst_port *port,
    3109             :                                    int id,
    3110             :                                    int pbn)
    3111             : {
    3112             :         struct drm_dp_sideband_msg_tx *txmsg;
    3113             :         struct drm_dp_mst_branch *mstb;
    3114             :         int ret, port_num;
    3115             :         u8 sinks[DRM_DP_MAX_SDP_STREAMS];
    3116             :         int i;
    3117             : 
    3118           0 :         port_num = port->port_num;
    3119           0 :         mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent);
    3120           0 :         if (!mstb) {
    3121           0 :                 mstb = drm_dp_get_last_connected_port_and_mstb(mgr,
    3122             :                                                                port->parent,
    3123             :                                                                &port_num);
    3124             : 
    3125           0 :                 if (!mstb)
    3126             :                         return -EINVAL;
    3127             :         }
    3128             : 
    3129           0 :         txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
    3130           0 :         if (!txmsg) {
    3131             :                 ret = -ENOMEM;
    3132             :                 goto fail_put;
    3133             :         }
    3134             : 
    3135           0 :         for (i = 0; i < port->num_sdp_streams; i++)
    3136           0 :                 sinks[i] = i;
    3137             : 
    3138           0 :         txmsg->dst = mstb;
    3139           0 :         build_allocate_payload(txmsg, port_num,
    3140             :                                id,
    3141             :                                pbn, port->num_sdp_streams, sinks);
    3142             : 
    3143           0 :         drm_dp_queue_down_tx(mgr, txmsg);
    3144             : 
    3145             :         /*
    3146             :          * FIXME: there is a small chance that between getting the last
    3147             :          * connected mstb and sending the payload message, the last connected
    3148             :          * mstb could also be removed from the topology. In the future, this
    3149             :          * needs to be fixed by restarting the
    3150             :          * drm_dp_get_last_connected_port_and_mstb() search in the event of a
    3151             :          * timeout if the topology is still connected to the system.
    3152             :          */
    3153           0 :         ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
    3154           0 :         if (ret > 0) {
    3155           0 :                 if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK)
    3156             :                         ret = -EINVAL;
    3157             :                 else
    3158           0 :                         ret = 0;
    3159             :         }
    3160           0 :         kfree(txmsg);
    3161             : fail_put:
    3162           0 :         drm_dp_mst_topology_put_mstb(mstb);
    3163           0 :         return ret;
    3164             : }
    3165             : 
    3166           0 : int drm_dp_send_power_updown_phy(struct drm_dp_mst_topology_mgr *mgr,
    3167             :                                  struct drm_dp_mst_port *port, bool power_up)
    3168             : {
    3169             :         struct drm_dp_sideband_msg_tx *txmsg;
    3170             :         int ret;
    3171             : 
    3172           0 :         port = drm_dp_mst_topology_get_port_validated(mgr, port);
    3173           0 :         if (!port)
    3174             :                 return -EINVAL;
    3175             : 
    3176           0 :         txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
    3177           0 :         if (!txmsg) {
    3178           0 :                 drm_dp_mst_topology_put_port(port);
    3179           0 :                 return -ENOMEM;
    3180             :         }
    3181             : 
    3182           0 :         txmsg->dst = port->parent;
    3183           0 :         build_power_updown_phy(txmsg, port->port_num, power_up);
    3184           0 :         drm_dp_queue_down_tx(mgr, txmsg);
    3185             : 
    3186           0 :         ret = drm_dp_mst_wait_tx_reply(port->parent, txmsg);
    3187           0 :         if (ret > 0) {
    3188           0 :                 if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK)
    3189             :                         ret = -EINVAL;
    3190             :                 else
    3191           0 :                         ret = 0;
    3192             :         }
    3193           0 :         kfree(txmsg);
    3194           0 :         drm_dp_mst_topology_put_port(port);
    3195             : 
    3196           0 :         return ret;
    3197             : }
    3198             : EXPORT_SYMBOL(drm_dp_send_power_updown_phy);
    3199             : 
    3200           0 : int drm_dp_send_query_stream_enc_status(struct drm_dp_mst_topology_mgr *mgr,
    3201             :                 struct drm_dp_mst_port *port,
    3202             :                 struct drm_dp_query_stream_enc_status_ack_reply *status)
    3203             : {
    3204             :         struct drm_dp_mst_topology_state *state;
    3205             :         struct drm_dp_mst_atomic_payload *payload;
    3206             :         struct drm_dp_sideband_msg_tx *txmsg;
    3207             :         u8 nonce[7];
    3208             :         int ret;
    3209             : 
    3210           0 :         txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
    3211           0 :         if (!txmsg)
    3212             :                 return -ENOMEM;
    3213             : 
    3214           0 :         port = drm_dp_mst_topology_get_port_validated(mgr, port);
    3215           0 :         if (!port) {
    3216             :                 ret = -EINVAL;
    3217             :                 goto out_get_port;
    3218             :         }
    3219             : 
    3220           0 :         get_random_bytes(nonce, sizeof(nonce));
    3221             : 
    3222           0 :         drm_modeset_lock(&mgr->base.lock, NULL);
    3223           0 :         state = to_drm_dp_mst_topology_state(mgr->base.state);
    3224           0 :         payload = drm_atomic_get_mst_payload_state(state, port);
    3225             : 
    3226             :         /*
    3227             :          * "Source device targets the QUERY_STREAM_ENCRYPTION_STATUS message
    3228             :          *  transaction at the MST Branch device directly connected to the
    3229             :          *  Source"
    3230             :          */
    3231           0 :         txmsg->dst = mgr->mst_primary;
    3232             : 
    3233           0 :         build_query_stream_enc_status(txmsg, payload->vcpi, nonce);
    3234             : 
    3235           0 :         drm_dp_queue_down_tx(mgr, txmsg);
    3236             : 
    3237           0 :         ret = drm_dp_mst_wait_tx_reply(mgr->mst_primary, txmsg);
    3238           0 :         if (ret < 0) {
    3239             :                 goto out;
    3240           0 :         } else if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) {
    3241           0 :                 drm_dbg_kms(mgr->dev, "query encryption status nak received\n");
    3242           0 :                 ret = -ENXIO;
    3243           0 :                 goto out;
    3244             :         }
    3245             : 
    3246           0 :         ret = 0;
    3247           0 :         memcpy(status, &txmsg->reply.u.enc_status, sizeof(*status));
    3248             : 
    3249             : out:
    3250           0 :         drm_modeset_unlock(&mgr->base.lock);
    3251           0 :         drm_dp_mst_topology_put_port(port);
    3252             : out_get_port:
    3253           0 :         kfree(txmsg);
    3254           0 :         return ret;
    3255             : }
    3256             : EXPORT_SYMBOL(drm_dp_send_query_stream_enc_status);
    3257             : 
    3258             : static int drm_dp_create_payload_step1(struct drm_dp_mst_topology_mgr *mgr,
    3259             :                                        struct drm_dp_mst_atomic_payload *payload)
    3260             : {
    3261           0 :         return drm_dp_dpcd_write_payload(mgr, payload->vcpi, payload->vc_start_slot,
    3262             :                                          payload->time_slots);
    3263             : }
    3264             : 
    3265           0 : static int drm_dp_create_payload_step2(struct drm_dp_mst_topology_mgr *mgr,
    3266             :                                        struct drm_dp_mst_atomic_payload *payload)
    3267             : {
    3268             :         int ret;
    3269           0 :         struct drm_dp_mst_port *port = drm_dp_mst_topology_get_port_validated(mgr, payload->port);
    3270             : 
    3271           0 :         if (!port)
    3272             :                 return -EIO;
    3273             : 
    3274           0 :         ret = drm_dp_payload_send_msg(mgr, port, payload->vcpi, payload->pbn);
    3275           0 :         drm_dp_mst_topology_put_port(port);
    3276           0 :         return ret;
    3277             : }
    3278             : 
    3279           0 : static int drm_dp_destroy_payload_step1(struct drm_dp_mst_topology_mgr *mgr,
    3280             :                                         struct drm_dp_mst_topology_state *mst_state,
    3281             :                                         struct drm_dp_mst_atomic_payload *payload)
    3282             : {
    3283           0 :         drm_dbg_kms(mgr->dev, "\n");
    3284             : 
    3285             :         /* it's okay for these to fail */
    3286           0 :         drm_dp_payload_send_msg(mgr, payload->port, payload->vcpi, 0);
    3287           0 :         drm_dp_dpcd_write_payload(mgr, payload->vcpi, payload->vc_start_slot, 0);
    3288             : 
    3289           0 :         return 0;
    3290             : }
    3291             : 
    3292             : /**
    3293             :  * drm_dp_add_payload_part1() - Execute payload update part 1
    3294             :  * @mgr: Manager to use.
    3295             :  * @mst_state: The MST atomic state
    3296             :  * @payload: The payload to write
    3297             :  *
    3298             :  * Determines the starting time slot for the given payload, and programs the VCPI for this payload
    3299             :  * into hardware. After calling this, the driver should generate ACT and payload packets.
    3300             :  *
    3301             :  * Returns: 0 on success, error code on failure. In the event that this fails,
    3302             :  * @payload.vc_start_slot will also be set to -1.
    3303             :  */
    3304           0 : int drm_dp_add_payload_part1(struct drm_dp_mst_topology_mgr *mgr,
    3305             :                              struct drm_dp_mst_topology_state *mst_state,
    3306             :                              struct drm_dp_mst_atomic_payload *payload)
    3307             : {
    3308             :         struct drm_dp_mst_port *port;
    3309             :         int ret;
    3310             : 
    3311           0 :         port = drm_dp_mst_topology_get_port_validated(mgr, payload->port);
    3312           0 :         if (!port) {
    3313           0 :                 drm_dbg_kms(mgr->dev,
    3314             :                             "VCPI %d for port %p not in topology, not creating a payload\n",
    3315             :                             payload->vcpi, payload->port);
    3316           0 :                 payload->vc_start_slot = -1;
    3317           0 :                 return 0;
    3318             :         }
    3319             : 
    3320           0 :         if (mgr->payload_count == 0)
    3321           0 :                 mgr->next_start_slot = mst_state->start_slot;
    3322             : 
    3323           0 :         payload->vc_start_slot = mgr->next_start_slot;
    3324             : 
    3325           0 :         ret = drm_dp_create_payload_step1(mgr, payload);
    3326           0 :         drm_dp_mst_topology_put_port(port);
    3327           0 :         if (ret < 0) {
    3328           0 :                 drm_warn(mgr->dev, "Failed to create MST payload for port %p: %d\n",
    3329             :                          payload->port, ret);
    3330           0 :                 payload->vc_start_slot = -1;
    3331           0 :                 return ret;
    3332             :         }
    3333             : 
    3334           0 :         mgr->payload_count++;
    3335           0 :         mgr->next_start_slot += payload->time_slots;
    3336             : 
    3337           0 :         return 0;
    3338             : }
    3339             : EXPORT_SYMBOL(drm_dp_add_payload_part1);
    3340             : 
    3341             : /**
    3342             :  * drm_dp_remove_payload() - Remove an MST payload
    3343             :  * @mgr: Manager to use.
    3344             :  * @mst_state: The MST atomic state
    3345             :  * @old_payload: The payload with its old state
    3346             :  * @new_payload: The payload to write
    3347             :  *
    3348             :  * Removes a payload from an MST topology if it was successfully assigned a start slot. Also updates
    3349             :  * the starting time slots of all other payloads which would have been shifted towards the start of
    3350             :  * the VC table as a result. After calling this, the driver should generate ACT and payload packets.
    3351             :  */
    3352           0 : void drm_dp_remove_payload(struct drm_dp_mst_topology_mgr *mgr,
    3353             :                            struct drm_dp_mst_topology_state *mst_state,
    3354             :                            const struct drm_dp_mst_atomic_payload *old_payload,
    3355             :                            struct drm_dp_mst_atomic_payload *new_payload)
    3356             : {
    3357             :         struct drm_dp_mst_atomic_payload *pos;
    3358           0 :         bool send_remove = false;
    3359             : 
    3360             :         /* We failed to make the payload, so nothing to do */
    3361           0 :         if (new_payload->vc_start_slot == -1)
    3362             :                 return;
    3363             : 
    3364           0 :         mutex_lock(&mgr->lock);
    3365           0 :         send_remove = drm_dp_mst_port_downstream_of_branch(new_payload->port, mgr->mst_primary);
    3366           0 :         mutex_unlock(&mgr->lock);
    3367             : 
    3368           0 :         if (send_remove)
    3369           0 :                 drm_dp_destroy_payload_step1(mgr, mst_state, new_payload);
    3370             :         else
    3371           0 :                 drm_dbg_kms(mgr->dev, "Payload for VCPI %d not in topology, not sending remove\n",
    3372             :                             new_payload->vcpi);
    3373             : 
    3374           0 :         list_for_each_entry(pos, &mst_state->payloads, next) {
    3375           0 :                 if (pos != new_payload && pos->vc_start_slot > new_payload->vc_start_slot)
    3376           0 :                         pos->vc_start_slot -= old_payload->time_slots;
    3377             :         }
    3378           0 :         new_payload->vc_start_slot = -1;
    3379             : 
    3380           0 :         mgr->payload_count--;
    3381           0 :         mgr->next_start_slot -= old_payload->time_slots;
    3382             : 
    3383           0 :         if (new_payload->delete)
    3384           0 :                 drm_dp_mst_put_port_malloc(new_payload->port);
    3385             : }
    3386             : EXPORT_SYMBOL(drm_dp_remove_payload);
    3387             : 
    3388             : /**
    3389             :  * drm_dp_add_payload_part2() - Execute payload update part 2
    3390             :  * @mgr: Manager to use.
    3391             :  * @state: The global atomic state
    3392             :  * @payload: The payload to update
    3393             :  *
    3394             :  * If @payload was successfully assigned a starting time slot by drm_dp_add_payload_part1(), this
    3395             :  * function will send the sideband messages to finish allocating this payload.
    3396             :  *
    3397             :  * Returns: 0 on success, negative error code on failure.
    3398             :  */
    3399           0 : int drm_dp_add_payload_part2(struct drm_dp_mst_topology_mgr *mgr,
    3400             :                              struct drm_atomic_state *state,
    3401             :                              struct drm_dp_mst_atomic_payload *payload)
    3402             : {
    3403           0 :         int ret = 0;
    3404             : 
    3405             :         /* Skip failed payloads */
    3406           0 :         if (payload->vc_start_slot == -1) {
    3407           0 :                 drm_dbg_kms(state->dev, "Part 1 of payload creation for %s failed, skipping part 2\n",
    3408             :                             payload->port->connector->name);
    3409           0 :                 return -EIO;
    3410             :         }
    3411             : 
    3412           0 :         ret = drm_dp_create_payload_step2(mgr, payload);
    3413           0 :         if (ret < 0) {
    3414           0 :                 if (!payload->delete)
    3415           0 :                         drm_err(mgr->dev, "Step 2 of creating MST payload for %p failed: %d\n",
    3416             :                                 payload->port, ret);
    3417             :                 else
    3418           0 :                         drm_dbg_kms(mgr->dev, "Step 2 of removing MST payload for %p failed: %d\n",
    3419             :                                     payload->port, ret);
    3420             :         }
    3421             : 
    3422             :         return ret;
    3423             : }
    3424             : EXPORT_SYMBOL(drm_dp_add_payload_part2);
    3425             : 
    3426           0 : static int drm_dp_send_dpcd_read(struct drm_dp_mst_topology_mgr *mgr,
    3427             :                                  struct drm_dp_mst_port *port,
    3428             :                                  int offset, int size, u8 *bytes)
    3429             : {
    3430           0 :         int ret = 0;
    3431             :         struct drm_dp_sideband_msg_tx *txmsg;
    3432             :         struct drm_dp_mst_branch *mstb;
    3433             : 
    3434           0 :         mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent);
    3435           0 :         if (!mstb)
    3436             :                 return -EINVAL;
    3437             : 
    3438           0 :         txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
    3439           0 :         if (!txmsg) {
    3440             :                 ret = -ENOMEM;
    3441             :                 goto fail_put;
    3442             :         }
    3443             : 
    3444           0 :         build_dpcd_read(txmsg, port->port_num, offset, size);
    3445           0 :         txmsg->dst = port->parent;
    3446             : 
    3447           0 :         drm_dp_queue_down_tx(mgr, txmsg);
    3448             : 
    3449           0 :         ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
    3450           0 :         if (ret < 0)
    3451             :                 goto fail_free;
    3452             : 
    3453           0 :         if (txmsg->reply.reply_type == 1) {
    3454           0 :                 drm_dbg_kms(mgr->dev, "mstb %p port %d: DPCD read on addr 0x%x for %d bytes NAKed\n",
    3455             :                             mstb, port->port_num, offset, size);
    3456           0 :                 ret = -EIO;
    3457             :                 goto fail_free;
    3458             :         }
    3459             : 
    3460           0 :         if (txmsg->reply.u.remote_dpcd_read_ack.num_bytes != size) {
    3461             :                 ret = -EPROTO;
    3462             :                 goto fail_free;
    3463             :         }
    3464             : 
    3465           0 :         ret = min_t(size_t, txmsg->reply.u.remote_dpcd_read_ack.num_bytes,
    3466             :                     size);
    3467           0 :         memcpy(bytes, txmsg->reply.u.remote_dpcd_read_ack.bytes, ret);
    3468             : 
    3469             : fail_free:
    3470           0 :         kfree(txmsg);
    3471             : fail_put:
    3472           0 :         drm_dp_mst_topology_put_mstb(mstb);
    3473             : 
    3474             :         return ret;
    3475             : }
    3476             : 
    3477           0 : static int drm_dp_send_dpcd_write(struct drm_dp_mst_topology_mgr *mgr,
    3478             :                                   struct drm_dp_mst_port *port,
    3479             :                                   int offset, int size, u8 *bytes)
    3480             : {
    3481             :         int ret;
    3482             :         struct drm_dp_sideband_msg_tx *txmsg;
    3483             :         struct drm_dp_mst_branch *mstb;
    3484             : 
    3485           0 :         mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent);
    3486           0 :         if (!mstb)
    3487             :                 return -EINVAL;
    3488             : 
    3489           0 :         txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
    3490           0 :         if (!txmsg) {
    3491             :                 ret = -ENOMEM;
    3492             :                 goto fail_put;
    3493             :         }
    3494             : 
    3495           0 :         build_dpcd_write(txmsg, port->port_num, offset, size, bytes);
    3496           0 :         txmsg->dst = mstb;
    3497             : 
    3498           0 :         drm_dp_queue_down_tx(mgr, txmsg);
    3499             : 
    3500           0 :         ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
    3501           0 :         if (ret > 0) {
    3502           0 :                 if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK)
    3503             :                         ret = -EIO;
    3504             :                 else
    3505           0 :                         ret = size;
    3506             :         }
    3507             : 
    3508           0 :         kfree(txmsg);
    3509             : fail_put:
    3510           0 :         drm_dp_mst_topology_put_mstb(mstb);
    3511             :         return ret;
    3512             : }
    3513             : 
    3514             : static int drm_dp_encode_up_ack_reply(struct drm_dp_sideband_msg_tx *msg, u8 req_type)
    3515             : {
    3516             :         struct drm_dp_sideband_msg_reply_body reply;
    3517             : 
    3518           0 :         reply.reply_type = DP_SIDEBAND_REPLY_ACK;
    3519           0 :         reply.req_type = req_type;
    3520           0 :         drm_dp_encode_sideband_reply(&reply, msg);
    3521             :         return 0;
    3522             : }
    3523             : 
    3524           0 : static int drm_dp_send_up_ack_reply(struct drm_dp_mst_topology_mgr *mgr,
    3525             :                                     struct drm_dp_mst_branch *mstb,
    3526             :                                     int req_type, bool broadcast)
    3527             : {
    3528             :         struct drm_dp_sideband_msg_tx *txmsg;
    3529             : 
    3530           0 :         txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
    3531           0 :         if (!txmsg)
    3532             :                 return -ENOMEM;
    3533             : 
    3534           0 :         txmsg->dst = mstb;
    3535           0 :         drm_dp_encode_up_ack_reply(txmsg, req_type);
    3536             : 
    3537           0 :         mutex_lock(&mgr->qlock);
    3538             :         /* construct a chunk from the first msg in the tx_msg queue */
    3539           0 :         process_single_tx_qlock(mgr, txmsg, true);
    3540           0 :         mutex_unlock(&mgr->qlock);
    3541             : 
    3542           0 :         kfree(txmsg);
    3543           0 :         return 0;
    3544             : }
    3545             : 
    3546             : /**
    3547             :  * drm_dp_get_vc_payload_bw - get the VC payload BW for an MST link
    3548             :  * @mgr: The &drm_dp_mst_topology_mgr to use
    3549             :  * @link_rate: link rate in 10kbits/s units
    3550             :  * @link_lane_count: lane count
    3551             :  *
    3552             :  * Calculate the total bandwidth of a MultiStream Transport link. The returned
    3553             :  * value is in units of PBNs/(timeslots/1 MTP). This value can be used to
    3554             :  * convert the number of PBNs required for a given stream to the number of
    3555             :  * timeslots this stream requires in each MTP.
    3556             :  */
    3557           0 : int drm_dp_get_vc_payload_bw(const struct drm_dp_mst_topology_mgr *mgr,
    3558             :                              int link_rate, int link_lane_count)
    3559             : {
    3560           0 :         if (link_rate == 0 || link_lane_count == 0)
    3561           0 :                 drm_dbg_kms(mgr->dev, "invalid link rate/lane count: (%d / %d)\n",
    3562             :                             link_rate, link_lane_count);
    3563             : 
    3564             :         /* See DP v2.0 2.6.4.2, VCPayload_Bandwidth_for_OneTimeSlotPer_MTP_Allocation */
    3565           0 :         return link_rate * link_lane_count / 54000;
    3566             : }
    3567             : EXPORT_SYMBOL(drm_dp_get_vc_payload_bw);
    3568             : 
    3569             : /**
    3570             :  * drm_dp_read_mst_cap() - check whether or not a sink supports MST
    3571             :  * @aux: The DP AUX channel to use
    3572             :  * @dpcd: A cached copy of the DPCD capabilities for this sink
    3573             :  *
    3574             :  * Returns: %True if the sink supports MST, %false otherwise
    3575             :  */
    3576           0 : bool drm_dp_read_mst_cap(struct drm_dp_aux *aux,
    3577             :                          const u8 dpcd[DP_RECEIVER_CAP_SIZE])
    3578             : {
    3579             :         u8 mstm_cap;
    3580             : 
    3581           0 :         if (dpcd[DP_DPCD_REV] < DP_DPCD_REV_12)
    3582             :                 return false;
    3583             : 
    3584           0 :         if (drm_dp_dpcd_readb(aux, DP_MSTM_CAP, &mstm_cap) != 1)
    3585             :                 return false;
    3586             : 
    3587           0 :         return mstm_cap & DP_MST_CAP;
    3588             : }
    3589             : EXPORT_SYMBOL(drm_dp_read_mst_cap);
    3590             : 
    3591             : /**
    3592             :  * drm_dp_mst_topology_mgr_set_mst() - Set the MST state for a topology manager
    3593             :  * @mgr: manager to set state for
    3594             :  * @mst_state: true to enable MST on this connector - false to disable.
    3595             :  *
    3596             :  * This is called by the driver when it detects an MST capable device plugged
    3597             :  * into a DP MST capable port, or when a DP MST capable device is unplugged.
    3598             :  */
    3599           0 : int drm_dp_mst_topology_mgr_set_mst(struct drm_dp_mst_topology_mgr *mgr, bool mst_state)
    3600             : {
    3601           0 :         int ret = 0;
    3602           0 :         struct drm_dp_mst_branch *mstb = NULL;
    3603             : 
    3604           0 :         mutex_lock(&mgr->lock);
    3605           0 :         if (mst_state == mgr->mst_state)
    3606             :                 goto out_unlock;
    3607             : 
    3608           0 :         mgr->mst_state = mst_state;
    3609             :         /* set the device into MST mode */
    3610           0 :         if (mst_state) {
    3611           0 :                 WARN_ON(mgr->mst_primary);
    3612             : 
    3613             :                 /* get dpcd info */
    3614           0 :                 ret = drm_dp_read_dpcd_caps(mgr->aux, mgr->dpcd);
    3615           0 :                 if (ret < 0) {
    3616           0 :                         drm_dbg_kms(mgr->dev, "%s: failed to read DPCD, ret %d\n",
    3617             :                                     mgr->aux->name, ret);
    3618           0 :                         goto out_unlock;
    3619             :                 }
    3620             : 
    3621             :                 /* add initial branch device at LCT 1 */
    3622           0 :                 mstb = drm_dp_add_mst_branch_device(1, NULL);
    3623           0 :                 if (mstb == NULL) {
    3624             :                         ret = -ENOMEM;
    3625             :                         goto out_unlock;
    3626             :                 }
    3627           0 :                 mstb->mgr = mgr;
    3628             : 
    3629             :                 /* give this the main reference */
    3630           0 :                 mgr->mst_primary = mstb;
    3631           0 :                 drm_dp_mst_topology_get_mstb(mgr->mst_primary);
    3632             : 
    3633           0 :                 ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
    3634             :                                          DP_MST_EN |
    3635             :                                          DP_UP_REQ_EN |
    3636             :                                          DP_UPSTREAM_IS_SRC);
    3637           0 :                 if (ret < 0)
    3638             :                         goto out_unlock;
    3639             : 
    3640             :                 /* Write reset payload */
    3641           0 :                 drm_dp_dpcd_write_payload(mgr, 0, 0, 0x3f);
    3642             : 
    3643           0 :                 queue_work(system_long_wq, &mgr->work);
    3644             : 
    3645           0 :                 ret = 0;
    3646             :         } else {
    3647             :                 /* disable MST on the device */
    3648           0 :                 mstb = mgr->mst_primary;
    3649           0 :                 mgr->mst_primary = NULL;
    3650             :                 /* this can fail if the device is gone */
    3651           0 :                 drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL, 0);
    3652           0 :                 ret = 0;
    3653           0 :                 mgr->payload_id_table_cleared = false;
    3654             : 
    3655           0 :                 memset(&mgr->down_rep_recv, 0, sizeof(mgr->down_rep_recv));
    3656           0 :                 memset(&mgr->up_req_recv, 0, sizeof(mgr->up_req_recv));
    3657             :         }
    3658             : 
    3659             : out_unlock:
    3660           0 :         mutex_unlock(&mgr->lock);
    3661           0 :         if (mstb)
    3662           0 :                 drm_dp_mst_topology_put_mstb(mstb);
    3663           0 :         return ret;
    3664             : 
    3665             : }
    3666             : EXPORT_SYMBOL(drm_dp_mst_topology_mgr_set_mst);
    3667             : 
    3668             : static void
    3669           0 : drm_dp_mst_topology_mgr_invalidate_mstb(struct drm_dp_mst_branch *mstb)
    3670             : {
    3671             :         struct drm_dp_mst_port *port;
    3672             : 
    3673             :         /* The link address will need to be re-sent on resume */
    3674           0 :         mstb->link_address_sent = false;
    3675             : 
    3676           0 :         list_for_each_entry(port, &mstb->ports, next)
    3677           0 :                 if (port->mstb)
    3678           0 :                         drm_dp_mst_topology_mgr_invalidate_mstb(port->mstb);
    3679           0 : }
    3680             : 
    3681             : /**
    3682             :  * drm_dp_mst_topology_mgr_suspend() - suspend the MST manager
    3683             :  * @mgr: manager to suspend
    3684             :  *
    3685             :  * This function tells the MST device that we can't handle UP messages
    3686             :  * anymore. This should stop it from sending any since we are suspended.
    3687             :  */
    3688           0 : void drm_dp_mst_topology_mgr_suspend(struct drm_dp_mst_topology_mgr *mgr)
    3689             : {
    3690           0 :         mutex_lock(&mgr->lock);
    3691           0 :         drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
    3692             :                            DP_MST_EN | DP_UPSTREAM_IS_SRC);
    3693           0 :         mutex_unlock(&mgr->lock);
    3694           0 :         flush_work(&mgr->up_req_work);
    3695           0 :         flush_work(&mgr->work);
    3696           0 :         flush_work(&mgr->delayed_destroy_work);
    3697             : 
    3698           0 :         mutex_lock(&mgr->lock);
    3699           0 :         if (mgr->mst_state && mgr->mst_primary)
    3700           0 :                 drm_dp_mst_topology_mgr_invalidate_mstb(mgr->mst_primary);
    3701           0 :         mutex_unlock(&mgr->lock);
    3702           0 : }
    3703             : EXPORT_SYMBOL(drm_dp_mst_topology_mgr_suspend);
    3704             : 
    3705             : /**
    3706             :  * drm_dp_mst_topology_mgr_resume() - resume the MST manager
    3707             :  * @mgr: manager to resume
    3708             :  * @sync: whether or not to perform topology reprobing synchronously
    3709             :  *
    3710             :  * This will fetch DPCD and see if the device is still there,
    3711             :  * if it is, it will rewrite the MSTM control bits, and return.
    3712             :  *
    3713             :  * If the device fails this returns -1, and the driver should do
    3714             :  * a full MST reprobe, in case we were undocked.
    3715             :  *
    3716             :  * During system resume (where it is assumed that the driver will be calling
    3717             :  * drm_atomic_helper_resume()) this function should be called beforehand with
    3718             :  * @sync set to true. In contexts like runtime resume where the driver is not
    3719             :  * expected to be calling drm_atomic_helper_resume(), this function should be
    3720             :  * called with @sync set to false in order to avoid deadlocking.
    3721             :  *
    3722             :  * Returns: -1 if the MST topology was removed while we were suspended, 0
    3723             :  * otherwise.
    3724             :  */
    3725           0 : int drm_dp_mst_topology_mgr_resume(struct drm_dp_mst_topology_mgr *mgr,
    3726             :                                    bool sync)
    3727             : {
    3728             :         int ret;
    3729             :         u8 guid[16];
    3730             : 
    3731           0 :         mutex_lock(&mgr->lock);
    3732           0 :         if (!mgr->mst_primary)
    3733             :                 goto out_fail;
    3734             : 
    3735           0 :         if (drm_dp_read_dpcd_caps(mgr->aux, mgr->dpcd) < 0) {
    3736           0 :                 drm_dbg_kms(mgr->dev, "dpcd read failed - undocked during suspend?\n");
    3737           0 :                 goto out_fail;
    3738             :         }
    3739             : 
    3740           0 :         ret = drm_dp_dpcd_writeb(mgr->aux, DP_MSTM_CTRL,
    3741             :                                  DP_MST_EN |
    3742             :                                  DP_UP_REQ_EN |
    3743             :                                  DP_UPSTREAM_IS_SRC);
    3744           0 :         if (ret < 0) {
    3745           0 :                 drm_dbg_kms(mgr->dev, "mst write failed - undocked during suspend?\n");
    3746           0 :                 goto out_fail;
    3747             :         }
    3748             : 
    3749             :         /* Some hubs forget their guids after they resume */
    3750           0 :         ret = drm_dp_dpcd_read(mgr->aux, DP_GUID, guid, 16);
    3751           0 :         if (ret != 16) {
    3752           0 :                 drm_dbg_kms(mgr->dev, "dpcd read failed - undocked during suspend?\n");
    3753           0 :                 goto out_fail;
    3754             :         }
    3755             : 
    3756           0 :         ret = drm_dp_check_mstb_guid(mgr->mst_primary, guid);
    3757           0 :         if (ret) {
    3758           0 :                 drm_dbg_kms(mgr->dev, "check mstb failed - undocked during suspend?\n");
    3759           0 :                 goto out_fail;
    3760             :         }
    3761             : 
    3762             :         /*
    3763             :          * For the final step of resuming the topology, we need to bring the
    3764             :          * state of our in-memory topology back into sync with reality. So,
    3765             :          * restart the probing process as if we're probing a new hub
    3766             :          */
    3767           0 :         queue_work(system_long_wq, &mgr->work);
    3768           0 :         mutex_unlock(&mgr->lock);
    3769             : 
    3770           0 :         if (sync) {
    3771           0 :                 drm_dbg_kms(mgr->dev,
    3772             :                             "Waiting for link probe work to finish re-syncing topology...\n");
    3773           0 :                 flush_work(&mgr->work);
    3774             :         }
    3775             : 
    3776             :         return 0;
    3777             : 
    3778             : out_fail:
    3779           0 :         mutex_unlock(&mgr->lock);
    3780           0 :         return -1;
    3781             : }
    3782             : EXPORT_SYMBOL(drm_dp_mst_topology_mgr_resume);
    3783             : 
    3784             : static bool
    3785           0 : drm_dp_get_one_sb_msg(struct drm_dp_mst_topology_mgr *mgr, bool up,
    3786             :                       struct drm_dp_mst_branch **mstb)
    3787             : {
    3788             :         int len;
    3789             :         u8 replyblock[32];
    3790             :         int replylen, curreply;
    3791             :         int ret;
    3792             :         u8 hdrlen;
    3793             :         struct drm_dp_sideband_msg_hdr hdr;
    3794           0 :         struct drm_dp_sideband_msg_rx *msg =
    3795           0 :                 up ? &mgr->up_req_recv : &mgr->down_rep_recv;
    3796           0 :         int basereg = up ? DP_SIDEBAND_MSG_UP_REQ_BASE :
    3797             :                            DP_SIDEBAND_MSG_DOWN_REP_BASE;
    3798             : 
    3799           0 :         if (!up)
    3800           0 :                 *mstb = NULL;
    3801             : 
    3802           0 :         len = min(mgr->max_dpcd_transaction_bytes, 16);
    3803           0 :         ret = drm_dp_dpcd_read(mgr->aux, basereg, replyblock, len);
    3804           0 :         if (ret != len) {
    3805           0 :                 drm_dbg_kms(mgr->dev, "failed to read DPCD down rep %d %d\n", len, ret);
    3806           0 :                 return false;
    3807             :         }
    3808             : 
    3809           0 :         ret = drm_dp_decode_sideband_msg_hdr(mgr, &hdr, replyblock, len, &hdrlen);
    3810           0 :         if (ret == false) {
    3811           0 :                 print_hex_dump(KERN_DEBUG, "failed hdr", DUMP_PREFIX_NONE, 16,
    3812             :                                1, replyblock, len, false);
    3813           0 :                 drm_dbg_kms(mgr->dev, "ERROR: failed header\n");
    3814           0 :                 return false;
    3815             :         }
    3816             : 
    3817           0 :         if (!up) {
    3818             :                 /* Caller is responsible for giving back this reference */
    3819           0 :                 *mstb = drm_dp_get_mst_branch_device(mgr, hdr.lct, hdr.rad);
    3820           0 :                 if (!*mstb) {
    3821           0 :                         drm_dbg_kms(mgr->dev, "Got MST reply from unknown device %d\n", hdr.lct);
    3822           0 :                         return false;
    3823             :                 }
    3824             :         }
    3825             : 
    3826           0 :         if (!drm_dp_sideband_msg_set_header(msg, &hdr, hdrlen)) {
    3827           0 :                 drm_dbg_kms(mgr->dev, "sideband msg set header failed %d\n", replyblock[0]);
    3828           0 :                 return false;
    3829             :         }
    3830             : 
    3831           0 :         replylen = min(msg->curchunk_len, (u8)(len - hdrlen));
    3832           0 :         ret = drm_dp_sideband_append_payload(msg, replyblock + hdrlen, replylen);
    3833           0 :         if (!ret) {
    3834           0 :                 drm_dbg_kms(mgr->dev, "sideband msg build failed %d\n", replyblock[0]);
    3835           0 :                 return false;
    3836             :         }
    3837             : 
    3838           0 :         replylen = msg->curchunk_len + msg->curchunk_hdrlen - len;
    3839           0 :         curreply = len;
    3840           0 :         while (replylen > 0) {
    3841           0 :                 len = min3(replylen, mgr->max_dpcd_transaction_bytes, 16);
    3842           0 :                 ret = drm_dp_dpcd_read(mgr->aux, basereg + curreply,
    3843             :                                     replyblock, len);
    3844           0 :                 if (ret != len) {
    3845           0 :                         drm_dbg_kms(mgr->dev, "failed to read a chunk (len %d, ret %d)\n",
    3846             :                                     len, ret);
    3847           0 :                         return false;
    3848             :                 }
    3849             : 
    3850           0 :                 ret = drm_dp_sideband_append_payload(msg, replyblock, len);
    3851           0 :                 if (!ret) {
    3852           0 :                         drm_dbg_kms(mgr->dev, "failed to build sideband msg\n");
    3853           0 :                         return false;
    3854             :                 }
    3855             : 
    3856           0 :                 curreply += len;
    3857           0 :                 replylen -= len;
    3858             :         }
    3859             :         return true;
    3860             : }
    3861             : 
    3862           0 : static int drm_dp_mst_handle_down_rep(struct drm_dp_mst_topology_mgr *mgr)
    3863             : {
    3864             :         struct drm_dp_sideband_msg_tx *txmsg;
    3865           0 :         struct drm_dp_mst_branch *mstb = NULL;
    3866           0 :         struct drm_dp_sideband_msg_rx *msg = &mgr->down_rep_recv;
    3867             : 
    3868           0 :         if (!drm_dp_get_one_sb_msg(mgr, false, &mstb))
    3869             :                 goto out_clear_reply;
    3870             : 
    3871             :         /* Multi-packet message transmission, don't clear the reply */
    3872           0 :         if (!msg->have_eomt)
    3873             :                 goto out;
    3874             : 
    3875             :         /* find the message */
    3876           0 :         mutex_lock(&mgr->qlock);
    3877           0 :         txmsg = list_first_entry_or_null(&mgr->tx_msg_downq,
    3878             :                                          struct drm_dp_sideband_msg_tx, next);
    3879           0 :         mutex_unlock(&mgr->qlock);
    3880             : 
    3881             :         /* Were we actually expecting a response, and from this mstb? */
    3882           0 :         if (!txmsg || txmsg->dst != mstb) {
    3883             :                 struct drm_dp_sideband_msg_hdr *hdr;
    3884             : 
    3885           0 :                 hdr = &msg->initial_hdr;
    3886           0 :                 drm_dbg_kms(mgr->dev, "Got MST reply with no msg %p %d %d %02x %02x\n",
    3887             :                             mstb, hdr->seqno, hdr->lct, hdr->rad[0], msg->msg[0]);
    3888           0 :                 goto out_clear_reply;
    3889             :         }
    3890             : 
    3891           0 :         drm_dp_sideband_parse_reply(mgr, msg, &txmsg->reply);
    3892             : 
    3893           0 :         if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) {
    3894           0 :                 drm_dbg_kms(mgr->dev,
    3895             :                             "Got NAK reply: req 0x%02x (%s), reason 0x%02x (%s), nak data 0x%02x\n",
    3896             :                             txmsg->reply.req_type,
    3897             :                             drm_dp_mst_req_type_str(txmsg->reply.req_type),
    3898             :                             txmsg->reply.u.nak.reason,
    3899             :                             drm_dp_mst_nak_reason_str(txmsg->reply.u.nak.reason),
    3900             :                             txmsg->reply.u.nak.nak_data);
    3901             :         }
    3902             : 
    3903           0 :         memset(msg, 0, sizeof(struct drm_dp_sideband_msg_rx));
    3904           0 :         drm_dp_mst_topology_put_mstb(mstb);
    3905             : 
    3906           0 :         mutex_lock(&mgr->qlock);
    3907           0 :         txmsg->state = DRM_DP_SIDEBAND_TX_RX;
    3908           0 :         list_del(&txmsg->next);
    3909           0 :         mutex_unlock(&mgr->qlock);
    3910             : 
    3911           0 :         wake_up_all(&mgr->tx_waitq);
    3912             : 
    3913           0 :         return 0;
    3914             : 
    3915             : out_clear_reply:
    3916           0 :         memset(msg, 0, sizeof(struct drm_dp_sideband_msg_rx));
    3917             : out:
    3918           0 :         if (mstb)
    3919           0 :                 drm_dp_mst_topology_put_mstb(mstb);
    3920             : 
    3921             :         return 0;
    3922             : }
    3923             : 
    3924             : static inline bool
    3925           0 : drm_dp_mst_process_up_req(struct drm_dp_mst_topology_mgr *mgr,
    3926             :                           struct drm_dp_pending_up_req *up_req)
    3927             : {
    3928           0 :         struct drm_dp_mst_branch *mstb = NULL;
    3929           0 :         struct drm_dp_sideband_msg_req_body *msg = &up_req->msg;
    3930           0 :         struct drm_dp_sideband_msg_hdr *hdr = &up_req->hdr;
    3931           0 :         bool hotplug = false, dowork = false;
    3932             : 
    3933           0 :         if (hdr->broadcast) {
    3934           0 :                 const u8 *guid = NULL;
    3935             : 
    3936           0 :                 if (msg->req_type == DP_CONNECTION_STATUS_NOTIFY)
    3937           0 :                         guid = msg->u.conn_stat.guid;
    3938           0 :                 else if (msg->req_type == DP_RESOURCE_STATUS_NOTIFY)
    3939           0 :                         guid = msg->u.resource_stat.guid;
    3940             : 
    3941           0 :                 if (guid)
    3942           0 :                         mstb = drm_dp_get_mst_branch_device_by_guid(mgr, guid);
    3943             :         } else {
    3944           0 :                 mstb = drm_dp_get_mst_branch_device(mgr, hdr->lct, hdr->rad);
    3945             :         }
    3946             : 
    3947           0 :         if (!mstb) {
    3948           0 :                 drm_dbg_kms(mgr->dev, "Got MST reply from unknown device %d\n", hdr->lct);
    3949           0 :                 return false;
    3950             :         }
    3951             : 
    3952             :         /* TODO: Add missing handler for DP_RESOURCE_STATUS_NOTIFY events */
    3953           0 :         if (msg->req_type == DP_CONNECTION_STATUS_NOTIFY) {
    3954           0 :                 dowork = drm_dp_mst_handle_conn_stat(mstb, &msg->u.conn_stat);
    3955           0 :                 hotplug = true;
    3956             :         }
    3957             : 
    3958           0 :         drm_dp_mst_topology_put_mstb(mstb);
    3959             : 
    3960           0 :         if (dowork)
    3961           0 :                 queue_work(system_long_wq, &mgr->work);
    3962             :         return hotplug;
    3963             : }
    3964             : 
    3965           0 : static void drm_dp_mst_up_req_work(struct work_struct *work)
    3966             : {
    3967           0 :         struct drm_dp_mst_topology_mgr *mgr =
    3968           0 :                 container_of(work, struct drm_dp_mst_topology_mgr,
    3969             :                              up_req_work);
    3970             :         struct drm_dp_pending_up_req *up_req;
    3971           0 :         bool send_hotplug = false;
    3972             : 
    3973           0 :         mutex_lock(&mgr->probe_lock);
    3974             :         while (true) {
    3975           0 :                 mutex_lock(&mgr->up_req_lock);
    3976           0 :                 up_req = list_first_entry_or_null(&mgr->up_req_list,
    3977             :                                                   struct drm_dp_pending_up_req,
    3978             :                                                   next);
    3979           0 :                 if (up_req)
    3980           0 :                         list_del(&up_req->next);
    3981           0 :                 mutex_unlock(&mgr->up_req_lock);
    3982             : 
    3983           0 :                 if (!up_req)
    3984             :                         break;
    3985             : 
    3986           0 :                 send_hotplug |= drm_dp_mst_process_up_req(mgr, up_req);
    3987           0 :                 kfree(up_req);
    3988             :         }
    3989           0 :         mutex_unlock(&mgr->probe_lock);
    3990             : 
    3991           0 :         if (send_hotplug)
    3992           0 :                 drm_kms_helper_hotplug_event(mgr->dev);
    3993           0 : }
    3994             : 
    3995           0 : static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr)
    3996             : {
    3997             :         struct drm_dp_pending_up_req *up_req;
    3998             : 
    3999           0 :         if (!drm_dp_get_one_sb_msg(mgr, true, NULL))
    4000             :                 goto out;
    4001             : 
    4002           0 :         if (!mgr->up_req_recv.have_eomt)
    4003             :                 return 0;
    4004             : 
    4005           0 :         up_req = kzalloc(sizeof(*up_req), GFP_KERNEL);
    4006           0 :         if (!up_req)
    4007             :                 return -ENOMEM;
    4008             : 
    4009           0 :         INIT_LIST_HEAD(&up_req->next);
    4010             : 
    4011           0 :         drm_dp_sideband_parse_req(mgr, &mgr->up_req_recv, &up_req->msg);
    4012             : 
    4013           0 :         if (up_req->msg.req_type != DP_CONNECTION_STATUS_NOTIFY &&
    4014             :             up_req->msg.req_type != DP_RESOURCE_STATUS_NOTIFY) {
    4015           0 :                 drm_dbg_kms(mgr->dev, "Received unknown up req type, ignoring: %x\n",
    4016             :                             up_req->msg.req_type);
    4017           0 :                 kfree(up_req);
    4018           0 :                 goto out;
    4019             :         }
    4020             : 
    4021           0 :         drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, up_req->msg.req_type,
    4022             :                                  false);
    4023             : 
    4024           0 :         if (up_req->msg.req_type == DP_CONNECTION_STATUS_NOTIFY) {
    4025           0 :                 const struct drm_dp_connection_status_notify *conn_stat =
    4026             :                         &up_req->msg.u.conn_stat;
    4027             : 
    4028           0 :                 drm_dbg_kms(mgr->dev, "Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n",
    4029             :                             conn_stat->port_number,
    4030             :                             conn_stat->legacy_device_plug_status,
    4031             :                             conn_stat->displayport_device_plug_status,
    4032             :                             conn_stat->message_capability_status,
    4033             :                             conn_stat->input_port,
    4034             :                             conn_stat->peer_device_type);
    4035           0 :         } else if (up_req->msg.req_type == DP_RESOURCE_STATUS_NOTIFY) {
    4036           0 :                 const struct drm_dp_resource_status_notify *res_stat =
    4037             :                         &up_req->msg.u.resource_stat;
    4038             : 
    4039           0 :                 drm_dbg_kms(mgr->dev, "Got RSN: pn: %d avail_pbn %d\n",
    4040             :                             res_stat->port_number,
    4041             :                             res_stat->available_pbn);
    4042             :         }
    4043             : 
    4044           0 :         up_req->hdr = mgr->up_req_recv.initial_hdr;
    4045           0 :         mutex_lock(&mgr->up_req_lock);
    4046           0 :         list_add_tail(&up_req->next, &mgr->up_req_list);
    4047           0 :         mutex_unlock(&mgr->up_req_lock);
    4048           0 :         queue_work(system_long_wq, &mgr->up_req_work);
    4049             : 
    4050             : out:
    4051           0 :         memset(&mgr->up_req_recv, 0, sizeof(struct drm_dp_sideband_msg_rx));
    4052           0 :         return 0;
    4053             : }
    4054             : 
    4055             : /**
    4056             :  * drm_dp_mst_hpd_irq() - MST hotplug IRQ notify
    4057             :  * @mgr: manager to notify irq for.
    4058             :  * @esi: 4 bytes from SINK_COUNT_ESI
    4059             :  * @handled: whether the hpd interrupt was consumed or not
    4060             :  *
    4061             :  * This should be called from the driver when it detects a short IRQ,
    4062             :  * along with the value of the DEVICE_SERVICE_IRQ_VECTOR_ESI0. The
    4063             :  * topology manager will process the sideband messages received as a result
    4064             :  * of this.
    4065             :  */
    4066           0 : int drm_dp_mst_hpd_irq(struct drm_dp_mst_topology_mgr *mgr, u8 *esi, bool *handled)
    4067             : {
    4068           0 :         int ret = 0;
    4069             :         int sc;
    4070           0 :         *handled = false;
    4071           0 :         sc = DP_GET_SINK_COUNT(esi[0]);
    4072             : 
    4073           0 :         if (sc != mgr->sink_count) {
    4074           0 :                 mgr->sink_count = sc;
    4075           0 :                 *handled = true;
    4076             :         }
    4077             : 
    4078           0 :         if (esi[1] & DP_DOWN_REP_MSG_RDY) {
    4079           0 :                 ret = drm_dp_mst_handle_down_rep(mgr);
    4080           0 :                 *handled = true;
    4081             :         }
    4082             : 
    4083           0 :         if (esi[1] & DP_UP_REQ_MSG_RDY) {
    4084           0 :                 ret |= drm_dp_mst_handle_up_req(mgr);
    4085           0 :                 *handled = true;
    4086             :         }
    4087             : 
    4088           0 :         drm_dp_mst_kick_tx(mgr);
    4089           0 :         return ret;
    4090             : }
    4091             : EXPORT_SYMBOL(drm_dp_mst_hpd_irq);
    4092             : 
    4093             : /**
    4094             :  * drm_dp_mst_detect_port() - get connection status for an MST port
    4095             :  * @connector: DRM connector for this port
    4096             :  * @ctx: The acquisition context to use for grabbing locks
    4097             :  * @mgr: manager for this port
    4098             :  * @port: pointer to a port
    4099             :  *
    4100             :  * This returns the current connection state for a port.
    4101             :  */
    4102             : int
    4103           0 : drm_dp_mst_detect_port(struct drm_connector *connector,
    4104             :                        struct drm_modeset_acquire_ctx *ctx,
    4105             :                        struct drm_dp_mst_topology_mgr *mgr,
    4106             :                        struct drm_dp_mst_port *port)
    4107             : {
    4108             :         int ret;
    4109             : 
    4110             :         /* we need to search for the port in the mgr in case it's gone */
    4111           0 :         port = drm_dp_mst_topology_get_port_validated(mgr, port);
    4112           0 :         if (!port)
    4113             :                 return connector_status_disconnected;
    4114             : 
    4115           0 :         ret = drm_modeset_lock(&mgr->base.lock, ctx);
    4116           0 :         if (ret)
    4117             :                 goto out;
    4118             : 
    4119           0 :         ret = connector_status_disconnected;
    4120             : 
    4121           0 :         if (!port->ddps)
    4122             :                 goto out;
    4123             : 
    4124           0 :         switch (port->pdt) {
    4125             :         case DP_PEER_DEVICE_NONE:
    4126             :                 break;
    4127             :         case DP_PEER_DEVICE_MST_BRANCHING:
    4128           0 :                 if (!port->mcs)
    4129           0 :                         ret = connector_status_connected;
    4130             :                 break;
    4131             : 
    4132             :         case DP_PEER_DEVICE_SST_SINK:
    4133           0 :                 ret = connector_status_connected;
    4134             :                 /* for logical ports - cache the EDID */
    4135           0 :                 if (port->port_num >= DP_MST_LOGICAL_PORT_0 && !port->cached_edid)
    4136           0 :                         port->cached_edid = drm_get_edid(connector, &port->aux.ddc);
    4137             :                 break;
    4138             :         case DP_PEER_DEVICE_DP_LEGACY_CONV:
    4139           0 :                 if (port->ldps)
    4140           0 :                         ret = connector_status_connected;
    4141             :                 break;
    4142             :         }
    4143             : out:
    4144           0 :         drm_dp_mst_topology_put_port(port);
    4145           0 :         return ret;
    4146             : }
    4147             : EXPORT_SYMBOL(drm_dp_mst_detect_port);
    4148             : 
    4149             : /**
    4150             :  * drm_dp_mst_get_edid() - get EDID for an MST port
    4151             :  * @connector: toplevel connector to get EDID for
    4152             :  * @mgr: manager for this port
    4153             :  * @port: unverified pointer to a port.
    4154             :  *
    4155             :  * This returns an EDID for the port connected to a connector,
    4156             :  * It validates the pointer still exists so the caller doesn't require a
    4157             :  * reference.
    4158             :  */
    4159           0 : struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_port *port)
    4160             : {
    4161           0 :         struct edid *edid = NULL;
    4162             : 
    4163             :         /* we need to search for the port in the mgr in case it's gone */
    4164           0 :         port = drm_dp_mst_topology_get_port_validated(mgr, port);
    4165           0 :         if (!port)
    4166             :                 return NULL;
    4167             : 
    4168           0 :         if (port->cached_edid)
    4169           0 :                 edid = drm_edid_duplicate(port->cached_edid);
    4170             :         else {
    4171           0 :                 edid = drm_get_edid(connector, &port->aux.ddc);
    4172             :         }
    4173           0 :         port->has_audio = drm_detect_monitor_audio(edid);
    4174           0 :         drm_dp_mst_topology_put_port(port);
    4175           0 :         return edid;
    4176             : }
    4177             : EXPORT_SYMBOL(drm_dp_mst_get_edid);
    4178             : 
    4179             : /**
    4180             :  * drm_dp_atomic_find_time_slots() - Find and add time slots to the state
    4181             :  * @state: global atomic state
    4182             :  * @mgr: MST topology manager for the port
    4183             :  * @port: port to find time slots for
    4184             :  * @pbn: bandwidth required for the mode in PBN
    4185             :  *
    4186             :  * Allocates time slots to @port, replacing any previous time slot allocations it may
    4187             :  * have had. Any atomic drivers which support MST must call this function in
    4188             :  * their &drm_encoder_helper_funcs.atomic_check() callback unconditionally to
    4189             :  * change the current time slot allocation for the new state, and ensure the MST
    4190             :  * atomic state is added whenever the state of payloads in the topology changes.
    4191             :  *
    4192             :  * Allocations set by this function are not checked against the bandwidth
    4193             :  * restraints of @mgr until the driver calls drm_dp_mst_atomic_check().
    4194             :  *
    4195             :  * Additionally, it is OK to call this function multiple times on the same
    4196             :  * @port as needed. It is not OK however, to call this function and
    4197             :  * drm_dp_atomic_release_time_slots() in the same atomic check phase.
    4198             :  *
    4199             :  * See also:
    4200             :  * drm_dp_atomic_release_time_slots()
    4201             :  * drm_dp_mst_atomic_check()
    4202             :  *
    4203             :  * Returns:
    4204             :  * Total slots in the atomic state assigned for this port, or a negative error
    4205             :  * code if the port no longer exists
    4206             :  */
    4207           0 : int drm_dp_atomic_find_time_slots(struct drm_atomic_state *state,
    4208             :                                   struct drm_dp_mst_topology_mgr *mgr,
    4209             :                                   struct drm_dp_mst_port *port, int pbn)
    4210             : {
    4211             :         struct drm_dp_mst_topology_state *topology_state;
    4212           0 :         struct drm_dp_mst_atomic_payload *payload = NULL;
    4213             :         struct drm_connector_state *conn_state;
    4214           0 :         int prev_slots = 0, prev_bw = 0, req_slots;
    4215             : 
    4216           0 :         topology_state = drm_atomic_get_mst_topology_state(state, mgr);
    4217           0 :         if (IS_ERR(topology_state))
    4218           0 :                 return PTR_ERR(topology_state);
    4219             : 
    4220           0 :         conn_state = drm_atomic_get_new_connector_state(state, port->connector);
    4221           0 :         topology_state->pending_crtc_mask |= drm_crtc_mask(conn_state->crtc);
    4222             : 
    4223             :         /* Find the current allocation for this port, if any */
    4224           0 :         payload = drm_atomic_get_mst_payload_state(topology_state, port);
    4225           0 :         if (payload) {
    4226           0 :                 prev_slots = payload->time_slots;
    4227           0 :                 prev_bw = payload->pbn;
    4228             : 
    4229             :                 /*
    4230             :                  * This should never happen, unless the driver tries
    4231             :                  * releasing and allocating the same timeslot allocation,
    4232             :                  * which is an error
    4233             :                  */
    4234           0 :                 if (drm_WARN_ON(mgr->dev, payload->delete)) {
    4235           0 :                         drm_err(mgr->dev,
    4236             :                                 "cannot allocate and release time slots on [MST PORT:%p] in the same state\n",
    4237             :                                 port);
    4238           0 :                         return -EINVAL;
    4239             :                 }
    4240             :         }
    4241             : 
    4242           0 :         req_slots = DIV_ROUND_UP(pbn, topology_state->pbn_div);
    4243             : 
    4244           0 :         drm_dbg_atomic(mgr->dev, "[CONNECTOR:%d:%s] [MST PORT:%p] TU %d -> %d\n",
    4245             :                        port->connector->base.id, port->connector->name,
    4246             :                        port, prev_slots, req_slots);
    4247           0 :         drm_dbg_atomic(mgr->dev, "[CONNECTOR:%d:%s] [MST PORT:%p] PBN %d -> %d\n",
    4248             :                        port->connector->base.id, port->connector->name,
    4249             :                        port, prev_bw, pbn);
    4250             : 
    4251             :         /* Add the new allocation to the state, note the VCPI isn't assigned until the end */
    4252           0 :         if (!payload) {
    4253           0 :                 payload = kzalloc(sizeof(*payload), GFP_KERNEL);
    4254           0 :                 if (!payload)
    4255             :                         return -ENOMEM;
    4256             : 
    4257           0 :                 drm_dp_mst_get_port_malloc(port);
    4258           0 :                 payload->port = port;
    4259           0 :                 payload->vc_start_slot = -1;
    4260           0 :                 list_add(&payload->next, &topology_state->payloads);
    4261             :         }
    4262           0 :         payload->time_slots = req_slots;
    4263           0 :         payload->pbn = pbn;
    4264             : 
    4265           0 :         return req_slots;
    4266             : }
    4267             : EXPORT_SYMBOL(drm_dp_atomic_find_time_slots);
    4268             : 
    4269             : /**
    4270             :  * drm_dp_atomic_release_time_slots() - Release allocated time slots
    4271             :  * @state: global atomic state
    4272             :  * @mgr: MST topology manager for the port
    4273             :  * @port: The port to release the time slots from
    4274             :  *
    4275             :  * Releases any time slots that have been allocated to a port in the atomic
    4276             :  * state. Any atomic drivers which support MST must call this function
    4277             :  * unconditionally in their &drm_connector_helper_funcs.atomic_check() callback.
    4278             :  * This helper will check whether time slots would be released by the new state and
    4279             :  * respond accordingly, along with ensuring the MST state is always added to the
    4280             :  * atomic state whenever a new state would modify the state of payloads on the
    4281             :  * topology.
    4282             :  *
    4283             :  * It is OK to call this even if @port has been removed from the system.
    4284             :  * Additionally, it is OK to call this function multiple times on the same
    4285             :  * @port as needed. It is not OK however, to call this function and
    4286             :  * drm_dp_atomic_find_time_slots() on the same @port in a single atomic check
    4287             :  * phase.
    4288             :  *
    4289             :  * See also:
    4290             :  * drm_dp_atomic_find_time_slots()
    4291             :  * drm_dp_mst_atomic_check()
    4292             :  *
    4293             :  * Returns:
    4294             :  * 0 on success, negative error code otherwise
    4295             :  */
    4296           0 : int drm_dp_atomic_release_time_slots(struct drm_atomic_state *state,
    4297             :                                      struct drm_dp_mst_topology_mgr *mgr,
    4298             :                                      struct drm_dp_mst_port *port)
    4299             : {
    4300             :         struct drm_dp_mst_topology_state *topology_state;
    4301             :         struct drm_dp_mst_atomic_payload *payload;
    4302             :         struct drm_connector_state *old_conn_state, *new_conn_state;
    4303           0 :         bool update_payload = true;
    4304             : 
    4305           0 :         old_conn_state = drm_atomic_get_old_connector_state(state, port->connector);
    4306           0 :         if (!old_conn_state->crtc)
    4307             :                 return 0;
    4308             : 
    4309             :         /* If the CRTC isn't disabled by this state, don't release it's payload */
    4310           0 :         new_conn_state = drm_atomic_get_new_connector_state(state, port->connector);
    4311           0 :         if (new_conn_state->crtc) {
    4312           0 :                 struct drm_crtc_state *crtc_state =
    4313             :                         drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
    4314             : 
    4315             :                 /* No modeset means no payload changes, so it's safe to not pull in the MST state */
    4316           0 :                 if (!crtc_state || !drm_atomic_crtc_needs_modeset(crtc_state))
    4317             :                         return 0;
    4318             : 
    4319           0 :                 if (!crtc_state->mode_changed && !crtc_state->connectors_changed)
    4320           0 :                         update_payload = false;
    4321             :         }
    4322             : 
    4323           0 :         topology_state = drm_atomic_get_mst_topology_state(state, mgr);
    4324           0 :         if (IS_ERR(topology_state))
    4325           0 :                 return PTR_ERR(topology_state);
    4326             : 
    4327           0 :         topology_state->pending_crtc_mask |= drm_crtc_mask(old_conn_state->crtc);
    4328           0 :         if (!update_payload)
    4329             :                 return 0;
    4330             : 
    4331           0 :         payload = drm_atomic_get_mst_payload_state(topology_state, port);
    4332           0 :         if (WARN_ON(!payload)) {
    4333           0 :                 drm_err(mgr->dev, "No payload for [MST PORT:%p] found in mst state %p\n",
    4334             :                         port, &topology_state->base);
    4335           0 :                 return -EINVAL;
    4336             :         }
    4337             : 
    4338           0 :         if (new_conn_state->crtc)
    4339             :                 return 0;
    4340             : 
    4341           0 :         drm_dbg_atomic(mgr->dev, "[MST PORT:%p] TU %d -> 0\n", port, payload->time_slots);
    4342           0 :         if (!payload->delete) {
    4343           0 :                 payload->pbn = 0;
    4344           0 :                 payload->delete = true;
    4345           0 :                 topology_state->payload_mask &= ~BIT(payload->vcpi - 1);
    4346             :         }
    4347             : 
    4348             :         return 0;
    4349             : }
    4350             : EXPORT_SYMBOL(drm_dp_atomic_release_time_slots);
    4351             : 
    4352             : /**
    4353             :  * drm_dp_mst_atomic_setup_commit() - setup_commit hook for MST helpers
    4354             :  * @state: global atomic state
    4355             :  *
    4356             :  * This function saves all of the &drm_crtc_commit structs in an atomic state that touch any CRTCs
    4357             :  * currently assigned to an MST topology. Drivers must call this hook from their
    4358             :  * &drm_mode_config_helper_funcs.atomic_commit_setup hook.
    4359             :  *
    4360             :  * Returns:
    4361             :  * 0 if all CRTC commits were retrieved successfully, negative error code otherwise
    4362             :  */
    4363           0 : int drm_dp_mst_atomic_setup_commit(struct drm_atomic_state *state)
    4364             : {
    4365             :         struct drm_dp_mst_topology_mgr *mgr;
    4366             :         struct drm_dp_mst_topology_state *mst_state;
    4367             :         struct drm_crtc *crtc;
    4368             :         struct drm_crtc_state *crtc_state;
    4369             :         int i, j, commit_idx, num_commit_deps;
    4370             : 
    4371           0 :         for_each_new_mst_mgr_in_state(state, mgr, mst_state, i) {
    4372           0 :                 if (!mst_state->pending_crtc_mask)
    4373           0 :                         continue;
    4374             : 
    4375           0 :                 num_commit_deps = hweight32(mst_state->pending_crtc_mask);
    4376           0 :                 mst_state->commit_deps = kmalloc_array(num_commit_deps,
    4377             :                                                        sizeof(*mst_state->commit_deps), GFP_KERNEL);
    4378           0 :                 if (!mst_state->commit_deps)
    4379             :                         return -ENOMEM;
    4380           0 :                 mst_state->num_commit_deps = num_commit_deps;
    4381             : 
    4382           0 :                 commit_idx = 0;
    4383           0 :                 for_each_new_crtc_in_state(state, crtc, crtc_state, j) {
    4384           0 :                         if (mst_state->pending_crtc_mask & drm_crtc_mask(crtc)) {
    4385           0 :                                 mst_state->commit_deps[commit_idx++] =
    4386           0 :                                         drm_crtc_commit_get(crtc_state->commit);
    4387             :                         }
    4388             :                 }
    4389             :         }
    4390             : 
    4391             :         return 0;
    4392             : }
    4393             : EXPORT_SYMBOL(drm_dp_mst_atomic_setup_commit);
    4394             : 
    4395             : /**
    4396             :  * drm_dp_mst_atomic_wait_for_dependencies() - Wait for all pending commits on MST topologies,
    4397             :  * prepare new MST state for commit
    4398             :  * @state: global atomic state
    4399             :  *
    4400             :  * Goes through any MST topologies in this atomic state, and waits for any pending commits which
    4401             :  * touched CRTCs that were/are on an MST topology to be programmed to hardware and flipped to before
    4402             :  * returning. This is to prevent multiple non-blocking commits affecting an MST topology from racing
    4403             :  * with eachother by forcing them to be executed sequentially in situations where the only resources
    4404             :  * the modeset objects in these commits share are an MST topology.
    4405             :  *
    4406             :  * This function also prepares the new MST state for commit by performing some state preparation
    4407             :  * which can't be done until this point, such as reading back the final VC start slots (which are
    4408             :  * determined at commit-time) from the previous state.
    4409             :  *
    4410             :  * All MST drivers must call this function after calling drm_atomic_helper_wait_for_dependencies(),
    4411             :  * or whatever their equivalent of that is.
    4412             :  */
    4413           0 : void drm_dp_mst_atomic_wait_for_dependencies(struct drm_atomic_state *state)
    4414             : {
    4415             :         struct drm_dp_mst_topology_state *old_mst_state, *new_mst_state;
    4416             :         struct drm_dp_mst_topology_mgr *mgr;
    4417             :         struct drm_dp_mst_atomic_payload *old_payload, *new_payload;
    4418             :         int i, j, ret;
    4419             : 
    4420           0 :         for_each_oldnew_mst_mgr_in_state(state, mgr, old_mst_state, new_mst_state, i) {
    4421           0 :                 for (j = 0; j < old_mst_state->num_commit_deps; j++) {
    4422           0 :                         ret = drm_crtc_commit_wait(old_mst_state->commit_deps[j]);
    4423           0 :                         if (ret < 0)
    4424           0 :                                 drm_err(state->dev, "Failed to wait for %s: %d\n",
    4425             :                                         old_mst_state->commit_deps[j]->crtc->name, ret);
    4426             :                 }
    4427             : 
    4428             :                 /* Now that previous state is committed, it's safe to copy over the start slot
    4429             :                  * assignments
    4430             :                  */
    4431           0 :                 list_for_each_entry(old_payload, &old_mst_state->payloads, next) {
    4432           0 :                         if (old_payload->delete)
    4433           0 :                                 continue;
    4434             : 
    4435           0 :                         new_payload = drm_atomic_get_mst_payload_state(new_mst_state,
    4436             :                                                                        old_payload->port);
    4437           0 :                         new_payload->vc_start_slot = old_payload->vc_start_slot;
    4438             :                 }
    4439             :         }
    4440           0 : }
    4441             : EXPORT_SYMBOL(drm_dp_mst_atomic_wait_for_dependencies);
    4442             : 
    4443             : /**
    4444             :  * drm_dp_mst_root_conn_atomic_check() - Serialize CRTC commits on MST-capable connectors operating
    4445             :  * in SST mode
    4446             :  * @new_conn_state: The new connector state of the &drm_connector
    4447             :  * @mgr: The MST topology manager for the &drm_connector
    4448             :  *
    4449             :  * Since MST uses fake &drm_encoder structs, the generic atomic modesetting code isn't able to
    4450             :  * serialize non-blocking commits happening on the real DP connector of an MST topology switching
    4451             :  * into/away from MST mode - as the CRTC on the real DP connector and the CRTCs on the connector's
    4452             :  * MST topology will never share the same &drm_encoder.
    4453             :  *
    4454             :  * This function takes care of this serialization issue, by checking a root MST connector's atomic
    4455             :  * state to determine if it is about to have a modeset - and then pulling in the MST topology state
    4456             :  * if so, along with adding any relevant CRTCs to &drm_dp_mst_topology_state.pending_crtc_mask.
    4457             :  *
    4458             :  * Drivers implementing MST must call this function from the
    4459             :  * &drm_connector_helper_funcs.atomic_check hook of any physical DP &drm_connector capable of
    4460             :  * driving MST sinks.
    4461             :  *
    4462             :  * Returns:
    4463             :  * 0 on success, negative error code otherwise
    4464             :  */
    4465           0 : int drm_dp_mst_root_conn_atomic_check(struct drm_connector_state *new_conn_state,
    4466             :                                       struct drm_dp_mst_topology_mgr *mgr)
    4467             : {
    4468           0 :         struct drm_atomic_state *state = new_conn_state->state;
    4469           0 :         struct drm_connector_state *old_conn_state =
    4470           0 :                 drm_atomic_get_old_connector_state(state, new_conn_state->connector);
    4471             :         struct drm_crtc_state *crtc_state;
    4472           0 :         struct drm_dp_mst_topology_state *mst_state = NULL;
    4473             : 
    4474           0 :         if (new_conn_state->crtc) {
    4475           0 :                 crtc_state = drm_atomic_get_new_crtc_state(state, new_conn_state->crtc);
    4476           0 :                 if (crtc_state && drm_atomic_crtc_needs_modeset(crtc_state)) {
    4477           0 :                         mst_state = drm_atomic_get_mst_topology_state(state, mgr);
    4478           0 :                         if (IS_ERR(mst_state))
    4479           0 :                                 return PTR_ERR(mst_state);
    4480             : 
    4481           0 :                         mst_state->pending_crtc_mask |= drm_crtc_mask(new_conn_state->crtc);
    4482             :                 }
    4483             :         }
    4484             : 
    4485           0 :         if (old_conn_state->crtc) {
    4486           0 :                 crtc_state = drm_atomic_get_new_crtc_state(state, old_conn_state->crtc);
    4487           0 :                 if (crtc_state && drm_atomic_crtc_needs_modeset(crtc_state)) {
    4488           0 :                         if (!mst_state) {
    4489           0 :                                 mst_state = drm_atomic_get_mst_topology_state(state, mgr);
    4490           0 :                                 if (IS_ERR(mst_state))
    4491           0 :                                         return PTR_ERR(mst_state);
    4492             :                         }
    4493             : 
    4494           0 :                         mst_state->pending_crtc_mask |= drm_crtc_mask(old_conn_state->crtc);
    4495             :                 }
    4496             :         }
    4497             : 
    4498             :         return 0;
    4499             : }
    4500             : EXPORT_SYMBOL(drm_dp_mst_root_conn_atomic_check);
    4501             : 
    4502             : /**
    4503             :  * drm_dp_mst_update_slots() - updates the slot info depending on the DP ecoding format
    4504             :  * @mst_state: mst_state to update
    4505             :  * @link_encoding_cap: the ecoding format on the link
    4506             :  */
    4507           0 : void drm_dp_mst_update_slots(struct drm_dp_mst_topology_state *mst_state, uint8_t link_encoding_cap)
    4508             : {
    4509           0 :         if (link_encoding_cap == DP_CAP_ANSI_128B132B) {
    4510           0 :                 mst_state->total_avail_slots = 64;
    4511           0 :                 mst_state->start_slot = 0;
    4512             :         } else {
    4513           0 :                 mst_state->total_avail_slots = 63;
    4514           0 :                 mst_state->start_slot = 1;
    4515             :         }
    4516             : 
    4517           0 :         DRM_DEBUG_KMS("%s encoding format on mst_state 0x%p\n",
    4518             :                       (link_encoding_cap == DP_CAP_ANSI_128B132B) ? "128b/132b":"8b/10b",
    4519             :                       mst_state);
    4520           0 : }
    4521             : EXPORT_SYMBOL(drm_dp_mst_update_slots);
    4522             : 
    4523           0 : static int drm_dp_dpcd_write_payload(struct drm_dp_mst_topology_mgr *mgr,
    4524             :                                      int id, u8 start_slot, u8 num_slots)
    4525             : {
    4526             :         u8 payload_alloc[3], status;
    4527             :         int ret;
    4528           0 :         int retries = 0;
    4529             : 
    4530           0 :         drm_dp_dpcd_writeb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS,
    4531             :                            DP_PAYLOAD_TABLE_UPDATED);
    4532             : 
    4533           0 :         payload_alloc[0] = id;
    4534           0 :         payload_alloc[1] = start_slot;
    4535           0 :         payload_alloc[2] = num_slots;
    4536             : 
    4537           0 :         ret = drm_dp_dpcd_write(mgr->aux, DP_PAYLOAD_ALLOCATE_SET, payload_alloc, 3);
    4538           0 :         if (ret != 3) {
    4539           0 :                 drm_dbg_kms(mgr->dev, "failed to write payload allocation %d\n", ret);
    4540           0 :                 goto fail;
    4541             :         }
    4542             : 
    4543             : retry:
    4544           0 :         ret = drm_dp_dpcd_readb(mgr->aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status);
    4545           0 :         if (ret < 0) {
    4546           0 :                 drm_dbg_kms(mgr->dev, "failed to read payload table status %d\n", ret);
    4547           0 :                 goto fail;
    4548             :         }
    4549             : 
    4550           0 :         if (!(status & DP_PAYLOAD_TABLE_UPDATED)) {
    4551           0 :                 retries++;
    4552           0 :                 if (retries < 20) {
    4553             :                         usleep_range(10000, 20000);
    4554             :                         goto retry;
    4555             :                 }
    4556           0 :                 drm_dbg_kms(mgr->dev, "status not set after read payload table status %d\n",
    4557             :                             status);
    4558           0 :                 ret = -EINVAL;
    4559           0 :                 goto fail;
    4560             :         }
    4561             :         ret = 0;
    4562             : fail:
    4563           0 :         return ret;
    4564             : }
    4565             : 
    4566             : static int do_get_act_status(struct drm_dp_aux *aux)
    4567             : {
    4568             :         int ret;
    4569             :         u8 status;
    4570             : 
    4571           0 :         ret = drm_dp_dpcd_readb(aux, DP_PAYLOAD_TABLE_UPDATE_STATUS, &status);
    4572           0 :         if (ret < 0)
    4573             :                 return ret;
    4574             : 
    4575           0 :         return status;
    4576             : }
    4577             : 
    4578             : /**
    4579             :  * drm_dp_check_act_status() - Polls for ACT handled status.
    4580             :  * @mgr: manager to use
    4581             :  *
    4582             :  * Tries waiting for the MST hub to finish updating it's payload table by
    4583             :  * polling for the ACT handled bit for up to 3 seconds (yes-some hubs really
    4584             :  * take that long).
    4585             :  *
    4586             :  * Returns:
    4587             :  * 0 if the ACT was handled in time, negative error code on failure.
    4588             :  */
    4589           0 : int drm_dp_check_act_status(struct drm_dp_mst_topology_mgr *mgr)
    4590             : {
    4591             :         /*
    4592             :          * There doesn't seem to be any recommended retry count or timeout in
    4593             :          * the MST specification. Since some hubs have been observed to take
    4594             :          * over 1 second to update their payload allocations under certain
    4595             :          * conditions, we use a rather large timeout value.
    4596             :          */
    4597           0 :         const int timeout_ms = 3000;
    4598             :         int ret, status;
    4599             : 
    4600           0 :         ret = readx_poll_timeout(do_get_act_status, mgr->aux, status,
    4601             :                                  status & DP_PAYLOAD_ACT_HANDLED || status < 0,
    4602             :                                  200, timeout_ms * USEC_PER_MSEC);
    4603           0 :         if (ret < 0 && status >= 0) {
    4604           0 :                 drm_err(mgr->dev, "Failed to get ACT after %dms, last status: %02x\n",
    4605             :                         timeout_ms, status);
    4606           0 :                 return -EINVAL;
    4607           0 :         } else if (status < 0) {
    4608             :                 /*
    4609             :                  * Failure here isn't unexpected - the hub may have
    4610             :                  * just been unplugged
    4611             :                  */
    4612           0 :                 drm_dbg_kms(mgr->dev, "Failed to read payload table status: %d\n", status);
    4613           0 :                 return status;
    4614             :         }
    4615             : 
    4616             :         return 0;
    4617             : }
    4618             : EXPORT_SYMBOL(drm_dp_check_act_status);
    4619             : 
    4620             : /**
    4621             :  * drm_dp_calc_pbn_mode() - Calculate the PBN for a mode.
    4622             :  * @clock: dot clock for the mode
    4623             :  * @bpp: bpp for the mode.
    4624             :  * @dsc: DSC mode. If true, bpp has units of 1/16 of a bit per pixel
    4625             :  *
    4626             :  * This uses the formula in the spec to calculate the PBN value for a mode.
    4627             :  */
    4628           5 : int drm_dp_calc_pbn_mode(int clock, int bpp, bool dsc)
    4629             : {
    4630             :         /*
    4631             :          * margin 5300ppm + 300ppm ~ 0.6% as per spec, factor is 1.006
    4632             :          * The unit of 54/64Mbytes/sec is an arbitrary unit chosen based on
    4633             :          * common multiplier to render an integer PBN for all link rate/lane
    4634             :          * counts combinations
    4635             :          * calculate
    4636             :          * peak_kbps *= (1006/1000)
    4637             :          * peak_kbps *= (64/54)
    4638             :          * peak_kbps *= 8    convert to bytes
    4639             :          *
    4640             :          * If the bpp is in units of 1/16, further divide by 16. Put this
    4641             :          * factor in the numerator rather than the denominator to avoid
    4642             :          * integer overflow
    4643             :          */
    4644             : 
    4645           5 :         if (dsc)
    4646           4 :                 return DIV_ROUND_UP_ULL(mul_u32_u32(clock * (bpp / 16), 64 * 1006),
    4647             :                                         8 * 54 * 1000 * 1000);
    4648             : 
    4649           6 :         return DIV_ROUND_UP_ULL(mul_u32_u32(clock * bpp, 64 * 1006),
    4650             :                                 8 * 54 * 1000 * 1000);
    4651             : }
    4652             : EXPORT_SYMBOL(drm_dp_calc_pbn_mode);
    4653             : 
    4654             : /* we want to kick the TX after we've ack the up/down IRQs. */
    4655             : static void drm_dp_mst_kick_tx(struct drm_dp_mst_topology_mgr *mgr)
    4656             : {
    4657           0 :         queue_work(system_long_wq, &mgr->tx_work);
    4658             : }
    4659             : 
    4660             : /*
    4661             :  * Helper function for parsing DP device types into convenient strings
    4662             :  * for use with dp_mst_topology
    4663             :  */
    4664             : static const char *pdt_to_string(u8 pdt)
    4665             : {
    4666             :         switch (pdt) {
    4667             :         case DP_PEER_DEVICE_NONE:
    4668             :                 return "NONE";
    4669             :         case DP_PEER_DEVICE_SOURCE_OR_SST:
    4670             :                 return "SOURCE OR SST";
    4671             :         case DP_PEER_DEVICE_MST_BRANCHING:
    4672             :                 return "MST BRANCHING";
    4673             :         case DP_PEER_DEVICE_SST_SINK:
    4674             :                 return "SST SINK";
    4675             :         case DP_PEER_DEVICE_DP_LEGACY_CONV:
    4676             :                 return "DP LEGACY CONV";
    4677             :         default:
    4678             :                 return "ERR";
    4679             :         }
    4680             : }
    4681             : 
    4682           0 : static void drm_dp_mst_dump_mstb(struct seq_file *m,
    4683             :                                  struct drm_dp_mst_branch *mstb)
    4684             : {
    4685             :         struct drm_dp_mst_port *port;
    4686           0 :         int tabs = mstb->lct;
    4687             :         char prefix[10];
    4688             :         int i;
    4689             : 
    4690           0 :         for (i = 0; i < tabs; i++)
    4691           0 :                 prefix[i] = '\t';
    4692           0 :         prefix[i] = '\0';
    4693             : 
    4694           0 :         seq_printf(m, "%smstb - [%p]: num_ports: %d\n", prefix, mstb, mstb->num_ports);
    4695           0 :         list_for_each_entry(port, &mstb->ports, next) {
    4696           0 :                 seq_printf(m, "%sport %d - [%p] (%s - %s): ddps: %d, ldps: %d, sdp: %d/%d, fec: %s, conn: %p\n",
    4697             :                            prefix,
    4698           0 :                            port->port_num,
    4699             :                            port,
    4700           0 :                            port->input ? "input" : "output",
    4701           0 :                            pdt_to_string(port->pdt),
    4702           0 :                            port->ddps,
    4703           0 :                            port->ldps,
    4704           0 :                            port->num_sdp_streams,
    4705           0 :                            port->num_sdp_stream_sinks,
    4706           0 :                            port->fec_capable ? "true" : "false",
    4707             :                            port->connector);
    4708           0 :                 if (port->mstb)
    4709           0 :                         drm_dp_mst_dump_mstb(m, port->mstb);
    4710             :         }
    4711           0 : }
    4712             : 
    4713             : #define DP_PAYLOAD_TABLE_SIZE           64
    4714             : 
    4715           0 : static bool dump_dp_payload_table(struct drm_dp_mst_topology_mgr *mgr,
    4716             :                                   char *buf)
    4717             : {
    4718             :         int i;
    4719             : 
    4720           0 :         for (i = 0; i < DP_PAYLOAD_TABLE_SIZE; i += 16) {
    4721           0 :                 if (drm_dp_dpcd_read(mgr->aux,
    4722           0 :                                      DP_PAYLOAD_TABLE_UPDATE_STATUS + i,
    4723           0 :                                      &buf[i], 16) != 16)
    4724             :                         return false;
    4725             :         }
    4726             :         return true;
    4727             : }
    4728             : 
    4729           0 : static void fetch_monitor_name(struct drm_dp_mst_topology_mgr *mgr,
    4730             :                                struct drm_dp_mst_port *port, char *name,
    4731             :                                int namelen)
    4732             : {
    4733             :         struct edid *mst_edid;
    4734             : 
    4735           0 :         mst_edid = drm_dp_mst_get_edid(port->connector, mgr, port);
    4736           0 :         drm_edid_get_monitor_name(mst_edid, name, namelen);
    4737           0 :         kfree(mst_edid);
    4738           0 : }
    4739             : 
    4740             : /**
    4741             :  * drm_dp_mst_dump_topology(): dump topology to seq file.
    4742             :  * @m: seq_file to dump output to
    4743             :  * @mgr: manager to dump current topology for.
    4744             :  *
    4745             :  * helper to dump MST topology to a seq file for debugfs.
    4746             :  */
    4747           0 : void drm_dp_mst_dump_topology(struct seq_file *m,
    4748             :                               struct drm_dp_mst_topology_mgr *mgr)
    4749             : {
    4750             :         struct drm_dp_mst_topology_state *state;
    4751             :         struct drm_dp_mst_atomic_payload *payload;
    4752             :         int i, ret;
    4753             : 
    4754           0 :         mutex_lock(&mgr->lock);
    4755           0 :         if (mgr->mst_primary)
    4756           0 :                 drm_dp_mst_dump_mstb(m, mgr->mst_primary);
    4757             : 
    4758             :         /* dump VCPIs */
    4759           0 :         mutex_unlock(&mgr->lock);
    4760             : 
    4761           0 :         ret = drm_modeset_lock_single_interruptible(&mgr->base.lock);
    4762           0 :         if (ret < 0)
    4763             :                 return;
    4764             : 
    4765           0 :         state = to_drm_dp_mst_topology_state(mgr->base.state);
    4766           0 :         seq_printf(m, "\n*** Atomic state info ***\n");
    4767           0 :         seq_printf(m, "payload_mask: %x, max_payloads: %d, start_slot: %u, pbn_div: %d\n",
    4768           0 :                    state->payload_mask, mgr->max_payloads, state->start_slot, state->pbn_div);
    4769             : 
    4770           0 :         seq_printf(m, "\n| idx | port | vcpi | slots | pbn | dsc |     sink name     |\n");
    4771           0 :         for (i = 0; i < mgr->max_payloads; i++) {
    4772           0 :                 list_for_each_entry(payload, &state->payloads, next) {
    4773             :                         char name[14];
    4774             : 
    4775           0 :                         if (payload->vcpi != i || payload->delete)
    4776           0 :                                 continue;
    4777             : 
    4778           0 :                         fetch_monitor_name(mgr, payload->port, name, sizeof(name));
    4779           0 :                         seq_printf(m, " %5d %6d %6d %02d - %02d %5d %5s %19s\n",
    4780             :                                    i,
    4781           0 :                                    payload->port->port_num,
    4782           0 :                                    payload->vcpi,
    4783             :                                    payload->vc_start_slot,
    4784           0 :                                    payload->vc_start_slot + payload->time_slots - 1,
    4785             :                                    payload->pbn,
    4786           0 :                                    payload->dsc_enabled ? "Y" : "N",
    4787           0 :                                    (*name != 0) ? name : "Unknown");
    4788             :                 }
    4789             :         }
    4790             : 
    4791           0 :         seq_printf(m, "\n*** DPCD Info ***\n");
    4792           0 :         mutex_lock(&mgr->lock);
    4793           0 :         if (mgr->mst_primary) {
    4794             :                 u8 buf[DP_PAYLOAD_TABLE_SIZE];
    4795             :                 int ret;
    4796             : 
    4797           0 :                 if (drm_dp_read_dpcd_caps(mgr->aux, buf) < 0) {
    4798           0 :                         seq_printf(m, "dpcd read failed\n");
    4799           0 :                         goto out;
    4800             :                 }
    4801           0 :                 seq_printf(m, "dpcd: %*ph\n", DP_RECEIVER_CAP_SIZE, buf);
    4802             : 
    4803           0 :                 ret = drm_dp_dpcd_read(mgr->aux, DP_FAUX_CAP, buf, 2);
    4804           0 :                 if (ret != 2) {
    4805           0 :                         seq_printf(m, "faux/mst read failed\n");
    4806           0 :                         goto out;
    4807             :                 }
    4808           0 :                 seq_printf(m, "faux/mst: %*ph\n", 2, buf);
    4809             : 
    4810           0 :                 ret = drm_dp_dpcd_read(mgr->aux, DP_MSTM_CTRL, buf, 1);
    4811           0 :                 if (ret != 1) {
    4812           0 :                         seq_printf(m, "mst ctrl read failed\n");
    4813           0 :                         goto out;
    4814             :                 }
    4815           0 :                 seq_printf(m, "mst ctrl: %*ph\n", 1, buf);
    4816             : 
    4817             :                 /* dump the standard OUI branch header */
    4818           0 :                 ret = drm_dp_dpcd_read(mgr->aux, DP_BRANCH_OUI, buf, DP_BRANCH_OUI_HEADER_SIZE);
    4819           0 :                 if (ret != DP_BRANCH_OUI_HEADER_SIZE) {
    4820           0 :                         seq_printf(m, "branch oui read failed\n");
    4821           0 :                         goto out;
    4822             :                 }
    4823           0 :                 seq_printf(m, "branch oui: %*phN devid: ", 3, buf);
    4824             : 
    4825           0 :                 for (i = 0x3; i < 0x8 && buf[i]; i++)
    4826           0 :                         seq_printf(m, "%c", buf[i]);
    4827           0 :                 seq_printf(m, " revision: hw: %x.%x sw: %x.%x\n",
    4828           0 :                            buf[0x9] >> 4, buf[0x9] & 0xf, buf[0xa], buf[0xb]);
    4829           0 :                 if (dump_dp_payload_table(mgr, buf))
    4830           0 :                         seq_printf(m, "payload table: %*ph\n", DP_PAYLOAD_TABLE_SIZE, buf);
    4831             :         }
    4832             : 
    4833             : out:
    4834           0 :         mutex_unlock(&mgr->lock);
    4835           0 :         drm_modeset_unlock(&mgr->base.lock);
    4836             : }
    4837             : EXPORT_SYMBOL(drm_dp_mst_dump_topology);
    4838             : 
    4839           0 : static void drm_dp_tx_work(struct work_struct *work)
    4840             : {
    4841           0 :         struct drm_dp_mst_topology_mgr *mgr = container_of(work, struct drm_dp_mst_topology_mgr, tx_work);
    4842             : 
    4843           0 :         mutex_lock(&mgr->qlock);
    4844           0 :         if (!list_empty(&mgr->tx_msg_downq))
    4845           0 :                 process_single_down_tx_qlock(mgr);
    4846           0 :         mutex_unlock(&mgr->qlock);
    4847           0 : }
    4848             : 
    4849             : static inline void
    4850           0 : drm_dp_delayed_destroy_port(struct drm_dp_mst_port *port)
    4851             : {
    4852           0 :         drm_dp_port_set_pdt(port, DP_PEER_DEVICE_NONE, port->mcs);
    4853             : 
    4854           0 :         if (port->connector) {
    4855           0 :                 drm_connector_unregister(port->connector);
    4856           0 :                 drm_connector_put(port->connector);
    4857             :         }
    4858             : 
    4859           0 :         drm_dp_mst_put_port_malloc(port);
    4860           0 : }
    4861             : 
    4862             : static inline void
    4863           0 : drm_dp_delayed_destroy_mstb(struct drm_dp_mst_branch *mstb)
    4864             : {
    4865           0 :         struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
    4866             :         struct drm_dp_mst_port *port, *port_tmp;
    4867             :         struct drm_dp_sideband_msg_tx *txmsg, *txmsg_tmp;
    4868           0 :         bool wake_tx = false;
    4869             : 
    4870           0 :         mutex_lock(&mgr->lock);
    4871           0 :         list_for_each_entry_safe(port, port_tmp, &mstb->ports, next) {
    4872           0 :                 list_del(&port->next);
    4873           0 :                 drm_dp_mst_topology_put_port(port);
    4874             :         }
    4875           0 :         mutex_unlock(&mgr->lock);
    4876             : 
    4877             :         /* drop any tx slot msg */
    4878           0 :         mutex_lock(&mstb->mgr->qlock);
    4879           0 :         list_for_each_entry_safe(txmsg, txmsg_tmp, &mgr->tx_msg_downq, next) {
    4880           0 :                 if (txmsg->dst != mstb)
    4881           0 :                         continue;
    4882             : 
    4883           0 :                 txmsg->state = DRM_DP_SIDEBAND_TX_TIMEOUT;
    4884           0 :                 list_del(&txmsg->next);
    4885           0 :                 wake_tx = true;
    4886             :         }
    4887           0 :         mutex_unlock(&mstb->mgr->qlock);
    4888             : 
    4889           0 :         if (wake_tx)
    4890           0 :                 wake_up_all(&mstb->mgr->tx_waitq);
    4891             : 
    4892           0 :         drm_dp_mst_put_mstb_malloc(mstb);
    4893           0 : }
    4894             : 
    4895           0 : static void drm_dp_delayed_destroy_work(struct work_struct *work)
    4896             : {
    4897           0 :         struct drm_dp_mst_topology_mgr *mgr =
    4898           0 :                 container_of(work, struct drm_dp_mst_topology_mgr,
    4899             :                              delayed_destroy_work);
    4900           0 :         bool send_hotplug = false, go_again;
    4901             : 
    4902             :         /*
    4903             :          * Not a regular list traverse as we have to drop the destroy
    4904             :          * connector lock before destroying the mstb/port, to avoid AB->BA
    4905             :          * ordering between this lock and the config mutex.
    4906             :          */
    4907             :         do {
    4908           0 :                 go_again = false;
    4909             : 
    4910           0 :                 for (;;) {
    4911             :                         struct drm_dp_mst_branch *mstb;
    4912             : 
    4913           0 :                         mutex_lock(&mgr->delayed_destroy_lock);
    4914           0 :                         mstb = list_first_entry_or_null(&mgr->destroy_branch_device_list,
    4915             :                                                         struct drm_dp_mst_branch,
    4916             :                                                         destroy_next);
    4917           0 :                         if (mstb)
    4918           0 :                                 list_del(&mstb->destroy_next);
    4919           0 :                         mutex_unlock(&mgr->delayed_destroy_lock);
    4920             : 
    4921           0 :                         if (!mstb)
    4922             :                                 break;
    4923             : 
    4924           0 :                         drm_dp_delayed_destroy_mstb(mstb);
    4925           0 :                         go_again = true;
    4926             :                 }
    4927             : 
    4928           0 :                 for (;;) {
    4929             :                         struct drm_dp_mst_port *port;
    4930             : 
    4931           0 :                         mutex_lock(&mgr->delayed_destroy_lock);
    4932           0 :                         port = list_first_entry_or_null(&mgr->destroy_port_list,
    4933             :                                                         struct drm_dp_mst_port,
    4934             :                                                         next);
    4935           0 :                         if (port)
    4936           0 :                                 list_del(&port->next);
    4937           0 :                         mutex_unlock(&mgr->delayed_destroy_lock);
    4938             : 
    4939           0 :                         if (!port)
    4940             :                                 break;
    4941             : 
    4942           0 :                         drm_dp_delayed_destroy_port(port);
    4943           0 :                         send_hotplug = true;
    4944           0 :                         go_again = true;
    4945             :                 }
    4946           0 :         } while (go_again);
    4947             : 
    4948           0 :         if (send_hotplug)
    4949           0 :                 drm_kms_helper_hotplug_event(mgr->dev);
    4950           0 : }
    4951             : 
    4952             : static struct drm_private_state *
    4953           0 : drm_dp_mst_duplicate_state(struct drm_private_obj *obj)
    4954             : {
    4955           0 :         struct drm_dp_mst_topology_state *state, *old_state =
    4956           0 :                 to_dp_mst_topology_state(obj->state);
    4957             :         struct drm_dp_mst_atomic_payload *pos, *payload;
    4958             : 
    4959           0 :         state = kmemdup(old_state, sizeof(*state), GFP_KERNEL);
    4960           0 :         if (!state)
    4961             :                 return NULL;
    4962             : 
    4963           0 :         __drm_atomic_helper_private_obj_duplicate_state(obj, &state->base);
    4964             : 
    4965           0 :         INIT_LIST_HEAD(&state->payloads);
    4966           0 :         state->commit_deps = NULL;
    4967           0 :         state->num_commit_deps = 0;
    4968           0 :         state->pending_crtc_mask = 0;
    4969             : 
    4970           0 :         list_for_each_entry(pos, &old_state->payloads, next) {
    4971             :                 /* Prune leftover freed timeslot allocations */
    4972           0 :                 if (pos->delete)
    4973           0 :                         continue;
    4974             : 
    4975           0 :                 payload = kmemdup(pos, sizeof(*payload), GFP_KERNEL);
    4976           0 :                 if (!payload)
    4977             :                         goto fail;
    4978             : 
    4979           0 :                 drm_dp_mst_get_port_malloc(payload->port);
    4980           0 :                 list_add(&payload->next, &state->payloads);
    4981             :         }
    4982             : 
    4983             :         return &state->base;
    4984             : 
    4985             : fail:
    4986           0 :         list_for_each_entry_safe(pos, payload, &state->payloads, next) {
    4987           0 :                 drm_dp_mst_put_port_malloc(pos->port);
    4988           0 :                 kfree(pos);
    4989             :         }
    4990           0 :         kfree(state);
    4991             : 
    4992           0 :         return NULL;
    4993             : }
    4994             : 
    4995           0 : static void drm_dp_mst_destroy_state(struct drm_private_obj *obj,
    4996             :                                      struct drm_private_state *state)
    4997             : {
    4998           0 :         struct drm_dp_mst_topology_state *mst_state =
    4999           0 :                 to_dp_mst_topology_state(state);
    5000             :         struct drm_dp_mst_atomic_payload *pos, *tmp;
    5001             :         int i;
    5002             : 
    5003           0 :         list_for_each_entry_safe(pos, tmp, &mst_state->payloads, next) {
    5004             :                 /* We only keep references to ports with active payloads */
    5005           0 :                 if (!pos->delete)
    5006           0 :                         drm_dp_mst_put_port_malloc(pos->port);
    5007           0 :                 kfree(pos);
    5008             :         }
    5009             : 
    5010           0 :         for (i = 0; i < mst_state->num_commit_deps; i++)
    5011           0 :                 drm_crtc_commit_put(mst_state->commit_deps[i]);
    5012             : 
    5013           0 :         kfree(mst_state->commit_deps);
    5014           0 :         kfree(mst_state);
    5015           0 : }
    5016             : 
    5017             : static bool drm_dp_mst_port_downstream_of_branch(struct drm_dp_mst_port *port,
    5018             :                                                  struct drm_dp_mst_branch *branch)
    5019             : {
    5020           0 :         while (port->parent) {
    5021           0 :                 if (port->parent == branch)
    5022             :                         return true;
    5023             : 
    5024           0 :                 if (port->parent->port_parent)
    5025             :                         port = port->parent->port_parent;
    5026             :                 else
    5027             :                         break;
    5028             :         }
    5029             :         return false;
    5030             : }
    5031             : 
    5032             : static int
    5033             : drm_dp_mst_atomic_check_port_bw_limit(struct drm_dp_mst_port *port,
    5034             :                                       struct drm_dp_mst_topology_state *state);
    5035             : 
    5036             : static int
    5037           0 : drm_dp_mst_atomic_check_mstb_bw_limit(struct drm_dp_mst_branch *mstb,
    5038             :                                       struct drm_dp_mst_topology_state *state)
    5039             : {
    5040             :         struct drm_dp_mst_atomic_payload *payload;
    5041             :         struct drm_dp_mst_port *port;
    5042           0 :         int pbn_used = 0, ret;
    5043           0 :         bool found = false;
    5044             : 
    5045             :         /* Check that we have at least one port in our state that's downstream
    5046             :          * of this branch, otherwise we can skip this branch
    5047             :          */
    5048           0 :         list_for_each_entry(payload, &state->payloads, next) {
    5049           0 :                 if (!payload->pbn ||
    5050           0 :                     !drm_dp_mst_port_downstream_of_branch(payload->port, mstb))
    5051           0 :                         continue;
    5052             : 
    5053             :                 found = true;
    5054             :                 break;
    5055             :         }
    5056           0 :         if (!found)
    5057             :                 return 0;
    5058             : 
    5059           0 :         if (mstb->port_parent)
    5060           0 :                 drm_dbg_atomic(mstb->mgr->dev,
    5061             :                                "[MSTB:%p] [MST PORT:%p] Checking bandwidth limits on [MSTB:%p]\n",
    5062             :                                mstb->port_parent->parent, mstb->port_parent, mstb);
    5063             :         else
    5064           0 :                 drm_dbg_atomic(mstb->mgr->dev, "[MSTB:%p] Checking bandwidth limits\n", mstb);
    5065             : 
    5066           0 :         list_for_each_entry(port, &mstb->ports, next) {
    5067           0 :                 ret = drm_dp_mst_atomic_check_port_bw_limit(port, state);
    5068           0 :                 if (ret < 0)
    5069             :                         return ret;
    5070             : 
    5071           0 :                 pbn_used += ret;
    5072             :         }
    5073             : 
    5074             :         return pbn_used;
    5075             : }
    5076             : 
    5077             : static int
    5078           0 : drm_dp_mst_atomic_check_port_bw_limit(struct drm_dp_mst_port *port,
    5079             :                                       struct drm_dp_mst_topology_state *state)
    5080             : {
    5081             :         struct drm_dp_mst_atomic_payload *payload;
    5082           0 :         int pbn_used = 0;
    5083             : 
    5084           0 :         if (port->pdt == DP_PEER_DEVICE_NONE)
    5085             :                 return 0;
    5086             : 
    5087           0 :         if (drm_dp_mst_is_end_device(port->pdt, port->mcs)) {
    5088           0 :                 payload = drm_atomic_get_mst_payload_state(state, port);
    5089           0 :                 if (!payload)
    5090             :                         return 0;
    5091             : 
    5092             :                 /*
    5093             :                  * This could happen if the sink deasserted its HPD line, but
    5094             :                  * the branch device still reports it as attached (PDT != NONE).
    5095             :                  */
    5096           0 :                 if (!port->full_pbn) {
    5097           0 :                         drm_dbg_atomic(port->mgr->dev,
    5098             :                                        "[MSTB:%p] [MST PORT:%p] no BW available for the port\n",
    5099             :                                        port->parent, port);
    5100           0 :                         return -EINVAL;
    5101             :                 }
    5102             : 
    5103           0 :                 pbn_used = payload->pbn;
    5104             :         } else {
    5105           0 :                 pbn_used = drm_dp_mst_atomic_check_mstb_bw_limit(port->mstb,
    5106             :                                                                  state);
    5107           0 :                 if (pbn_used <= 0)
    5108             :                         return pbn_used;
    5109             :         }
    5110             : 
    5111           0 :         if (pbn_used > port->full_pbn) {
    5112           0 :                 drm_dbg_atomic(port->mgr->dev,
    5113             :                                "[MSTB:%p] [MST PORT:%p] required PBN of %d exceeds port limit of %d\n",
    5114             :                                port->parent, port, pbn_used, port->full_pbn);
    5115           0 :                 return -ENOSPC;
    5116             :         }
    5117             : 
    5118           0 :         drm_dbg_atomic(port->mgr->dev, "[MSTB:%p] [MST PORT:%p] uses %d out of %d PBN\n",
    5119             :                        port->parent, port, pbn_used, port->full_pbn);
    5120             : 
    5121           0 :         return pbn_used;
    5122             : }
    5123             : 
    5124             : static inline int
    5125           0 : drm_dp_mst_atomic_check_payload_alloc_limits(struct drm_dp_mst_topology_mgr *mgr,
    5126             :                                              struct drm_dp_mst_topology_state *mst_state)
    5127             : {
    5128             :         struct drm_dp_mst_atomic_payload *payload;
    5129           0 :         int avail_slots = mst_state->total_avail_slots, payload_count = 0;
    5130             : 
    5131           0 :         list_for_each_entry(payload, &mst_state->payloads, next) {
    5132             :                 /* Releasing payloads is always OK-even if the port is gone */
    5133           0 :                 if (payload->delete) {
    5134           0 :                         drm_dbg_atomic(mgr->dev, "[MST PORT:%p] releases all time slots\n",
    5135             :                                        payload->port);
    5136           0 :                         continue;
    5137             :                 }
    5138             : 
    5139           0 :                 drm_dbg_atomic(mgr->dev, "[MST PORT:%p] requires %d time slots\n",
    5140             :                                payload->port, payload->time_slots);
    5141             : 
    5142           0 :                 avail_slots -= payload->time_slots;
    5143           0 :                 if (avail_slots < 0) {
    5144           0 :                         drm_dbg_atomic(mgr->dev,
    5145             :                                        "[MST PORT:%p] not enough time slots in mst state %p (avail=%d)\n",
    5146             :                                        payload->port, mst_state, avail_slots + payload->time_slots);
    5147           0 :                         return -ENOSPC;
    5148             :                 }
    5149             : 
    5150           0 :                 if (++payload_count > mgr->max_payloads) {
    5151           0 :                         drm_dbg_atomic(mgr->dev,
    5152             :                                        "[MST MGR:%p] state %p has too many payloads (max=%d)\n",
    5153             :                                        mgr, mst_state, mgr->max_payloads);
    5154           0 :                         return -EINVAL;
    5155             :                 }
    5156             : 
    5157             :                 /* Assign a VCPI */
    5158           0 :                 if (!payload->vcpi) {
    5159           0 :                         payload->vcpi = ffz(mst_state->payload_mask) + 1;
    5160           0 :                         drm_dbg_atomic(mgr->dev, "[MST PORT:%p] assigned VCPI #%d\n",
    5161             :                                        payload->port, payload->vcpi);
    5162           0 :                         mst_state->payload_mask |= BIT(payload->vcpi - 1);
    5163             :                 }
    5164             :         }
    5165             : 
    5166           0 :         if (!payload_count)
    5167           0 :                 mst_state->pbn_div = 0;
    5168             : 
    5169           0 :         drm_dbg_atomic(mgr->dev, "[MST MGR:%p] mst state %p TU pbn_div=%d avail=%d used=%d\n",
    5170             :                        mgr, mst_state, mst_state->pbn_div, avail_slots,
    5171             :                        mst_state->total_avail_slots - avail_slots);
    5172             : 
    5173           0 :         return 0;
    5174             : }
    5175             : 
    5176             : /**
    5177             :  * drm_dp_mst_add_affected_dsc_crtcs
    5178             :  * @state: Pointer to the new struct drm_dp_mst_topology_state
    5179             :  * @mgr: MST topology manager
    5180             :  *
    5181             :  * Whenever there is a change in mst topology
    5182             :  * DSC configuration would have to be recalculated
    5183             :  * therefore we need to trigger modeset on all affected
    5184             :  * CRTCs in that topology
    5185             :  *
    5186             :  * See also:
    5187             :  * drm_dp_mst_atomic_enable_dsc()
    5188             :  */
    5189           0 : int drm_dp_mst_add_affected_dsc_crtcs(struct drm_atomic_state *state, struct drm_dp_mst_topology_mgr *mgr)
    5190             : {
    5191             :         struct drm_dp_mst_topology_state *mst_state;
    5192             :         struct drm_dp_mst_atomic_payload *pos;
    5193             :         struct drm_connector *connector;
    5194             :         struct drm_connector_state *conn_state;
    5195             :         struct drm_crtc *crtc;
    5196             :         struct drm_crtc_state *crtc_state;
    5197             : 
    5198           0 :         mst_state = drm_atomic_get_mst_topology_state(state, mgr);
    5199             : 
    5200           0 :         if (IS_ERR(mst_state))
    5201           0 :                 return PTR_ERR(mst_state);
    5202             : 
    5203           0 :         list_for_each_entry(pos, &mst_state->payloads, next) {
    5204             : 
    5205           0 :                 connector = pos->port->connector;
    5206             : 
    5207           0 :                 if (!connector)
    5208             :                         return -EINVAL;
    5209             : 
    5210           0 :                 conn_state = drm_atomic_get_connector_state(state, connector);
    5211             : 
    5212           0 :                 if (IS_ERR(conn_state))
    5213           0 :                         return PTR_ERR(conn_state);
    5214             : 
    5215           0 :                 crtc = conn_state->crtc;
    5216             : 
    5217           0 :                 if (!crtc)
    5218           0 :                         continue;
    5219             : 
    5220           0 :                 if (!drm_dp_mst_dsc_aux_for_port(pos->port))
    5221           0 :                         continue;
    5222             : 
    5223           0 :                 crtc_state = drm_atomic_get_crtc_state(mst_state->base.state, crtc);
    5224             : 
    5225           0 :                 if (IS_ERR(crtc_state))
    5226           0 :                         return PTR_ERR(crtc_state);
    5227             : 
    5228           0 :                 drm_dbg_atomic(mgr->dev, "[MST MGR:%p] Setting mode_changed flag on CRTC %p\n",
    5229             :                                mgr, crtc);
    5230             : 
    5231           0 :                 crtc_state->mode_changed = true;
    5232             :         }
    5233             :         return 0;
    5234             : }
    5235             : EXPORT_SYMBOL(drm_dp_mst_add_affected_dsc_crtcs);
    5236             : 
    5237             : /**
    5238             :  * drm_dp_mst_atomic_enable_dsc - Set DSC Enable Flag to On/Off
    5239             :  * @state: Pointer to the new drm_atomic_state
    5240             :  * @port: Pointer to the affected MST Port
    5241             :  * @pbn: Newly recalculated bw required for link with DSC enabled
    5242             :  * @enable: Boolean flag to enable or disable DSC on the port
    5243             :  *
    5244             :  * This function enables DSC on the given Port
    5245             :  * by recalculating its vcpi from pbn provided
    5246             :  * and sets dsc_enable flag to keep track of which
    5247             :  * ports have DSC enabled
    5248             :  *
    5249             :  */
    5250           0 : int drm_dp_mst_atomic_enable_dsc(struct drm_atomic_state *state,
    5251             :                                  struct drm_dp_mst_port *port,
    5252             :                                  int pbn, bool enable)
    5253             : {
    5254             :         struct drm_dp_mst_topology_state *mst_state;
    5255             :         struct drm_dp_mst_atomic_payload *payload;
    5256           0 :         int time_slots = 0;
    5257             : 
    5258           0 :         mst_state = drm_atomic_get_mst_topology_state(state, port->mgr);
    5259           0 :         if (IS_ERR(mst_state))
    5260           0 :                 return PTR_ERR(mst_state);
    5261             : 
    5262           0 :         payload = drm_atomic_get_mst_payload_state(mst_state, port);
    5263           0 :         if (!payload) {
    5264           0 :                 drm_dbg_atomic(state->dev,
    5265             :                                "[MST PORT:%p] Couldn't find payload in mst state %p\n",
    5266             :                                port, mst_state);
    5267           0 :                 return -EINVAL;
    5268             :         }
    5269             : 
    5270           0 :         if (payload->dsc_enabled == enable) {
    5271           0 :                 drm_dbg_atomic(state->dev,
    5272             :                                "[MST PORT:%p] DSC flag is already set to %d, returning %d time slots\n",
    5273             :                                port, enable, payload->time_slots);
    5274           0 :                 time_slots = payload->time_slots;
    5275             :         }
    5276             : 
    5277           0 :         if (enable) {
    5278           0 :                 time_slots = drm_dp_atomic_find_time_slots(state, port->mgr, port, pbn);
    5279           0 :                 drm_dbg_atomic(state->dev,
    5280             :                                "[MST PORT:%p] Enabling DSC flag, reallocating %d time slots on the port\n",
    5281             :                                port, time_slots);
    5282           0 :                 if (time_slots < 0)
    5283             :                         return -EINVAL;
    5284             :         }
    5285             : 
    5286           0 :         payload->dsc_enabled = enable;
    5287             : 
    5288           0 :         return time_slots;
    5289             : }
    5290             : EXPORT_SYMBOL(drm_dp_mst_atomic_enable_dsc);
    5291             : 
    5292             : /**
    5293             :  * drm_dp_mst_atomic_check - Check that the new state of an MST topology in an
    5294             :  * atomic update is valid
    5295             :  * @state: Pointer to the new &struct drm_dp_mst_topology_state
    5296             :  *
    5297             :  * Checks the given topology state for an atomic update to ensure that it's
    5298             :  * valid. This includes checking whether there's enough bandwidth to support
    5299             :  * the new timeslot allocations in the atomic update.
    5300             :  *
    5301             :  * Any atomic drivers supporting DP MST must make sure to call this after
    5302             :  * checking the rest of their state in their
    5303             :  * &drm_mode_config_funcs.atomic_check() callback.
    5304             :  *
    5305             :  * See also:
    5306             :  * drm_dp_atomic_find_time_slots()
    5307             :  * drm_dp_atomic_release_time_slots()
    5308             :  *
    5309             :  * Returns:
    5310             :  *
    5311             :  * 0 if the new state is valid, negative error code otherwise.
    5312             :  */
    5313           0 : int drm_dp_mst_atomic_check(struct drm_atomic_state *state)
    5314             : {
    5315             :         struct drm_dp_mst_topology_mgr *mgr;
    5316             :         struct drm_dp_mst_topology_state *mst_state;
    5317           0 :         int i, ret = 0;
    5318             : 
    5319           0 :         for_each_new_mst_mgr_in_state(state, mgr, mst_state, i) {
    5320           0 :                 if (!mgr->mst_state)
    5321           0 :                         continue;
    5322             : 
    5323           0 :                 ret = drm_dp_mst_atomic_check_payload_alloc_limits(mgr, mst_state);
    5324           0 :                 if (ret)
    5325             :                         break;
    5326             : 
    5327           0 :                 mutex_lock(&mgr->lock);
    5328           0 :                 ret = drm_dp_mst_atomic_check_mstb_bw_limit(mgr->mst_primary,
    5329             :                                                             mst_state);
    5330           0 :                 mutex_unlock(&mgr->lock);
    5331           0 :                 if (ret < 0)
    5332             :                         break;
    5333             :                 else
    5334             :                         ret = 0;
    5335             :         }
    5336             : 
    5337           0 :         return ret;
    5338             : }
    5339             : EXPORT_SYMBOL(drm_dp_mst_atomic_check);
    5340             : 
    5341             : const struct drm_private_state_funcs drm_dp_mst_topology_state_funcs = {
    5342             :         .atomic_duplicate_state = drm_dp_mst_duplicate_state,
    5343             :         .atomic_destroy_state = drm_dp_mst_destroy_state,
    5344             : };
    5345             : EXPORT_SYMBOL(drm_dp_mst_topology_state_funcs);
    5346             : 
    5347             : /**
    5348             :  * drm_atomic_get_mst_topology_state: get MST topology state
    5349             :  * @state: global atomic state
    5350             :  * @mgr: MST topology manager, also the private object in this case
    5351             :  *
    5352             :  * This function wraps drm_atomic_get_priv_obj_state() passing in the MST atomic
    5353             :  * state vtable so that the private object state returned is that of a MST
    5354             :  * topology object.
    5355             :  *
    5356             :  * RETURNS:
    5357             :  *
    5358             :  * The MST topology state or error pointer.
    5359             :  */
    5360           0 : struct drm_dp_mst_topology_state *drm_atomic_get_mst_topology_state(struct drm_atomic_state *state,
    5361             :                                                                     struct drm_dp_mst_topology_mgr *mgr)
    5362             : {
    5363           0 :         return to_dp_mst_topology_state(drm_atomic_get_private_obj_state(state, &mgr->base));
    5364             : }
    5365             : EXPORT_SYMBOL(drm_atomic_get_mst_topology_state);
    5366             : 
    5367             : /**
    5368             :  * drm_atomic_get_old_mst_topology_state: get old MST topology state in atomic state, if any
    5369             :  * @state: global atomic state
    5370             :  * @mgr: MST topology manager, also the private object in this case
    5371             :  *
    5372             :  * This function wraps drm_atomic_get_old_private_obj_state() passing in the MST atomic
    5373             :  * state vtable so that the private object state returned is that of a MST
    5374             :  * topology object.
    5375             :  *
    5376             :  * Returns:
    5377             :  *
    5378             :  * The old MST topology state, or NULL if there's no topology state for this MST mgr
    5379             :  * in the global atomic state
    5380             :  */
    5381             : struct drm_dp_mst_topology_state *
    5382           0 : drm_atomic_get_old_mst_topology_state(struct drm_atomic_state *state,
    5383             :                                       struct drm_dp_mst_topology_mgr *mgr)
    5384             : {
    5385           0 :         struct drm_private_state *old_priv_state =
    5386           0 :                 drm_atomic_get_old_private_obj_state(state, &mgr->base);
    5387             : 
    5388           0 :         return old_priv_state ? to_dp_mst_topology_state(old_priv_state) : NULL;
    5389             : }
    5390             : EXPORT_SYMBOL(drm_atomic_get_old_mst_topology_state);
    5391             : 
    5392             : /**
    5393             :  * drm_atomic_get_new_mst_topology_state: get new MST topology state in atomic state, if any
    5394             :  * @state: global atomic state
    5395             :  * @mgr: MST topology manager, also the private object in this case
    5396             :  *
    5397             :  * This function wraps drm_atomic_get_new_private_obj_state() passing in the MST atomic
    5398             :  * state vtable so that the private object state returned is that of a MST
    5399             :  * topology object.
    5400             :  *
    5401             :  * Returns:
    5402             :  *
    5403             :  * The new MST topology state, or NULL if there's no topology state for this MST mgr
    5404             :  * in the global atomic state
    5405             :  */
    5406             : struct drm_dp_mst_topology_state *
    5407           0 : drm_atomic_get_new_mst_topology_state(struct drm_atomic_state *state,
    5408             :                                       struct drm_dp_mst_topology_mgr *mgr)
    5409             : {
    5410           0 :         struct drm_private_state *new_priv_state =
    5411           0 :                 drm_atomic_get_new_private_obj_state(state, &mgr->base);
    5412             : 
    5413           0 :         return new_priv_state ? to_dp_mst_topology_state(new_priv_state) : NULL;
    5414             : }
    5415             : EXPORT_SYMBOL(drm_atomic_get_new_mst_topology_state);
    5416             : 
    5417             : /**
    5418             :  * drm_dp_mst_topology_mgr_init - initialise a topology manager
    5419             :  * @mgr: manager struct to initialise
    5420             :  * @dev: device providing this structure - for i2c addition.
    5421             :  * @aux: DP helper aux channel to talk to this device
    5422             :  * @max_dpcd_transaction_bytes: hw specific DPCD transaction limit
    5423             :  * @max_payloads: maximum number of payloads this GPU can source
    5424             :  * @conn_base_id: the connector object ID the MST device is connected to.
    5425             :  *
    5426             :  * Return 0 for success, or negative error code on failure
    5427             :  */
    5428           0 : int drm_dp_mst_topology_mgr_init(struct drm_dp_mst_topology_mgr *mgr,
    5429             :                                  struct drm_device *dev, struct drm_dp_aux *aux,
    5430             :                                  int max_dpcd_transaction_bytes, int max_payloads,
    5431             :                                  int conn_base_id)
    5432             : {
    5433             :         struct drm_dp_mst_topology_state *mst_state;
    5434             : 
    5435           0 :         mutex_init(&mgr->lock);
    5436           0 :         mutex_init(&mgr->qlock);
    5437           0 :         mutex_init(&mgr->delayed_destroy_lock);
    5438           0 :         mutex_init(&mgr->up_req_lock);
    5439           0 :         mutex_init(&mgr->probe_lock);
    5440             : #if IS_ENABLED(CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS)
    5441             :         mutex_init(&mgr->topology_ref_history_lock);
    5442             :         stack_depot_init();
    5443             : #endif
    5444           0 :         INIT_LIST_HEAD(&mgr->tx_msg_downq);
    5445           0 :         INIT_LIST_HEAD(&mgr->destroy_port_list);
    5446           0 :         INIT_LIST_HEAD(&mgr->destroy_branch_device_list);
    5447           0 :         INIT_LIST_HEAD(&mgr->up_req_list);
    5448             : 
    5449             :         /*
    5450             :          * delayed_destroy_work will be queued on a dedicated WQ, so that any
    5451             :          * requeuing will be also flushed when deiniting the topology manager.
    5452             :          */
    5453           0 :         mgr->delayed_destroy_wq = alloc_ordered_workqueue("drm_dp_mst_wq", 0);
    5454           0 :         if (mgr->delayed_destroy_wq == NULL)
    5455             :                 return -ENOMEM;
    5456             : 
    5457           0 :         INIT_WORK(&mgr->work, drm_dp_mst_link_probe_work);
    5458           0 :         INIT_WORK(&mgr->tx_work, drm_dp_tx_work);
    5459           0 :         INIT_WORK(&mgr->delayed_destroy_work, drm_dp_delayed_destroy_work);
    5460           0 :         INIT_WORK(&mgr->up_req_work, drm_dp_mst_up_req_work);
    5461           0 :         init_waitqueue_head(&mgr->tx_waitq);
    5462           0 :         mgr->dev = dev;
    5463           0 :         mgr->aux = aux;
    5464           0 :         mgr->max_dpcd_transaction_bytes = max_dpcd_transaction_bytes;
    5465           0 :         mgr->max_payloads = max_payloads;
    5466           0 :         mgr->conn_base_id = conn_base_id;
    5467             : 
    5468           0 :         mst_state = kzalloc(sizeof(*mst_state), GFP_KERNEL);
    5469           0 :         if (mst_state == NULL)
    5470             :                 return -ENOMEM;
    5471             : 
    5472           0 :         mst_state->total_avail_slots = 63;
    5473           0 :         mst_state->start_slot = 1;
    5474             : 
    5475           0 :         mst_state->mgr = mgr;
    5476           0 :         INIT_LIST_HEAD(&mst_state->payloads);
    5477             : 
    5478           0 :         drm_atomic_private_obj_init(dev, &mgr->base,
    5479             :                                     &mst_state->base,
    5480             :                                     &drm_dp_mst_topology_state_funcs);
    5481             : 
    5482           0 :         return 0;
    5483             : }
    5484             : EXPORT_SYMBOL(drm_dp_mst_topology_mgr_init);
    5485             : 
    5486             : /**
    5487             :  * drm_dp_mst_topology_mgr_destroy() - destroy topology manager.
    5488             :  * @mgr: manager to destroy
    5489             :  */
    5490           0 : void drm_dp_mst_topology_mgr_destroy(struct drm_dp_mst_topology_mgr *mgr)
    5491             : {
    5492           0 :         drm_dp_mst_topology_mgr_set_mst(mgr, false);
    5493           0 :         flush_work(&mgr->work);
    5494             :         /* The following will also drain any requeued work on the WQ. */
    5495           0 :         if (mgr->delayed_destroy_wq) {
    5496           0 :                 destroy_workqueue(mgr->delayed_destroy_wq);
    5497           0 :                 mgr->delayed_destroy_wq = NULL;
    5498             :         }
    5499           0 :         mgr->dev = NULL;
    5500           0 :         mgr->aux = NULL;
    5501           0 :         drm_atomic_private_obj_fini(&mgr->base);
    5502           0 :         mgr->funcs = NULL;
    5503             : 
    5504           0 :         mutex_destroy(&mgr->delayed_destroy_lock);
    5505           0 :         mutex_destroy(&mgr->qlock);
    5506           0 :         mutex_destroy(&mgr->lock);
    5507           0 :         mutex_destroy(&mgr->up_req_lock);
    5508           0 :         mutex_destroy(&mgr->probe_lock);
    5509             : #if IS_ENABLED(CONFIG_DRM_DEBUG_DP_MST_TOPOLOGY_REFS)
    5510             :         mutex_destroy(&mgr->topology_ref_history_lock);
    5511             : #endif
    5512           0 : }
    5513             : EXPORT_SYMBOL(drm_dp_mst_topology_mgr_destroy);
    5514             : 
    5515           0 : static bool remote_i2c_read_ok(const struct i2c_msg msgs[], int num)
    5516             : {
    5517             :         int i;
    5518             : 
    5519           0 :         if (num - 1 > DP_REMOTE_I2C_READ_MAX_TRANSACTIONS)
    5520             :                 return false;
    5521             : 
    5522           0 :         for (i = 0; i < num - 1; i++) {
    5523           0 :                 if (msgs[i].flags & I2C_M_RD ||
    5524           0 :                     msgs[i].len > 0xff)
    5525             :                         return false;
    5526             :         }
    5527             : 
    5528           0 :         return msgs[num - 1].flags & I2C_M_RD &&
    5529           0 :                 msgs[num - 1].len <= 0xff;
    5530             : }
    5531             : 
    5532           0 : static bool remote_i2c_write_ok(const struct i2c_msg msgs[], int num)
    5533             : {
    5534             :         int i;
    5535             : 
    5536           0 :         for (i = 0; i < num - 1; i++) {
    5537           0 :                 if (msgs[i].flags & I2C_M_RD || !(msgs[i].flags & I2C_M_STOP) ||
    5538           0 :                     msgs[i].len > 0xff)
    5539             :                         return false;
    5540             :         }
    5541             : 
    5542           0 :         return !(msgs[num - 1].flags & I2C_M_RD) && msgs[num - 1].len <= 0xff;
    5543             : }
    5544             : 
    5545           0 : static int drm_dp_mst_i2c_read(struct drm_dp_mst_branch *mstb,
    5546             :                                struct drm_dp_mst_port *port,
    5547             :                                struct i2c_msg *msgs, int num)
    5548             : {
    5549           0 :         struct drm_dp_mst_topology_mgr *mgr = port->mgr;
    5550             :         unsigned int i;
    5551             :         struct drm_dp_sideband_msg_req_body msg;
    5552           0 :         struct drm_dp_sideband_msg_tx *txmsg = NULL;
    5553             :         int ret;
    5554             : 
    5555           0 :         memset(&msg, 0, sizeof(msg));
    5556           0 :         msg.req_type = DP_REMOTE_I2C_READ;
    5557           0 :         msg.u.i2c_read.num_transactions = num - 1;
    5558           0 :         msg.u.i2c_read.port_number = port->port_num;
    5559           0 :         for (i = 0; i < num - 1; i++) {
    5560           0 :                 msg.u.i2c_read.transactions[i].i2c_dev_id = msgs[i].addr;
    5561           0 :                 msg.u.i2c_read.transactions[i].num_bytes = msgs[i].len;
    5562           0 :                 msg.u.i2c_read.transactions[i].bytes = msgs[i].buf;
    5563           0 :                 msg.u.i2c_read.transactions[i].no_stop_bit = !(msgs[i].flags & I2C_M_STOP);
    5564             :         }
    5565           0 :         msg.u.i2c_read.read_i2c_device_id = msgs[num - 1].addr;
    5566           0 :         msg.u.i2c_read.num_bytes_read = msgs[num - 1].len;
    5567             : 
    5568           0 :         txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
    5569           0 :         if (!txmsg) {
    5570             :                 ret = -ENOMEM;
    5571             :                 goto out;
    5572             :         }
    5573             : 
    5574           0 :         txmsg->dst = mstb;
    5575           0 :         drm_dp_encode_sideband_req(&msg, txmsg);
    5576             : 
    5577           0 :         drm_dp_queue_down_tx(mgr, txmsg);
    5578             : 
    5579           0 :         ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
    5580           0 :         if (ret > 0) {
    5581             : 
    5582           0 :                 if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) {
    5583             :                         ret = -EREMOTEIO;
    5584             :                         goto out;
    5585             :                 }
    5586           0 :                 if (txmsg->reply.u.remote_i2c_read_ack.num_bytes != msgs[num - 1].len) {
    5587             :                         ret = -EIO;
    5588             :                         goto out;
    5589             :                 }
    5590           0 :                 memcpy(msgs[num - 1].buf, txmsg->reply.u.remote_i2c_read_ack.bytes, msgs[num - 1].len);
    5591           0 :                 ret = num;
    5592             :         }
    5593             : out:
    5594           0 :         kfree(txmsg);
    5595           0 :         return ret;
    5596             : }
    5597             : 
    5598           0 : static int drm_dp_mst_i2c_write(struct drm_dp_mst_branch *mstb,
    5599             :                                 struct drm_dp_mst_port *port,
    5600             :                                 struct i2c_msg *msgs, int num)
    5601             : {
    5602           0 :         struct drm_dp_mst_topology_mgr *mgr = port->mgr;
    5603             :         unsigned int i;
    5604             :         struct drm_dp_sideband_msg_req_body msg;
    5605           0 :         struct drm_dp_sideband_msg_tx *txmsg = NULL;
    5606             :         int ret;
    5607             : 
    5608           0 :         txmsg = kzalloc(sizeof(*txmsg), GFP_KERNEL);
    5609           0 :         if (!txmsg) {
    5610             :                 ret = -ENOMEM;
    5611             :                 goto out;
    5612             :         }
    5613           0 :         for (i = 0; i < num; i++) {
    5614           0 :                 memset(&msg, 0, sizeof(msg));
    5615           0 :                 msg.req_type = DP_REMOTE_I2C_WRITE;
    5616           0 :                 msg.u.i2c_write.port_number = port->port_num;
    5617           0 :                 msg.u.i2c_write.write_i2c_device_id = msgs[i].addr;
    5618           0 :                 msg.u.i2c_write.num_bytes = msgs[i].len;
    5619           0 :                 msg.u.i2c_write.bytes = msgs[i].buf;
    5620             : 
    5621           0 :                 memset(txmsg, 0, sizeof(*txmsg));
    5622           0 :                 txmsg->dst = mstb;
    5623             : 
    5624           0 :                 drm_dp_encode_sideband_req(&msg, txmsg);
    5625           0 :                 drm_dp_queue_down_tx(mgr, txmsg);
    5626             : 
    5627           0 :                 ret = drm_dp_mst_wait_tx_reply(mstb, txmsg);
    5628           0 :                 if (ret > 0) {
    5629           0 :                         if (txmsg->reply.reply_type == DP_SIDEBAND_REPLY_NAK) {
    5630             :                                 ret = -EREMOTEIO;
    5631             :                                 goto out;
    5632             :                         }
    5633             :                 } else {
    5634             :                         goto out;
    5635             :                 }
    5636             :         }
    5637             :         ret = num;
    5638             : out:
    5639           0 :         kfree(txmsg);
    5640           0 :         return ret;
    5641             : }
    5642             : 
    5643             : /* I2C device */
    5644           0 : static int drm_dp_mst_i2c_xfer(struct i2c_adapter *adapter,
    5645             :                                struct i2c_msg *msgs, int num)
    5646             : {
    5647           0 :         struct drm_dp_aux *aux = adapter->algo_data;
    5648           0 :         struct drm_dp_mst_port *port =
    5649           0 :                 container_of(aux, struct drm_dp_mst_port, aux);
    5650             :         struct drm_dp_mst_branch *mstb;
    5651           0 :         struct drm_dp_mst_topology_mgr *mgr = port->mgr;
    5652             :         int ret;
    5653             : 
    5654           0 :         mstb = drm_dp_mst_topology_get_mstb_validated(mgr, port->parent);
    5655           0 :         if (!mstb)
    5656             :                 return -EREMOTEIO;
    5657             : 
    5658           0 :         if (remote_i2c_read_ok(msgs, num)) {
    5659           0 :                 ret = drm_dp_mst_i2c_read(mstb, port, msgs, num);
    5660           0 :         } else if (remote_i2c_write_ok(msgs, num)) {
    5661           0 :                 ret = drm_dp_mst_i2c_write(mstb, port, msgs, num);
    5662             :         } else {
    5663           0 :                 drm_dbg_kms(mgr->dev, "Unsupported I2C transaction for MST device\n");
    5664           0 :                 ret = -EIO;
    5665             :         }
    5666             : 
    5667           0 :         drm_dp_mst_topology_put_mstb(mstb);
    5668           0 :         return ret;
    5669             : }
    5670             : 
    5671           0 : static u32 drm_dp_mst_i2c_functionality(struct i2c_adapter *adapter)
    5672             : {
    5673           0 :         return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
    5674             :                I2C_FUNC_SMBUS_READ_BLOCK_DATA |
    5675             :                I2C_FUNC_SMBUS_BLOCK_PROC_CALL |
    5676             :                I2C_FUNC_10BIT_ADDR;
    5677             : }
    5678             : 
    5679             : static const struct i2c_algorithm drm_dp_mst_i2c_algo = {
    5680             :         .functionality = drm_dp_mst_i2c_functionality,
    5681             :         .master_xfer = drm_dp_mst_i2c_xfer,
    5682             : };
    5683             : 
    5684             : /**
    5685             :  * drm_dp_mst_register_i2c_bus() - register an I2C adapter for I2C-over-AUX
    5686             :  * @port: The port to add the I2C bus on
    5687             :  *
    5688             :  * Returns 0 on success or a negative error code on failure.
    5689             :  */
    5690           0 : static int drm_dp_mst_register_i2c_bus(struct drm_dp_mst_port *port)
    5691             : {
    5692           0 :         struct drm_dp_aux *aux = &port->aux;
    5693           0 :         struct device *parent_dev = port->mgr->dev->dev;
    5694             : 
    5695           0 :         aux->ddc.algo = &drm_dp_mst_i2c_algo;
    5696           0 :         aux->ddc.algo_data = aux;
    5697           0 :         aux->ddc.retries = 3;
    5698             : 
    5699           0 :         aux->ddc.class = I2C_CLASS_DDC;
    5700           0 :         aux->ddc.owner = THIS_MODULE;
    5701             :         /* FIXME: set the kdev of the port's connector as parent */
    5702           0 :         aux->ddc.dev.parent = parent_dev;
    5703           0 :         aux->ddc.dev.of_node = parent_dev->of_node;
    5704             : 
    5705           0 :         strlcpy(aux->ddc.name, aux->name ? aux->name : dev_name(parent_dev),
    5706             :                 sizeof(aux->ddc.name));
    5707             : 
    5708           0 :         return i2c_add_adapter(&aux->ddc);
    5709             : }
    5710             : 
    5711             : /**
    5712             :  * drm_dp_mst_unregister_i2c_bus() - unregister an I2C-over-AUX adapter
    5713             :  * @port: The port to remove the I2C bus from
    5714             :  */
    5715             : static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_mst_port *port)
    5716             : {
    5717           0 :         i2c_del_adapter(&port->aux.ddc);
    5718             : }
    5719             : 
    5720             : /**
    5721             :  * drm_dp_mst_is_virtual_dpcd() - Is the given port a virtual DP Peer Device
    5722             :  * @port: The port to check
    5723             :  *
    5724             :  * A single physical MST hub object can be represented in the topology
    5725             :  * by multiple branches, with virtual ports between those branches.
    5726             :  *
    5727             :  * As of DP1.4, An MST hub with internal (virtual) ports must expose
    5728             :  * certain DPCD registers over those ports. See sections 2.6.1.1.1
    5729             :  * and 2.6.1.1.2 of Display Port specification v1.4 for details.
    5730             :  *
    5731             :  * May acquire mgr->lock
    5732             :  *
    5733             :  * Returns:
    5734             :  * true if the port is a virtual DP peer device, false otherwise
    5735             :  */
    5736           0 : static bool drm_dp_mst_is_virtual_dpcd(struct drm_dp_mst_port *port)
    5737             : {
    5738             :         struct drm_dp_mst_port *downstream_port;
    5739             : 
    5740           0 :         if (!port || port->dpcd_rev < DP_DPCD_REV_14)
    5741             :                 return false;
    5742             : 
    5743             :         /* Virtual DP Sink (Internal Display Panel) */
    5744           0 :         if (port->port_num >= 8)
    5745             :                 return true;
    5746             : 
    5747             :         /* DP-to-HDMI Protocol Converter */
    5748           0 :         if (port->pdt == DP_PEER_DEVICE_DP_LEGACY_CONV &&
    5749           0 :             !port->mcs &&
    5750           0 :             port->ldps)
    5751             :                 return true;
    5752             : 
    5753             :         /* DP-to-DP */
    5754           0 :         mutex_lock(&port->mgr->lock);
    5755           0 :         if (port->pdt == DP_PEER_DEVICE_MST_BRANCHING &&
    5756           0 :             port->mstb &&
    5757           0 :             port->mstb->num_ports == 2) {
    5758           0 :                 list_for_each_entry(downstream_port, &port->mstb->ports, next) {
    5759           0 :                         if (downstream_port->pdt == DP_PEER_DEVICE_SST_SINK &&
    5760           0 :                             !downstream_port->input) {
    5761           0 :                                 mutex_unlock(&port->mgr->lock);
    5762           0 :                                 return true;
    5763             :                         }
    5764             :                 }
    5765             :         }
    5766           0 :         mutex_unlock(&port->mgr->lock);
    5767             : 
    5768           0 :         return false;
    5769             : }
    5770             : 
    5771             : /**
    5772             :  * drm_dp_mst_dsc_aux_for_port() - Find the correct aux for DSC
    5773             :  * @port: The port to check. A leaf of the MST tree with an attached display.
    5774             :  *
    5775             :  * Depending on the situation, DSC may be enabled via the endpoint aux,
    5776             :  * the immediately upstream aux, or the connector's physical aux.
    5777             :  *
    5778             :  * This is both the correct aux to read DSC_CAPABILITY and the
    5779             :  * correct aux to write DSC_ENABLED.
    5780             :  *
    5781             :  * This operation can be expensive (up to four aux reads), so
    5782             :  * the caller should cache the return.
    5783             :  *
    5784             :  * Returns:
    5785             :  * NULL if DSC cannot be enabled on this port, otherwise the aux device
    5786             :  */
    5787           0 : struct drm_dp_aux *drm_dp_mst_dsc_aux_for_port(struct drm_dp_mst_port *port)
    5788             : {
    5789             :         struct drm_dp_mst_port *immediate_upstream_port;
    5790             :         struct drm_dp_mst_port *fec_port;
    5791           0 :         struct drm_dp_desc desc = {};
    5792             :         u8 endpoint_fec;
    5793             :         u8 endpoint_dsc;
    5794             : 
    5795           0 :         if (!port)
    5796             :                 return NULL;
    5797             : 
    5798           0 :         if (port->parent->port_parent)
    5799           0 :                 immediate_upstream_port = port->parent->port_parent;
    5800             :         else
    5801             :                 immediate_upstream_port = NULL;
    5802             : 
    5803           0 :         fec_port = immediate_upstream_port;
    5804           0 :         while (fec_port) {
    5805             :                 /*
    5806             :                  * Each physical link (i.e. not a virtual port) between the
    5807             :                  * output and the primary device must support FEC
    5808             :                  */
    5809           0 :                 if (!drm_dp_mst_is_virtual_dpcd(fec_port) &&
    5810           0 :                     !fec_port->fec_capable)
    5811             :                         return NULL;
    5812             : 
    5813           0 :                 fec_port = fec_port->parent->port_parent;
    5814             :         }
    5815             : 
    5816             :         /* DP-to-DP peer device */
    5817           0 :         if (drm_dp_mst_is_virtual_dpcd(immediate_upstream_port)) {
    5818             :                 u8 upstream_dsc;
    5819             : 
    5820           0 :                 if (drm_dp_dpcd_read(&port->aux,
    5821             :                                      DP_DSC_SUPPORT, &endpoint_dsc, 1) != 1)
    5822             :                         return NULL;
    5823           0 :                 if (drm_dp_dpcd_read(&port->aux,
    5824             :                                      DP_FEC_CAPABILITY, &endpoint_fec, 1) != 1)
    5825             :                         return NULL;
    5826           0 :                 if (drm_dp_dpcd_read(&immediate_upstream_port->aux,
    5827             :                                      DP_DSC_SUPPORT, &upstream_dsc, 1) != 1)
    5828             :                         return NULL;
    5829             : 
    5830             :                 /* Enpoint decompression with DP-to-DP peer device */
    5831           0 :                 if ((endpoint_dsc & DP_DSC_DECOMPRESSION_IS_SUPPORTED) &&
    5832           0 :                     (endpoint_fec & DP_FEC_CAPABLE) &&
    5833           0 :                     (upstream_dsc & DP_DSC_PASSTHROUGH_IS_SUPPORTED)) {
    5834           0 :                         port->passthrough_aux = &immediate_upstream_port->aux;
    5835           0 :                         return &port->aux;
    5836             :                 }
    5837             : 
    5838             :                 /* Virtual DPCD decompression with DP-to-DP peer device */
    5839             :                 return &immediate_upstream_port->aux;
    5840             :         }
    5841             : 
    5842             :         /* Virtual DPCD decompression with DP-to-HDMI or Virtual DP Sink */
    5843           0 :         if (drm_dp_mst_is_virtual_dpcd(port))
    5844           0 :                 return &port->aux;
    5845             : 
    5846             :         /*
    5847             :          * Synaptics quirk
    5848             :          * Applies to ports for which:
    5849             :          * - Physical aux has Synaptics OUI
    5850             :          * - DPv1.4 or higher
    5851             :          * - Port is on primary branch device
    5852             :          * - Not a VGA adapter (DP_DWN_STRM_PORT_TYPE_ANALOG)
    5853             :          */
    5854           0 :         if (drm_dp_read_desc(port->mgr->aux, &desc, true))
    5855             :                 return NULL;
    5856             : 
    5857           0 :         if (drm_dp_has_quirk(&desc, DP_DPCD_QUIRK_DSC_WITHOUT_VIRTUAL_DPCD) &&
    5858           0 :             port->mgr->dpcd[DP_DPCD_REV] >= DP_DPCD_REV_14 &&
    5859           0 :             port->parent == port->mgr->mst_primary) {
    5860             :                 u8 dpcd_ext[DP_RECEIVER_CAP_SIZE];
    5861             : 
    5862           0 :                 if (drm_dp_read_dpcd_caps(port->mgr->aux, dpcd_ext) < 0)
    5863           0 :                         return NULL;
    5864             : 
    5865           0 :                 if ((dpcd_ext[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_PRESENT) &&
    5866             :                     ((dpcd_ext[DP_DOWNSTREAMPORT_PRESENT] & DP_DWN_STRM_PORT_TYPE_MASK)
    5867             :                      != DP_DWN_STRM_PORT_TYPE_ANALOG))
    5868           0 :                         return port->mgr->aux;
    5869             :         }
    5870             : 
    5871             :         /*
    5872             :          * The check below verifies if the MST sink
    5873             :          * connected to the GPU is capable of DSC -
    5874             :          * therefore the endpoint needs to be
    5875             :          * both DSC and FEC capable.
    5876             :          */
    5877           0 :         if (drm_dp_dpcd_read(&port->aux,
    5878             :            DP_DSC_SUPPORT, &endpoint_dsc, 1) != 1)
    5879             :                 return NULL;
    5880           0 :         if (drm_dp_dpcd_read(&port->aux,
    5881             :            DP_FEC_CAPABILITY, &endpoint_fec, 1) != 1)
    5882             :                 return NULL;
    5883           0 :         if ((endpoint_dsc & DP_DSC_DECOMPRESSION_IS_SUPPORTED) &&
    5884           0 :            (endpoint_fec & DP_FEC_CAPABLE))
    5885           0 :                 return &port->aux;
    5886             : 
    5887             :         return NULL;
    5888             : }
    5889             : EXPORT_SYMBOL(drm_dp_mst_dsc_aux_for_port);

Generated by: LCOV version 1.14