@@ -94,6 +94,9 @@ static int drm_dp_mst_register_i2c_bus(struct drm_dp_mst_port *port);
9494static void drm_dp_mst_unregister_i2c_bus (struct drm_dp_mst_port * port );
9595static void drm_dp_mst_kick_tx (struct drm_dp_mst_topology_mgr * mgr );
9696
97+ static bool drm_dp_mst_port_downstream_of_branch (struct drm_dp_mst_port * port ,
98+ struct drm_dp_mst_branch * branch );
99+
97100#define DBG_PREFIX "[dp_mst]"
98101
99102#define DP_STR (x ) [DP_ ## x] = #x
@@ -2501,7 +2504,7 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
25012504{
25022505 struct drm_dp_mst_topology_mgr * mgr = mstb -> mgr ;
25032506 struct drm_dp_mst_port * port ;
2504- int old_ddps , old_input , ret , i ;
2507+ int old_ddps , ret ;
25052508 u8 new_pdt ;
25062509 bool new_mcs ;
25072510 bool dowork = false, create_connector = false;
@@ -2533,7 +2536,6 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
25332536 }
25342537
25352538 old_ddps = port -> ddps ;
2536- old_input = port -> input ;
25372539 port -> input = conn_stat -> input_port ;
25382540 port -> ldps = conn_stat -> legacy_device_plug_status ;
25392541 port -> ddps = conn_stat -> displayport_device_plug_status ;
@@ -2555,28 +2557,6 @@ drm_dp_mst_handle_conn_stat(struct drm_dp_mst_branch *mstb,
25552557 dowork = false;
25562558 }
25572559
2558- if (!old_input && old_ddps != port -> ddps && !port -> ddps ) {
2559- for (i = 0 ; i < mgr -> max_payloads ; i ++ ) {
2560- struct drm_dp_vcpi * vcpi = mgr -> proposed_vcpis [i ];
2561- struct drm_dp_mst_port * port_validated ;
2562-
2563- if (!vcpi )
2564- continue ;
2565-
2566- port_validated =
2567- container_of (vcpi , struct drm_dp_mst_port , vcpi );
2568- port_validated =
2569- drm_dp_mst_topology_get_port_validated (mgr , port_validated );
2570- if (!port_validated ) {
2571- mutex_lock (& mgr -> payload_lock );
2572- vcpi -> num_slots = 0 ;
2573- mutex_unlock (& mgr -> payload_lock );
2574- } else {
2575- drm_dp_mst_topology_put_port (port_validated );
2576- }
2577- }
2578- }
2579-
25802560 if (port -> connector )
25812561 drm_modeset_unlock (& mgr -> base .lock );
25822562 else if (create_connector )
@@ -3389,6 +3369,7 @@ int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr)
33893369 struct drm_dp_mst_port * port ;
33903370 int i , j ;
33913371 int cur_slots = 1 ;
3372+ bool skip ;
33923373
33933374 mutex_lock (& mgr -> payload_lock );
33943375 for (i = 0 ; i < mgr -> max_payloads ; i ++ ) {
@@ -3403,15 +3384,33 @@ int drm_dp_update_payload_part1(struct drm_dp_mst_topology_mgr *mgr)
34033384 port = container_of (vcpi , struct drm_dp_mst_port ,
34043385 vcpi );
34053386
3387+ mutex_lock (& mgr -> lock );
3388+ skip = !drm_dp_mst_port_downstream_of_branch (port , mgr -> mst_primary );
3389+ mutex_unlock (& mgr -> lock );
3390+
3391+ if (skip ) {
3392+ drm_dbg_kms (mgr -> dev ,
3393+ "Virtual channel %d is not in current topology\n" ,
3394+ i );
3395+ continue ;
3396+ }
34063397 /* Validated ports don't matter if we're releasing
34073398 * VCPI
34083399 */
34093400 if (vcpi -> num_slots ) {
34103401 port = drm_dp_mst_topology_get_port_validated (
34113402 mgr , port );
34123403 if (!port ) {
3413- mutex_unlock (& mgr -> payload_lock );
3414- return - EINVAL ;
3404+ if (vcpi -> num_slots == payload -> num_slots ) {
3405+ cur_slots += vcpi -> num_slots ;
3406+ payload -> start_slot = req_payload .start_slot ;
3407+ continue ;
3408+ } else {
3409+ drm_dbg_kms (mgr -> dev ,
3410+ "Fail:set payload to invalid sink" );
3411+ mutex_unlock (& mgr -> payload_lock );
3412+ return - EINVAL ;
3413+ }
34153414 }
34163415 put_port = true;
34173416 }
@@ -3495,6 +3494,7 @@ int drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr)
34953494 struct drm_dp_mst_port * port ;
34963495 int i ;
34973496 int ret = 0 ;
3497+ bool skip ;
34983498
34993499 mutex_lock (& mgr -> payload_lock );
35003500 for (i = 0 ; i < mgr -> max_payloads ; i ++ ) {
@@ -3504,6 +3504,13 @@ int drm_dp_update_payload_part2(struct drm_dp_mst_topology_mgr *mgr)
35043504
35053505 port = container_of (mgr -> proposed_vcpis [i ], struct drm_dp_mst_port , vcpi );
35063506
3507+ mutex_lock (& mgr -> lock );
3508+ skip = !drm_dp_mst_port_downstream_of_branch (port , mgr -> mst_primary );
3509+ mutex_unlock (& mgr -> lock );
3510+
3511+ if (skip )
3512+ continue ;
3513+
35073514 drm_dbg_kms (mgr -> dev , "payload %d %d\n" , i , mgr -> payloads [i ].payload_state );
35083515 if (mgr -> payloads [i ].payload_state == DP_PAYLOAD_LOCAL ) {
35093516 ret = drm_dp_create_payload_step2 (mgr , port , mgr -> proposed_vcpis [i ]-> vcpi , & mgr -> payloads [i ]);
@@ -4590,9 +4597,18 @@ EXPORT_SYMBOL(drm_dp_mst_reset_vcpi_slots);
45904597void drm_dp_mst_deallocate_vcpi (struct drm_dp_mst_topology_mgr * mgr ,
45914598 struct drm_dp_mst_port * port )
45924599{
4600+ bool skip ;
4601+
45934602 if (!port -> vcpi .vcpi )
45944603 return ;
45954604
4605+ mutex_lock (& mgr -> lock );
4606+ skip = !drm_dp_mst_port_downstream_of_branch (port , mgr -> mst_primary );
4607+ mutex_unlock (& mgr -> lock );
4608+
4609+ if (skip )
4610+ return ;
4611+
45964612 drm_dp_mst_put_payload_id (mgr , port -> vcpi .vcpi );
45974613 port -> vcpi .num_slots = 0 ;
45984614 port -> vcpi .pbn = 0 ;
0 commit comments