> -----Original Message-----
> From: Intel-xe <[email protected]> On Behalf Of Imre Deak
> Sent: Tuesday, 16 June 2026 23.09
> To: [email protected]; [email protected]
> Subject: [PATCH v2 14/28] drm/i915/dp_link_caps: Pass supported link rates to 
> link caps update
> 
> Pass the supported link rates explicitly to intel_dp_link_caps_update().
> This prepares for tracking these capabilities internally within the
> link caps module.
> 

Reviewed-by: Mika Kahola <[email protected]>

> Signed-off-by: Imre Deak <[email protected]>
> ---
>  drivers/gpu/drm/i915/display/intel_dp.c       | 28 ++++---------------
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 28 +++++++++++++++----
>  .../gpu/drm/i915/display/intel_dp_link_caps.h |  5 +++-
>  3 files changed, 33 insertions(+), 28 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/display/intel_dp.c 
> b/drivers/gpu/drm/i915/display/intel_dp.c
> index 635e3ede0d41e..d2b9b6fce2b32 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp.c
> @@ -698,36 +698,20 @@ static void intel_dp_get_common_rates(struct intel_dp 
> *intel_dp,
>       }
>  }
> 
> -static bool intel_dp_set_common_rates(struct intel_dp *intel_dp)
> -{
> -     int num_old_common_rates = intel_dp->num_common_rates;
> -     int old_common_rates[DP_MAX_SUPPORTED_RATES];
> -
> -     /* TODO: Add a struct containing both rates and number of rates. */
> -     static_assert(__same_type(old_common_rates[0], 
> intel_dp->common_rates[0]) &&
> -                   sizeof(old_common_rates) == 
> sizeof(intel_dp->common_rates));
> -     memcpy(old_common_rates, intel_dp->common_rates,
> -            num_old_common_rates * sizeof(old_common_rates[0]));
> -
> -     intel_dp_get_common_rates(intel_dp, intel_dp->common_rates, 
> &intel_dp->num_common_rates);
> -
> -     return num_old_common_rates != intel_dp->num_common_rates ||
> -            memcmp(old_common_rates, intel_dp->common_rates,
> -                   num_old_common_rates * sizeof(old_common_rates[0]));
> -}
> -
>  /* Return %true if any common link param changed. */
>  static bool intel_dp_set_common_link_params(struct intel_dp *intel_dp)
>  {
> +     int num_common_rates;
> +     int common_rates[DP_MAX_SUPPORTED_RATES];
>       bool params_changed = false;
> 
> -     if (intel_dp_set_common_rates(intel_dp))
> -             params_changed = true;
> -
>       if (intel_dp_set_max_common_lane_count(intel_dp))
>               params_changed = true;
> 
> -     intel_dp_link_caps_update(intel_dp);
> +     intel_dp_get_common_rates(intel_dp, common_rates, &num_common_rates);
> +     if (intel_dp_link_caps_update(intel_dp,
> +                                   common_rates, num_common_rates))
> +             params_changed = true;
> 
>       return params_changed;
>  }
> 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 2074952931738..679d59cc256c9 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -8,6 +8,7 @@
>  #include <linux/log2.h>
>  #include <linux/slab.h>
>  #include <linux/sort.h>
> +#include <linux/string.h>
>  #include <linux/types.h>
> 
>  #include <drm/drm_print.h>
> @@ -131,25 +132,39 @@ static int link_config_cmp_by_bw(const void *a, const 
> void *b, const void *p)
>              intel_dp_link_config_rate(intel_dp, lc_b);
>  }
> 
> -void intel_dp_link_caps_update(struct intel_dp *intel_dp)
> +/* Return %true if the supported link parameters have changed. */
> +bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
> +                            const int *rates, int num_rates)
>  {
>       struct intel_dp_link_caps *link_caps = intel_dp->link.caps;
>       struct intel_display *display = to_intel_display(intel_dp);
>       struct intel_dp_link_config_entry *lc;
> +     bool link_params_changed = false;
>       int num_common_lane_configs;
>       int i;
>       int j;
> 
>       if (drm_WARN_ON(display->drm, 
> !is_power_of_2(intel_dp_max_common_lane_count(intel_dp))))
> -             return;
> +             return false;
> +
> +     if (drm_WARN_ON(display->drm, num_rates > 
> ARRAY_SIZE(intel_dp->common_rates)))
> +             return false;
> 
>       num_common_lane_configs = 
> ilog2(intel_dp_max_common_lane_count(intel_dp)) + 1;
> 
> -     if (drm_WARN_ON(display->drm, intel_dp->num_common_rates * 
> num_common_lane_configs >
> +     if (drm_WARN_ON(display->drm, num_rates * num_common_lane_configs >
>                                   ARRAY_SIZE(link_caps->configs)))
> -             return;
> +             return false;
> 
> -     link_caps->num_configs = intel_dp->num_common_rates * 
> num_common_lane_configs;
> +     /* TODO: Add a struct containing both rates and number of rates. */
> +     static_assert(__same_type(rates[0], intel_dp->common_rates[0]));
> +     if (num_rates != intel_dp->num_common_rates ||
> +         memcmp(rates, intel_dp->common_rates, num_rates * sizeof(rates[0])))
> +             link_params_changed = true;
> +
> +     memcpy(intel_dp->common_rates, rates, num_rates * sizeof(rates[0]));
> +     intel_dp->num_common_rates = num_rates;
> +     link_caps->num_configs = num_rates * num_common_lane_configs;
> 
>       lc = &link_caps->configs[0];
>       for (i = 0; i < intel_dp->num_common_rates; i++) {
> @@ -165,6 +180,9 @@ void intel_dp_link_caps_update(struct intel_dp *intel_dp)
>              sizeof(link_caps->configs[0]),
>              link_config_cmp_by_bw, NULL,
>              intel_dp);
> +
> +     /* TODO: Also detect a change in the max lane count. */
> +     return link_params_changed;
>  }
> 
>  void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int 
> *link_rate, int *lane_count)
> 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 aed2122a05d24..09e580bc5c9b3 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h
> @@ -4,6 +4,8 @@
>  #ifndef __INTEL_DP_LINK_CAPS_H__
>  #define __INTEL_DP_LINK_CAPS_H__
> 
> +#include <linux/types.h>
> +
>  struct intel_connector;
>  struct intel_dp;
>  struct intel_dp_link_caps;
> @@ -20,7 +22,8 @@ void intel_dp_link_caps_get_forced_params(struct 
> intel_dp_link_caps *link_caps,
>  int intel_dp_link_config_index(struct intel_dp *intel_dp, int link_rate, int 
> lane_count);
>  void intel_dp_link_config_get(struct intel_dp *intel_dp, int idx, int 
> *link_rate, int *lane_count);
> 
> -void intel_dp_link_caps_update(struct intel_dp *intel_dp);
> +bool intel_dp_link_caps_update(struct intel_dp *intel_dp,
> +                            const int *rates, int num_rates);
> 
>  void intel_dp_link_caps_debugfs_add(struct intel_connector *connector);
> 
> --
> 2.49.1

Reply via email to