> -----Original Message----- > From: Intel-gfx <[email protected]> On Behalf Of Imre > Deak > Sent: Tuesday, 16 June 2026 23.09 > To: [email protected]; [email protected] > Subject: [PATCH v2 21/28] drm/i915/dp_link_caps: Add helpers to get max link > limits > > Add intel_dp_link_caps_get_max_limits() to query the current maximum > link limits (max bound over all allowed configurations) through the > link caps API instead of direct accesses. > > This allows tracking the state 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 | 8 +++- > .../gpu/drm/i915/display/intel_dp_link_caps.c | 38 ++++++++++++++++++- > .../gpu/drm/i915/display/intel_dp_link_caps.h | 3 ++ > .../drm/i915/display/intel_dp_link_training.c | 8 +++- > 4 files changed, 51 insertions(+), 6 deletions(-) > > diff --git a/drivers/gpu/drm/i915/display/intel_dp.c > b/drivers/gpu/drm/i915/display/intel_dp.c > index 0d7ec7a8898c9..3b3c31122452d 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp.c > +++ b/drivers/gpu/drm/i915/display/intel_dp.c > @@ -357,15 +357,17 @@ static int intel_dp_get_max_common_lane_count(struct > intel_dp *intel_dp) > int intel_dp_max_lane_count(struct intel_dp *intel_dp) > { > struct intel_dp_link_caps *link_caps = intel_dp->link.caps; > + struct intel_dp_link_config max_link_limits; > struct intel_dp_link_config forced_params; > int lane_count; > > + intel_dp_link_caps_get_max_limits(link_caps, &max_link_limits); > intel_dp_link_caps_get_forced_params(link_caps, &forced_params); > > if (forced_params.lane_count) > lane_count = forced_params.lane_count; > else > - lane_count = intel_dp->link.max_lane_count; > + lane_count = max_link_limits.lane_count; > > switch (lane_count) { > case 1: > @@ -1539,6 +1541,7 @@ int > intel_dp_max_link_rate(struct intel_dp *intel_dp) > { > struct intel_dp_link_caps *link_caps = intel_dp->link.caps; > + struct intel_dp_link_config max_link_limits; > struct intel_dp_link_config forced_params; > int len; > > @@ -1547,7 +1550,8 @@ intel_dp_max_link_rate(struct intel_dp *intel_dp) > if (forced_params.rate) > return forced_params.rate; > > - len = intel_dp_common_len_rate_limit(intel_dp, intel_dp->link.max_rate); > + intel_dp_link_caps_get_max_limits(link_caps, &max_link_limits); > + len = intel_dp_common_len_rate_limit(intel_dp, max_link_limits.rate); > > return intel_dp_common_rate(intel_dp, len - 1); > } > 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 b227c9a55f63b..fa7dabc94ddf1 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c > @@ -151,6 +151,36 @@ static int intel_dp_link_config_lane_count(const struct > intel_dp_link_config_ent > return 1 << lc->lane_count_exp; > } > > +/** > + * intel_dp_link_caps_get_max_limits - get the current maximum link limits > + * @link_caps: link capabilities state > + * @max_link_limits: returned maximum link limits > + * > + * Return the current maximum rate and lane count limits in > + * @max_link_limits. > + * > + * These limits constrain the set of allowed configurations. > + * > + * The limits are set to the maximum common supported values after > + * intel_dp_link_caps_reset() is called, and can later be modified by > + * intel_dp_link_caps_set_max_limits(). The max rate and lane count > + * parameters are independent limits, so the pair does not necessarily > + * define a valid configuration. > + * > + * This function may be called without serializing against updates to > + * @link_caps. However, without such serialization the returned value may be > + * an out-of-sync (link rate, lane count) tuple, i.e. the parameters may > + * belong to different update snapshots in time. > + */ > +void intel_dp_link_caps_get_max_limits(struct intel_dp_link_caps *link_caps, > + struct intel_dp_link_config > *max_link_limits) > +{ > + struct intel_dp *intel_dp = link_caps->dp; > + > + max_link_limits->rate = intel_dp->link.max_rate; > + max_link_limits->lane_count = intel_dp->link.max_lane_count; > +} > + > static int intel_dp_link_config_bw(struct intel_dp *intel_dp, > const struct intel_dp_link_config_entry *lc) > { > @@ -482,6 +512,7 @@ static int i915_dp_max_link_rate_show(void *data, u64 > *val) > struct intel_connector *connector = to_intel_connector(data); > struct intel_display *display = to_intel_display(connector); > struct intel_dp *intel_dp = intel_attached_dp(connector); > + struct intel_dp_link_config max_link_limits; > int err; > > err = > drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex); > @@ -490,7 +521,8 @@ static int i915_dp_max_link_rate_show(void *data, u64 > *val) > > intel_dp_flush_connector_commits(connector); > > - *val = intel_dp->link.max_rate; > + intel_dp_link_caps_get_max_limits(intel_dp->link.caps, > &max_link_limits); > + *val = max_link_limits.rate; > > drm_modeset_unlock(&display->drm->mode_config.connection_mutex); > > @@ -503,6 +535,7 @@ static int i915_dp_max_lane_count_show(void *data, u64 > *val) > struct intel_connector *connector = to_intel_connector(data); > struct intel_display *display = to_intel_display(connector); > struct intel_dp *intel_dp = intel_attached_dp(connector); > + struct intel_dp_link_config max_link_limits; > int err; > > err = > drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex); > @@ -511,7 +544,8 @@ static int i915_dp_max_lane_count_show(void *data, u64 > *val) > > intel_dp_flush_connector_commits(connector); > > - *val = intel_dp->link.max_lane_count; > + intel_dp_link_caps_get_max_limits(intel_dp->link.caps, > &max_link_limits); > + *val = max_link_limits.lane_count; > > drm_modeset_unlock(&display->drm->mode_config.connection_mutex); > > 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 9218cb5de2c71..376dbd9bd5aba 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.h > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.h > @@ -27,6 +27,9 @@ 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_get_max_limits(struct intel_dp_link_caps *link_caps, > + struct intel_dp_link_config > *max_link_limits); > + > bool intel_dp_link_caps_update(struct intel_dp *intel_dp, > const int *rates, int num_rates, int > max_lane_count); > > 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 ec9bd9b4c800b..7145f2d0ad6d3 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp_link_training.c > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_training.c > @@ -2389,6 +2389,8 @@ void intel_dp_128b132b_sdp_crc16(struct intel_dp > *intel_dp, > bool intel_dp_link_params_valid(struct intel_dp *intel_dp, int link_rate, > u8 lane_count) > { > + struct intel_dp_link_config max_link_limits; > + > /* > * FIXME: we need to synchronize the current link parameters with > * hardware readout. Currently fast link training doesn't work on > @@ -2411,12 +2413,14 @@ bool intel_dp_link_params_valid(struct intel_dp > *intel_dp, int link_rate, > * configuration. Although that happens to be true for now, it will > * stop being guaranteed once fallback depends only on disabled configs. > */ > + intel_dp_link_caps_get_max_limits(intel_dp->link.caps, > &max_link_limits); > + > if (link_rate == 0 || > - link_rate > intel_dp->link.max_rate) > + link_rate > max_link_limits.rate) > return false; > > if (lane_count == 0 || > - lane_count > intel_dp_max_lane_count(intel_dp)) > + lane_count > max_link_limits.lane_count) > return false; > > return true; > -- > 2.49.1
