[Intel-gfx] [PATCH] drm/i915/dp_mst: Fix active port PLL selection for secondary MST streams
Kahola, Mika
mika.kahola at intel.com
Tue Apr 18 13:38:27 UTC 2023
> -----Original Message-----
> From: Deak, Imre <imre.deak at intel.com>
> Sent: Friday, April 14, 2023 8:38 PM
> To: intel-gfx at lists.freedesktop.org
> Cc: Kahola, Mika <mika.kahola at intel.com>
> Subject: [PATCH] drm/i915/dp_mst: Fix active port PLL selection for secondary
> MST streams
>
> The port PLL selection needs to be up-to-date in the CRTC state of both the
> primary and all secondary MST streams. The commit removing the encoder
> update_prepare/complete hooks (see Fixes: below), stopped doing this for
> secondary streams, fix this up.
>
> Fixes: 0f752b2178c9 ("drm/i915: Remove the encoder
> update_prepare()/complete() hooks")
> Closes: https://gitlab.freedesktop.org/drm/intel/-/issues/8336
> Cc: Mika Kahola <mika.kahola at intel.com>
Reviewed-by: Mika Kahola <mika.kahola at intel.com>
> Signed-off-by: Imre Deak <imre.deak at intel.com>
> ---
> drivers/gpu/drm/i915/display/intel_ddi.c | 27 +++++++++++++++------
> drivers/gpu/drm/i915/display/intel_ddi.h | 3 +++
> drivers/gpu/drm/i915/display/intel_dp_mst.c | 7 ++++++
> 3 files changed, 30 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/display/intel_ddi.c
> b/drivers/gpu/drm/i915/display/intel_ddi.c
> index ea012d7f378f3..29e4bfab46358 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.c
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.c
> @@ -3349,6 +3349,25 @@ void intel_ddi_update_pipe(struct
> intel_atomic_state *state,
> intel_hdcp_update_pipe(state, encoder, crtc_state, conn_state); }
>
> +void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> + struct intel_encoder *encoder,
> + struct intel_crtc *crtc)
> +{
> + struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> + struct intel_crtc_state *crtc_state =
> + intel_atomic_get_new_crtc_state(state, crtc);
> + struct intel_crtc *slave_crtc;
> + enum phy phy = intel_port_to_phy(i915, encoder->port);
> +
> + if (!intel_phy_is_tc(i915, phy))
> + return;
> +
> + intel_update_active_dpll(state, crtc, encoder);
> + for_each_intel_crtc_in_pipe_mask(&i915->drm, slave_crtc,
> +
> intel_crtc_bigjoiner_slave_pipes(crtc_state))
> + intel_update_active_dpll(state, slave_crtc, encoder); }
> +
> static void
> intel_ddi_pre_pll_enable(struct intel_atomic_state *state,
> struct intel_encoder *encoder,
> @@ -3363,15 +3382,9 @@ intel_ddi_pre_pll_enable(struct intel_atomic_state
> *state,
> if (is_tc_port) {
> struct intel_crtc *master_crtc =
> to_intel_crtc(crtc_state->uapi.crtc);
> - struct intel_crtc *slave_crtc;
>
> intel_tc_port_get_link(dig_port, crtc_state->lane_count);
> -
> - intel_update_active_dpll(state, master_crtc, encoder);
> -
> - for_each_intel_crtc_in_pipe_mask(&dev_priv->drm, slave_crtc,
> -
> intel_crtc_bigjoiner_slave_pipes(crtc_state))
> - intel_update_active_dpll(state, slave_crtc, encoder);
> + intel_ddi_update_active_dpll(state, encoder, master_crtc);
> }
>
> main_link_aux_power_domain_get(dig_port, crtc_state); diff --git
> a/drivers/gpu/drm/i915/display/intel_ddi.h
> b/drivers/gpu/drm/i915/display/intel_ddi.h
> index c85e74ae68e4d..2bc034042a937 100644
> --- a/drivers/gpu/drm/i915/display/intel_ddi.h
> +++ b/drivers/gpu/drm/i915/display/intel_ddi.h
> @@ -72,5 +72,8 @@ void intel_ddi_sanitize_encoder_pll_mapping(struct
> intel_encoder *encoder); int intel_ddi_level(struct intel_encoder *encoder,
> const struct intel_crtc_state *crtc_state,
> int lane);
> +void intel_ddi_update_active_dpll(struct intel_atomic_state *state,
> + struct intel_encoder *encoder,
> + struct intel_crtc *crtc);
>
> #endif /* __INTEL_DDI_H__ */
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index a88b852c437c4..2c49d9ab86a2a 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -674,6 +674,13 @@ static void intel_mst_pre_pll_enable_dp(struct
> intel_atomic_state *state,
> if (intel_dp->active_mst_links == 0)
> dig_port->base.pre_pll_enable(state, &dig_port->base,
> pipe_config, NULL);
> + else
> + /*
> + * The port PLL state needs to get updated for secondary
> + * streams as for the primary stream.
> + */
> + intel_ddi_update_active_dpll(state, &dig_port->base,
> + to_intel_crtc(pipe_config-
> >uapi.crtc));
> }
>
> static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
> --
> 2.37.2
More information about the Intel-gfx
mailing list