drm/amd/display: fix trigger_hotplug to support mst case
authorWayne Lin <Wayne.Lin@amd.com>
Tue, 17 Aug 2021 10:14:42 +0000 (18:14 +0800)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 20 Jul 2022 20:04:35 +0000 (16:04 -0400)
[Why & How]
Correct few problems below to have debugfs trigger_hotplug entry
supports mst case

* Adjust the place for acquiring the hpd_lock. We'll also access
  dc_link when simulate unplug
* When detect the connector is a mst root, call
  reset_cur_dp_mst_topology() to simulate unplug
* Don't support hotplug caused by CSN message since we can't change
  mst topology info directly. We can't simulate that
* Clean up redundant code

Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
Reviewed-by: Hersen Wu <hersenxs.wu@amd.com>
Acked-by: Alan Liu <HaoPing.Liu@amd.com>
Signed-off-by: Wayne Lin <Wayne.Lin@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c

index a1f40d0cd41cf97a912d580f7a8ca810c28b28fa..e0ea350784e3a67933765f91eb6fd0816bd53da8 100644 (file)
@@ -1256,14 +1256,22 @@ static ssize_t trigger_hotplug(struct file *f, const char __user *buf,
                return -EINVAL;
        }
 
+       kfree(wr_buf);
+
        if (param_nums <= 0) {
                DRM_DEBUG_DRIVER("user data not be read\n");
-               kfree(wr_buf);
+               return -EINVAL;
+       }
+
+       mutex_lock(&aconnector->hpd_lock);
+
+       /* Don't support for mst end device*/
+       if (aconnector->mst_port) {
+               mutex_unlock(&aconnector->hpd_lock);
                return -EINVAL;
        }
 
        if (param[0] == 1) {
-               mutex_lock(&aconnector->hpd_lock);
 
                if (!dc_link_detect_sink(aconnector->dc_link, &new_connection_type) &&
                        new_connection_type != dc_connection_none)
@@ -1300,6 +1308,10 @@ static ssize_t trigger_hotplug(struct file *f, const char __user *buf,
 
                amdgpu_dm_update_connector_after_detect(aconnector);
 
+               /* If the aconnector is the root node in mst topology */
+               if (aconnector->mst_mgr.mst_state == true)
+                       reset_cur_dp_mst_topology(link);
+
                drm_modeset_lock_all(dev);
                dm_restore_drm_connector_state(dev, connector);
                drm_modeset_unlock_all(dev);
@@ -1310,7 +1322,6 @@ static ssize_t trigger_hotplug(struct file *f, const char __user *buf,
 unlock:
        mutex_unlock(&aconnector->hpd_lock);
 
-       kfree(wr_buf);
        return size;
 }