drm/dp_mst: Do not set proposed vcpi directly
authorjsg <jsg@openbsd.org>
Wed, 21 Jul 2021 00:57:36 +0000 (00:57 +0000)
committerjsg <jsg@openbsd.org>
Wed, 21 Jul 2021 00:57:36 +0000 (00:57 +0000)
From Wayne Lin
3462bc8b1a1f1b507804d33d118402235e8a1fab in linux 5.10.y/5.10.52
35d3e8cb35e75450f87f87e3d314e2d418b6954b in mainline linux

sys/dev/pci/drm/drm_dp_mst_topology.c

index ebb6322..02ed709 100644 (file)
@@ -2509,7 +2509,7 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
 {
        struct drm_dp_mst_topology_mgr *mgr = mstb->mgr;
        struct drm_dp_mst_port *port;
-       int old_ddps, old_input, ret, i;
+       int old_ddps, ret;
        u8 new_pdt;
        bool new_mcs;
        bool dowork = false, create_connector = false;
@@ -2541,7 +2541,6 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
        }
 
        old_ddps = port->ddps;
-       old_input = port->input;
        port->input = conn_stat->input_port;
        port->ldps = conn_stat->legacy_device_plug_status;
        port->ddps = conn_stat->displayport_device_plug_status;
@@ -2564,28 +2563,6 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
                dowork = false;
        }
 
-       if (!old_input && old_ddps != port->ddps && !port->ddps) {
-               for (i = 0; i < mgr->max_payloads; i++) {
-                       struct drm_dp_vcpi *vcpi = mgr->proposed_vcpis[i];
-                       struct drm_dp_mst_port *port_validated;
-
-                       if (!vcpi)
-                               continue;
-
-                       port_validated =
-                               container_of(vcpi, struct drm_dp_mst_port, vcpi);
-                       port_validated =
-                               drm_dp_mst_topology_get_port_validated(mgr, port_validated);
-                       if (!port_validated) {
-                               mutex_lock(&mgr->payload_lock);
-                               vcpi->num_slots = 0;
-                               mutex_unlock(&mgr->payload_lock);
-                       } else {
-                               drm_dp_mst_topology_put_port(port_validated);
-                       }
-               }
-       }
-
        if (port->connector)
                drm_modeset_unlock(&mgr->base.lock);
        else if (create_connector)
@@ -3416,8 +3393,15 @@ int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr)
                                port = drm_dp_mst_topology_get_port_validated(
                                    mgr, port);
                                if (!port) {
-                                       mutex_unlock(&mgr->payload_lock);
-                                       return -EINVAL;
+                                       if (vcpi->num_slots == payload->num_slots) {
+                                               cur_slots += vcpi->num_slots;
+                                               payload->start_slot = req_payload.start_slot;
+                                               continue;
+                                       } else {
+                                               drm_dbg_kms("Fail:set payload to invalid sink");
+                                               mutex_unlock(&mgr->payload_lock);
+                                               return -EINVAL;
+                                       }
                                }
                                put_port = true;
                        }