Loading drivers/gpu/drm/drm_dp_mst_topology.c +47 −2 Original line number Diff line number Diff line Loading @@ -1176,6 +1176,14 @@ static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, port->aux.dev = dev->dev; created = true; } else { if (port->pdt == DP_PEER_DEVICE_DP_LEGACY_CONV || port->pdt == DP_PEER_DEVICE_SST_SINK) { if (!port->cached_edid) port->cached_edid = drm_get_edid( port->connector, &port->aux.ddc); } old_pdt = port->pdt; old_ddps = port->ddps; } Loading Loading @@ -1249,6 +1257,7 @@ static void drm_dp_update_port(struct drm_dp_mst_branch *mstb, int old_pdt; int old_ddps; bool dowork = false; bool dohotplug = false; port = drm_dp_get_port(mstb, conn_stat->port_number); if (!port) return; Loading @@ -1273,6 +1282,7 @@ static void drm_dp_update_port(struct drm_dp_mst_branch *mstb, port->port_num < DP_MST_LOGICAL_PORT_0) { kfree(port->cached_edid); port->cached_edid = NULL; dohotplug = true; } drm_dp_port_teardown_pdt(port, old_pdt); Loading @@ -1285,6 +1295,8 @@ static void drm_dp_update_port(struct drm_dp_mst_branch *mstb, if (dowork) queue_work(system_long_wq, &mstb->mgr->work); if (dohotplug) (*mstb->mgr->cbs->hotplug)(mstb->mgr); } static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device(struct drm_dp_mst_topology_mgr *mgr, Loading Loading @@ -1365,6 +1377,40 @@ static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device_by_guid( return mstb; } static void drm_dp_reset_sink_mstb_link_address_sent( struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb) { struct drm_dp_mst_port *port; struct drm_dp_mst_branch *mstb_child; struct drm_dp_mst_branch *mstb_parent; list_for_each_entry(port, &mstb->ports, next) { if (port->input) continue; if (!port->ddps) continue; if (port->mstb) { mstb_child = drm_dp_get_validated_mstb_ref(mgr, port->mstb); if (mstb_child) { drm_dp_reset_sink_mstb_link_address_sent(mgr, mstb_child); drm_dp_put_mst_branch_device(mstb_child); } } else { mstb_parent = drm_dp_get_validated_mstb_ref(mgr, port->parent); if (mstb_parent) { mstb_parent->link_address_sent = false; drm_dp_put_mst_branch_device(mstb_parent); } } } } static void drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb) { Loading Loading @@ -1405,6 +1451,7 @@ static void drm_dp_mst_link_probe_work(struct work_struct *work) } mutex_unlock(&mgr->lock); if (mstb) { drm_dp_reset_sink_mstb_link_address_sent(mgr, mstb); drm_dp_check_and_send_link_address(mgr, mstb); drm_dp_put_mst_branch_device(mstb); } Loading Loading @@ -2568,8 +2615,6 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) drm_dp_update_port(mstb, &msg.u.conn_stat); 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); (*mgr->cbs->hotplug)(mgr); } else if (msg.req_type == DP_RESOURCE_STATUS_NOTIFY) { drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false); if (!mstb) Loading Loading
drivers/gpu/drm/drm_dp_mst_topology.c +47 −2 Original line number Diff line number Diff line Loading @@ -1176,6 +1176,14 @@ static void drm_dp_add_port(struct drm_dp_mst_branch *mstb, port->aux.dev = dev->dev; created = true; } else { if (port->pdt == DP_PEER_DEVICE_DP_LEGACY_CONV || port->pdt == DP_PEER_DEVICE_SST_SINK) { if (!port->cached_edid) port->cached_edid = drm_get_edid( port->connector, &port->aux.ddc); } old_pdt = port->pdt; old_ddps = port->ddps; } Loading Loading @@ -1249,6 +1257,7 @@ static void drm_dp_update_port(struct drm_dp_mst_branch *mstb, int old_pdt; int old_ddps; bool dowork = false; bool dohotplug = false; port = drm_dp_get_port(mstb, conn_stat->port_number); if (!port) return; Loading @@ -1273,6 +1282,7 @@ static void drm_dp_update_port(struct drm_dp_mst_branch *mstb, port->port_num < DP_MST_LOGICAL_PORT_0) { kfree(port->cached_edid); port->cached_edid = NULL; dohotplug = true; } drm_dp_port_teardown_pdt(port, old_pdt); Loading @@ -1285,6 +1295,8 @@ static void drm_dp_update_port(struct drm_dp_mst_branch *mstb, if (dowork) queue_work(system_long_wq, &mstb->mgr->work); if (dohotplug) (*mstb->mgr->cbs->hotplug)(mstb->mgr); } static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device(struct drm_dp_mst_topology_mgr *mgr, Loading Loading @@ -1365,6 +1377,40 @@ static struct drm_dp_mst_branch *drm_dp_get_mst_branch_device_by_guid( return mstb; } static void drm_dp_reset_sink_mstb_link_address_sent( struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb) { struct drm_dp_mst_port *port; struct drm_dp_mst_branch *mstb_child; struct drm_dp_mst_branch *mstb_parent; list_for_each_entry(port, &mstb->ports, next) { if (port->input) continue; if (!port->ddps) continue; if (port->mstb) { mstb_child = drm_dp_get_validated_mstb_ref(mgr, port->mstb); if (mstb_child) { drm_dp_reset_sink_mstb_link_address_sent(mgr, mstb_child); drm_dp_put_mst_branch_device(mstb_child); } } else { mstb_parent = drm_dp_get_validated_mstb_ref(mgr, port->parent); if (mstb_parent) { mstb_parent->link_address_sent = false; drm_dp_put_mst_branch_device(mstb_parent); } } } } static void drm_dp_check_and_send_link_address(struct drm_dp_mst_topology_mgr *mgr, struct drm_dp_mst_branch *mstb) { Loading Loading @@ -1405,6 +1451,7 @@ static void drm_dp_mst_link_probe_work(struct work_struct *work) } mutex_unlock(&mgr->lock); if (mstb) { drm_dp_reset_sink_mstb_link_address_sent(mgr, mstb); drm_dp_check_and_send_link_address(mgr, mstb); drm_dp_put_mst_branch_device(mstb); } Loading Loading @@ -2568,8 +2615,6 @@ static int drm_dp_mst_handle_up_req(struct drm_dp_mst_topology_mgr *mgr) drm_dp_update_port(mstb, &msg.u.conn_stat); 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); (*mgr->cbs->hotplug)(mgr); } else if (msg.req_type == DP_RESOURCE_STATUS_NOTIFY) { drm_dp_send_up_ack_reply(mgr, mgr->mst_primary, msg.req_type, seqno, false); if (!mstb) Loading