From: Kunal Joshi <kunal1.joshi@intel.com>
To: igt-dev@lists.freedesktop.org
Cc: Kunal Joshi <kunal1.joshi@intel.com>, Sowmiya S <sowmiya.s@intel.com>
Subject: [PATCH i-g-t 03/13] tests/intel/kms_dp_link_training: extract train_link_config()
Date: Thu, 1 Oct 2026 13:06:53 +0530 [thread overview]
Message-ID: <20261001073703.5067-4-kunal1.joshi@intel.com> (raw)
In-Reply-To: <20261001073703.5067-1-kunal1.joshi@intel.com>
Move the force and retrain sequence to train_link_config(), taking the
config to train as struct i915_dp_link_config. This prepares for
training other configs than just the max.
While at it, check the kmstest_get_property() return value in
assert_link_status_good(), and stop leaking the property. This also
lets SST and MST share the loop.
Drop the UHBR check after training. It can't fail, as the rate has
already been checked against the forced rate.
Other than that, there should be no functional changes.
Assisted-by: GitHub_Copilot:claude-opus-5
Signed-off-by: Kunal Joshi <kunal1.joshi@intel.com>
Reviewed-by: Sowmiya S <sowmiya.s@intel.com>
---
tests/intel/kms_dp_link_training.c | 97 +++++++++++++++---------------
1 file changed, 48 insertions(+), 49 deletions(-)
diff --git a/tests/intel/kms_dp_link_training.c b/tests/intel/kms_dp_link_training.c
index 2d5241246..595d78d98 100644
--- a/tests/intel/kms_dp_link_training.c
+++ b/tests/intel/kms_dp_link_training.c
@@ -72,9 +72,7 @@ static int check_condition_with_timeout(int drm_fd, igt_output_t *output,
static void assert_link_status_good(data_t *data, bool mst)
{
igt_output_t *outputs[IGT_MAX_PIPES];
- uint32_t link_status_prop_id;
uint64_t link_status_value;
- drmModePropertyPtr link_status_prop;
int count = 0;
int i;
@@ -83,32 +81,54 @@ static void assert_link_status_good(data_t *data, bool mst)
&data->display, data->output,
outputs, &count) == 0,
"Unable to find MST outputs\n");
-
- for (i = 0; i < count; i++) {
- kmstest_get_property(data->drm_fd,
- outputs[i]->config.connector->connector_id,
- DRM_MODE_OBJECT_CONNECTOR,
- "link-status",
- &link_status_prop_id,
- &link_status_value,
- &link_status_prop);
-
- igt_assert_eq(link_status_value,
- DRM_MODE_LINK_STATUS_GOOD);
- }
} else {
- kmstest_get_property(data->drm_fd,
- data->output->config.connector->connector_id,
- DRM_MODE_OBJECT_CONNECTOR,
- "link-status",
- &link_status_prop_id,
- &link_status_value,
- &link_status_prop);
+ outputs[0] = data->output;
+ count = 1;
+ }
+
+ for (i = 0; i < count; i++) {
+ igt_assert_f(kmstest_get_property(data->drm_fd,
+ outputs[i]->config.connector->connector_id,
+ DRM_MODE_OBJECT_CONNECTOR,
+ "link-status", NULL,
+ &link_status_value, NULL),
+ "No link-status property on %s\n",
+ igt_output_name(outputs[i]));
igt_assert_eq(link_status_value, DRM_MODE_LINK_STATUS_GOOD);
}
}
+/*
+ * train_link_config - Force one link configuration, re-establish the link and
+ * check that the configuration took effect.
+ */
+static void train_link_config(data_t *data, bool mst,
+ const struct i915_dp_link_config *config)
+{
+ int current_link_rate;
+ char rate_str[32];
+ char lane_str[32];
+
+ snprintf(rate_str, sizeof(rate_str), "%d", config->link_rate);
+ snprintf(lane_str, sizeof(lane_str), "%d", config->lane_count);
+ igt_info("Training %s at %d lanes, rate %d\n",
+ igt_output_name(data->output), config->lane_count,
+ config->link_rate);
+
+ i915_dp_set_link_params(data->drm_fd, data->output, rate_str, lane_str);
+ i915_dp_force_link_retrain(data->drm_fd, data->output, RETRAIN_COUNT);
+ igt_assert_eq(check_condition_with_timeout(data->drm_fd, data->output,
+ i915_dp_get_pending_retrain,
+ 1.0, 20.0), 0);
+ assert_link_status_good(data, mst);
+
+ current_link_rate = i915_dp_get_current_link_rate(data->drm_fd, data->output);
+ igt_info("Current link rate is %d\n", current_link_rate);
+ igt_assert_f(current_link_rate == config->link_rate,
+ "Link training did not succeed at the forced link rate.\n");
+}
+
/*
* setup_planes_fbs - Create solid-color FBs and attach them to the primary plane.
*/
@@ -188,12 +208,8 @@ static void do_modeset(data_t *data, bool mst)
*/
static bool run_link_rate_test(data_t *data, bool mst, bool uhbr)
{
- int max_link_rate;
- int max_lane_count;
- int current_link_rate;
+ struct i915_dp_link_config config;
bool is_uhbr_output;
- char rate_str[32];
- char lane_str[32];
igt_display_reset(&data->display);
i915_dp_reset_link_params(data->drm_fd, data->output);
@@ -208,12 +224,12 @@ static bool run_link_rate_test(data_t *data, bool mst, bool uhbr)
/* FIXME : Driver may lie max link rate or max lane count */
/* Read max_link_rate and max_lane_count */
- max_link_rate = i915_dp_get_max_link_rate(data->drm_fd, data->output);
- max_lane_count = i915_dp_get_max_lane_count(data->drm_fd, data->output);
+ config.link_rate = i915_dp_get_max_link_rate(data->drm_fd, data->output);
+ config.lane_count = i915_dp_get_max_lane_count(data->drm_fd, data->output);
/* Check sink supports uhbr or not */
- is_uhbr_output = i915_dp_is_uhbr_rate(max_link_rate);
- if ((uhbr && !is_uhbr_output) || (!uhbr && is_uhbr_output)) {
+ is_uhbr_output = i915_dp_is_uhbr_rate(config.link_rate);
+ if (uhbr != is_uhbr_output) {
igt_info("Test expects %s, but output %s is %s.\n",
uhbr ? "UHBR" : "NON-UHBR",
data->output->name,
@@ -222,26 +238,9 @@ static bool run_link_rate_test(data_t *data, bool mst, bool uhbr)
return false;
}
- snprintf(rate_str, sizeof(rate_str), "%d", max_link_rate);
- snprintf(lane_str, sizeof(lane_str), "%d", max_lane_count);
- igt_info("Max link rate for %s is %s, lane count = %d\n",
- data->output->name, rate_str, max_lane_count);
-
/* Force retrain at max link params */
- i915_dp_set_link_params(data->drm_fd, data->output, rate_str, lane_str);
- i915_dp_force_link_retrain(data->drm_fd, data->output, RETRAIN_COUNT);
- igt_assert_eq(check_condition_with_timeout(data->drm_fd, data->output,
- i915_dp_get_pending_retrain,
- 1.0, 20.0), 0);
- assert_link_status_good(data, mst);
+ train_link_config(data, mst, &config);
- current_link_rate = i915_dp_get_current_link_rate(data->drm_fd, data->output);
- igt_info("Current link rate is %d\n", current_link_rate);
- igt_assert_f(current_link_rate == max_link_rate,
- "Link training did not succeed at max link rate.\n");
- igt_assert_f(i915_dp_is_uhbr_rate(current_link_rate) == is_uhbr_output,
- is_uhbr_output ? "Link training didn't happen at uhbr rates" :
- "Link training didn't happen at non-uhbr rates");
igt_info("----------------------------------------------------\n");
return true;
}
--
2.25.1
next prev parent reply other threads:[~2026-10-01 7:21 UTC|newest]
Thread overview: 24+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-01 7:36 [PATCH i-g-t 00/13] Expand kms_dp_link_training coverage Kunal Joshi
2026-10-01 7:36 ` [PATCH i-g-t 01/13] lib/i915/i915_dp: add helpers for the allowed link configs debugfs Kunal Joshi
2026-10-01 7:36 ` [PATCH i-g-t 02/13] tests/intel/kms_dp_link_training: use i915_dp_is_uhbr_rate() Kunal Joshi
2026-10-01 7:36 ` Kunal Joshi [this message]
2026-10-01 7:36 ` [PATCH i-g-t 04/13] tests/intel/kms_dp_link_training: detect links that failed training Kunal Joshi
2026-10-01 9:05 ` S, Sowmiya
2026-10-01 7:36 ` [PATCH i-g-t 05/13] tests/intel/kms_dp_link_training: use the lowest pixel clock mode Kunal Joshi
2026-10-01 7:36 ` [PATCH i-g-t 06/13] tests/intel/kms_dp_link_training: train all allowed link configs Kunal Joshi
2026-10-01 9:05 ` S, Sowmiya
2026-10-01 7:36 ` [PATCH i-g-t 07/13] lib/i915/i915_dp: add i915_dp_get_tc_mode() Kunal Joshi
2026-10-01 7:36 ` [PATCH i-g-t 08/13] tests/intel/kms_dp_link_training: log the DP link inventory Kunal Joshi
2026-10-01 7:36 ` [PATCH i-g-t 09/13] tests/intel/kms_dp_link_training: train each MST topology only once Kunal Joshi
2026-10-01 7:37 ` [PATCH i-g-t 10/13] tests/intel/kms_dp_link_training: add tbt-alt and direct link subtests Kunal Joshi
2026-10-01 7:37 ` [PATCH i-g-t 11/13] lib/igt_dp: add DPCD read helpers Kunal Joshi
2026-10-01 7:37 ` [PATCH i-g-t 12/13] lib/igt_dp: add DPCD link status and channel coding checks Kunal Joshi
2026-10-01 7:37 ` [PATCH i-g-t 13/13] tests/intel/kms_dp_link_training: check the link from the sink side Kunal Joshi
2026-10-01 13:13 ` ✓ i915.CI.BAT: success for Expand kms_dp_link_training coverage (rev2) Patchwork
2026-10-01 16:42 ` ✓ Xe.CI.BAT: " Patchwork
2026-10-01 21:02 ` ✗ Xe.CI.FULL: failure " Patchwork
2026-10-05 16:06 ` Joshi, Kunal1
2026-10-02 17:18 ` ✗ i915.CI.Full: " Patchwork
2026-10-05 16:04 ` Joshi, Kunal1
-- strict thread matches above, loose matches on Subject: below --
2026-09-16 4:47 [PATCH i-g-t 00/13] Expand kms_dp_link_training coverage Kunal Joshi
2026-09-16 4:47 ` [PATCH i-g-t 03/13] tests/intel/kms_dp_link_training: Extract train_link_config() Kunal Joshi
2026-09-22 11:51 ` S, Sowmiya
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261001073703.5067-4-kunal1.joshi@intel.com \
--to=kunal1.joshi@intel.com \
--cc=igt-dev@lists.freedesktop.org \
--cc=sowmiya.s@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.