static void drm_dp_mst_unregister_i2c_bus(struct drm_dp_mst_port *port);
 static void drm_dp_mst_kick_tx(struct drm_dp_mst_topology_mgr *mgr);
 
+static bool drm_dp_mst_port_downstream_of_branch(struct drm_dp_mst_port *port,
+                                                struct drm_dp_mst_branch *branch);
+
 #define DBG_PREFIX "[dp_mst]"
 
 #define DP_STR(x) [DP_ ## x] = #x
        struct drm_dp_mst_port *port;
        int i, j;
        int cur_slots = 1;
+       bool skip;
 
        mutex_lock(&mgr->payload_lock);
        for (i = 0; i < mgr->max_payloads; i++) {
                        port = container_of(vcpi, struct drm_dp_mst_port,
                                            vcpi);
 
+                       mutex_lock(&mgr->lock);
+                       skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary);
+                       mutex_unlock(&mgr->lock);
+
+                       if (skip) {
+                               drm_dbg_kms("Virtual channel %d is not in current topology\n", i);
+                               continue;
+                       }
                        /* Validated ports don't matter if we're releasing
                         * VCPI
                         */
        struct drm_dp_mst_port *port;
        int i;
        int ret = 0;
+       bool skip;
 
        mutex_lock(&mgr->payload_lock);
        for (i = 0; i < mgr->max_payloads; i++) {
 
                port = container_of(mgr->proposed_vcpis[i], struct drm_dp_mst_port, vcpi);
 
+               mutex_lock(&mgr->lock);
+               skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary);
+               mutex_unlock(&mgr->lock);
+
+               if (skip)
+                       continue;
+
                drm_dbg_kms(mgr->dev, "payload %d %d\n", i, mgr->payloads[i].payload_state);
                if (mgr->payloads[i].payload_state == DP_PAYLOAD_LOCAL) {
                        ret = drm_dp_create_payload_step2(mgr, port, mgr->proposed_vcpis[i]->vcpi, &mgr->payloads[i]);
 void drm_dp_mst_deallocate_vcpi(struct drm_dp_mst_topology_mgr *mgr,
                                struct drm_dp_mst_port *port)
 {
+       bool skip;
+
        if (!port->vcpi.vcpi)
                return;
 
+       mutex_lock(&mgr->lock);
+       skip = !drm_dp_mst_port_downstream_of_branch(port, mgr->mst_primary);
+       mutex_unlock(&mgr->lock);
+
+       if (skip)
+               return;
+
        drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi);
        port->vcpi.num_slots = 0;
        port->vcpi.pbn = 0;