diff options
-rw-r--r-- | tests/kms_psr.c | 138 |
1 files changed, 85 insertions, 53 deletions
diff --git a/tests/kms_psr.c b/tests/kms_psr.c index 8f2ef89c..3e16a6bf 100644 --- a/tests/kms_psr.c +++ b/tests/kms_psr.c @@ -61,6 +61,7 @@ typedef struct { int debugfs_fd; enum operations op; int test_plane_id; + enum psr_mode op_psr_mode; uint32_t devid; uint32_t crtc_id; igt_display_t display; @@ -72,6 +73,7 @@ typedef struct { drmModeModeInfo *mode; igt_output_t *output; bool with_psr_disabled; + bool supports_psr2; } data_t; static void create_cursor_fb(data_t *data) @@ -190,10 +192,10 @@ static void fill_render(data_t *data, uint32_t handle, unsigned char color) gem_bo_busy(data->drm_fd, handle); } -static bool sink_support(data_t *data) +static bool sink_support(data_t *data, enum psr_mode mode) { return data->with_psr_disabled || - psr_sink_support(data->debugfs_fd, PSR_MODE_1); + psr_sink_support(data->debugfs_fd, mode); } static bool psr_wait_entry_if_enabled(data_t *data) @@ -201,7 +203,23 @@ static bool psr_wait_entry_if_enabled(data_t *data) if (data->with_psr_disabled) return true; - return psr_wait_entry(data->debugfs_fd, PSR_MODE_1); + return psr_wait_entry(data->debugfs_fd, data->op_psr_mode); +} + +static bool psr_wait_update_if_enabled(data_t *data) +{ + if (data->with_psr_disabled) + return true; + + return psr_wait_update(data->debugfs_fd, data->op_psr_mode); +} + +static bool psr_enable_if_enabled(data_t *data) +{ + if (data->with_psr_disabled) + return true; + + return psr_enable(data->debugfs_fd, data->op_psr_mode); } static inline void manual(const char *expected) @@ -291,7 +309,7 @@ static void run_test(data_t *data) expected = "screen GREEN"; break; } - igt_assert(psr_wait_update(data->debugfs_fd, PSR_MODE_1)); + igt_assert(psr_wait_update_if_enabled(data)); manual(expected); } @@ -369,6 +387,9 @@ static void setup_test_plane(data_t *data, int test_plane) 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); igt_assert(psr_wait_entry_if_enabled(data)); } @@ -399,13 +420,17 @@ static int opt_handler(int opt, int opt_index, void *_data) int main(int argc, char *argv[]) { const char *help_str = - " --no-psr\tRun test without PSR."; + " --no-psr\tRun test without PSR/PSR2."; static struct option long_options[] = { {"no-psr", 0, 0, 'n'}, { 0, 0, 0, 0 } }; data_t data = {}; enum operations op; + const char *append_subtest_name[2] = { + "", + "psr2_" + }; igt_subtest_init_parse_opts(&argc, argv, "", long_options, help_str, opt_handler, &data); @@ -417,12 +442,11 @@ int main(int argc, char *argv[]) kmstest_set_vt_graphics_mode(); data.devid = intel_get_drm_devid(data.drm_fd); - if (!data.with_psr_disabled) - psr_enable(data.debugfs_fd, PSR_MODE_1); - - igt_require_f(sink_support(&data), + igt_require_f(sink_support(&data, PSR_MODE_1), "Sink does not support PSR\n"); + data.supports_psr2 = sink_support(&data, PSR_MODE_2); + data.bufmgr = drm_intel_bufmgr_gem_init(data.drm_fd, 4096); igt_assert(data.bufmgr); drm_intel_bufmgr_gem_enable_reuse(data.bufmgr); @@ -430,69 +454,77 @@ int main(int argc, char *argv[]) display_init(&data); } - igt_subtest("basic") { - data.test_plane_id = DRM_PLANE_TYPE_PRIMARY; - test_setup(&data); - test_cleanup(&data); - } + for (data.op_psr_mode = PSR_MODE_1; data.op_psr_mode <= PSR_MODE_2; + data.op_psr_mode++) { - igt_subtest("no_drrs") { - data.test_plane_id = DRM_PLANE_TYPE_PRIMARY; - test_setup(&data); - igt_assert(drrs_disabled(&data)); - test_cleanup(&data); - } + 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); + } - for (op = PAGE_FLIP; op <= RENDER; op++) { - igt_subtest_f("primary_%s", op_str(op)) { - data.op = op; + igt_subtest_f("%sno_drrs", append_subtest_name[data.op_psr_mode]) { data.test_plane_id = DRM_PLANE_TYPE_PRIMARY; test_setup(&data); - run_test(&data); + igt_assert(drrs_disabled(&data)); test_cleanup(&data); } - } - for (op = MMAP_GTT; op <= PLANE_ONOFF; op++) { - igt_subtest_f("sprite_%s", op_str(op)) { - data.op = op; - data.test_plane_id = DRM_PLANE_TYPE_OVERLAY; + for (op = PAGE_FLIP; op <= RENDER; op++) { + igt_subtest_f("%sprimary_%s", + append_subtest_name[data.op_psr_mode], + op_str(op)) { + 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_subtest_f("%ssprite_%s", + append_subtest_name[data.op_psr_mode], + op_str(op)) { + data.op = op; + data.test_plane_id = DRM_PLANE_TYPE_OVERLAY; + test_setup(&data); + run_test(&data); + test_cleanup(&data); + } + + igt_subtest_f("%scursor_%s", + append_subtest_name[data.op_psr_mode], + op_str(op)) { + data.op = op; + data.test_plane_id = DRM_PLANE_TYPE_CURSOR; + test_setup(&data); + run_test(&data); + test_cleanup(&data); + } + } + + 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); } - } - for (op = MMAP_GTT; op <= PLANE_ONOFF; op++) { - igt_subtest_f("cursor_%s", op_str(op)) { - data.op = op; + 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_f("dpms") { - 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_f("suspend") { - 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_fixture { if (!data.with_psr_disabled) psr_disable(data.debugfs_fd); |