summaryrefslogtreecommitdiff
path: root/tests/kms_flip.c
diff options
context:
space:
mode:
authorBhanuprakash Modem <bhanuprakash.modem@intel.com>2022-04-13 15:56:07 +0530
committerBhanuprakash Modem <bhanuprakash.modem@intel.com>2022-04-21 15:57:20 +0530
commitbc65f1ab45d8738f4e3a49927a80af4577e383b9 (patch)
tree07f582ff74911be04b92c4f47a566dbb1810afef /tests/kms_flip.c
parent90d4ef4c10f1ba81e308bc002dd04eafcd42837e (diff)
tests/kms_flip: Add support to handle displays having 5k+ modes
As single crtc can handle max of 5k resolution, and we need one more crtc to handle > 5k modes. This patch will skip the scenarios where those crtc/mode combinations won't fit. Example: Consider two 8K panels connected via DP-1 & DP-2 resp, and we have four pipes (A-D) got enabled. So, below are the combos for basic subtest. pipe-A-DP-1 pipe-B-DP-1 pipe-C-DP-1 pipe-D-DP-1 is not possible pipe-A-DP-2 pipe-B-DP-2 pipe-C-DP-2 pipe-D-DP-2 is not possible pipe-A-DP-1-pipe-B-DP-2 is not possible pipe-A-DP-1-pipe-C-DP-2 pipe-A-DP-1-pipe-D-DP-2 is not possible pipe-B-DP-1-pipe-A-DP-2 is not possible pipe-B-DP-1-pipe-C-DP-2 is not possible pipe-B-DP-1-pipe-D-DP-2 is not possible pipe-C-DP-1-pipe-A-DP-2 pipe-C-DP-1-pipe-B-DP-2 is not possible pipe-C-DP-1-pipe-D-DP-2 is not possible pipe-D-DP-1-pipe-A-DP-2 is not possible pipe-D-DP-1-pipe-B-DP-2 is not possible pipe-D-DP-1-pipe-C-DP-2 is not possible Cc: Karthik B S <karthik.b.s@intel.com> Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem@intel.com> Reviewed-by: Karthik B S <karthik.b.s@intel.com>
Diffstat (limited to 'tests/kms_flip.c')
-rwxr-xr-xtests/kms_flip.c42
1 files changed, 32 insertions, 10 deletions
diff --git a/tests/kms_flip.c b/tests/kms_flip.c
index 0826015e..ce452dc8 100755
--- a/tests/kms_flip.c
+++ b/tests/kms_flip.c
@@ -81,6 +81,8 @@
#define RUN_TEST 1
#define RUN_PAIR 2
+#define MAX_HDISPLAY_PER_CRTC 5120
+
#ifndef DRM_CAP_TIMESTAMP_MONOTONIC
#define DRM_CAP_TIMESTAMP_MONOTONIC 6
#endif
@@ -1364,14 +1366,7 @@ retry:
igt_flush_uevents(mon);
- if (set_mode(o, o->fb_ids[0], 0, 0)) {
- /* We may fail to apply the mode if there are hidden
- * constraints, such as bandwidth on the third pipe.
- */
- igt_assert_f(crtc_count > 1 || crtc_idxs[0] < 2,
- "set_mode may only fail on the 3rd pipe or in multiple crtc tests\n");
- goto out;
- }
+ igt_assert(!set_mode(o, o->fb_ids[0], 0, 0));
igt_assert(fb_is_bound(o, o->fb_ids[0]));
vblank = kms_has_vblank(drm_fd);
@@ -1443,9 +1438,11 @@ out:
}
static void run_test_on_crtc_set(struct test_output *o, int *crtc_idxs,
- int crtc_count, int duration_ms)
+ int crtc_count, int total_crtcs,
+ int duration_ms)
{
char test_name[128];
+ int i;
switch (crtc_count) {
case RUN_TEST:
@@ -1477,6 +1474,29 @@ static void run_test_on_crtc_set(struct test_output *o, int *crtc_idxs,
igt_assert_eq(o->count, crtc_count);
+ /*
+ * Handle BW limitations:
+ *
+ * if mode.hdisplay > 5120, then ignore
+ * - last crtc in single/multi-connector config
+ * - consecutive crtcs in multi-connector config
+ *
+ * in multi-connector config ignore if
+ * - previous crtc mode.hdisplay > 5120 and
+ * - current & previous crtcs are consecutive
+ */
+ for (i = 0; i < crtc_count; i++) {
+ if (((o->kmode[i].hdisplay > MAX_HDISPLAY_PER_CRTC) &&
+ ((crtc_idxs[i] >= (total_crtcs - 1)) ||
+ ((i < (crtc_count - 1)) && (abs(crtc_idxs[i + 1] - crtc_idxs[i]) <= 1)))) ||
+ ((i > 0) && (o->kmode[i - 1].hdisplay > MAX_HDISPLAY_PER_CRTC) &&
+ (abs(crtc_idxs[i] - crtc_idxs[i - 1]) <= 1))) {
+
+ igt_debug("Combo: %s is not possible with selected mode(s).\n", test_name);
+ return;
+ }
+ }
+
igt_dynamic_f("%s", test_name)
__run_test_on_crtc_set(o, crtc_idxs, crtc_count, duration_ms);
}
@@ -1538,7 +1558,8 @@ static int run_test(int duration, int flags)
o.depth = 24;
crtc_idx = n;
- run_test_on_crtc_set(&o, &crtc_idx, RUN_TEST, duration);
+ run_test_on_crtc_set(&o, &crtc_idx, RUN_TEST,
+ resources->count_crtcs, duration);
}
}
@@ -1607,6 +1628,7 @@ static int run_pair(int duration, int flags)
run_test_on_crtc_set(&o, crtc_idxs,
RUN_PAIR,
+ resources->count_crtcs,
duration);
}
}