summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/i915/kms_flip_scaled_crc.c129
1 files changed, 57 insertions, 72 deletions
diff --git a/tests/i915/kms_flip_scaled_crc.c b/tests/i915/kms_flip_scaled_crc.c
index 9740715f..d6edb01c 100644
--- a/tests/i915/kms_flip_scaled_crc.c
+++ b/tests/i915/kms_flip_scaled_crc.c
@@ -163,8 +163,6 @@ const struct {
},
};
-enum subrval {CONNECTORFAIL, CONNECTORSUCCESS, TESTSKIP, NOREQUESTEDFORMATONPIPE};
-
static void setup_fb(data_t *data, struct igt_fb *newfb, uint32_t width,
uint32_t height, uint64_t format, uint64_t modifier)
{
@@ -220,12 +218,12 @@ static void clear_lut(data_t *data, enum pipe pipe)
igt_pipe_obj_set_prop_value(pipe_obj, IGT_CRTC_GAMMA_LUT, 0);
}
-static enum subrval test_flip_to_scaled(data_t *data, uint32_t index,
- enum pipe pipe, igt_output_t *output)
+static void test_flip_to_scaled(data_t *data, uint32_t index,
+ enum pipe pipe, igt_output_t *output,
+ drmModeModeInfoPtr modetoset)
{
igt_plane_t *primary;
igt_crc_t small_crc, big_crc;
- drmModeModeInfoPtr modetoset = NULL;
struct drm_event_vblank ev;
int ret;
@@ -254,18 +252,23 @@ static enum subrval test_flip_to_scaled(data_t *data, uint32_t index,
data->big_fb.height);
}
+ if (modetoset)
+ igt_output_override_mode(output, modetoset);
+ /*
+ * Setting a pipe invalidates the modetoset pointer.
+ * So, mode is overriden first and then pipe is set.
+ * Don't change this sequence.
+ */
igt_output_set_pipe(output, pipe);
primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
- if (!igt_plane_has_format_mod(primary, data->small_fb.drm_format,
- data->small_fb.modifier) ||
- !igt_plane_has_format_mod(primary, data->big_fb.drm_format,
- data->big_fb.modifier))
- return NOREQUESTEDFORMATONPIPE;
+ igt_skip_on_f(!igt_plane_has_format_mod(primary, data->small_fb.drm_format, data->small_fb.modifier) ||
+ !igt_plane_has_format_mod(primary, data->big_fb.drm_format,
+ data->big_fb.modifier), "No requested format/modifier on pipe %s\n", kmstest_pipe_name(pipe));
set_lut(data, pipe);
- igt_display_commit_atomic(&data->display, DRM_MODE_ATOMIC_ALLOW_MODESET,
- NULL);
+ igt_display_commit_atomic(&data->display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
+
if (data->pipe_crc) {
igt_pipe_crc_stop(data->pipe_crc);
igt_pipe_crc_free(data->pipe_crc);
@@ -273,42 +276,15 @@ static enum subrval test_flip_to_scaled(data_t *data, uint32_t index,
data->pipe_crc = igt_pipe_crc_new(data->drm_fd, pipe,
INTEL_PIPE_CRC_SOURCE_AUTO);
- for (int i = 0; i < output->config.connector->count_modes; i++) {
- if (output->config.connector->modes[i].hdisplay == data->attemptmodewidth &&
- output->config.connector->modes[i].vdisplay == data->attemptmodeheight) {
- if (modetoset &&
- modetoset->vrefresh < output->config.connector->modes[i].vrefresh)
- continue;
-
- modetoset = &output->config.connector->modes[i];
- }
- }
-
- if (!modetoset)
- igt_debug("%dp mode was not found from connector, will try with default. This may cause cdclk to fail this test on this connector.\n",
- data->attemptmodeheight);
- else
- igt_output_override_mode(output, modetoset);
-
igt_plane_set_position(primary, 0, 0);
igt_plane_set_fb(primary, &data->small_fb);
igt_plane_set_size(primary, data->attemptmodewidth,
data->attemptmodeheight);
ret = igt_display_try_commit_atomic(&data->display, DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
- switch (ret) {
- case -ERANGE:
- igt_debug("Platform scaling limits exceeded, skipping.\n");
- return TESTSKIP;
- case -EINVAL:
- if (!modetoset) {
- igt_debug("No %dp and default mode too big, cdclk limits exceeded. Check next connector\n",
- data->attemptmodeheight);
- return CONNECTORFAIL;
- }
- /* fallthrough */
- default:
- igt_assert_eq(ret, 0);
- }
+
+ igt_skip_on_f(ret == -ERANGE, "Platform scaling limits exceeded, skipping.\n");
+ igt_skip_on_f((ret == -EINVAL) && (!modetoset || modetoset->vrefresh > 90), "Valid/default mode too big, cdclk limits exceeded. Check next connector\n");
+ igt_assert_eq(ret, 0);
igt_pipe_crc_start(data->pipe_crc);
igt_pipe_crc_get_current(data->drm_fd, data->pipe_crc, &small_crc);
@@ -320,20 +296,9 @@ static enum subrval test_flip_to_scaled(data_t *data, uint32_t index,
DRM_MODE_ATOMIC_ALLOW_MODESET |
DRM_MODE_PAGE_FLIP_EVENT, NULL);
- switch (ret) {
- case -ERANGE:
- igt_debug("Platform scaling limits exceeded, skipping.\n");
- return TESTSKIP;
- case -EINVAL:
- if (!modetoset) {
- igt_debug("No %dp and default mode too big, cdclk limits exceeded. Check next connector\n",
- data->attemptmodeheight);
- return CONNECTORFAIL;
- }
- /* fallthrough */
- default:
- igt_assert_eq(ret, 0);
- }
+ igt_skip_on_f(ret == -ERANGE, "Platform scaling limits exceeded, skipping.\n");
+ igt_skip_on_f((ret == -EINVAL) && (!modetoset || modetoset->vrefresh > 90), "Valid/default mode too big, cdclk limits exceeded. Check next connector\n");
+ igt_assert_eq(ret, 0);
igt_assert(read(data->drm_fd, &ev, sizeof(ev)) == sizeof(ev));
@@ -346,11 +311,28 @@ static enum subrval test_flip_to_scaled(data_t *data, uint32_t index,
clear_lut(data, pipe);
+ modetoset = NULL;
igt_output_set_pipe(output, PIPE_NONE);
igt_plane_set_fb(primary, NULL);
igt_display_commit2(&data->display, COMMIT_ATOMIC);
+}
+
+static drmModeModeInfoPtr find_mode(data_t *data, igt_output_t *output)
+{
+ drmModeModeInfoPtr modetoset = NULL;
+
+ for (int i = 0; i < output->config.connector->count_modes; i++) {
+ if (output->config.connector->modes[i].hdisplay == data->attemptmodewidth &&
+ output->config.connector->modes[i].vdisplay == data->attemptmodeheight) {
+ if (modetoset &&
+ modetoset->vrefresh < output->config.connector->modes[i].vrefresh)
+ continue;
- return CONNECTORSUCCESS;
+ modetoset = &output->config.connector->modes[i];
+ }
+ }
+
+ return modetoset;
}
igt_main
@@ -358,6 +340,7 @@ igt_main
enum pipe pipe;
data_t data = {};
igt_output_t *output;
+ drmModeModeInfoPtr modetoset = NULL;
igt_fixture {
data.drm_fd = drm_open_driver_master(DRIVER_INTEL);
@@ -379,28 +362,30 @@ igt_main
for (int index = 0; index < ARRAY_SIZE(flip_scenario_test); index++) {
igt_describe(flip_scenario_test[index].describe);
- igt_subtest(flip_scenario_test[index].name) {
- int validtests = 0;
+ igt_subtest_with_dynamic(flip_scenario_test[index].name) {
free_fbs(&data);
- for_each_pipe_static(pipe) {
- enum subrval rval = CONNECTORSUCCESS;
+ for_each_pipe(&data.display, pipe) {
+ bool found = false;
for_each_valid_output_on_pipe(&data.display, pipe, output) {
- rval = test_flip_to_scaled(&data, index, pipe, output);
-
- igt_require(rval != TESTSKIP);
-
- // break out to test next pipe
- if (rval == CONNECTORSUCCESS) {
- validtests++;
+ modetoset = find_mode(&data, output);
+ if (modetoset) {
+ found = true;
+ igt_dynamic_f("pipe-%s-valid-mode", kmstest_pipe_name(pipe))
+ test_flip_to_scaled(&data, index, pipe, output, modetoset);
break;
}
}
- if (rval == NOREQUESTEDFORMATONPIPE)
- igt_debug("No requested format/modifier on pipe %s\n", kmstest_pipe_name(pipe));
+ if (!found) {
+ for_each_valid_output_on_pipe(&data.display, pipe, output) {
+ igt_dynamic_f("pipe-%s-default-mode", kmstest_pipe_name(pipe))
+ test_flip_to_scaled(&data, index, pipe, output, NULL);
+ }
+ }
+ break;
}
- igt_require_f(validtests > 0, "No valid pipe/connector/format/mod combination found\n");
}
}
+
igt_fixture {
free_fbs(&data);
if (data.pipe_crc) {