[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