[Intel-gfx] [PATCH] drm/i915: Call intel_update_active_dpll() for both bigjoiner pipes
Imre Deak
imre.deak at intel.com
Mon Nov 8 20:54:40 UTC 2021
On Fri, Nov 05, 2021 at 11:21:56PM +0200, Ville Syrjala wrote:
> From: Ville Syrjälä <ville.syrjala at linux.intel.com>
>
> 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 at intel.com>
> Cc: Manasi Navare <manasi.d.navare at 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 at linux.intel.com>
Reviewed-by: Imre Deak <imre.deak at intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_ddi.c | 8 +++++++-
> 1 file changed, 7 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c b/drivers/gpu/drm/i915/display/intel_ddi.c
> index 145d51ac43a3..f9e7e3d1c7d0 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -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
> --
> 2.32.0
>
More information about the Intel-gfx
mailing list