From: Wayne Lin <wayne....@amd.com>

[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

Reviewed-by: Hersen Wu <hersenxs...@amd.com>
Acked-by: Alan Liu <haoping....@amd.com>
Signed-off-by: Wayne Lin <wayne....@amd.com>
---
 .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c   | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c 
b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
index e0646db6fdbf..b764198eca5c 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
@@ -1273,14 +1273,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)
@@ -1317,6 +1325,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);
@@ -1327,7 +1339,6 @@ static ssize_t trigger_hotplug(struct file *f, const char 
__user *buf,
 unlock:
        mutex_unlock(&aconnector->hpd_lock);
 
-       kfree(wr_buf);
        return size;
 }
 
-- 
2.37.0

Reply via email to