> Subject: [PATCH v2 06/34] drm/i915/dp_link_caps: Validate max link limits > > Add validation in intel_dp_link_caps_set_max_limits() to ensure that the new > maximum rate and lane count leave at least one allowed configuration. > > The validation takes disabled configurations and active forced parameters into > account. Disabled configurations are not supported yet, so that part has no > effect for now. > > At the moment this validation is also performed by the link training fallback > code, but that will be removed later, leaving only the link caps module to > perform the validation added in this patch. > > v2: Rebase on changes using a filter object instead of a mask of > configuration indices. > > Signed-off-by: Imre Deak <[email protected]>
LGTM, Reviewed-by: Suraj Kandpal <[email protected]> > --- > .../gpu/drm/i915/display/intel_dp_link_caps.c | 28 ++++++++++++++++++- > 1 file changed, 27 insertions(+), 1 deletion(-) > > 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 36895dd9d6c81..5976e85bb2729 100644 > --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c > +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c > @@ -558,6 +558,26 @@ void intel_dp_link_caps_get_max_limits(struct > intel_dp_link_caps *link_caps, > *max_link_limits = link_caps->max_limits; } > > +static bool max_link_limits_valid(struct intel_dp_link_caps *link_caps, > + const struct intel_dp_link_config > *max_link_limits) { > + struct intel_dp_link_caps_filter allowed_configs; > + struct intel_dp_link_config forced_params; > + > + if (max_link_limits->lane_count > INTEL_DP_MAX_LANE_COUNT || > + !is_power_of_2(max_link_limits->lane_count)) > + return false; > + > + /* TODO: Validate max_link_limits->rate against the source supported > +rates. */ > + > + intel_dp_link_caps_get_forced_params(link_caps, &forced_params); > + /* TODO: Get filter for enabled configs. */ > + allowed_configs = calc_allowed_config_filter(link_caps, > INTEL_DP_LINK_CAPS_FILTER_ALL, > + max_link_limits, > &forced_params); > + > + return allowed_configs.config_mask != 0; } > + > /** > * intel_dp_link_caps_set_max_limits - set the current maximum link limits > * @link_caps: link capabilities state > @@ -566,6 +586,10 @@ void intel_dp_link_caps_get_max_limits(struct > intel_dp_link_caps *link_caps, > * Set the current maximum rate and lane count limits to @max_link_limits, > * constraining the set of allowed configurations. > * > + * The new limits must leave at least one configuration allowed: the > + limits > + * must not be below the currently active forced parameters or below > + all the > + * configurations that remain after disabled configurations are excluded. > + * > * Unlike intel_dp_link_caps_get_max_limits(), the caller must serialize > * this call against concurrent queries and updates to @link_caps, in line > * with the rest of the API. > @@ -578,9 +602,11 @@ void intel_dp_link_caps_get_max_limits(struct > intel_dp_link_caps *link_caps, bool intel_dp_link_caps_set_max_limits(struct > intel_dp_link_caps *link_caps, > const struct intel_dp_link_config > *max_link_limits) { > + if (!max_link_limits_valid(link_caps, max_link_limits)) > + return false; > + > set_max_link_limits_no_update(link_caps, max_link_limits); > > - /* TODO: validate max_link_limits */ > return true; > } > > -- > 2.49.1
