summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/kms_busy.c149
1 files changed, 90 insertions, 59 deletions
diff --git a/tests/kms_busy.c b/tests/kms_busy.c
index 9722aadc..a60ff6b0 100644
--- a/tests/kms_busy.c
+++ b/tests/kms_busy.c
@@ -30,6 +30,8 @@
IGT_TEST_DESCRIPTION("Basic check of KMS ABI with busy framebuffers.");
+static bool all_pipes = false;
+
static igt_output_t *
set_fb_on_crtc(igt_display_t *dpy, int pipe, struct igt_fb *fb)
{
@@ -287,13 +289,46 @@ static void test_pageflip_modeset_hang(igt_display_t *dpy, enum pipe pipe)
igt_remove_fb(dpy->drm_fd, &fb);
}
-igt_main
+static int opt_handler(int opt, int opt_index, void *data)
+{
+ switch (opt) {
+ case 'e':
+ all_pipes = true;
+ break;
+ default:
+ return IGT_OPT_HANDLER_ERROR;
+ }
+
+ return IGT_OPT_HANDLER_SUCCESS;
+}
+
+const char *help_str =
+ " -e \tRun on all pipes. (By default subtests will run on two pipes)\n";
+
+igt_main_args("e", NULL, help_str, opt_handler, NULL)
{
igt_display_t display = { .drm_fd = -1, .n_pipes = IGT_MAX_PIPES };
- enum pipe n;
+
+ enum pipe active_pipes[IGT_MAX_PIPES];
+ uint32_t last_pipe = 0;
+ int i;
+ struct {
+ const char *name;
+ bool modeset;
+ bool hang_newfb;
+ bool reset;
+ } tests[] = {
+ { "extended-pageflip-hang-oldfb", false, false, false },
+ { "extended-pageflip-hang-newfb", false, true, false },
+ { "extended-modeset-hang-oldfb", true, false, false },
+ { "extended-modeset-hang-newfb", true, true, false },
+ { "extended-modeset-hang-oldfb-with-reset", true, false, true },
+ { "extended-modeset-hang-newfb-with-reset", true, true, true },
+ };
igt_fixture {
int fd = drm_open_driver_master(DRIVER_INTEL);
+ enum pipe pipe;
igt_require_gem(fd);
gem_require_mmap_wc(fd);
@@ -301,6 +336,11 @@ igt_main
kmstest_set_vt_graphics_mode();
igt_display_require(&display, fd);
+
+ /* Get active pipes. */
+ for_each_pipe(&display, pipe)
+ active_pipes[last_pipe++] = pipe;
+ last_pipe--;
}
/* XXX Extend to cover atomic rendering tests to all planes + legacy */
@@ -319,79 +359,70 @@ igt_main
}
}
- for_each_pipe_static(n) igt_subtest_group {
- igt_hang_t hang;
-
+ igt_subtest_with_dynamic("basic-hang") {
+ enum pipe pipe;
+ igt_output_t *output;
+ igt_hang_t hang = igt_allow_hang(display.drm_fd, 0, 0);
errno = 0;
- igt_fixture {
- igt_display_require_output_on_pipe(&display, n);
- }
-
- igt_describe("Tests basic flip on pipe.");
- igt_subtest_f("basic-flip-pipe-%s", kmstest_pipe_name(n)) {
- test_flip(&display, n, false);
- }
- igt_describe("Tests basic modeset on pipe.");
- igt_subtest_f("basic-modeset-pipe-%s", kmstest_pipe_name(n)) {
-
- test_flip(&display, n, true);
- }
-
- igt_fixture {
- hang = igt_allow_hang(display.drm_fd, 0, 0);
- }
+ for_each_pipe_with_valid_output(&display, pipe, output) {
+ if (!all_pipes && pipe != active_pipes[0] &&
+ pipe != active_pipes[last_pipe])
+ continue;
- igt_describe("Hang test on pipe with oldfb and extended pageflip modeset.");
- igt_subtest_f("extended-pageflip-modeset-hang-oldfb-pipe-%s",
- kmstest_pipe_name(n)) {
- test_pageflip_modeset_hang(&display, n);
+ igt_dynamic_f("flip-pipe-%s", kmstest_pipe_name(pipe))
+ test_flip(&display, pipe, false);
+ igt_dynamic_f("modeset-pipe-%s", kmstest_pipe_name(pipe))
+ test_flip(&display, pipe, true);
}
- igt_fixture
- igt_require(display.is_atomic);
+ igt_disallow_hang(display.drm_fd, hang);
+ }
- igt_describe("Test the results with a single hanging pageflip on pipe with oldfb.");
- igt_subtest_f("extended-pageflip-hang-oldfb-pipe-%s",
- kmstest_pipe_name(n))
- test_hang(&display, n, false, false);
+ igt_subtest_with_dynamic("extended-pageflip-modeset-hang-oldfb") {
+ enum pipe pipe;
+ igt_output_t *output;
+ igt_hang_t hang = igt_allow_hang(display.drm_fd, 0, 0);
+ errno = 0;
- igt_describe("Test the results with a single hanging pageflip on pipe with newfb.");
- igt_subtest_f("extended-pageflip-hang-newfb-pipe-%s",
- kmstest_pipe_name(n))
- test_hang(&display, n, false, true);
+ for_each_pipe_with_valid_output(&display, pipe, output) {
+ if (!all_pipes && pipe != active_pipes[0] &&
+ pipe != active_pipes[last_pipe])
+ continue;
- igt_describe("Tests modeset disable/enable with hang on pipe with oldfb.");
- igt_subtest_f("extended-modeset-hang-oldfb-pipe-%s",
- kmstest_pipe_name(n))
- test_hang(&display, n, true, false);
+ igt_dynamic_f("pipe-%s", kmstest_pipe_name(pipe))
+ test_pageflip_modeset_hang(&display, pipe);
+ }
- igt_describe("Tests modeset disable/enable with hang on pipe with newfb.");
- igt_subtest_f("extended-modeset-hang-newfb-pipe-%s",
- kmstest_pipe_name(n))
- test_hang(&display, n, true, true);
+ igt_disallow_hang(display.drm_fd, hang);
+ }
- igt_describe("Tests modeset disable/enable with hang on reset pipe with oldfb.");
- igt_subtest_f("extended-modeset-hang-oldfb-with-reset-pipe-%s",
- kmstest_pipe_name(n)) {
- igt_set_module_param_int(display.drm_fd, "force_reset_modeset_test", 1);
+ for (i = 0; i < sizeof(tests) / sizeof (tests[0]); i++) {
+ igt_subtest_with_dynamic(tests[i].name) {
+ enum pipe pipe;
+ igt_output_t *output;
+ igt_hang_t hang;
+ errno = 0;
- test_hang(&display, n, true, false);
+ igt_require(display.is_atomic);
+ hang = igt_allow_hang(display.drm_fd, 0, 0);
- igt_set_module_param_int(display.drm_fd, "force_reset_modeset_test", 0);
- }
+ for_each_pipe_with_valid_output(&display, pipe, output) {
+ if (!all_pipes && pipe != active_pipes[0] &&
+ pipe != active_pipes[last_pipe])
+ continue;
- igt_describe("Tests modeset disable/enable with hang on reset pipe with newfb.");
- igt_subtest_f("extended-modeset-hang-newfb-with-reset-pipe-%s",
- kmstest_pipe_name(n)) {
- igt_set_module_param_int(display.drm_fd, "force_reset_modeset_test", 1);
+ igt_dynamic_f("pipe-%s", kmstest_pipe_name(pipe)) {
+ if (tests[i].reset)
+ igt_set_module_param_int(display.drm_fd, "force_reset_modeset_test", 1);
- test_hang(&display, n, true, true);
+ test_hang(&display, pipe, tests[i].modeset, tests[i].hang_newfb);
- igt_set_module_param_int(display.drm_fd, "force_reset_modeset_test", 0);
- }
+ if (tests[i].reset)
+ igt_set_module_param_int(display.drm_fd, "force_reset_modeset_test", 0);
+ }
+ }
- igt_fixture {
igt_disallow_hang(display.drm_fd, hang);
}
}