[PATCH 3/8] drm/i915/mst: introduce to_primary_encoder() and to_primary_dp()

Imre Deak imre.deak at intel.com
Mon Nov 11 16:01:59 UTC 2024


On Thu, Nov 07, 2024 at 10:32:16PM +0200, Jani Nikula wrote:
> Add helpers to_primary_encoder() and to_primary_dp() to convert fake MST
> encoder pointers to primary encoder and DP pointers, respectively, and
> use them.
> 
> The main point is to highlight the primary encoder and DP usage. Very
> few places actually need the struct intel_dp_mst_encoder pointer, or the
> primary struct intel_digital_port, so ditch them where possible for
> clarity.
> 
> Signed-off-by: Jani Nikula <jani.nikula at intel.com>
> ---
>  drivers/gpu/drm/i915/display/intel_dp_mst.c | 98 +++++++++++----------
>  1 file changed, 52 insertions(+), 46 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_mst.c b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index 7b03ec571464..558cf13b977f 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -53,6 +53,24 @@
>  #include "intel_vdsc.h"
>  #include "skl_scaler.h"
>  
> +/* From fake MST encoder to primary encoder */
> +static struct intel_encoder *to_primary_encoder(struct intel_encoder *encoder)
> +{
> +	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> +	struct intel_digital_port *dig_port = intel_mst->primary;
> +
> +	return &dig_port->base;
> +}
> +
> +/* From fake MST encoder to primary DP */
> +static struct intel_dp *to_primary_dp(struct intel_encoder *encoder)
> +{
> +	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> +	struct intel_digital_port *dig_port = intel_mst->primary;
> +
> +	return &dig_port->dp;
> +}

Other to_intel_dp conversion helpers exist from at least
drm_dp_mst_topology_mgr, intel_connector, intel_lspcon, intel_encoder,
so wondered if _Generic could be used, but that's a bigger change and
maybe you want to keep these conversions local:

Reviewed-by: Imre Deak <imre.deak at intel.com>

> +
>  static int intel_dp_mst_max_dpt_bpp(const struct intel_crtc_state *crtc_state,
>  				    bool dsc)
>  {
> @@ -171,8 +189,7 @@ static int intel_dp_mst_find_vcpi_slots_for_bpp(struct intel_encoder *encoder,
>  						bool dsc)
>  {
>  	struct drm_atomic_state *state = crtc_state->uapi.state;
> -	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_dp *intel_dp = &intel_mst->primary->dp;
> +	struct intel_dp *intel_dp = to_primary_dp(encoder);
>  	struct drm_dp_mst_topology_state *mst_state;
>  	struct intel_connector *connector =
>  		to_intel_connector(conn_state->connector);
> @@ -422,8 +439,7 @@ static int intel_dp_mst_update_slots(struct intel_encoder *encoder,
>  				     struct drm_connector_state *conn_state)
>  {
>  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> -	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_dp *intel_dp = &intel_mst->primary->dp;
> +	struct intel_dp *intel_dp = to_primary_dp(encoder);
>  	struct drm_dp_mst_topology_mgr *mgr = &intel_dp->mst_mgr;
>  	struct drm_dp_mst_topology_state *topology_state;
>  	u8 link_coding_cap = intel_dp_is_uhbr(crtc_state) ?
> @@ -581,8 +597,7 @@ static int intel_dp_mst_compute_config(struct intel_encoder *encoder,
>  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
>  	struct intel_atomic_state *state = to_intel_atomic_state(conn_state->state);
>  	struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
> -	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_dp *intel_dp = &intel_mst->primary->dp;
> +	struct intel_dp *intel_dp = to_primary_dp(encoder);
>  	struct intel_connector *connector =
>  		to_intel_connector(conn_state->connector);
>  	const struct drm_display_mode *adjusted_mode =
> @@ -855,8 +870,7 @@ static int intel_dp_mst_compute_config_late(struct intel_encoder *encoder,
>  					    struct drm_connector_state *conn_state)
>  {
>  	struct intel_atomic_state *state = to_intel_atomic_state(conn_state->state);
> -	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_dp *intel_dp = &intel_mst->primary->dp;
> +	struct intel_dp *intel_dp = to_primary_dp(encoder);
>  
>  	/* lowest numbered transcoder will be designated master */
>  	crtc_state->mst_master_transcoder =
> @@ -970,8 +984,7 @@ static void wait_for_act_sent(struct intel_encoder *encoder,
>  			      const struct intel_crtc_state *crtc_state)
>  {
>  	struct drm_i915_private *i915 = to_i915(encoder->base.dev);
> -	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_dp *intel_dp = &intel_mst->primary->dp;
> +	struct intel_dp *intel_dp = to_primary_dp(encoder);
>  
>  	if (intel_de_wait_for_set(i915, dp_tp_status_reg(encoder, crtc_state),
>  				  DP_TP_STATUS_ACT_SENT, 1))
> @@ -986,8 +999,7 @@ static void intel_mst_disable_dp(struct intel_atomic_state *state,
>  				 const struct drm_connector_state *old_conn_state)
>  {
>  	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_digital_port *dig_port = intel_mst->primary;
> -	struct intel_dp *intel_dp = &dig_port->dp;
> +	struct intel_dp *intel_dp = to_primary_dp(encoder);
>  	struct intel_connector *connector =
>  		to_intel_connector(old_conn_state->connector);
>  	struct drm_i915_private *i915 = to_i915(connector->base.dev);
> @@ -1010,8 +1022,8 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
>  {
>  	struct intel_display *display = to_intel_display(encoder);
>  	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_digital_port *dig_port = intel_mst->primary;
> -	struct intel_dp *intel_dp = &dig_port->dp;
> +	struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
> +	struct intel_dp *intel_dp = to_primary_dp(encoder);
>  	struct intel_connector *connector =
>  		to_intel_connector(old_conn_state->connector);
>  	struct drm_dp_mst_topology_state *old_mst_state =
> @@ -1080,8 +1092,7 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
>  	 * BSpec 4287: disable DIP after the transcoder is disabled and before
>  	 * the transcoder clock select is set to none.
>  	 */
> -	intel_dp_set_infoframes(&dig_port->base, false,
> -				old_crtc_state, NULL);
> +	intel_dp_set_infoframes(primary_encoder, false, old_crtc_state, NULL);
>  	/*
>  	 * From TGL spec: "If multi-stream slave transcoder: Configure
>  	 * Transcoder Clock Select to direct no clock to the transcoder"
> @@ -1095,8 +1106,8 @@ static void intel_mst_post_disable_dp(struct intel_atomic_state *state,
>  
>  	intel_mst->connector = NULL;
>  	if (last_mst_stream)
> -		dig_port->base.post_disable(state, &dig_port->base,
> -						  old_crtc_state, NULL);
> +		primary_encoder->post_disable(state, primary_encoder,
> +					      old_crtc_state, NULL);
>  
>  	drm_dbg_kms(&dev_priv->drm, "active links %d\n",
>  		    intel_dp->active_mst_links);
> @@ -1107,13 +1118,12 @@ static void intel_mst_post_pll_disable_dp(struct intel_atomic_state *state,
>  					  const struct intel_crtc_state *old_crtc_state,
>  					  const struct drm_connector_state *old_conn_state)
>  {
> -	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_digital_port *dig_port = intel_mst->primary;
> -	struct intel_dp *intel_dp = &dig_port->dp;
> +	struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
> +	struct intel_dp *intel_dp = to_primary_dp(encoder);
>  
>  	if (intel_dp->active_mst_links == 0 &&
> -	    dig_port->base.post_pll_disable)
> -		dig_port->base.post_pll_disable(state, &dig_port->base, old_crtc_state, old_conn_state);
> +	    primary_encoder->post_pll_disable)
> +		primary_encoder->post_pll_disable(state, primary_encoder, old_crtc_state, old_conn_state);
>  }
>  
>  static void intel_mst_pre_pll_enable_dp(struct intel_atomic_state *state,
> @@ -1121,19 +1131,18 @@ static void intel_mst_pre_pll_enable_dp(struct intel_atomic_state *state,
>  					const struct intel_crtc_state *pipe_config,
>  					const struct drm_connector_state *conn_state)
>  {
> -	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_digital_port *dig_port = intel_mst->primary;
> -	struct intel_dp *intel_dp = &dig_port->dp;
> +	struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
> +	struct intel_dp *intel_dp = to_primary_dp(encoder);
>  
>  	if (intel_dp->active_mst_links == 0)
> -		dig_port->base.pre_pll_enable(state, &dig_port->base,
> -						    pipe_config, NULL);
> +		primary_encoder->pre_pll_enable(state, primary_encoder,
> +						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,
> +		intel_ddi_update_active_dpll(state, primary_encoder,
>  					     to_intel_crtc(pipe_config->uapi.crtc));
>  }
>  
> @@ -1170,8 +1179,8 @@ static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
>  				    const struct drm_connector_state *conn_state)
>  {
>  	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_digital_port *dig_port = intel_mst->primary;
> -	struct intel_dp *intel_dp = &dig_port->dp;
> +	struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
> +	struct intel_dp *intel_dp = to_primary_dp(encoder);
>  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
>  	struct intel_connector *connector =
>  		to_intel_connector(conn_state->connector);
> @@ -1201,8 +1210,8 @@ static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
>  	intel_dp_sink_enable_decompression(state, connector, pipe_config);
>  
>  	if (first_mst_stream) {
> -		dig_port->base.pre_enable(state, &dig_port->base,
> -						pipe_config, NULL);
> +		primary_encoder->pre_enable(state, primary_encoder,
> +					    pipe_config, NULL);
>  
>  		intel_mst_reprobe_topology(intel_dp, pipe_config);
>  	}
> @@ -1212,11 +1221,11 @@ static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
>  	ret = drm_dp_add_payload_part1(&intel_dp->mst_mgr, mst_state,
>  				       drm_atomic_get_mst_payload_state(mst_state, connector->port));
>  	if (ret < 0)
> -		intel_dp_queue_modeset_retry_for_link(state, &dig_port->base, pipe_config);
> +		intel_dp_queue_modeset_retry_for_link(state, primary_encoder, pipe_config);
>  
>  	/*
>  	 * Before Gen 12 this is not done as part of
> -	 * dig_port->base.pre_enable() and should be done here. For
> +	 * primary_encoder->pre_enable() and should be done here. For
>  	 * Gen 12+ the step in which this should be done is different for the
>  	 * first MST stream, so it's done on the DDI for the first stream and
>  	 * here for the following ones.
> @@ -1227,7 +1236,7 @@ static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
>  	if (DISPLAY_VER(dev_priv) >= 13 && !first_mst_stream)
>  		intel_ddi_config_transcoder_func(encoder, pipe_config);
>  
> -	intel_dsc_dp_pps_write(&dig_port->base, pipe_config);
> +	intel_dsc_dp_pps_write(primary_encoder, pipe_config);
>  	intel_ddi_set_dp_msa(pipe_config, conn_state);
>  }
>  
> @@ -1270,9 +1279,8 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
>  				const struct drm_connector_state *conn_state)
>  {
>  	struct intel_display *display = to_intel_display(encoder);
> -	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_digital_port *dig_port = intel_mst->primary;
> -	struct intel_dp *intel_dp = &dig_port->dp;
> +	struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
> +	struct intel_dp *intel_dp = to_primary_dp(encoder);
>  	struct intel_connector *connector = to_intel_connector(conn_state->connector);
>  	struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
>  	struct drm_dp_mst_topology_state *mst_state =
> @@ -1316,7 +1324,7 @@ static void intel_mst_enable_dp(struct intel_atomic_state *state,
>  				       drm_atomic_get_mst_payload_state(mst_state,
>  									connector->port));
>  	if (ret < 0)
> -		intel_dp_queue_modeset_retry_for_link(state, &dig_port->base, pipe_config);
> +		intel_dp_queue_modeset_retry_for_link(state, primary_encoder, pipe_config);
>  
>  	if (DISPLAY_VER(dev_priv) >= 12)
>  		intel_de_rmw(dev_priv, hsw_chicken_trans_reg(dev_priv, trans),
> @@ -1350,19 +1358,17 @@ static bool intel_dp_mst_enc_get_hw_state(struct intel_encoder *encoder,
>  static void intel_dp_mst_enc_get_config(struct intel_encoder *encoder,
>  					struct intel_crtc_state *pipe_config)
>  {
> -	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_digital_port *dig_port = intel_mst->primary;
> +	struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
>  
> -	dig_port->base.get_config(&dig_port->base, pipe_config);
> +	primary_encoder->get_config(primary_encoder, pipe_config);
>  }
>  
>  static bool intel_dp_mst_initial_fastset_check(struct intel_encoder *encoder,
>  					       struct intel_crtc_state *crtc_state)
>  {
> -	struct intel_dp_mst_encoder *intel_mst = enc_to_mst(encoder);
> -	struct intel_digital_port *dig_port = intel_mst->primary;
> +	struct intel_encoder *primary_encoder = to_primary_encoder(encoder);
>  
> -	return intel_dp_initial_fastset_check(&dig_port->base, crtc_state);
> +	return intel_dp_initial_fastset_check(primary_encoder, crtc_state);
>  }
>  
>  static int intel_dp_mst_get_ddc_modes(struct drm_connector *connector)
> -- 
> 2.39.5
> 


More information about the Intel-gfx mailing list