[igt-dev] [i-g-t 3/3] tests/kms_setmode: Sort modes only if they dont fit in link BW
Sharma, Swati2
swati2.sharma at intel.com
Tue Mar 8 14:00:47 UTC 2022
On 01-Mar-22 10:13 PM, Bhanuprakash Modem wrote:
> This patch revers sorting logic and uses it only when modes
*reverts
> tried dont fit into link BW. This avoids failure due to
> setting unsupported modes on connector.
>
> Test affected (fail -> pass after change) :
> igt at kms_setmode@invalid-clone-single-[crtc|crtc-stealing]
>
> invalid-clone-single-crtc-stealing tests are also passing
> with the change.
>
Is there any bug for the issue?
You can add "Fixes" with the patch
> Signed-off-by: Bhanuprakash Modem <bhanuprakash.modem at intel.com>
> ---
> tests/kms_setmode.c | 133 ++++++++++++++++++--------------------------
> 1 file changed, 53 insertions(+), 80 deletions(-)
>
> diff --git a/tests/kms_setmode.c b/tests/kms_setmode.c
> index a47070e50c..86348e459e 100644
> --- a/tests/kms_setmode.c
> +++ b/tests/kms_setmode.c
> @@ -42,9 +42,6 @@ static drmModeRes *drm_resources;
> static int filter_test_id;
> static bool dry_run;
>
> -static char str_buf[MAX_CRTCS][1024];
> -static const char *crtc_strs[MAX_CRTCS];
> -
> const drmModeModeInfo mode_640_480 = {
> .name = "640x480",
> .vrefresh = 60,
> @@ -536,87 +533,18 @@ static int sort_drm_modes(const void *a, const void *b)
> {
> const drmModeModeInfo *mode1 = a, *mode2 = b;
>
> - return (mode1->clock < mode2->clock) - (mode2->clock < mode1->clock);
> -}
> -
> -static
> -int __test_crtc_config(struct crtc_config *crtcs, int crtc_count,
> - const struct test_config *tconf, bool *config_failed,
> - int base)
> -{
> - struct crtc_config *crtc = NULL;
> - int ret = 0;
> -
> - crtc = &crtcs[base];
> -
> - /* Sort the modes in descending order by clock freq. */
> - qsort(crtc->cconfs->connector->modes,
> - crtc->cconfs->connector->count_modes,
> - sizeof(drmModeModeInfo),
> - sort_drm_modes);
> -
> - for (int i = 0; i < crtc->cconfs->connector->count_modes; i++) {
> - uint32_t *ids;
> -
> - crtc->mode = crtc->cconfs->connector->modes[i];
> -
> - get_crtc_config_str(crtc, str_buf[base], sizeof(str_buf[base]));
> - crtc_strs[base] = &str_buf[base][0];
> - igt_info(" %s\n", crtc_strs[base]);
> -
> - create_fb_for_crtc(crtc, &crtc->fb_info);
> - paint_fb(&crtc->fb_info, tconf->name, crtc_strs, crtc_count, base);
> -
> - ids = get_connector_ids(crtc);
> - if (tconf->flags & TEST_STEALING)
> - ret = test_stealing(drm_fd, crtc, ids);
> - else
> - ret = drmModeSetCrtc(drm_fd, crtc->crtc_id,
> - crtc->fb_info.fb_id, 0, 0, ids,
> - crtc->connector_count, &crtc->mode);
> -
> - free(ids);
> -
> - /* crtcs[base].modes[i] don't fit, try next mode. */
> - if (ret < 0 && errno == ENOSPC)
> - continue;
> -
> - if (ret < 0) {
> - igt_assert_eq(errno, EINVAL);
> - *config_failed = true;
> -
> - return ret;
> - }
> -
> - /* Try all crtcs recursively. */
> - if (base + 1 < crtc_count)
> - ret = __test_crtc_config(crtcs, crtc_count, tconf, config_failed, base + 1);
> -
> - /*
> - * With crtcs[base].modes[i], None of the crtc[base+1] modes fits
> - * into the link BW.
> - *
> - * Lets try with crtcs[base].modes[i+1]
> - */
> - if (ret < 0 && errno == ENOSPC)
> - continue;
> -
> - /*
> - * ret == 0, (or) ret < 0 && errno == EINVAL
> - * No need to try other modes of crtcs[base].
> - */
> - return ret;
> - }
> -
> - /* When all crtcs[base].modes are tried & failed to fit into link BW. */
> - return ret;
> + return (mode2->clock < mode1->clock) - (mode1->clock < mode2->clock);
> }
>
> static void test_crtc_config(const struct test_config *tconf,
> struct crtc_config *crtcs, int crtc_count)
> {
> + char str_buf[MAX_CRTCS][1024];
> + const char *crtc_strs[MAX_CRTCS];
> + struct crtc_config *crtc;
> static int test_id;
> bool config_failed = false;
> + bool retry = false;
> int ret = 0;
> int i;
>
> @@ -627,6 +555,21 @@ static void test_crtc_config(const struct test_config *tconf,
>
> igt_info(" Test id#%d CRTC count %d\n", test_id, crtc_count);
>
> +retry:
> + if (retry) {
> + kmstest_unset_all_crtcs(drm_fd, tconf->resources);
> +
> + for (i = 0; i < crtc_count; i++) {
> + /* Sort the modes in asending order by clock freq. */
> + qsort(crtcs[i].cconfs->connector->modes,
> + crtcs[i].cconfs->connector->count_modes,
> + sizeof(drmModeModeInfo),
> + sort_drm_modes);
> +
> + crtcs[i].mode = crtcs[i].cconfs->connector->modes[0];
> + }
> + }
> +
> for (i = 0; i < crtc_count; i++) {
> get_crtc_config_str(&crtcs[i], str_buf[i], sizeof(str_buf[i]));
> crtc_strs[i] = &str_buf[i][0];
> @@ -638,9 +581,39 @@ static void test_crtc_config(const struct test_config *tconf,
> return;
> }
>
> - ret = __test_crtc_config(crtcs, crtc_count, tconf, &config_failed, 0);
> - igt_skip_on_f((ret < 0 && errno == ENOSPC),
> - "No suitable mode(s) found to fit into the link BW\n");
> + for (i = 0; i < crtc_count; i++) {
> + uint32_t *ids;
> +
> + crtc = &crtcs[i];
> +
> + igt_info(" %s\n", crtc_strs[i]);
> +
> + create_fb_for_crtc(crtc, &crtc->fb_info);
> + paint_fb(&crtc->fb_info, tconf->name, crtc_strs, crtc_count, i);
> +
> + ids = get_connector_ids(crtc);
> + if (tconf->flags & TEST_STEALING)
> + ret = test_stealing(drm_fd, crtc, ids);
> + else
> + ret = drmModeSetCrtc(drm_fd, crtc->crtc_id,
> + crtc->fb_info.fb_id, 0, 0, ids,
> + crtc->connector_count, &crtc->mode);
> +
> + free(ids);
> +
> + if (ret < 0) {
> + if (errno == ENOSPC) {
> + igt_skip_on_f(retry, "No suitable mode(s) found to fit into the link BW.\n");
> +
> + retry = true;
> + goto retry;
> + }
> +
> + igt_assert_eq(errno, EINVAL);
> + config_failed = true;
> + }
> + }
> +
> igt_assert(config_failed == !!(tconf->flags & TEST_INVALID));
>
> if (ret == 0 && tconf->flags & TEST_TIMINGS)
Series look good to me.
Reviewed-by: Swati Sharma <swati2.sharma at intel.com>
--
~Swati Sharma
More information about the igt-dev
mailing list