[igt-dev] [PATCH i-g-t] tests/kms_vrr: Extend to cover full VRR range

Bhanuprakash Modem bhanuprakash.modem at intel.com
Mon Feb 22 13:36:29 UTC 2021


As we are restricting the vrr max to current mode vrefresh,
we are not covering the full vrr range with default mode.

So, instead of running tests on default mode, loop through the
all connector modes and find the mode with max refresh rate to
exercise full vrr range.

Cc: Ville Syrjälä <ville.syrjala at linux.intel.com>
Cc: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>
Suggested-by: Manasi Navare <manasi.d.navare at intel.com>
Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem at intel.com>
---
 tests/kms_vrr.c | 48 ++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 42 insertions(+), 6 deletions(-)

diff --git a/tests/kms_vrr.c b/tests/kms_vrr.c
index e4ea74c17..e9071c220 100644
--- a/tests/kms_vrr.c
+++ b/tests/kms_vrr.c
@@ -33,6 +33,13 @@
  */
 #define TEST_DURATION_NS (5000000000ull)
 
+#define DRM_MODE_FMT    "\"%s\": %d %d %d %d %d %d %d %d %d %d 0x%x 0x%x"
+#define DRM_MODE_ARG(m) \
+	(m)->name, (m)->vrefresh, (m)->clock, \
+	(m)->hdisplay, (m)->hsync_start, (m)->hsync_end, (m)->htotal, \
+	(m)->vdisplay, (m)->vsync_start, (m)->vsync_end, (m)->vtotal, \
+	(m)->type, (m)->flags
+
 enum {
 	TEST_NONE = 0,
 	TEST_DPMS = 1 << 0,
@@ -111,6 +118,26 @@ static uint64_t rate_from_refresh(uint64_t refresh)
 	return NSECS_PER_SEC / refresh;
 }
 
+/* Instead of running on default mode, loop through the connector modes
+ * and find the mode with max refresh rate to exercise full vrr range.
+ */
+static drmModeModeInfo output_mode_with_maxrate(igt_output_t *output)
+{
+	int i;
+	drmModeConnectorPtr connector = output->config.connector;
+	drmModeModeInfo mode = *igt_output_get_mode(output);
+
+	igt_debug("Default Mode " DRM_MODE_FMT "\n", DRM_MODE_ARG(&mode));
+
+	for (i = 0; i < connector->count_modes; i++)
+		if (connector->modes[i].vrefresh > mode.vrefresh)
+			mode = connector->modes[i];
+
+	igt_debug("Override Mode " DRM_MODE_FMT "\n", DRM_MODE_ARG(&mode));
+
+	return mode;
+}
+
 /* Read min and max vrr range from the connector debugfs.
  *  - min range should be less than the current mode vfreq
  *  - if max range is grater than the current mode vfreq, consider
@@ -176,7 +203,7 @@ static void set_vrr_on_pipe(data_t *data, enum pipe pipe, bool enabled)
 /* Prepare the display for testing on the given pipe. */
 static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
 {
-	drmModeModeInfo mode = *igt_output_get_mode(output);
+	drmModeModeInfo mode = output_mode_with_maxrate(output);
 	cairo_t *cr;
 
 	/* Reset output */
@@ -202,6 +229,7 @@ static void prepare_test(data_t *data, igt_output_t *output, enum pipe pipe)
 	/* Take care of any required modesetting before the test begins. */
 	data->primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
 	igt_plane_set_fb(data->primary, &data->fb0);
+	igt_output_override_mode(output, &mode);
 
 	/* Clear vrr_enabled state before enabling it, because
 	 * it might be left enabled if the previous test fails.
@@ -269,6 +297,9 @@ flip_and_measure(data_t *data, igt_output_t *output, enum pipe pipe,
 		 */
 		event_ns = get_kernel_event_ns(data, DRM_EVENT_FLIP_COMPLETE);
 
+		igt_debug("event_ns - last_event_ns: %"PRIu64"\n",
+						(event_ns - last_event_ns));
+
 		/*
 		 * Check if the difference between the two flip timestamps
 		 * was within the required threshold from the expected rate.
@@ -316,15 +347,19 @@ static void
 test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags)
 {
 	uint32_t result;
-	vtest_ns_t vtest_ns = get_test_rate_ns(data, output);
-	range_t range = get_vrr_range(data, output);
-	uint64_t rate = vtest_ns.mid;
+	vtest_ns_t vtest_ns;
+	range_t range;
+	uint64_t rate;
+
+	prepare_test(data, output, pipe);
+
+	vtest_ns = get_test_rate_ns(data, output);
+	range = get_vrr_range(data, output);
+	rate = vtest_ns.mid;
 
 	igt_info("VRR Test execution on %s, PIPE_%s with VRR range: (%u-%u) Hz\n",
 		 output->name, kmstest_pipe_name(pipe), range.min, range.max);
 
-	prepare_test(data, output, pipe);
-
 	set_vrr_on_pipe(data, pipe, 1);
 
 	/*
@@ -394,6 +429,7 @@ test_basic(data_t *data, enum pipe pipe, igt_output_t *output, uint32_t flags)
 	/* Clean-up */
 	igt_plane_set_fb(data->primary, NULL);
 	igt_output_set_pipe(output, PIPE_NONE);
+	igt_output_override_mode(output, NULL);
 	igt_display_commit2(&data->display, COMMIT_ATOMIC);
 
 	igt_remove_fb(data->drm_fd, &data->fb1);
-- 
2.20.1



More information about the igt-dev mailing list