drm/i915: Call intel_update_active_dpll() for both bigjoiner pipes
authorVille Syrjälä <ville.syrjala@linux.intel.com>
Fri, 5 Nov 2021 21:21:56 +0000 (23:21 +0200)
committerVille Syrjälä <ville.syrjala@linux.intel.com>
Tue, 9 Nov 2021 22:40:10 +0000 (00:40 +0200)
Currently we're only calling intel_update_active_dpll() for the
bigjoiner master pipe but not for the slave. With TC ports this
leads to the two pipes end up trying to use different PLLs
(TC vs. TBT). What's worse we're enabling the PLL that didn't get
intel_update_active_dpll() called on it at the spot where we
need the clocks turned on. So we turn on the wrong PLL and the
DDI is now trying to source its clock from the other PLL which is
still disabled. Naturally that doesn't end so well and the DDI
fails to start up.

The state checker also gets a bit unhappy (which is a good thing)
when it notices that one of the pipes was using the wrong PLL.

Let's fix this by remembering to call intel_update_active_dpll()
for both pipes. That should get the correct PLL turned on when
we need it, and the state checker should also be happy.

Cc: Imre Deak <imre.deak@intel.com>
Cc: Manasi Navare <manasi.d.navare@intel.com>
Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/4434
Fixes: e12d6218fda2 ("drm/i915: Reduce bigjoiner special casing")
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20211105212156.5697-1-ville.syrjala@linux.intel.com
Reviewed-by: Imre Deak <imre.deak@intel.com>
drivers/gpu/drm/i915/display/intel_ddi.c

index 145d51a..f9e7e3d 100644 (file)
@@ -3140,8 +3140,14 @@ intel_ddi_update_prepare(struct intel_atomic_state *state,
 
        intel_tc_port_get_link(enc_to_dig_port(encoder),
                               required_lanes);
-       if (crtc_state && crtc_state->hw.active)
+       if (crtc_state && crtc_state->hw.active) {
+               struct intel_crtc *slave_crtc = crtc_state->bigjoiner_linked_crtc;
+
                intel_update_active_dpll(state, crtc, encoder);
+
+               if (slave_crtc)
+                       intel_update_active_dpll(state, slave_crtc, encoder);
+       }
 }
 
 static void