[PATCH 4/5] tests/intel/kms_linktrain_fallback: extend test for eDP connector
Kunal Joshi
kunal1.joshi at intel.com
Wed Jun 25 12:34:01 UTC 2025
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);
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