[PATCH 4/5] tests/intel/kms_linktrain_fallback: extend test for eDP connector

B, Jeevan jeevan.b at intel.com
Mon Jun 30 07:51:42 UTC 2025


> -----Original Message-----
> From: igt-dev <igt-dev-bounces at lists.freedesktop.org> On Behalf Of Kunal Joshi
> Sent: Wednesday, June 25, 2025 6:04 PM
> To: igt-dev at lists.freedesktop.org
> Cc: Joshi, Kunal1 <kunal1.joshi at intel.com>; Deak, Imre <imre.deak at intel.com>;
> Murthy, Arun R <arun.r.murthy at intel.com>
> Subject: [PATCH 4/5] tests/intel/kms_linktrain_fallback: extend test for eDP
> connector
> 
> Rename dp-fallback subtest name to lt-fallback and add additional logic in
> test_fallback to handle eDP fallback.
> 
> In eDP fallback on the initial link training failure expectation is to retry with max
> link rate and max lane count that is supported, Further failures leads to reduction
> in either link rate or lane count.
> 
> Cc: Imre Deak <imre.deak at intel.com>
> Cc: Arun R Murthy <arun.r.murthy at intel.com>
> Signed-off-by: Kunal Joshi <kunal1.joshi at intel.com>
> ---
>  tests/intel/kms_linktrain_fallback.c | 43 +++++++++++++++++++---------
>  1 file changed, 29 insertions(+), 14 deletions(-)
> 
> diff --git a/tests/intel/kms_linktrain_fallback.c
> b/tests/intel/kms_linktrain_fallback.c
> index f8ef0cac4..8ac36a86c 100644
> --- a/tests/intel/kms_linktrain_fallback.c
> +++ b/tests/intel/kms_linktrain_fallback.c
> @@ -18,8 +18,8 @@
>  #include "kms_dsc_helper.h"
> 
>  /**
> - * SUBTEST: dp-fallback
> - * Description: Test fallback on DP connectors
> + * SUBTEST: lt-fallback
> + * Description: Test Link Training fallback on DP/eDP connectors
>   *
>   * SUBTEST: dsc-fallback
>   * Description: Test fallback to DSC when BW isn't sufficient @@ -336,11
> +336,12 @@ static bool fix_link_status_and_recommit(data_t *data,
>  	return true;
>  }
> 
> -static void test_fallback(data_t *data, bool is_mst)
> +static void test_fallback(data_t *data, bool is_mst, bool is_edp)
>  {
>  	int output_count, retries;
>  	int max_link_rate, curr_link_rate, prev_link_rate;
>  	int max_lane_count, curr_lane_count, prev_lane_count;
> +	int iter = 0;
>  	igt_output_t *outputs[IGT_MAX_PIPES];
>  	drmModeModeInfo * modes[IGT_MAX_PIPES];
>  	struct igt_fb fbs[IGT_MAX_PIPES];
> @@ -365,6 +366,7 @@ static void test_fallback(data_t *data, bool is_mst)
> 
>  	while (!igt_get_dp_link_retrain_disabled(data->drm_fd,
>  						 data->output)) {
> +		iter++;
>  		igt_info("Current link rate: %d, Current lane count: %d\n",
>  			 prev_link_rate,
>  			 prev_lane_count);
> @@ -400,10 +402,19 @@ static void test_fallback(data_t *data, bool is_mst)
>  		curr_link_rate = igt_get_current_link_rate(data->drm_fd, data-
> >output);
>  		curr_lane_count = igt_get_current_lane_count(data->drm_fd,
> data->output);
> 
> -		igt_assert_f((curr_link_rate < prev_link_rate ||
> -			     curr_lane_count < prev_lane_count) ||
> -			     ((curr_link_rate == max_link_rate &&
> curr_lane_count == max_lane_count) && --retries),
> -			     "Fallback unsuccessful\n");
> +		if (is_edp && iter == 1) {
> +			/* eDP first retry must stay at max, no reduction */
> +			igt_assert_eq(curr_link_rate,  prev_link_rate);
> +			igt_assert_eq(curr_lane_count, prev_lane_count);
> +		} else {
> +			/* Otherwise DP‐style fallback: either shrink or allow
> spurious retry */
> +			igt_assert_f((curr_link_rate  < prev_link_rate ||
> +				     curr_lane_count < prev_lane_count) ||
> +				     ((curr_link_rate  == max_link_rate &&
> +				     curr_lane_count == max_lane_count) &&
> +				     --retries),
> +				    "Fallback unsuccessful\n");
> +		}
> 
>  		prev_link_rate = curr_link_rate;
>  		prev_lane_count = curr_lane_count;
> @@ -413,10 +424,14 @@ static void test_fallback(data_t *data, bool is_mst)
> static bool run_lt_fallback_test(data_t *data)  {
>  	bool ran = false;
> +	bool is_edp = false;
> +	bool is_dp = false;
>  	igt_output_t *output;
> 
>  	for_each_connected_output(&data->display, output) {
>  		data->output = output;
> +		is_edp = output->config.connector->connector_type ==
> DRM_MODE_CONNECTOR_eDP;
> +		is_dp = output->config.connector->connector_type ==
> +DRM_MODE_CONNECTOR_DisplayPort;
> 
>  		if (!igt_has_force_link_training_failure_debugfs(data->drm_fd,
>  								 data-
> >output)) {
> @@ -425,8 +440,8 @@ static bool run_lt_fallback_test(data_t *data)
>  			continue;
>  		}
> 
> -		if (output->config.connector->connector_type !=
> DRM_MODE_CONNECTOR_DisplayPort) {
> -			igt_info("Skipping output %s as it's not DP\n", output-
> >name);
> +		if (!(is_edp || is_dp)) {
> +			igt_info("Skipping output %s as it's not DP/eDP\n",
> output->name);
We can re-use the helper suggested in the previous patch comments here. 

>  				continue;
>  		}
> 
> @@ -438,11 +453,12 @@ static bool run_lt_fallback_test(data_t *data)
>  		if (igt_check_output_is_dp_mst(data->output)) {
>  			igt_info("Testing MST output %s\n",
>  				 igt_output_name(data->output));
> -			test_fallback(data, true);
> +			test_fallback(data, true, false);
>  		} else {
> -			igt_info("Testing DP output %s\n",
> +			igt_info("Testing %s output %s\n",
> +				 is_edp ? "eDP" : "DP",
>  				 igt_output_name(data->output));
> -			test_fallback(data, false);
> +			test_fallback(data, false, is_edp);
>  		}
>  	}
>  	return ran;
> @@ -511,7 +527,6 @@ static void test_dsc_sst_fallback(data_t *data)
>  	/* Repeatedly force link failure until DSC is required (or link is disabled) */
>  	while (!igt_get_dp_link_retrain_disabled(data->drm_fd, data->output)) {
>  		mon = igt_watch_uevents();
> -
>  		igt_assert_f(force_failure_and_wait(data, data->output,
> 
> LT_FAILURE_REDUCED_CAPS,
>  						    RETRAIN_COUNT, 1.0, 20.0),
> @@ -621,7 +636,7 @@ igt_main
>  			     "Unable to disable ignore long hpd\n");
>  	}
> 
> -	igt_subtest("dp-fallback") {
> +	igt_subtest("lt-fallback") {
>  		igt_require_f(run_lt_fallback_test(&data),
>  			      "Skipping test as no output found or none supports
> fallback\n");
>  	}
> --
> 2.25.1



More information about the igt-dev mailing list