> Subject: [PATCH v2 07/34] drm/i915/dp_link_caps: Add filter for enabled link
> configurations
> 
> Add a filter for enabled link configurations to the link capability state.
> 
> This allows fallback code to disable only the configuration that failed link
> training, instead of constraining later modesets via maximum link rate or lane
> count. The code only needs to exclude the failed configuration from the
> allowed set; all other supported configurations remain available.
> 
> Use the filter when computing the allowed configuration set and when
> validating maximum link limits.
> 
> Follow-up changes will switch the fallback code to disable individual
> configurations through this filter.
> 
> v2:
> - Rebase on changes using a filter object instead of a mask of
>   configuration indices.
> - Track the enabled configurations instead of the disabled ones.
> 
> Signed-off-by: Imre Deak <[email protected]>

LGTM,
Reviewed-by: Suraj Kandpal <[email protected]>

> ---
>  .../gpu/drm/i915/display/intel_dp_link_caps.c | 38 +++++++++++++++++--
>  1 file changed, 34 insertions(+), 4 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 5976e85bb2729..03e40e8d24fb6 100644
> --- a/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> +++ b/drivers/gpu/drm/i915/display/intel_dp_link_caps.c
> @@ -130,6 +130,37 @@ struct intel_dp_link_caps {
>       u8 rate_lane_map[INTEL_DP_MAX_LINK_CONFIGS];
>       u8 lane_rate_map[INTEL_DP_MAX_LINK_CONFIGS];
> 
> +     /*
> +      * Filter of configurations enabled for the current sink
> +      * connection.
> +      *
> +      * Each bit in the filter's configuration mask corresponds to a
> +      * configuration index in the intel_dp_link_caps::configs[] array.
> +      *
> +      * All configurations start out enabled in the filter after a
> +      * new sink is connected. Users disable configurations afterwards
> +      * via the link caps API. All configurations get re-enabled
> +      * internally in the following cases:
> +      * - when forcing a link rate or lane count
> +      * - when intel_dp_link_caps_update(reset=true) is called after
> +      *   a new sink is connected
> +      * - when intel_dp_link_caps_update(reset=false) with changed
> +      *   link capabilities is called
> +      * - when intel_dp_link_caps_reset() is called after a new sink
> +      *   is connected
> +      */
> +     struct intel_dp_link_caps_filter enabled_configs;
> +
> +     /*
> +      * Allowed configurations are the supported configurations defined by
> +      * config_table.rates and config_table.max_lane_count, constrained by
> +      * config_table.enabled_configs and the forced_params and
> +      * max_limits values below.
> +      *
> +      * See get_allowed_config_filter() for the filter of these
> +      * configurations.
> +      */
> +
>       /*
>        * Forced parameters requested via debugfs. Remains set across sink
>        * disconnects.
> @@ -454,8 +485,7 @@ get_allowed_config_filter(struct intel_dp_link_caps
> *link_caps)
> 
>       intel_dp_link_caps_get_forced_params(link_caps, &forced_params);
> 
> -     /* TODO: Get filter for enabled configs. */
> -     return calc_allowed_config_filter(link_caps,
> INTEL_DP_LINK_CAPS_FILTER_ALL,
> +     return calc_allowed_config_filter(link_caps,
> +link_caps->enabled_configs,
>                                         &link_caps->max_limits,
> &forced_params);  }
> 
> @@ -571,8 +601,7 @@ static bool max_link_limits_valid(struct
> intel_dp_link_caps *link_caps,
>       /* 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,
> +     allowed_configs = calc_allowed_config_filter(link_caps,
> +link_caps->enabled_configs,
>                                                    max_link_limits,
> &forced_params);
> 
>       return allowed_configs.config_mask != 0; @@ -1095,6 +1124,7 @@
> struct intel_dp_link_caps *intel_dp_link_caps_init(struct intel_dp *intel_dp)
>               return NULL;
> 
>       link_caps->dp = intel_dp;
> +     link_caps->enabled_configs = INTEL_DP_LINK_CAPS_FILTER_ALL;
> 
>       return link_caps;
>  }
> --
> 2.49.1

Reply via email to