[igt-dev] [PATCH i-g-t 5/5] tests/intel/kms_psr: made test compaitable with pr
Kunal Joshi
kunal1.joshi at intel.com
Fri Oct 20 06:05:03 UTC 2023
Modified kms_psr to have support for DP pr.
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 | 402 ++++++++++++++++++++++++++++++++++--------
1 file changed, 331 insertions(+), 71 deletions(-)
diff --git a/tests/intel/kms_psr.c b/tests/intel/kms_psr.c
index ffecc5222..b14267dce 100644
--- a/tests/intel/kms_psr.c
+++ b/tests/intel/kms_psr.c
@@ -229,6 +229,102 @@
* @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,
@@ -272,6 +368,9 @@ typedef struct {
igt_output_t *output;
bool with_psr_disabled;
bool supports_psr2;
+ bool supports_psr;
+ bool supports_pr;
+ igt_output_t **pr_outputs;
} data_t;
static void create_cursor_fb(data_t *data)
@@ -316,7 +415,6 @@ static void setup_output(data_t *data)
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)
@@ -444,6 +542,15 @@ static bool psr_wait_entry_if_enabled(data_t *data)
return psr_wait_entry(data->debugfs_fd, data->op_psr_mode);
}
+static bool pr_wait_entry(data_t *data)
+{
+ if (data->with_psr_disabled)
+ return true;
+
+ return igt_wait(dp_pr_active_check(data->debugfs_fd,
+ data->output), 500, 20);
+}
+
static bool psr_wait_update_if_enabled(data_t *data)
{
if (data->with_psr_disabled)
@@ -604,7 +711,10 @@ static void run_test(data_t *data)
expected = "screen GREEN";
break;
}
- igt_assert(psr_wait_update_if_enabled(data));
+ if(strstr(data->output->name, "DP"))
+ igt_assert(pr_wait_entry(data));
+ else
+ igt_assert(psr_wait_update_if_enabled(data));
manual(expected);
}
@@ -687,6 +797,7 @@ static void test_setup(data_t *data)
{
drmModeConnectorPtr connector;
bool psr_entered = false;
+ bool pr_entered = false;
igt_require_f(data->output,
"No available output found\n");
@@ -703,15 +814,23 @@ static void test_setup(data_t *data)
if (data->op_psr_mode == PSR_MODE_2)
igt_require(data->supports_psr2);
- psr_enable_if_enabled(data);
- setup_test_plane(data, data->test_plane_id);
- if (psr_wait_entry_if_enabled(data)) {
- psr_entered = true;
- break;
+ if (strstr(data->output->name, "DP"))
+ {
+ setup_test_plane(data, data->test_plane_id);
+ pr_entered = pr_wait_entry(data);
+ if(pr_entered)
+ break;
+ }
+ else {
+ psr_enable_if_enabled(data);
+ setup_test_plane(data, data->test_plane_id);
+ if(psr_wait_entry_if_enabled(data)) {
+ psr_entered = true;
+ break;
+ }
}
}
-
- igt_assert(psr_entered);
+ igt_assert(psr_entered || pr_entered);
}
static void dpms_off_on(data_t *data)
@@ -748,10 +867,15 @@ data_t data = {};
igt_main_args("", long_options, help_str, opt_handler, &data)
{
enum operations op;
- const char *append_subtest_name[2] = {
+ const char *append_subtest_name[3] = {
"",
- "psr2_"
+ "psr2_",
+ "pr_"
};
+ int pr_output_count;
+ igt_output_t *out;
+ int modes[] = {PSR_MODE_1, PSR_MODE_1, PR_MODE};
+ int z;
igt_fixture {
data.drm_fd = drm_open_driver_master(DRIVER_INTEL | DRIVER_XE);
@@ -759,103 +883,239 @@ igt_main_args("", long_options, help_str, opt_handler, &data)
kmstest_set_vt_graphics_mode();
data.devid = intel_get_drm_devid(data.drm_fd);
- igt_require_f(sink_support(&data, PSR_MODE_1),
- "Sink does not support PSR\n");
-
+ pr_output_count = 0;
+ data.pr_outputs = (igt_output_t **)malloc(sizeof(igt_output_t *) * data.display.n_outputs);
+ for_each_connected_output(&data.display, out)
+ if(output_supports_pr(data.debugfs_fd, out))
+ data.pr_outputs[pr_output_count++] = out;
+ data.supports_psr = sink_support(&data, PSR_MODE_1);
data.supports_psr2 = sink_support(&data, PSR_MODE_2);
+ data.supports_pr = pr_output_count > 0 ? true : false;
+
+ igt_require_f(data.supports_psr || data.supports_pr,
+ "Sink does not support PSR/PR\n");
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]) {
+ if (data.op_psr_mode == PR_MODE)
+ {
+ for(int k = 0; k < pr_output_count; k++) {
+ igt_dynamic_f("%s", data.pr_outputs[k]->name)
+ {
+ data.output = data.pr_outputs[k];
+ data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
+ test_setup(&data);
+ test_cleanup(&data);
+ }
+ }
+ }
+ else {
+ setup_output(&data);
+ 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]) {
+ if (data.op_psr_mode == PR_MODE)
+ {
+ for(int k = 0; k < pr_output_count; k++) {
+ igt_dynamic_f("%s", data.pr_outputs[k]->name)
+ {
+ data.output = data.pr_outputs[k];
+ data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
+ test_setup(&data);
+ igt_assert(drrs_disabled(&data));
+ test_cleanup(&data);
+
+ }
+ }
+ }
+ else {
+ setup_output(&data);
+ 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);
+ if (data.op_psr_mode == PR_MODE)
+ {
+ for(int k = 0; k < pr_output_count; k++) {
+ igt_dynamic_f("%s", data.pr_outputs[k]->name)
+ {
+ data.output = data.pr_outputs[k];
+ data.op = op;
+ data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
+ test_setup(&data);
+ run_test(&data);
+ test_cleanup(&data);
+ }
+ }
+ }
+ else {
+ setup_output(&data);
+ 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);
+ if (data.op_psr_mode == PR_MODE)
+ {
+ for(int k = 0; k < pr_output_count; k++) {
+ igt_dynamic_f("%s", data.pr_outputs[k]->name)
+ {
+ data.output = data.pr_outputs[k];
+ data.op = op;
+ data.test_plane_id = DRM_PLANE_TYPE_OVERLAY;
+ test_setup(&data);
+ run_test(&data);
+ test_cleanup(&data);
+ }
+ }
+ }
+ else {
+ setup_output(&data);
+ 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],
- op_str(op)) {
+ "and plane operations performed on cursor planes");
+ 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);
+ (op == MMAP_CPU || op == MMAP_GTT));
+ if (data.op_psr_mode == PR_MODE)
+ {
+ for(int k = 0; k < pr_output_count; k++) {
+ igt_dynamic_f("%s", data.pr_outputs[k]->name)
+ {
+ data.output = data.pr_outputs[k];
+ data.op = op;
+ data.test_plane_id = DRM_PLANE_TYPE_CURSOR;
+ test_setup(&data);
+ run_test(&data);
+ test_cleanup(&data);
+ }
+ }
+ }
+ else {
+ setup_output(&data);
+ igt_dynamic_f("%s", data.output->name) {
+ data.op = op;
+ 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_describe("Check if psr is detecting changes when rendering operation is performed "
+ "with dpms enabled or disabled");
+ igt_subtest_with_dynamic_f("%sdpms", append_subtest_name[z]) {
+ if (data.op_psr_mode == PR_MODE)
+ {
+ for(int k = 0; k < pr_output_count; k++) {
+ igt_dynamic_f("%s", data.pr_outputs[k]->name)
+ {
+ data.output = data.pr_outputs[k];
+ data.op = RENDER;
+ data.test_plane_id = DRM_PLANE_TYPE_PRIMARY;
+ test_setup(&data);
+ dpms_off_on(&data);
+ run_test(&data);
+ test_cleanup(&data);
+ }
+ }
+ }
+ else {
+ setup_output(&data);
+ 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]) {
+ if (data.op_psr_mode == PR_MODE)
+ {
+ for(int k = 0; k < pr_output_count; k++) {
+ igt_dynamic_f("%s", data.pr_outputs[k]->name)
+ {
+ data.output = data.pr_outputs[k];
+ 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(pr_wait_entry(&data));
+ run_test(&data);
+ test_cleanup(&data);
+ }
+ }
+ }
+ else {
+ setup_output(&data);
+ 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);
+ }
+ }
}
}
--
2.25.1
More information about the igt-dev
mailing list