[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