Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/amd/display: Enable mst when it's detected but yet to be initialized

[Why]
drm_dp_mst_topology_queue_probe() is used under the assumption that
mst is already initialized. If we connect system with SST first
then switch to the mst branch during suspend, we will fail probing
topology by calling the wrong API since the mst manager is yet to
be initialized.

[How]
At dm_resume(), once it's detected as mst branc connected, check if
the mst is initialized already. If not, call
dm_helpers_dp_mst_start_top_mgr() instead to initialize mst

V2: Adjust the commit msg a bit

Fixes: bc068194f548 ("drm/amd/display: Don't write DP_MSTM_CTRL after LT")
Cc: Fangzhi Zuo <jerry.zuo@amd.com>
Cc: Mario Limonciello <mario.limonciello@amd.com>
Cc: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Tom Chung <chiahsuan.chung@amd.com>
Signed-off-by: Wayne Lin <Wayne.Lin@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Wayne Lin and committed by
Alex Deucher
62320fb8 e1ca536e

+9 -1
+9 -1
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
··· 3624 3624 /* Do mst topology probing after resuming cached state*/ 3625 3625 drm_connector_list_iter_begin(ddev, &iter); 3626 3626 drm_for_each_connector_iter(connector, &iter) { 3627 + bool init = false; 3627 3628 3628 3629 if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK) 3629 3630 continue; ··· 3634 3633 aconnector->mst_root) 3635 3634 continue; 3636 3635 3637 - drm_dp_mst_topology_queue_probe(&aconnector->mst_mgr); 3636 + scoped_guard(mutex, &aconnector->mst_mgr.lock) { 3637 + init = !aconnector->mst_mgr.mst_primary; 3638 + } 3639 + if (init) 3640 + dm_helpers_dp_mst_start_top_mgr(aconnector->dc_link->ctx, 3641 + aconnector->dc_link, false); 3642 + else 3643 + drm_dp_mst_topology_queue_probe(&aconnector->mst_mgr); 3638 3644 } 3639 3645 drm_connector_list_iter_end(&iter); 3640 3646