diff mbox series

[07/14] drm/i915/dp: Add a separate function to reduce the link parameters

Message ID 20240722165503.2084999-8-imre.deak@intel.com (mailing list archive)
State New, archived
Headers show
Series drm/i915/dp_mst: Enable LT fallback for UHBR<->non-UHBR rates | expand

Commit Message

Imre Deak July 22, 2024, 4:54 p.m. UTC
A follow-up patch will add an alternative way to reduce the link
parameters in BW order on MST links, prepare for that here.

Signed-off-by: Imre Deak <imre.deak@intel.com>
---
 .../drm/i915/display/intel_dp_link_training.c | 39 +++++++++++++++----
 1 file changed, 31 insertions(+), 8 deletions(-)

Comments

Suraj Kandpal July 23, 2024, 9:12 a.m. UTC | #1
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre
> Deak
> Sent: Monday, July 22, 2024 10:25 PM
> To: intel-gfx@lists.freedesktop.org
> Subject: [PATCH 07/14] drm/i915/dp: Add a separate function to reduce the link
> parameters
> 
> A follow-up patch will add an alternative way to reduce the link parameters in
> BW order on MST links, prepare for that here.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>

LGTM,
Reviewed-by: Suraj Kandpal <suraj.kandpal@intel.com>

> ---
>  .../drm/i915/display/intel_dp_link_training.c | 39 +++++++++++++++----
>  1 file changed, 31 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> index 58dea87a9fa28..57536ae200b77 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> @@ -1193,6 +1193,36 @@ static int reduce_lane_count(struct intel_dp
> *intel_dp, int current_lane_count)
>  	return current_lane_count >> 1;
>  }
> 
> +static bool reduce_link_params_in_rate_lane_order(struct intel_dp *intel_dp,
> +						  const struct intel_crtc_state
> *crtc_state,
> +						  int *new_link_rate, int
> *new_lane_count) {
> +	int link_rate;
> +	int lane_count;
> +
> +	lane_count = crtc_state->lane_count;
> +	link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
> +	if (link_rate < 0) {
> +		lane_count = reduce_lane_count(intel_dp, crtc_state-
> >lane_count);
> +		link_rate = intel_dp_max_common_rate(intel_dp);
> +	}
> +
> +	if (lane_count < 0)
> +		return false;
> +
> +	*new_link_rate = link_rate;
> +	*new_lane_count = lane_count;
> +
> +	return true;
> +}
> +
> +static bool reduce_link_params(struct intel_dp *intel_dp, const struct
> intel_crtc_state *crtc_state,
> +			       int *new_link_rate, int *new_lane_count) {
> +	return reduce_link_params_in_rate_lane_order(intel_dp, crtc_state,
> +						     new_link_rate,
> new_lane_count); }
> +
>  static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
>  						   const struct intel_crtc_state
> *crtc_state)  { @@ -1206,14 +1236,7 @@ static int
> intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
>  		return 0;
>  	}
> 
> -	new_lane_count = crtc_state->lane_count;
> -	new_link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
> -	if (new_link_rate < 0) {
> -		new_lane_count = reduce_lane_count(intel_dp, crtc_state-
> >lane_count);
> -		new_link_rate = intel_dp_max_common_rate(intel_dp);
> -	}
> -
> -	if (new_lane_count < 0)
> +	if (!reduce_link_params(intel_dp, crtc_state, &new_link_rate,
> +&new_lane_count))
>  		return -1;
> 
>  	if (intel_dp_is_edp(intel_dp) &&
> --
> 2.44.2
Arun R Murthy July 24, 2024, 4:55 a.m. UTC | #2
> -----Original Message-----
> From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre
> Deak
> Sent: Monday, July 22, 2024 10:25 PM
> To: intel-gfx@lists.freedesktop.org
> Subject: [PATCH 07/14] drm/i915/dp: Add a separate function to reduce the link
> parameters
> 
> A follow-up patch will add an alternative way to reduce the link parameters in
> BW order on MST links, prepare for that here.
> 
> Signed-off-by: Imre Deak <imre.deak@intel.com>
> ---
>  .../drm/i915/display/intel_dp_link_training.c | 39 +++++++++++++++----
>  1 file changed, 31 insertions(+), 8 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> index 58dea87a9fa28..57536ae200b77 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> @@ -1193,6 +1193,36 @@ static int reduce_lane_count(struct intel_dp
> *intel_dp, int current_lane_count)
>  	return current_lane_count >> 1;
>  }
> 
> +static bool reduce_link_params_in_rate_lane_order(struct intel_dp *intel_dp,
> +						  const struct intel_crtc_state
> *crtc_state,
> +						  int *new_link_rate, int
> *new_lane_count) {
> +	int link_rate;
> +	int lane_count;
> +
> +	lane_count = crtc_state->lane_count;
> +	link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
> +	if (link_rate < 0) {
> +		lane_count = reduce_lane_count(intel_dp, crtc_state-
> >lane_count);
> +		link_rate = intel_dp_max_common_rate(intel_dp);
> +	}
> +
On link training failure reducing link rate or lane count is not linear. Sometime we fall from uhbr to hbr and then again with uhbr with lane reduction. So would it be better to have a table/list for the fallback link rate/lane count.

Thanks and Regards,
Arun R Murthy
--------------------
> +	if (lane_count < 0)
> +		return false;
> +
> +	*new_link_rate = link_rate;
> +	*new_lane_count = lane_count;
> +
> +	return true;
> +}
> +
> +static bool reduce_link_params(struct intel_dp *intel_dp, const struct
> intel_crtc_state *crtc_state,
> +			       int *new_link_rate, int *new_lane_count) {
> +	return reduce_link_params_in_rate_lane_order(intel_dp, crtc_state,
> +						     new_link_rate,
> new_lane_count); }
> +
>  static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
>  						   const struct intel_crtc_state
> *crtc_state)  { @@ -1206,14 +1236,7 @@ static int
> intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
>  		return 0;
>  	}
> 
> -	new_lane_count = crtc_state->lane_count;
> -	new_link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
> -	if (new_link_rate < 0) {
> -		new_lane_count = reduce_lane_count(intel_dp, crtc_state-
> >lane_count);
> -		new_link_rate = intel_dp_max_common_rate(intel_dp);
> -	}
> -
> -	if (new_lane_count < 0)
> +	if (!reduce_link_params(intel_dp, crtc_state, &new_link_rate,
> +&new_lane_count))
>  		return -1;
> 
>  	if (intel_dp_is_edp(intel_dp) &&
> --
> 2.44.2
Imre Deak July 24, 2024, 11:19 a.m. UTC | #3
On Wed, Jul 24, 2024 at 07:55:03AM +0300, Murthy, Arun R wrote:
> > -----Original Message-----
> > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf Of Imre
> > Deak
> > Sent: Monday, July 22, 2024 10:25 PM
> > To: intel-gfx@lists.freedesktop.org
> > Subject: [PATCH 07/14] drm/i915/dp: Add a separate function to reduce the link
> > parameters
> >
> > A follow-up patch will add an alternative way to reduce the link parameters in
> > BW order on MST links, prepare for that here.
> >
> > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > ---
> >  .../drm/i915/display/intel_dp_link_training.c | 39 +++++++++++++++----
> >  1 file changed, 31 insertions(+), 8 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > index 58dea87a9fa28..57536ae200b77 100644
> > --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > @@ -1193,6 +1193,36 @@ static int reduce_lane_count(struct intel_dp
> > *intel_dp, int current_lane_count)
> >       return current_lane_count >> 1;
> >  }
> >
> > +static bool reduce_link_params_in_rate_lane_order(struct intel_dp *intel_dp,
> > +                                               const struct intel_crtc_state
> > *crtc_state,
> > +                                               int *new_link_rate, int
> > *new_lane_count) {
> > +     int link_rate;
> > +     int lane_count;
> > +
> > +     lane_count = crtc_state->lane_count;
> > +     link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
> > +     if (link_rate < 0) {
> > +             lane_count = reduce_lane_count(intel_dp, crtc_state-
> > >lane_count);
> > +             link_rate = intel_dp_max_common_rate(intel_dp);
> > +     }
> > +
>
> On link training failure reducing link rate or lane count is not
> linear. Sometime we fall from uhbr to hbr and then again with uhbr
> with lane reduction. So would it be better to have a table/list for
> the fallback link rate/lane count.

This patch is meant to to keep the current way of reducing the rate and
lane count, just preparing for a follow-up change that adds the
alternetive BW order fallback logic for MST. I think later SST would
need to be switched to the logic as well, for now I didn't want to
change this.

> 
> Thanks and Regards,
> Arun R Murthy
> --------------------
> > +     if (lane_count < 0)
> > +             return false;
> > +
> > +     *new_link_rate = link_rate;
> > +     *new_lane_count = lane_count;
> > +
> > +     return true;
> > +}
> > +
> > +static bool reduce_link_params(struct intel_dp *intel_dp, const struct
> > intel_crtc_state *crtc_state,
> > +                            int *new_link_rate, int *new_lane_count) {
> > +     return reduce_link_params_in_rate_lane_order(intel_dp, crtc_state,
> > +                                                  new_link_rate,
> > new_lane_count); }
> > +
> >  static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
> >                                                  const struct intel_crtc_state
> > *crtc_state)  { @@ -1206,14 +1236,7 @@ static int
> > intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
> >               return 0;
> >       }
> >
> > -     new_lane_count = crtc_state->lane_count;
> > -     new_link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
> > -     if (new_link_rate < 0) {
> > -             new_lane_count = reduce_lane_count(intel_dp, crtc_state-
> > >lane_count);
> > -             new_link_rate = intel_dp_max_common_rate(intel_dp);
> > -     }
> > -
> > -     if (new_lane_count < 0)
> > +     if (!reduce_link_params(intel_dp, crtc_state, &new_link_rate,
> > +&new_lane_count))
> >               return -1;
> >
> >       if (intel_dp_is_edp(intel_dp) &&
> > --
> > 2.44.2
>
Arun R Murthy July 25, 2024, 3:20 a.m. UTC | #4
> -----Original Message-----
> From: Deak, Imre <imre.deak@intel.com>
> Sent: Wednesday, July 24, 2024 4:50 PM
> To: Murthy, Arun R <arun.r.murthy@intel.com>
> Cc: intel-gfx@lists.freedesktop.org
> Subject: Re: [PATCH 07/14] drm/i915/dp: Add a separate function to reduce the
> link parameters
> 
> On Wed, Jul 24, 2024 at 07:55:03AM +0300, Murthy, Arun R wrote:
> > > -----Original Message-----
> > > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf
> > > Of Imre Deak
> > > Sent: Monday, July 22, 2024 10:25 PM
> > > To: intel-gfx@lists.freedesktop.org
> > > Subject: [PATCH 07/14] drm/i915/dp: Add a separate function to
> > > reduce the link parameters
> > >
> > > A follow-up patch will add an alternative way to reduce the link
> > > parameters in BW order on MST links, prepare for that here.
> > >
> > > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > > ---
> > >  .../drm/i915/display/intel_dp_link_training.c | 39
> > > +++++++++++++++----
> > >  1 file changed, 31 insertions(+), 8 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > > b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > > index 58dea87a9fa28..57536ae200b77 100644
> > > --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > > @@ -1193,6 +1193,36 @@ static int reduce_lane_count(struct intel_dp
> > > *intel_dp, int current_lane_count)
> > >       return current_lane_count >> 1;  }
> > >
> > > +static bool reduce_link_params_in_rate_lane_order(struct intel_dp
> *intel_dp,
> > > +                                               const struct
> > > +intel_crtc_state
> > > *crtc_state,
> > > +                                               int *new_link_rate,
> > > + int
> > > *new_lane_count) {
> > > +     int link_rate;
> > > +     int lane_count;
> > > +
> > > +     lane_count = crtc_state->lane_count;
> > > +     link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
> > > +     if (link_rate < 0) {
> > > +             lane_count = reduce_lane_count(intel_dp, crtc_state-
> > > >lane_count);
> > > +             link_rate = intel_dp_max_common_rate(intel_dp);
> > > +     }
> > > +
> >
> > On link training failure reducing link rate or lane count is not
> > linear. Sometime we fall from uhbr to hbr and then again with uhbr
> > with lane reduction. So would it be better to have a table/list for
> > the fallback link rate/lane count.
> 
> This patch is meant to to keep the current way of reducing the rate and lane
> count, just preparing for a follow-up change that adds the alternetive BW order
> fallback logic for MST. I think later SST would need to be switched to the logic as
> well, for now I didn't want to change this.
> 
This series enables fallback for 128b/132b as well and the fallback linkrate and lanecount values for them are not in linear reducing manner. 
Can we have a TODO in this function about this?

Thanks and Regards,
Arun R Murthy
--------------------
> >
> > Thanks and Regards,
> > Arun R Murthy
> > --------------------
> > > +     if (lane_count < 0)
> > > +             return false;
> > > +
> > > +     *new_link_rate = link_rate;
> > > +     *new_lane_count = lane_count;
> > > +
> > > +     return true;
> > > +}
> > > +
> > > +static bool reduce_link_params(struct intel_dp *intel_dp, const
> > > +struct
> > > intel_crtc_state *crtc_state,
> > > +                            int *new_link_rate, int *new_lane_count) {
> > > +     return reduce_link_params_in_rate_lane_order(intel_dp, crtc_state,
> > > +                                                  new_link_rate,
> > > new_lane_count); }
> > > +
> > >  static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
> > >                                                  const struct
> > > intel_crtc_state
> > > *crtc_state)  { @@ -1206,14 +1236,7 @@ static int
> > > intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
> > >               return 0;
> > >       }
> > >
> > > -     new_lane_count = crtc_state->lane_count;
> > > -     new_link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
> > > -     if (new_link_rate < 0) {
> > > -             new_lane_count = reduce_lane_count(intel_dp, crtc_state-
> > > >lane_count);
> > > -             new_link_rate = intel_dp_max_common_rate(intel_dp);
> > > -     }
> > > -
> > > -     if (new_lane_count < 0)
> > > +     if (!reduce_link_params(intel_dp, crtc_state, &new_link_rate,
> > > +&new_lane_count))
> > >               return -1;
> > >
> > >       if (intel_dp_is_edp(intel_dp) &&
> > > --
> > > 2.44.2
> >
Imre Deak July 25, 2024, 12:14 p.m. UTC | #5
On Thu, Jul 25, 2024 at 06:20:23AM +0300, Murthy, Arun R wrote:
> > -----Original Message-----
> > From: Deak, Imre <imre.deak@intel.com>
> > Sent: Wednesday, July 24, 2024 4:50 PM
> > To: Murthy, Arun R <arun.r.murthy@intel.com>
> > Cc: intel-gfx@lists.freedesktop.org
> > Subject: Re: [PATCH 07/14] drm/i915/dp: Add a separate function to reduce the
> > link parameters
> >
> > On Wed, Jul 24, 2024 at 07:55:03AM +0300, Murthy, Arun R wrote:
> > > > -----Original Message-----
> > > > From: Intel-gfx <intel-gfx-bounces@lists.freedesktop.org> On Behalf
> > > > Of Imre Deak
> > > > Sent: Monday, July 22, 2024 10:25 PM
> > > > To: intel-gfx@lists.freedesktop.org
> > > > Subject: [PATCH 07/14] drm/i915/dp: Add a separate function to
> > > > reduce the link parameters
> > > >
> > > > A follow-up patch will add an alternative way to reduce the link
> > > > parameters in BW order on MST links, prepare for that here.
> > > >
> > > > Signed-off-by: Imre Deak <imre.deak@intel.com>
> > > > ---
> > > >  .../drm/i915/display/intel_dp_link_training.c | 39
> > > > +++++++++++++++----
> > > >  1 file changed, 31 insertions(+), 8 deletions(-)
> > > >
> > > > diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > > > b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > > > index 58dea87a9fa28..57536ae200b77 100644
> > > > --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > > > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> > > > @@ -1193,6 +1193,36 @@ static int reduce_lane_count(struct intel_dp
> > > > *intel_dp, int current_lane_count)
> > > >       return current_lane_count >> 1;  }
> > > >
> > > > +static bool reduce_link_params_in_rate_lane_order(struct intel_dp
> > *intel_dp,
> > > > +                                               const struct
> > > > +intel_crtc_state
> > > > *crtc_state,
> > > > +                                               int *new_link_rate,
> > > > + int
> > > > *new_lane_count) {
> > > > +     int link_rate;
> > > > +     int lane_count;
> > > > +
> > > > +     lane_count = crtc_state->lane_count;
> > > > +     link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
> > > > +     if (link_rate < 0) {
> > > > +             lane_count = reduce_lane_count(intel_dp, crtc_state-
> > > > >lane_count);
> > > > +             link_rate = intel_dp_max_common_rate(intel_dp);
> > > > +     }
> > > > +
> > >
> > > On link training failure reducing link rate or lane count is not
> > > linear. Sometime we fall from uhbr to hbr and then again with uhbr
> > > with lane reduction. So would it be better to have a table/list for
> > > the fallback link rate/lane count.
> >
> > This patch is meant to to keep the current way of reducing the rate and lane
> > count, just preparing for a follow-up change that adds the alternetive BW order
> > fallback logic for MST. I think later SST would need to be switched to the logic as
> > well, for now I didn't want to change this.
> >
> This series enables fallback for 128b/132b as well and the fallback
> linkrate and lanecount values for them are not in linear reducing
> manner.  Can we have a TODO in this function about this?

Not sure what you mean. I can add a TODO comment to change the fallback
logic on SST links to happen the same way as on MST links, decreasing
the link's BW at each step.

> Thanks and Regards,
> Arun R Murthy
> --------------------
> > >
> > > Thanks and Regards,
> > > Arun R Murthy
> > > --------------------
> > > > +     if (lane_count < 0)
> > > > +             return false;
> > > > +
> > > > +     *new_link_rate = link_rate;
> > > > +     *new_lane_count = lane_count;
> > > > +
> > > > +     return true;
> > > > +}
> > > > +
> > > > +static bool reduce_link_params(struct intel_dp *intel_dp, const
> > > > +struct
> > > > intel_crtc_state *crtc_state,
> > > > +                            int *new_link_rate, int *new_lane_count) {
> > > > +     return reduce_link_params_in_rate_lane_order(intel_dp, crtc_state,
> > > > +                                                  new_link_rate,
> > > > new_lane_count); }
> > > > +
> > > >  static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
> > > >                                                  const struct
> > > > intel_crtc_state
> > > > *crtc_state)  { @@ -1206,14 +1236,7 @@ static int
> > > > intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
> > > >               return 0;
> > > >       }
> > > >
> > > > -     new_lane_count = crtc_state->lane_count;
> > > > -     new_link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
> > > > -     if (new_link_rate < 0) {
> > > > -             new_lane_count = reduce_lane_count(intel_dp, crtc_state-
> > > > >lane_count);
> > > > -             new_link_rate = intel_dp_max_common_rate(intel_dp);
> > > > -     }
> > > > -
> > > > -     if (new_lane_count < 0)
> > > > +     if (!reduce_link_params(intel_dp, crtc_state, &new_link_rate,
> > > > +&new_lane_count))
> > > >               return -1;
> > > >
> > > >       if (intel_dp_is_edp(intel_dp) &&
> > > > --
> > > > 2.44.2
> > >
diff mbox series

Patch

diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_training.c b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
index 58dea87a9fa28..57536ae200b77 100644
--- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
+++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
@@ -1193,6 +1193,36 @@  static int reduce_lane_count(struct intel_dp *intel_dp, int current_lane_count)
 	return current_lane_count >> 1;
 }
 
+static bool reduce_link_params_in_rate_lane_order(struct intel_dp *intel_dp,
+						  const struct intel_crtc_state *crtc_state,
+						  int *new_link_rate, int *new_lane_count)
+{
+	int link_rate;
+	int lane_count;
+
+	lane_count = crtc_state->lane_count;
+	link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
+	if (link_rate < 0) {
+		lane_count = reduce_lane_count(intel_dp, crtc_state->lane_count);
+		link_rate = intel_dp_max_common_rate(intel_dp);
+	}
+
+	if (lane_count < 0)
+		return false;
+
+	*new_link_rate = link_rate;
+	*new_lane_count = lane_count;
+
+	return true;
+}
+
+static bool reduce_link_params(struct intel_dp *intel_dp, const struct intel_crtc_state *crtc_state,
+			       int *new_link_rate, int *new_lane_count)
+{
+	return reduce_link_params_in_rate_lane_order(intel_dp, crtc_state,
+						     new_link_rate, new_lane_count);
+}
+
 static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
 						   const struct intel_crtc_state *crtc_state)
 {
@@ -1206,14 +1236,7 @@  static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,
 		return 0;
 	}
 
-	new_lane_count = crtc_state->lane_count;
-	new_link_rate = reduce_link_rate(intel_dp, crtc_state->port_clock);
-	if (new_link_rate < 0) {
-		new_lane_count = reduce_lane_count(intel_dp, crtc_state->lane_count);
-		new_link_rate = intel_dp_max_common_rate(intel_dp);
-	}
-
-	if (new_lane_count < 0)
+	if (!reduce_link_params(intel_dp, crtc_state, &new_link_rate, &new_lane_count))
 		return -1;
 
 	if (intel_dp_is_edp(intel_dp) &&