drm/i915/vrr: Reorder transcoder vs. vrr enable/disable
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 2 Dec 2022 13:44:11 +0000 (15:44 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Thu, 8 Dec 2022 19:33:52 +0000 (21:33 +0200)
On mtl it looks like disabling VRR after the transcoder has
been disabled can cause the pipe/transcoder to get stuck
when re-enabled in non-vrr mode. Reversing the order seems to
help.

Bspec is extremely confused about the VRR enable/disable sequence
anyway, and this now more closely matches the non-modeset VRR
sequence, whereas the full modeset sequence still claims that
the original order is fine. But since we eventually want to toggle
VRR without a full modeset anyway this seems like the better order
to follow.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20221202134412.21943-4-ville.syrjala@linux.intel.com
Reviewed-by: Manasi Navare <manasi.d.navare@intel.com>
drivers/gpu/drm/i915/display/intel_ddi.c

index 5f9a241..69595cb 100644 (file)
@@ -2726,10 +2726,10 @@ static void intel_ddi_post_disable(struct intel_atomic_state *state,
        if (!intel_crtc_has_type(old_crtc_state, INTEL_OUTPUT_DP_MST)) {
                intel_crtc_vblank_off(old_crtc_state);
 
-               intel_disable_transcoder(old_crtc_state);
-
                intel_vrr_disable(old_crtc_state);
 
+               intel_disable_transcoder(old_crtc_state);
+
                intel_ddi_disable_transcoder_func(old_crtc_state);
 
                intel_dsc_disable(old_crtc_state);
@@ -2946,13 +2946,13 @@ static void intel_enable_ddi(struct intel_atomic_state *state,
        if (!intel_crtc_is_bigjoiner_slave(crtc_state))
                intel_ddi_enable_transcoder_func(encoder, crtc_state);
 
-       intel_vrr_enable(encoder, crtc_state);
-
        /* Enable/Disable DP2.0 SDP split config before transcoder */
        intel_audio_sdp_split_update(encoder, crtc_state);
 
        intel_enable_transcoder(crtc_state);
 
+       intel_vrr_enable(encoder, crtc_state);
+
        intel_crtc_vblank_on(crtc_state);
 
        if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_HDMI))