On Wed, 2026-07-01 at 18:31 +0300, Imre Deak wrote:
> Switch the fallback loop to use the link configuration iterator to
> select a fallback configuration.
> 
> This also allows unexporting and removing from the link caps interface
> all the common link rate query helpers and the helpers that accept or
> return a link configuration index.
> 
> Signed-off-by: Imre Deak <[email protected]>
> ---
>  .../gpu/drm/i915/display/intel_dp_link_caps.c |  45 +-----
>  .../gpu/drm/i915/display/intel_dp_link_caps.h |   9 --
>  .../drm/i915/display/intel_dp_link_training.c | 143 +++++-------------
>  3 files changed, 39 insertions(+), 158 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c 
> b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> index 766dc9a98e05a..c947e6511fbc5 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -249,7 +249,7 @@ static int intel_dp_common_len_rate_limit(struct 
> intel_dp_link_caps *link_caps,
>                                      link_caps->num_rates, max_rate);
>  }
>  
> -int intel_dp_common_rate(struct intel_dp_link_caps *link_caps, int index)
> +static int intel_dp_common_rate(struct intel_dp_link_caps *link_caps, int 
> index)
>  {
>       struct intel_display *display = to_intel_display(link_caps->dp);
>  
> @@ -260,15 +260,8 @@ int intel_dp_common_rate(struct intel_dp_link_caps 
> *link_caps, int index)
>       return link_caps->rates[index];
>  }
>  
> -int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, 
> int rate)
> -{
> -     return intel_dp_rate_index(link_caps->rates,
> -                                link_caps->num_rates,
> -                                rate);
> -}
> -
>  /* Theoretical max between source and sink */
> -int intel_dp_max_common_rate(struct intel_dp_link_caps *link_caps)
> +static int intel_dp_max_common_rate(struct intel_dp_link_caps *link_caps)
>  {
>       return intel_dp_common_rate(link_caps, link_caps->num_rates - 1);
>  }
> @@ -870,40 +863,6 @@ bool intel_dp_link_caps_update(struct intel_dp_link_caps 
> *link_caps,
>       return link_params_changed;
>  }
>  
> -void intel_dp_link_config_get(struct intel_dp_link_caps *link_caps,
> -                           int idx, int *link_rate, int *lane_count)
> -{
> -     struct intel_display *display = to_intel_display(link_caps->dp);
> -     struct intel_dp_link_config config;
> -
> -     if (drm_WARN_ON(display->drm, idx < 0 || idx >= link_caps->num_configs))
> -             idx = 0;
> -
> -     to_intel_dp_link_config(link_caps, idx, &config);
> -
> -     *link_rate = config.rate;
> -     *lane_count = config.lane_count;
> -}
> -
> -int intel_dp_link_config_index(struct intel_dp_link_caps *link_caps,
> -                            int link_rate, int lane_count)
> -{
> -     int link_rate_idx = intel_dp_rate_index(link_caps->rates, 
> link_caps->num_rates,
> -                                             link_rate);
> -     int lane_count_exp = ilog2(lane_count);
> -     int i;
> -
> -     for (i = 0; i < link_caps->num_configs; i++) {
> -             const struct intel_dp_link_config_entry *lce = 
> &link_caps->configs[i];
> -
> -             if (lce->lane_count_exp == lane_count_exp &&
> -                 lce->link_rate_idx == link_rate_idx)
> -                     return i;
> -     }
> -
> -     return -1;
> -}
> -
>  /**
>   * intel_dp_link_caps_reset - reset link capability restrictions
>   * @link_caps: link capabilities state
> diff --git a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h 
> b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> index bb785c15c91f6..5c0d660062149 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -119,20 +119,11 @@ intel_dp_link_caps_connector_compute_order(struct 
> intel_connector *connector);
>  struct intel_dp_link_caps_order
>  intel_dp_link_caps_connector_fallback_order(bool is_mst);
>  
> -int intel_dp_common_rate(struct intel_dp_link_caps *link_caps, int index);
> -int intel_dp_link_caps_common_rate_idx(struct intel_dp_link_caps *link_caps, 
> int rate);
> -int intel_dp_max_common_rate(struct intel_dp_link_caps *link_caps);
> -
>  void intel_dp_link_caps_print_common_rates(struct intel_dp_link_caps 
> *link_caps);
>  
>  void intel_dp_link_caps_get_forced_params(struct intel_dp_link_caps 
> *link_caps,
>                                         struct intel_dp_link_config 
> *forced_params);
>  
> -int intel_dp_link_config_index(struct intel_dp_link_caps *link_caps,
> -                            int link_rate, int lane_count);
> -void intel_dp_link_config_get(struct intel_dp_link_caps *link_caps,
> -                           int idx, int *link_rate, int *lane_count);
> -
>  bool intel_dp_link_caps_filter_add(struct intel_dp_link_caps *link_caps,
>                                  struct intel_dp_link_caps_filter *filter,
>                                  const struct intel_dp_link_config *config);
> 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 7fdcc299daea5..1c12503908d80 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c
> @@ -1846,115 +1846,46 @@ static bool 
> intel_dp_can_link_train_fallback_for_edp(struct intel_dp *intel_dp,
>       return true;
>  }
>  
> -static bool reduce_link_params_in_bw_order(struct intel_dp *intel_dp,
> -                                        const struct intel_crtc_state 
> *crtc_state,
> -                                        int *new_link_rate, int 
> *new_lane_count)
> -{
> -     struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> -     struct intel_dp_link_config forced_params;
> -     int link_rate;
> -     int lane_count;
> -     int i;
> -
> -     intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> -
> -     i = intel_dp_link_config_index(intel_dp->link.caps,
> -                                    crtc_state->port_clock, 
> crtc_state->lane_count);
> -     for (i--; i >= 0; i--) {
> -             intel_dp_link_config_get(intel_dp->link.caps, i, &link_rate, 
> &lane_count);
> -
> -             if ((forced_params.rate &&
> -                  forced_params.rate != link_rate) ||
> -                 (forced_params.lane_count &&
> -                  forced_params.lane_count != lane_count))
> -                     continue;
> -
> -             break;
> -     }
> -
> -     if (i < 0)
> -             return false;
> -
> -     *new_link_rate = link_rate;
> -     *new_lane_count = lane_count;
> -
> -     return true;
> -}
> -
> -static int reduce_link_rate(struct intel_dp *intel_dp, int current_rate)
> -{
> -     struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> -     struct intel_dp_link_config forced_params;
> -     int rate_index;
> -     int new_rate;
> -
> -     intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> -     if (forced_params.rate)
> -             return -1;
> -
> -     rate_index = intel_dp_link_caps_common_rate_idx(link_caps,
> -                                                     current_rate);
> -
> -     if (rate_index <= 0)
> -             return -1;
> -
> -     new_rate = intel_dp_common_rate(link_caps, rate_index - 1);
> -
> -     /* TODO: Make switching from UHBR to non-UHBR rates work. */
> -     if (drm_dp_is_uhbr_rate(current_rate) != drm_dp_is_uhbr_rate(new_rate))
> -             return -1;
> -
> -     return new_rate;
> -}
> -
> -static int reduce_lane_count(struct intel_dp *intel_dp, int 
> current_lane_count)
> -{
> -     struct intel_dp_link_config forced_params;
> -
> -     intel_dp_link_caps_get_forced_params(intel_dp->link.caps, 
> &forced_params);
> -     if (forced_params.lane_count)
> -             return -1;
> -
> -     if (current_lane_count == 1)
> -             return -1;
> -
> -     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)
> -{
> -     struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> -     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(link_caps);
> -     }
> -
> -     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)
>  {
> -     /* TODO: Use the same fallback logic on SST as on MST. */
> -     if (intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST))
> -             return reduce_link_params_in_bw_order(intel_dp, crtc_state,
> -                                                   new_link_rate, 
> new_lane_count);
> -     else
> -             return reduce_link_params_in_rate_lane_order(intel_dp, 
> crtc_state,
> -                                                          new_link_rate, 
> new_lane_count);
> +     struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
> +     bool is_mst = intel_crtc_has_type(crtc_state, INTEL_OUTPUT_DP_MST);
> +     struct intel_dp_link_caps_order order =
> +             intel_dp_link_caps_connector_fallback_order(is_mst);
> +     struct intel_dp_link_config old_config = {
> +             .rate = crtc_state->port_clock,
> +             .lane_count = crtc_state->lane_count,
> +     };
> +     struct intel_dp_link_caps_iter iter;
> +     struct intel_dp_link_config config;
> +     bool old_found = false;
> +     bool new_found = false;
> +
> +     intel_dp_link_caps_iter_start(&iter, link_caps, order, 
> INTEL_DP_LINK_CAPS_FILTER_ALL);
> +     for_each_dp_link_config(&iter, &config) {
> +             if (!old_found) {
> +                     if (config.rate == old_config.rate &&
> +                         config.lane_count == old_config.lane_count)
> +                             old_found = true;
> +
> +                     continue;
> +             }
> +
> +             if (!is_mst &&
> +                 drm_dp_is_uhbr_rate(config.rate) !=
> +                 drm_dp_is_uhbr_rate(old_config.rate))
> +                     continue;
> +
> +             *new_link_rate = config.rate;
> +             *new_lane_count = config.lane_count;
> +             new_found = true;
> +
> +             break;
> +     }
> +     intel_dp_link_caps_iter_end(&iter);
> +
> +     return new_found;
>  }
>  
>  static int intel_dp_get_link_train_fallback_values(struct intel_dp *intel_dp,

Reviewed-by: Luca Coelho <[email protected]>

--
Cheers,
Luca.

Reply via email to