[PATCH 12/14] drm/i915/dp_mst: Reprobe the MST topology after a link parameter change

Kandpal, Suraj suraj.kandpal at intel.com
Wed Jul 24 08:48:34 UTC 2024



> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces at lists.freedesktop.org> On Behalf Of Imre
> Deak
> Sent: Monday, July 22, 2024 10:25 PM
> To: intel-gfx at lists.freedesktop.org
> Subject: [PATCH 12/14] drm/i915/dp_mst: Reprobe the MST topology after a
> link parameter change
> 
> The MST link BW reported by branch devices via the
> ENUM_PATH_RESOURCES message depends on the channel coding and link
> rate/lane count parameters programmed to DPCD. This is the case at least
> for some branch devices, while for others the reported BW is independent
> of the link parameters. In any case the DP standard requires the branch
> device to adjust the returned value to both account for the different way
> the BW for FEC is accounted for (included in the returned value for non-
> UHBR and not included for UHBR rates) and to limit the returned value to
> the
> (trained) link BW between the source and first downstreaam branch device,
> see DP v2.0/v2.1 Figure 2-94, DP v2.1 5.9.7. Presumedly this is also the
> reason why the standard requires the DPCD link rate/lane count values
> being up-to-date before sending the ENUM_PATH_RESOURCES message, see
> DP v2.1 2.14.9.4.
> 
> Based on the above reprobe the MST topology after the link is retrained
> with new link parameters to make sure that the MST link BW tracked in the
> MST topology state (via each topology port's full_pbn value) is up-to-date.
> 
> The next patch will make sure that the MST link BW is also kept up-to-date if
> the link is disabled.
> 
> Signed-off-by: Imre Deak <imre.deak at intel.com>

LGTM,
Reviewed-by: Suraj Kandpal <suraj.kandpal at intel.com>
> ---
>  .../drm/i915/display/intel_display_types.h    |  8 +++++
>  drivers/gpu/drm/i915/display/intel_dp.c       |  2 ++
>  drivers/gpu/drm/i915/display/intel_dp_mst.c   | 32 ++++++++++++++++++-
>  3 files changed, 41 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_display_types.h
> b/drivers/gpu/drm/i915/display/intel_display_types.h
> index 51e2151315977..afd8329e3ed6e 100644
> --- a/drivers/gpu/drm/i915/display/intel_display_types.h
> +++ b/drivers/gpu/drm/i915/display/intel_display_types.h
> @@ -1794,6 +1794,14 @@ struct intel_dp {
>  		int max_lane_count;
>  		/* Max rate for the current link */
>  		int max_rate;
> +		/*
> +		 * Link parameters for which the MST topology was probed.
> +		 * Tracking these ensures that the MST path resources are
> +		 * re-enumerated whenever the link is retrained with new
> link
> +		 * parameters, as required by the DP standard.
> +		 */
> +		int mst_probed_lane_count;
> +		int mst_probed_rate;
>  		int force_lane_count;
>  		int force_rate;
>  		bool retrain_disabled;
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index 1c6d1db1d2690..0771e4c6357ba 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -3134,6 +3134,8 @@ void intel_dp_reset_link_params(struct intel_dp
> *intel_dp)  {
>  	intel_dp->link.max_lane_count =
> intel_dp_max_common_lane_count(intel_dp);
>  	intel_dp->link.max_rate = intel_dp_max_common_rate(intel_dp);
> +	intel_dp->link.mst_probed_lane_count = 0;
> +	intel_dp->link.mst_probed_rate = 0;
>  	intel_dp->link.retrain_disabled = false;
>  	intel_dp->link.seq_train_failures = 0;  } diff --git
> a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> index 57f29906fa28f..19c8b6878b030 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_mst.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_mst.c
> @@ -1113,6 +1113,33 @@ static void intel_mst_pre_pll_enable_dp(struct
> intel_atomic_state *state,
>  					     to_intel_crtc(pipe_config-
> >uapi.crtc));
>  }
> 
> +static bool intel_mst_probed_link_params_valid(struct intel_dp *intel_dp,
> +					       int link_rate, int lane_count) {
> +	return intel_dp->link.mst_probed_rate == link_rate &&
> +		intel_dp->link.mst_probed_lane_count == lane_count; }
> +
> +static void intel_mst_set_probed_link_params(struct intel_dp *intel_dp,
> +					     int link_rate, int lane_count) {
> +	intel_dp->link.mst_probed_rate = link_rate;
> +	intel_dp->link.mst_probed_lane_count = lane_count; }
> +
> +static void intel_mst_reprobe_topology(struct intel_dp *intel_dp,
> +				       const struct intel_crtc_state *crtc_state) {
> +	if (intel_mst_probed_link_params_valid(intel_dp,
> +					       crtc_state->port_clock, crtc_state-
> >lane_count))
> +		return;
> +
> +	drm_dp_mst_topology_queue_probe(&intel_dp->mst_mgr);
> +
> +	intel_mst_set_probed_link_params(intel_dp,
> +					 crtc_state->port_clock, crtc_state-
> >lane_count); }
> +
>  static void intel_mst_pre_enable_dp(struct intel_atomic_state *state,
>  				    struct intel_encoder *encoder,
>  				    const struct intel_crtc_state *pipe_config,
> @@ -1149,10 +1176,13 @@ 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)
> +	if (first_mst_stream) {
>  		dig_port->base.pre_enable(state, &dig_port->base,
>  						pipe_config, NULL);
> 
> +		intel_mst_reprobe_topology(intel_dp, pipe_config);
> +	}
> +
>  	intel_dp->active_mst_links++;
> 
>  	ret = drm_dp_add_payload_part1(&intel_dp->mst_mgr, mst_state,
> --
> 2.44.2



More information about the Intel-gfx mailing list