summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/kms_atomic_transition.c71
1 files changed, 67 insertions, 4 deletions
diff --git a/tests/kms_atomic_transition.c b/tests/kms_atomic_transition.c
index 4c295125..54581ed7 100644
--- a/tests/kms_atomic_transition.c
+++ b/tests/kms_atomic_transition.c
@@ -189,6 +189,7 @@ enum transition_type {
TRANSITION_PLANES,
TRANSITION_AFTER_FREE,
TRANSITION_MODESET,
+ TRANSITION_MODESET_FAST,
TRANSITION_MODESET_DISABLE,
};
@@ -528,6 +529,13 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
}
for (i = 0; i < iter_max; i++) {
+ int n_enable_planes = hweight32(i);
+
+ if (type == TRANSITION_MODESET_FAST &&
+ n_enable_planes > 1 &&
+ n_enable_planes < pipe_obj->n_planes)
+ continue;
+
igt_output_set_pipe(output, pipe);
wm_setup_plane(display, pipe, i, parms, fencing);
@@ -547,16 +555,23 @@ run_transition_test(igt_display_t *display, enum pipe pipe, igt_output_t *output
/* i -> i+1 will be done when i increases, can be skipped here */
for (j = iter_max - 1; j > i + 1; j--) {
+ n_enable_planes = hweight32(j);
+
+ if (type == TRANSITION_MODESET_FAST &&
+ n_enable_planes > 1 &&
+ n_enable_planes < pipe_obj->n_planes)
+ continue;
+
wm_setup_plane(display, pipe, j, parms, fencing);
- if (type == TRANSITION_MODESET)
+ if (type >= TRANSITION_MODESET)
igt_output_override_mode(output, &override_mode);
atomic_commit(display, pipe, flags, (void *)(unsigned long) j, fencing);
wait_for_transition(display, pipe, nonblocking, fencing);
wm_setup_plane(display, pipe, i, parms, fencing);
- if (type == TRANSITION_MODESET)
+ if (type >= TRANSITION_MODESET)
igt_output_override_mode(output, NULL);
atomic_commit(display, pipe, flags, (void *)(unsigned long) i, fencing);
@@ -864,6 +879,19 @@ static void run_modeset_transition(igt_display_t *display, int requested_outputs
run_modeset_tests(display, requested_outputs, nonblocking, fencing);
}
+static bool output_is_internal_panel(igt_output_t *output)
+{
+ switch (output->config.connector->connector_type) {
+ case DRM_MODE_CONNECTOR_LVDS:
+ case DRM_MODE_CONNECTOR_eDP:
+ case DRM_MODE_CONNECTOR_DSI:
+ case DRM_MODE_CONNECTOR_DPI:
+ return true;
+ default:
+ return false;
+ }
+}
+
igt_main
{
igt_display_t display;
@@ -913,13 +941,48 @@ igt_main
for_each_pipe_with_valid_output(&display, pipe, output)
run_transition_test(&display, pipe, output, TRANSITION_AFTER_FREE, true, true);
+ /*
+ * Test modeset cases on internal panels separately with a reduced
+ * number of combinations, to avoid long runtimes due to modesets on
+ * panels with long power cycle delays.
+ */
igt_subtest("plane-all-modeset-transition")
- for_each_pipe_with_valid_output(&display, pipe, output)
+ for_each_pipe_with_valid_output(&display, pipe, output) {
+ if (output_is_internal_panel(output))
+ continue;
run_transition_test(&display, pipe, output, TRANSITION_MODESET, false, false);
+ }
igt_subtest("plane-all-modeset-transition-fencing")
- for_each_pipe_with_valid_output(&display, pipe, output)
+ for_each_pipe_with_valid_output(&display, pipe, output) {
+ if (output_is_internal_panel(output))
+ continue;
run_transition_test(&display, pipe, output, TRANSITION_MODESET, false, true);
+ }
+
+ igt_subtest("plane-all-modeset-transition-internal-panels") {
+ int tested = 0;
+
+ for_each_pipe_with_valid_output(&display, pipe, output) {
+ if (!output_is_internal_panel(output))
+ continue;
+ run_transition_test(&display, pipe, output, TRANSITION_MODESET_FAST, false, false);
+ tested++;
+ }
+ igt_skip_on_f(!tested, "No output with internal panel found\n");
+ }
+
+ igt_subtest("plane-all-modeset-transition-fencing-internal-panels") {
+ int tested = 0;
+
+ for_each_pipe_with_valid_output(&display, pipe, output) {
+ if (!output_is_internal_panel(output))
+ continue;
+ run_transition_test(&display, pipe, output, TRANSITION_MODESET_FAST, false, true);
+ tested++;
+ }
+ igt_skip_on_f(!tested, "No output with internal panel found\n");
+ }
igt_subtest("plane-toggle-modeset-transition")
for_each_pipe_with_valid_output(&display, pipe, output)