drm/i915/dp: Fix disabling the transcoder function in 128b/132b mode
authorImre Deak <imre.deak@intel.com>
Mon, 17 Feb 2025 22:38:28 +0000 (00:38 +0200)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Wed, 19 Feb 2025 19:41:40 +0000 (14:41 -0500)
During disabling the transcoder in DP 128b/132b mode (both in case of an
MST master transcoder and in case of SST) the transcoder function must
be first disabled without changing any other field in the register (in
particular leaving the DDI port and mode select fields unchanged) and
clearing the DDI port and mode select fields separately, later during
the disabling sequences. Fix the sequence accordingly.

Bspec: 54128, 65448, 68849
Cc: Jani Nikula <jani.nikula@intel.com>
Fixes: 79a6734cd56e ("drm/i915/ddi: disable trancoder port select for 128b/132b SST")
Signed-off-by: Imre Deak <imre.deak@intel.com>
Reviewed-by: Jani Nikula <jani.nikula@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250217223828.1166093-3-imre.deak@intel.com
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/i915/display/intel_ddi.c

index 0a9ea34f0215aac1356685695377af368d1491e6..5fe68943074421bb5f484cd21038b18c2051f76e 100644 (file)
@@ -681,7 +681,6 @@ void intel_ddi_disable_transcoder_func(const struct intel_crtc_state *crtc_state
        struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
        struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
        enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
-       bool is_mst = intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST);
        u32 ctl;
 
        if (DISPLAY_VER(dev_priv) >= 11)
@@ -701,8 +700,7 @@ void intel_ddi_disable_transcoder_func(const struct intel_crtc_state *crtc_state
                         TRANS_DDI_PORT_SYNC_MASTER_SELECT_MASK);
 
        if (DISPLAY_VER(dev_priv) >= 12) {
-               if (!intel_dp_mst_is_master_trans(crtc_state) ||
-                   (!is_mst && intel_dp_is_uhbr(crtc_state))) {
+               if (!intel_dp_mst_is_master_trans(crtc_state)) {
                        ctl &= ~(TGL_TRANS_DDI_PORT_MASK |
                                 TRANS_DDI_MODE_SELECT_MASK);
                }
@@ -3134,7 +3132,7 @@ static void intel_ddi_post_disable_dp(struct intel_atomic_state *state,
        intel_dp_set_power(intel_dp, DP_SET_POWER_D3);
 
        if (DISPLAY_VER(dev_priv) >= 12) {
-               if (is_mst) {
+               if (is_mst || intel_dp_is_uhbr(old_crtc_state)) {
                        enum transcoder cpu_transcoder = old_crtc_state->cpu_transcoder;
 
                        intel_de_rmw(dev_priv,