From: Mohammed Thasleem <mohammed.thasleem@intel.com>
To: igt-dev@lists.freedesktop.org
Subject: [igt-dev] [PATCH v3 1/2] tests/kms_display_modes: Add negative test for extended display
Date: Mon, 8 May 2023 01:09:42 +0530 [thread overview]
Message-ID: <20230507193943.57877-2-mohammed.thasleem@intel.com> (raw)
In-Reply-To: <20230507193943.57877-1-mohammed.thasleem@intel.com>
Added negative test to validte ENOSPC when two 2k-4k or 4k-4k
moniters connected through MST.
This test added to provide bandwidth issue in MST config.
Example:
When two monitors connected through MST, the second monitor
also tries to use the same mode. So two such modes may not
fit into the link bandwidth. So, iterate through connected
outputs & modes and find a invalid combination.
v2: Rebased on tip.
v3: -Code cleanup and updated description.
-Free path_blob before call return. (Kamil)
v4: Updated code formatting and function description. (Jeevan)
v5: Updated commit description and minor changes.
v6: Added bigjoiner check and updated comments. (Bhanu)
Signed-off-by: Mohammed Thasleem <mohammed.thasleem@intel.com>
Reviewed-by: Jeevan B <jeevan.b@intel.com>
---
tests/kms_display_modes.c | 165 ++++++++++++++++++++++++++++++++++++++
1 file changed, 165 insertions(+)
diff --git a/tests/kms_display_modes.c b/tests/kms_display_modes.c
index d69c7b931..892f39b20 100644
--- a/tests/kms_display_modes.c
+++ b/tests/kms_display_modes.c
@@ -26,14 +26,111 @@
#include "igt.h"
+#define HDISPLAY_4K 3840
+#define VDISPLAY_4K 2160
+
IGT_TEST_DESCRIPTION("Test Display Modes");
typedef struct {
int drm_fd;
igt_display_t display;
+ drmModeModeInfo mode_mst[2];
+ igt_output_t *mst_output[2];
int n_pipes;
} data_t;
+/* Get higher mode supported by panel. */
+static drmModeModeInfo *get_highres_mode(igt_output_t *output)
+{
+ drmModeConnector *connector = output->config.connector;
+ drmModeModeInfo *highest_mode = NULL;
+
+ igt_sort_connector_modes(connector, sort_drm_modes_by_res_dsc);
+ highest_mode = &connector->modes[0];
+
+ return highest_mode;
+}
+
+/* Get the 4k or less then 4k mode of connected panel. */
+static drmModeModeInfo *get_mode(igt_output_t *output)
+{
+ int j;
+ drmModeModeInfo *required_mode = NULL;
+ drmModeConnector *connector = output->config.connector;
+
+ required_mode = igt_output_get_mode(output);
+ if (required_mode->vdisplay <= VDISPLAY_4K &&
+ required_mode->hdisplay <= HDISPLAY_4K) {
+ return required_mode;
+ }
+
+ /* If default mode not 4k or less than 4k mode, then sort modes and check for it. */
+ igt_sort_connector_modes(connector, sort_drm_modes_by_res_dsc);
+ for (j = 0; j < connector->count_modes; j++) {
+ if (connector->modes[j].vdisplay <= VDISPLAY_4K &&
+ connector->modes[j].hdisplay <= HDISPLAY_4K) {
+ required_mode = &connector->modes[j];
+ break;
+ }
+ }
+
+ return required_mode;
+}
+
+static int parse_path_blob(char *blob_data)
+{
+ int connector_id;
+ char *encoder;
+
+ encoder = strtok(blob_data, ":");
+ igt_assert_f(!strcmp(encoder, "mst"), "PATH connector property expected to have 'mst'\n");
+
+ connector_id = atoi(strtok(NULL, "-"));
+
+ return connector_id;
+}
+
+static bool output_is_dp_mst(data_t *data, igt_output_t *output, int i)
+{
+ drmModePropertyBlobPtr path_blob = NULL;
+ uint64_t path_blob_id;
+ drmModeConnector *connector = output->config.connector;
+ struct kmstest_connector_config config;
+ const char *encoder;
+ int connector_id;
+ static int prev_connector_id;
+
+ kmstest_get_connector_config(data->drm_fd, output->config.connector->connector_id,
+ -1, &config);
+ encoder = kmstest_encoder_type_str(config.encoder->encoder_type);
+
+ if (strcmp(encoder, "DP MST"))
+ return false;
+
+ igt_assert(kmstest_get_property(data->drm_fd, connector->connector_id,
+ DRM_MODE_OBJECT_CONNECTOR, "PATH", NULL,
+ &path_blob_id, NULL));
+
+ igt_assert(path_blob = drmModeGetPropertyBlob(data->drm_fd, path_blob_id));
+
+ connector_id = parse_path_blob((char *) path_blob->data);
+
+ drmModeFreePropertyBlob(path_blob);
+
+ /*
+ * Discarding outputs of other DP MST topology.
+ * Testing only on outputs on the topology we got previously
+ */
+ if (i == 0) {
+ prev_connector_id = connector_id;
+ } else {
+ if (connector_id != prev_connector_id)
+ return false;
+ }
+
+ return true;
+}
+
static void run_extendedmode_basic(data_t *data,
enum pipe pipe1, igt_output_t *output1,
enum pipe pipe2, igt_output_t *output2)
@@ -173,8 +270,47 @@ static void run_extendedmode_test(data_t *data) {
}
}
+static void run_extendedmode_negative(data_t *data, int pipe1, int pipe2)
+{
+ struct igt_fb fbs[2];
+ igt_display_t *display = &data->display;
+ igt_plane_t *plane[2];
+ int ret;
+
+ igt_display_reset(display);
+
+ igt_output_set_pipe(data->mst_output[0], pipe1);
+ igt_output_set_pipe(data->mst_output[1], pipe2);
+
+ igt_create_color_fb(data->drm_fd, data->mode_mst[0].hdisplay, data->mode_mst[0].vdisplay,
+ DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR, 1, 0, 0, &fbs[0]);
+ igt_create_color_fb(data->drm_fd, data->mode_mst[1].hdisplay, data->mode_mst[1].vdisplay,
+ DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR, 0, 0, 1, &fbs[1]);
+
+ plane[0] = igt_pipe_get_plane_type(&display->pipes[pipe1], DRM_PLANE_TYPE_PRIMARY);
+ plane[1] = igt_pipe_get_plane_type(&display->pipes[pipe2], DRM_PLANE_TYPE_PRIMARY);
+
+ igt_plane_set_fb(plane[0], &fbs[0]);
+ igt_fb_set_size(&fbs[0], plane[0], data->mode_mst[0].hdisplay, data->mode_mst[0].vdisplay);
+ igt_plane_set_size(plane[0], data->mode_mst[0].hdisplay, data->mode_mst[0].vdisplay);
+
+ igt_plane_set_fb(plane[1], &fbs[1]);
+ igt_fb_set_size(&fbs[1], plane[1], data->mode_mst[1].hdisplay, data->mode_mst[1].vdisplay);
+ igt_plane_set_size(plane[1], data->mode_mst[1].hdisplay, data->mode_mst[1].vdisplay);
+
+ igt_output_override_mode(data->mst_output[0], &data->mode_mst[0]);
+ igt_output_override_mode(data->mst_output[1], &data->mode_mst[1]);
+
+ igt_require(i915_pipe_output_combo_valid(display));
+ ret = igt_display_try_commit2(display, COMMIT_ATOMIC);
+ igt_assert(ret != 0 && errno == ENOSPC);
+}
+
igt_main
{
+ int dp_mst_outputs = 0, count = 0;
+ enum pipe pipe1, pipe2;
+ igt_output_t *output;
data_t data;
igt_fixture {
@@ -182,12 +318,41 @@ igt_main
kmstest_set_vt_graphics_mode();
igt_display_require(&data.display, data.drm_fd);
igt_display_require_output(&data.display);
+
+ for_each_connected_output(&data.display, output) {
+ data.mst_output[count++] = output;
+ if (output_is_dp_mst(&data, output, dp_mst_outputs))
+ dp_mst_outputs++;
+ }
}
igt_describe("Test for validating display extended mode with a pair of connected displays");
igt_subtest_with_dynamic("extended-mode-basic")
run_extendedmode_test(&data);
+ igt_describe("Negative test for validating display extended mode with a pair of connected "
+ "2k-4k or 4k-4k displays");
+ igt_subtest_with_dynamic("mst-extended-mode-negative") {
+ igt_require_f(dp_mst_outputs > 1, "MST not found more then one\n");
+
+ memcpy(&data.mode_mst[0], get_mode(data.mst_output[0]), sizeof(drmModeModeInfo));
+ memcpy(&data.mode_mst[1], get_highres_mode(data.mst_output[1]),
+ sizeof(drmModeModeInfo));
+ igt_require_f((data.mode_mst[1].hdisplay >= HDISPLAY_4K &&
+ data.mode_mst[1].vdisplay >= VDISPLAY_4K), "4k panel not found\n");
+
+ for_each_pipe(&data.display, pipe1) {
+ for_each_pipe(&data.display, pipe2) {
+ if (pipe1 == pipe2)
+ continue;
+
+ igt_dynamic_f("pipe-%s-%s", kmstest_pipe_name(pipe1),
+ kmstest_pipe_name(pipe2))
+ run_extendedmode_negative(&data, pipe1, pipe2);
+ }
+ }
+ }
+
igt_fixture {
igt_display_fini(&data.display);
}
--
2.25.1
next prev parent reply other threads:[~2023-05-07 19:44 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-05-07 19:39 [igt-dev] [PATCH v3 0/2] Add negative test for extended display Mohammed Thasleem
2023-05-07 19:39 ` Mohammed Thasleem [this message]
2023-05-12 10:36 ` [igt-dev] [PATCH v3 1/2] tests/kms_display_modes: " Kamil Konieczny
2023-06-05 15:08 ` Kamil Konieczny
2023-05-07 19:39 ` [igt-dev] [PATCH v3 2/2] lib/igt_kms: Check for other modes to fit on bw when ENOSPC failure Mohammed Thasleem
2023-05-09 5:24 ` Modem, Bhanuprakash
2023-05-07 20:20 ` [igt-dev] ✓ Fi.CI.BAT: success for Add negative test for extended display (rev2) Patchwork
2023-05-07 21:55 ` [igt-dev] ✓ Fi.CI.IGT: " Patchwork
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20230507193943.57877-2-mohammed.thasleem@intel.com \
--to=mohammed.thasleem@intel.com \
--cc=igt-dev@lists.freedesktop.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox