OSDN Git Service

drm/amd/display: Move drm_dp_mst_atomic_check() to the front of dc_validate_global_st...
authorZhan Liu <zhan.liu@amd.com>
Tue, 28 Jan 2020 21:38:53 +0000 (16:38 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Thu, 30 Jan 2020 22:15:43 +0000 (17:15 -0500)
[Why]
Need to do atomic check first, then validate global state.
If not, when connecting both MST and HDMI displays and
set a bad mode via xrandr, system will hang.

[How]
Move drm_dp_mst_atomic_check() to the front of
dc_validate_global_state().

Signed-off-by: Zhan Liu <zhan.liu@amd.com>
Reviewed-by: Mikita Lipski <mikita.lipski@amd.com>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c

index 2ac3498..2795415 100644 (file)
@@ -8167,6 +8167,16 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                        goto fail;
 #endif
 
+               /*
+                * Perform validation of MST topology in the state:
+                * We need to perform MST atomic check before calling
+                * dc_validate_global_state(), or there is a chance
+                * to get stuck in an infinite loop and hang eventually.
+                */
+               ret = drm_dp_mst_atomic_check(state);
+               if (ret)
+                       goto fail;
+
                if (dc_validate_global_state(dc, dm_state->context, false) != DC_OK) {
                        ret = -EINVAL;
                        goto fail;
@@ -8195,10 +8205,6 @@ static int amdgpu_dm_atomic_check(struct drm_device *dev,
                                dc_retain_state(old_dm_state->context);
                }
        }
-       /* Perform validation of MST topology in the state*/
-       ret = drm_dp_mst_atomic_check(state);
-       if (ret)
-               goto fail;
 
        /* Store the overall update type for use later in atomic check. */
        for_each_new_crtc_in_state (state, crtc, new_crtc_state, i) {