]> www.infradead.org Git - users/willy/pagecache.git/commitdiff
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:42:31 +0000 (14:42 -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>
(cherry picked from commit 2ed653c7b843db0670136330480842d76cb65cd8)
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
drivers/gpu/drm/i915/display/intel_ddi.c

index 2b9240ab547d8883046ee09c4c868e6f56aeca2d..18c66992aa1d8b50c2c57eb61cfe007f00f93f71 100644 (file)
@@ -658,7 +658,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)
@@ -678,8 +677,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,