[igt-dev] [PATCH i-g-t 6/7] tests/intel/kms_psr: made test compaitable with pr

Kunal Joshi kunal1.joshi at intel.com
Tue Oct 31 08:09:48 UTC 2023


Modified kms_psr to have support for PR.

v2: remove set_output and have outputs (Jouni)
v3: loop over connected outputs (Jouni)

Cc: Jouni Högander <jouni.hogander at intel.com>
Cc: Animesh Manna <animesh.manna 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_psr.c | 381 +++++++++++++++++++++++++++++++-----------
 1 file changed, 286 insertions(+), 95 deletions(-)

diff --git a/tests/intel/kms_psr.c b/tests/intel/kms_psr.c
index 8485e9894..feb24329f 100644
--- a/tests/intel/kms_psr.c
+++ b/tests/intel/kms_psr.c
@@ -25,7 +25,7 @@
 /**
  * TEST: kms psr
  * Category: Display
- * Description: Tests behaviour of PSR & PSR2
+ * Description: Tests behaviour of PSR & PSR2 & PR
  */
 
 #include "igt.h"
@@ -39,14 +39,14 @@
 #include "xe/xe_query.h"
 
 /**
- * SUBTEST: basic
+ * SUBTEST: psr_basic
  * Description: Basic check for psr if it is detecting changes made in planes
  * Driver requirement: i915, xe
  * Functionality: psr
  * Mega feature: PSR
  * Test category: functionality test
  *
- * SUBTEST: %s_%s
+ * SUBTEST: psr_%s_%s
  * Description: Check if psr is detecting memory mapping, rendering and plane
  *              operations performed on %arg[1]
  * Driver requirement: i915
@@ -67,7 +67,7 @@
  */
 
 /**
- * SUBTEST: sprite_plane_move
+ * SUBTEST: psr_sprite_plane_move
  * Description: Check if psr is detecting memory mapping, rendering and plane
  *              operations performed on sprite planes
  * Driver requirement: i915, xe
@@ -75,7 +75,7 @@
  * Mega feature: PSR
  * Test category: functionality test
  *
- * SUBTEST: %s_%s
+ * SUBTEST: psr_%s_%s
  * Description: Check if psr is detecting memory mapping, rendering and plane
  *              operations performed on %arg[1] planes
  * Driver requirement: i915, xe
@@ -96,7 +96,7 @@
  */
 
 /**
- * SUBTEST: primary_%s
+ * SUBTEST: psr_primary_%s
  * Description: Check if psr is detecting memory mapping, rendering and plane
  *              operations performed on %arg[1] planes
  * Driver requirement: i915, xe
@@ -111,7 +111,7 @@
  */
 
 /**
- * SUBTEST: dpms
+ * SUBTEST: psr_dpms
  * Description: Check if psr is detecting changes when rendering operation is
  *              performed  with dpms enabled or disabled
  * Driver requirement: i915, xe
@@ -119,14 +119,14 @@
  * Mega feature: PSR
  * Test category: functionality test
  *
- * SUBTEST: no_drrs
+ * SUBTEST: psr_no_drrs
  * Description: Check if psr is detecting changes when drrs is disabled
  * Driver requirement: i915, xe
  * Functionality: drrs, psr
  * Mega feature: PSR
  * Test category: functionality test
  *
- * SUBTEST: suspend
+ * SUBTEST: psr_suspend
  * Description: Check if psr is detecting changes when plane operation
  *              is performed with suspend resume cycles
  * Driver requirement: i915, xe
@@ -229,6 +229,112 @@
  * @plane_move:         Move plane position
  */
 
+/**
+ * SUBTEST: pr_dpms
+ * Description: Check if pr is detecting changes when rendering operation
+ *              is performed with dpms enabled or disabled
+ * Driver requirement: i915, xe
+ * Functionality: dpms, pr
+ * Mega feature: Panel Replay
+ * Test category: functionality test
+ */
+
+/**
+ * SUBTEST: pr_no_drrs
+ * Description: Check if pr is detecting changes when drrs is disabled
+ * Driver requirement: i915, xe
+ * Functionality: drrs, pr
+ * Mega feature: Panel Replay
+ * Test category: functionality test
+ */
+
+/**
+ * SUBTEST: pr_suspend
+ * Description: Check if pr is detecting changes when plane operation is
+ *              performed with suspend resume cycles
+ * Driver requirement: i915, xe
+ * Functionality: pr, suspend
+ * Mega feature: Panel Replay
+ * Test category: functionality test
+ */
+
+/**
+ * SUBTEST: pr_basic
+ * Description: Basic check for pr if it is detecting changes made in planes
+ * Driver requirement: i915, xe
+ * Functionality: pr
+ * Mega feature: Panel Replay
+ * Test category: functionality test
+ */
+
+/**
+ * SUBTEST: pr_%s_%s
+ * Description: Check if pr is detecting memory mapping, rendering and plane
+ *              operations performed on %arg[1] planes
+ * Driver requirement: i915
+ * Functionality: kms_core, plane, pr
+ * Mega feature: Panel Replay
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @cursor:             Cursor plane
+ * @primary:            Primary plane
+ * @sprite:             Sprite plane
+ *
+ * arg[2]:
+ *
+ * @mmap_cpu:           MMAP CPU
+ * @mmap_gtt:           MMAP GTT
+ */
+
+/**
+ * SUBTEST: pr_primary_page_flip
+ * Description: Check if pr is detecting memory mapping, rendering and plane
+ *              operations performed on primary planes
+ * Driver requirement: i915, xe
+ * Functionality: plane, pr
+ * Mega feature: Panel Replay
+ * Test category: functionality test
+ */
+
+/**
+ * SUBTEST: pr_primary_%s
+ * Description: Check if pr is detecting memory mapping, rendering and plane
+ *              operations performed on primary planes
+ * Driver requirement: i915, xe
+ * Functionality: kms_core, plane, pr
+ * Mega feature: Panel Replay
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @blt:                Blitter
+ * @render:             Render
+ */
+
+/**
+ * SUBTEST: pr_%s_%s
+ * Description: Check if pr is detecting memory mapping, rendering and plane
+ *              operations performed on %arg[1] planes
+ * Driver requirement: i915, xe
+ * Functionality: kms_core, plane, pr
+ * Mega feature: Panel Replay
+ * Test category: functionality test
+ *
+ * arg[1]:
+ *
+ * @cursor:             Cursor plane
+ * @sprite:             Sprite plane
+ *
+ * arg[2]:
+ *
+ * @blt:                Blitter
+ * @render:             Render
+ * @plane_onoff:        Plane On off
+ * @plane_move:         Move plane position
+ */
+
 enum operations {
 	PAGE_FLIP,
 	MMAP_GTT,
@@ -271,7 +377,9 @@ typedef struct {
 	drmModeModeInfo *mode;
 	igt_output_t *output;
 	bool with_psr_disabled;
+	bool supports_psr;
 	bool supports_psr2;
+	bool supports_pr;
 } data_t;
 
 static void create_cursor_fb(data_t *data)
@@ -289,36 +397,34 @@ static void create_cursor_fb(data_t *data)
 	igt_put_cairo_ctx(cr);
 }
 
-static void setup_output(data_t *data)
+static void set_output_supports(data_t *data)
 {
-	igt_display_t *display = &data->display;
 	igt_output_t *output;
-	enum pipe pipe;
-
-	for_each_pipe_with_valid_output(display, pipe, output) {
-		drmModeConnectorPtr c = output->config.connector;
 
-		if (c->connector_type != DRM_MODE_CONNECTOR_eDP)
-			continue;
-
-		igt_display_reset(display);
-		igt_output_set_pipe(output, pipe);
-		if (!i915_pipe_output_combo_valid(display))
-			continue;
-
-		data->crtc_id = output->config.crtc->crtc_id;
-		data->output = output;
-
-		return;
+	for_each_connected_output(&data->display, output) {
+                if(psr_sink_support(data->drm_fd, data->debugfs_fd,
+                                    PSR_MODE_2, output))
+                {
+                        data->supports_psr2 = true;
+                        igt_debug("PSR_2 supported on %s\n", output->name);
+                }
+		else if(psr_sink_support(data->drm_fd, data->debugfs_fd,
+				    PSR_MODE_1, output))
+		{
+			data->supports_psr = true;
+			igt_debug("PSR_1 supported on %s\n", output->name);
+		}
+		else if(psr_sink_support(data->drm_fd, data->debugfs_fd,
+                                    PR_MODE, output))
+                {
+                        data->supports_pr = true;
+			igt_debug("PR supported on %s\n", output->name);
+                }
+		else
+			igt_debug("PSR/PSR2/PR not supported on %s\n", output->name);
 	}
 }
 
-static void display_init(data_t *data)
-{
-	igt_display_require(&data->display, data->drm_fd);
-	setup_output(data);
-}
-
 static void display_fini(data_t *data)
 {
 	igt_display_fini(&data->display);
@@ -502,7 +608,7 @@ static void fb_dirty_fb_ioctl(data_t *data, struct igt_fb *fb)
 }
 
 /**
- * SUBTEST: cursor_plane_move
+ * SUBTEST: psr_cursor_plane_move
  * Description: Check if psr is detecting the plane operations performed on
  *		cursor planes
  * Driver requirement: i915, xe
@@ -510,7 +616,7 @@ static void fb_dirty_fb_ioctl(data_t *data, struct igt_fb *fb)
  * Functionality: psr
  * Mega feature: PSR
  *
- * SUBTEST: primary_page_flip
+ * SUBTEST: psr_primary_page_flip
  * Description: Check if psr is detecting page-flipping operations performed
  *		on primary planes
  * Driver requirement: i915, xe
@@ -518,7 +624,7 @@ static void fb_dirty_fb_ioctl(data_t *data, struct igt_fb *fb)
  * Functionality: psr
  * Mega feature: PSR
  *
- * SUBTEST: sprite_plane_onoff
+ * SUBTEST: psr_sprite_plane_onoff
  * Description: Check if psr is detecting the plane operations performed on
  *		sprite planes
  * Driver requirement: i915, xe
@@ -683,15 +789,36 @@ static void setup_test_plane(data_t *data, int test_plane)
 	igt_display_commit(&data->display);
 }
 
+static enum pipe get_pipe_for_output(igt_display_t *display,
+				     igt_output_t *output)
+{
+        enum pipe pipe;
+
+        for_each_pipe(display, pipe) {
+                if (igt_pipe_connector_valid(pipe, output)) {
+                        return pipe;
+                }
+        }
+
+        igt_assert_f(false, "No pipe found for output %s\n",
+                     igt_output_name(output));
+}
+
 static void test_setup(data_t *data)
 {
+	enum pipe pipe;
 	drmModeConnectorPtr connector;
 	bool psr_entered = false;
 
 	igt_require_f(data->output,
 		      "No available output found\n");
 
+	data->crtc_id = data->output->config.crtc->crtc_id;
 	connector = data->output->config.connector;
+	pipe = get_pipe_for_output(&data->display, data->output);
+	igt_output_set_pipe(data->output, pipe);
+	igt_require_f(i915_pipe_output_combo_valid(&data->display),
+		      "output pipe combo not valid\n");
 
 	for (int i = 0; i < connector->count_modes; i++) {
 		data->mode = &connector->modes[i];
@@ -747,115 +874,179 @@ data_t data = {};
 
 igt_main_args("", long_options, help_str, opt_handler, &data)
 {
+	int z;
 	enum operations op;
-	const char *append_subtest_name[2] = {
-		"",
-		"psr2_"
+	const char *append_subtest_name[3] = {
+		"psr_",
+		"psr2_",
+		"pr_"
 	};
+	int modes[] = {PSR_MODE_1, PSR_MODE_2, PR_MODE};
+	igt_output_t *output;
 
 	igt_fixture {
 		data.drm_fd = drm_open_driver_master(DRIVER_INTEL | DRIVER_XE);
 		data.debugfs_fd = igt_debugfs_dir(data.drm_fd);
 		kmstest_set_vt_graphics_mode();
 		data.devid = intel_get_drm_devid(data.drm_fd);
+		data.bops = buf_ops_create(data.drm_fd);
+		igt_display_require(&data.display, data.drm_fd);
+		set_output_supports(&data);
+		data.supports_psr2 = data.supports_psr2 | sink_support(&data, PSR_MODE_2);
 
-		igt_require_f(sink_support(&data, PSR_MODE_1),
-			      "Sink does not support PSR\n");
+                igt_require_f(data.supports_psr || data.supports_psr2 || data.supports_pr,
+                              "Sink does not support PSR/PSR2/PR\n");
 
-		data.supports_psr2 = sink_support(&data, PSR_MODE_2);
-		data.bops = buf_ops_create(data.drm_fd);
-		display_init(&data);
 	}
 
-	for (data.op_psr_mode = PSR_MODE_1; data.op_psr_mode <= PSR_MODE_2;
-	     data.op_psr_mode++) {
+	for (z = 0; z < ARRAY_SIZE(modes); z++) {
+		data.op_psr_mode = modes[z];
 
 		igt_describe("Basic check for psr if it is detecting changes made in planes");
-		igt_subtest_f("%sbasic", append_subtest_name[data.op_psr_mode]) {
-			data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
-			test_setup(&data);
-			test_cleanup(&data);
+		igt_subtest_with_dynamic_f("%sbasic", append_subtest_name[z]) {
+			for_each_connected_output(&data.display, output) {
+				if (!psr_sink_support(data.drm_fd, data.debugfs_fd,
+						      data.op_psr_mode, output))
+					continue;
+				igt_display_reset(&data.display);
+				data.output = output;
+				igt_dynamic_f("%s", data.output->name) {
+					data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
+					test_setup(&data);
+					test_cleanup(&data);
+				}
+			}
 		}
 
 		igt_describe("Check if psr is detecting changes when drrs is disabled");
-		igt_subtest_f("%sno_drrs", append_subtest_name[data.op_psr_mode]) {
-			data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
-			test_setup(&data);
-			igt_assert(drrs_disabled(&data));
-			test_cleanup(&data);
+		igt_subtest_with_dynamic_f("%sno_drrs", append_subtest_name[z]) {
+			for_each_connected_output(&data.display, output) {
+				if (!psr_sink_support(data.drm_fd, data.debugfs_fd,
+						      data.op_psr_mode, output))
+					continue;
+                                igt_display_reset(&data.display);
+                                data.output = output;
+                                igt_dynamic_f("%s", data.output->name) {
+					data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
+					test_setup(&data);
+					igt_assert(drrs_disabled(&data));
+					test_cleanup(&data);
+				}
+			}
 		}
 
 		for (op = PAGE_FLIP; op <= RENDER; op++) {
 			igt_describe("Check if psr is detecting page-flipping,memory mapping and "
 					"rendering operations performed on primary planes");
-			igt_subtest_f("%sprimary_%s",
-				      append_subtest_name[data.op_psr_mode],
+			igt_subtest_with_dynamic_f("%sprimary_%s",
+				      append_subtest_name[z],
 				      op_str(op)) {
 				igt_skip_on(is_xe_device(data.drm_fd) &&
 					    (op == MMAP_CPU || op == MMAP_GTT));
-
-				data.op = op;
-				data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
-				test_setup(&data);
-				run_test(&data);
-				test_cleanup(&data);
+				for_each_connected_output(&data.display, output) {
+					if (!psr_sink_support(data.drm_fd, data.debugfs_fd,
+							      data.op_psr_mode, output))
+						continue;
+					igt_display_reset(&data.display);
+					data.output = output;
+					igt_dynamic_f("%s", data.output->name) {
+						data.op = op;
+						data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
+						test_setup(&data);
+						run_test(&data);
+						test_cleanup(&data);
+					}
+				}
 			}
 		}
 
 		for (op = MMAP_GTT; op <= PLANE_ONOFF; op++) {
 			igt_describe("Check if psr is detecting memory mapping,rendering "
 					"and plane operations performed on sprite planes");
-			igt_subtest_f("%ssprite_%s",
-				      append_subtest_name[data.op_psr_mode],
+			igt_subtest_with_dynamic_f("%ssprite_%s",
+				      append_subtest_name[z],
 				      op_str(op)) {
 				igt_skip_on(is_xe_device(data.drm_fd) &&
 					    (op == MMAP_CPU || op == MMAP_GTT));
-
-				data.op = op;
-				data.test_plane_id = DRM_PLANE_TYPE_OVERLAY;
-				test_setup(&data);
-				run_test(&data);
-				test_cleanup(&data);
+				for_each_connected_output(&data.display, output) {
+					if (!psr_sink_support(data.drm_fd, data.debugfs_fd,
+							      data.op_psr_mode, output))
+						continue;
+					igt_display_reset(&data.display);
+					data.output = output;
+					igt_dynamic_f("%s", data.output->name) {
+						data.op = op;
+						data.test_plane_id = DRM_PLANE_TYPE_OVERLAY;
+						test_setup(&data);
+						run_test(&data);
+						test_cleanup(&data);
+					}
+				}
 			}
 
 			igt_describe("Check if psr is detecting memory mapping, rendering "
 					"and plane operations performed on cursor planes");
-			igt_subtest_f("%scursor_%s",
-				      append_subtest_name[data.op_psr_mode],
+			igt_subtest_with_dynamic_f("%scursor_%s",
+				      append_subtest_name[z],
 				      op_str(op)) {
 				igt_skip_on(is_xe_device(data.drm_fd) &&
 					    (op == MMAP_CPU || op == MMAP_GTT));
-
-				data.op = op;
-				data.test_plane_id = DRM_PLANE_TYPE_CURSOR;
-				test_setup(&data);
-				run_test(&data);
-				test_cleanup(&data);
+				for_each_connected_output(&data.display, output) {
+					if (!psr_sink_support(data.drm_fd, data.debugfs_fd,
+							      data.op_psr_mode, output))
+						continue;
+					igt_display_reset(&data.display);
+					data.output = output;
+					igt_dynamic_f("%s", data.output->name) {
+						data.test_plane_id = DRM_PLANE_TYPE_CURSOR;
+						test_setup(&data);
+						run_test(&data);
+						test_cleanup(&data);
+					}
+				}
 			}
 		}
 
 		igt_describe("Check if psr is detecting changes when rendering operation is performed"
 				"  with dpms enabled or disabled");
-		igt_subtest_f("%sdpms", append_subtest_name[data.op_psr_mode]) {
-			data.op = RENDER;
-			data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
-			test_setup(&data);
-			dpms_off_on(&data);
-			run_test(&data);
-			test_cleanup(&data);
+		igt_subtest_with_dynamic_f("%sdpms", append_subtest_name[z]) {
+			for_each_connected_output(&data.display, output) {
+				if (!psr_sink_support(data.drm_fd, data.debugfs_fd,
+						      data.op_psr_mode, output))
+					continue;
+                                igt_display_reset(&data.display);
+                                data.output = output;
+                                igt_dynamic_f("%s", data.output->name) {
+					data.op = RENDER;
+					data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
+					test_setup(&data);
+					dpms_off_on(&data);
+					run_test(&data);
+					test_cleanup(&data);
+				}
+			}
 		}
 
 		igt_describe("Check if psr is detecting changes when plane operation is performed "
 				"with suspend resume cycles");
-		igt_subtest_f("%ssuspend", append_subtest_name[data.op_psr_mode]) {
-			data.op = PLANE_ONOFF;
-			data.test_plane_id = DRM_PLANE_TYPE_CURSOR;
-			test_setup(&data);
-			igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
-						      SUSPEND_TEST_NONE);
-			igt_assert(psr_wait_entry_if_enabled(&data));
-			run_test(&data);
-			test_cleanup(&data);
+		igt_subtest_with_dynamic_f("%ssuspend", append_subtest_name[z]) {
+			for_each_connected_output(&data.display, output) {
+				if (!psr_sink_support(data.drm_fd, data.debugfs_fd,
+						      data.op_psr_mode, output))
+					continue;
+                                igt_display_reset(&data.display);
+                                data.output = output;
+                                igt_dynamic_f("%s", data.output->name) {
+					data.op = PLANE_ONOFF;
+					data.test_plane_id = DRM_PLANE_TYPE_CURSOR;
+					test_setup(&data);
+					igt_system_suspend_autoresume(SUSPEND_STATE_MEM,
+								      SUSPEND_TEST_NONE);
+					igt_assert(psr_wait_entry_if_enabled(&data));
+					run_test(&data);
+					test_cleanup(&data);
+				}
+			}
 		}
 	}
 
-- 
2.25.1



More information about the igt-dev mailing list