[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