[igt-dev] [PATCH 1/2] tests/kms_flip: Add support to handle displays having 5k+ modes
Karthik B S
karthik.b.s at intel.com
Thu Apr 21 10:26:54 UTC 2022
On 4/13/2022 3:56 PM, Bhanuprakash Modem wrote:
> 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 at intel.com>
> Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem at intel.com>
Reviewed-by: Karthik B S <karthik.b.s at intel.com>
> ---
> tests/kms_flip.c | 42 ++++++++++++++++++++++++++++++++----------
> 1 file 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);
> }
> }
More information about the igt-dev
mailing list