aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/drm_dp_mst_topology.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/drm_dp_mst_topology.c')
-rw-r--r--drivers/gpu/drm/drm_dp_mst_topology.c37
1 files changed, 18 insertions, 19 deletions
diff --git a/drivers/gpu/drm/drm_dp_mst_topology.c b/drivers/gpu/drm/drm_dp_mst_topology.c
index 8ae13de272c4..27fbd79d0daf 100644
--- a/drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/drivers/gpu/drm/drm_dp_mst_topology.c
@@ -1159,11 +1159,13 @@ static void drm_dp_add_port(struct drm_dp_mst_branch *mstb,
1159 drm_dp_put_port(port); 1159 drm_dp_put_port(port);
1160 goto out; 1160 goto out;
1161 } 1161 }
1162 1162 if (port->port_num >= DP_MST_LOGICAL_PORT_0) {
1163 drm_mode_connector_set_tile_property(port->connector); 1163 port->cached_edid = drm_get_edid(port->connector, &port->aux.ddc);
1164 1164 drm_mode_connector_set_tile_property(port->connector);
1165 }
1165 (*mstb->mgr->cbs->register_connector)(port->connector); 1166 (*mstb->mgr->cbs->register_connector)(port->connector);
1166 } 1167 }
1168
1167out: 1169out:
1168 /* put reference to this port */ 1170 /* put reference to this port */
1169 drm_dp_put_port(port); 1171 drm_dp_put_port(port);
@@ -1188,8 +1190,8 @@ static void drm_dp_update_port(struct drm_dp_mst_branch *mstb,
1188 port->ddps = conn_stat->displayport_device_plug_status; 1190 port->ddps = conn_stat->displayport_device_plug_status;
1189 1191
1190 if (old_ddps != port->ddps) { 1192 if (old_ddps != port->ddps) {
1191 dowork = true;
1192 if (port->ddps) { 1193 if (port->ddps) {
1194 dowork = true;
1193 } else { 1195 } else {
1194 port->available_pbn = 0; 1196 port->available_pbn = 0;
1195 } 1197 }
@@ -1294,13 +1296,8 @@ static void drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *m
1294 if (port->input) 1296 if (port->input)
1295 continue; 1297 continue;
1296 1298
1297 if (!port->ddps) { 1299 if (!port->ddps)
1298 if (port->cached_edid) {
1299 kfree(port->cached_edid);
1300 port->cached_edid = NULL;
1301 }
1302 continue; 1300 continue;
1303 }
1304 1301
1305 if (!port->available_pbn) 1302 if (!port->available_pbn)
1306 drm_dp_send_enum_path_resources(mgr, mstb, port); 1303 drm_dp_send_enum_path_resources(mgr, mstb, port);
@@ -1311,12 +1308,6 @@ static void drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *m
1311 drm_dp_check_and_send_link_address(mgr, mstb_child); 1308 drm_dp_check_and_send_link_address(mgr, mstb_child);
1312 drm_dp_put_mst_branch_device(mstb_child); 1309 drm_dp_put_mst_branch_device(mstb_child);
1313 } 1310 }
1314 } else if (port->pdt == DP_PEER_DEVICE_SST_SINK ||
1315 port->pdt == DP_PEER_DEVICE_DP_LEGACY_CONV) {
1316 if (!port->cached_edid) {
1317 port->cached_edid =
1318 drm_get_edid(port->connector, &port->aux.ddc);
1319 }
1320 } 1311 }
1321 } 1312 }
1322} 1313}
@@ -1336,8 +1327,6 @@ static void drm_dp_mst_link_probe_work(struct work_struct *work)
1336 drm_dp_check_and_send_link_address(mgr, mstb); 1327 drm_dp_check_and_send_link_address(mgr, mstb);
1337 drm_dp_put_mst_branch_device(mstb); 1328 drm_dp_put_mst_branch_device(mstb);
1338 } 1329 }
1339
1340 (*mgr->cbs->hotplug)(mgr);
1341} 1330}
1342 1331
1343static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr, 1332static bool drm_dp_validate_guid(struct drm_dp_mst_topology_mgr *mgr,
@@ -1597,6 +1586,7 @@ static void drm_dp_send_link_address(struct drm_dp_mst_topology_mgr *mgr,
1597 for (i = 0; i < txmsg->reply.u.link_addr.nports; i++) { 1586 for (i = 0; i < txmsg->reply.u.link_addr.nports; i++) {
1598 drm_dp_add_port(mstb, mgr->dev, &txmsg->reply.u.link_addr.ports[i]); 1587 drm_dp_add_port(mstb, mgr->dev, &txmsg->reply.u.link_addr.ports[i]);
1599 } 1588 }
1589 (*mgr->cbs->hotplug)(mgr);
1600 } 1590 }
1601 } else { 1591 } else {
1602 mstb->link_address_sent = false; 1592 mstb->link_address_sent = false;
@@ -2293,6 +2283,8 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr)
2293 drm_dp_update_port(mstb, &msg.u.conn_stat); 2283 drm_dp_update_port(mstb, &msg.u.conn_stat);
2294 2284
2295 DRM_DEBUG_KMS("Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n", msg.u.conn_stat.port_number, msg.u.conn_stat.legacy_device_plug_status, msg.u.conn_stat.displayport_device_plug_status, msg.u.conn_stat.message_capability_status, msg.u.conn_stat.input_port, msg.u.conn_stat.peer_device_type); 2285 DRM_DEBUG_KMS("Got CSN: pn: %d ldps:%d ddps: %d mcs: %d ip: %d pdt: %d\n", msg.u.conn_stat.port_number, msg.u.conn_stat.legacy_device_plug_status, msg.u.conn_stat.displayport_device_plug_status, msg.u.conn_stat.message_capability_status, msg.u.conn_stat.input_port, msg.u.conn_stat.peer_device_type);
2286 (*mgr->cbs->hotplug)(mgr);
2287
2296 } else if (msg.req_type == DP_RESOURCE_STATUS_NOTIFY) { 2288 } else if (msg.req_type == DP_RESOURCE_STATUS_NOTIFY) {
2297 drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false); 2289 drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false);
2298 if (!mstb) 2290 if (!mstb)
@@ -2379,6 +2371,10 @@ enum drm_connector_status drm_dp_mst_detect_port(struct drm_connector *connector
2379 2371
2380 case DP_PEER_DEVICE_SST_SINK: 2372 case DP_PEER_DEVICE_SST_SINK:
2381 status = connector_status_connected; 2373 status = connector_status_connected;
2374 /* for logical ports - cache the EDID */
2375 if (port->port_num >= 8 && !port->cached_edid) {
2376 port->cached_edid = drm_get_edid(connector, &port->aux.ddc);
2377 }
2382 break; 2378 break;
2383 case DP_PEER_DEVICE_DP_LEGACY_CONV: 2379 case DP_PEER_DEVICE_DP_LEGACY_CONV:
2384 if (port->ldps) 2380 if (port->ldps)
@@ -2433,7 +2429,10 @@ struct edid *drm_dp_mst_get_edid(struct drm_connector *connector, struct drm_dp_
2433 2429
2434 if (port->cached_edid) 2430 if (port->cached_edid)
2435 edid = drm_edid_duplicate(port->cached_edid); 2431 edid = drm_edid_duplicate(port->cached_edid);
2436 2432 else {
2433 edid = drm_get_edid(connector, &port->aux.ddc);
2434 drm_mode_connector_set_tile_property(connector);
2435 }
2437 port->has_audio = drm_detect_monitor_audio(edid); 2436 port->has_audio = drm_detect_monitor_audio(edid);
2438 drm_dp_put_port(port); 2437 drm_dp_put_port(port);
2439 return edid; 2438 return edid;