[igt-dev] [PATCH i-g-t 1/2] tests/intel/kms_big_joiner: added new subtest simultaneous-modeset
Kunal Joshi
kunal1.joshi at intel.com
Mon Nov 6 07:12:14 UTC 2023
newly added test tries to have as many outputs as possible,
prefernce is given to big_joiner outputs, with this we can
stress on bw
v2: Sorting not needed when output count is 1
Skip if output count is 0
Cc: Karthik B S <karthik.b.s at intel.com>
Cc: Bhanuprakash Modem <bhanuprakash.modem at intel.com>
Signed-off-by: Kunal Joshi <kunal1.joshi at intel.com>
---
tests/intel/kms_big_joiner.c | 117 ++++++++++++++++++++++++++++++++---
1 file changed, 108 insertions(+), 9 deletions(-)
diff --git a/tests/intel/kms_big_joiner.c b/tests/intel/kms_big_joiner.c
index a555ca799..496ce1e0e 100644
--- a/tests/intel/kms_big_joiner.c
+++ b/tests/intel/kms_big_joiner.c
@@ -43,8 +43,100 @@ typedef struct {
enum pipe pipe1;
enum pipe pipe2;
uint32_t big_joiner_output[2];
+ int no_of_big_joiner_outputs;
+ igt_output_t **sorted_outputs;
+ int no_sorted_outputs;
} data_t;
+/*
+ * Sort outputs based on hdisplay
+ */
+static int compare_outputs(const void *a, const void *b) {
+ igt_output_t *outputA = *(igt_output_t **)a;
+ igt_output_t *outputB = *(igt_output_t **)b;
+
+ return outputB->config.connector->modes[0].hdisplay - outputA->config.connector->modes[0].hdisplay;
+}
+
+/*
+ * Function to add connected outputs to an array and sort them by hdisplay
+ */
+static void set_sorted_outputs(data_t *data) {
+ int i;
+ igt_output_t *output;
+
+ i = 0;
+ for_each_connected_output(&data->display, output)
+ data->no_sorted_outputs++;
+
+ igt_skip_on_f(data->no_sorted_outputs <= 0, "No output found\n");
+ /*
+ * Create an array to store igt_output_t pointers
+ */
+ data->sorted_outputs = (igt_output_t **)malloc(sizeof(igt_output_t *) * data->no_sorted_outputs);
+ /*
+ * Add connected outputs to the array
+ */
+ for_each_connected_output(&data->display, output)
+ data->sorted_outputs[i++] = output;
+
+ if (data->no_sorted_outputs > 1)
+ /*
+ * Sort the array based on hdisplay
+ */
+ qsort(data->sorted_outputs, data->no_sorted_outputs,
+ sizeof(igt_output_t *), compare_outputs);
+}
+
+/**
+ * SUBTEST: simultaneous-modeset
+ * Description: Try to do modeset with as many output as possible
+ * with big joiner given as priority
+ * Driver requirement: i915, xe
+ * Functionality: BW
+ * Mega feature: Bigjoiner, BW
+ * Test category: BW test
+ */
+static int run_simultaneous_modeset(data_t *data)
+{
+ int pipe, i, j;
+ int remanining_big_joiner_outputs;
+ struct igt_fb *primary_fb = malloc(data->n_pipes * sizeof(struct igt_fb));
+ igt_plane_t **primary = malloc(data->n_pipes * sizeof(igt_plane_t *));
+ drmModeModeInfo *mode;
+ igt_output_t *output;
+
+ remanining_big_joiner_outputs = data->no_of_big_joiner_outputs;
+ pipe = i = j = 0;
+ set_sorted_outputs(data);
+
+ while(pipe < data->n_pipes)
+ {
+ output = i < data->no_sorted_outputs ? data->sorted_outputs[i] : NULL;
+ if(output == NULL)
+ break;
+ mode = igt_output_get_mode(output);
+ igt_create_color_fb(data->drm_fd, mode->hdisplay, mode->vdisplay,
+ DRM_FORMAT_XRGB8888, DRM_FORMAT_MOD_LINEAR, 1.0,0.0, 0.0, &primary_fb[i]);
+ igt_output_set_pipe(output, pipe);
+ igt_info("Using (pipe %s + %s) to run the subtest with mode %dx%d.\n",
+ kmstest_pipe_name(pipe), igt_output_name(output),
+ mode->hdisplay, mode->vdisplay);
+ primary[i] = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
+ igt_plane_set_fb(primary[i], &primary_fb[i]);
+ i++;
+ pipe = pipe + remanining_big_joiner_outputs > 0 ? 2 : 1;
+ --remanining_big_joiner_outputs;
+ }
+ if (igt_display_try_commit2(&data->display, COMMIT_ATOMIC) == 0)
+ {
+ igt_display_commit2(&data->display, COMMIT_ATOMIC);
+ return 0;
+ }
+ else
+ return igt_display_try_commit2(&data->display, COMMIT_ATOMIC);
+}
+
/**
* SUBTEST: invalid-modeset
* Description: Verify if the modeset on the adjoining pipe is rejected when
@@ -213,7 +305,7 @@ igt_main
data_t data;
igt_output_t *output;
drmModeModeInfo *mode;
- int valid_output = 0, i, count = 0, j = 0;
+ int valid_output = 0, i, j = 0;
uint16_t width = 0, height = 0;
enum pipe pipe_seq[IGT_MAX_PIPES];
@@ -230,8 +322,7 @@ igt_main
mode = &output->config.connector->modes[0];
if (mode->hdisplay > MAX_HDISPLAY_PER_PIPE) {
- data.big_joiner_output[count++] = output->id;
-
+ data.big_joiner_output[data.no_of_big_joiner_outputs++] = output->id;
width = max(width, mode->hdisplay);
height = max(height, mode->vdisplay);
}
@@ -244,15 +335,13 @@ igt_main
pipe_seq[j] = i;
j++;
}
-
- igt_require_f(count > 0, "No output with 5k+ mode found\n");
-
- igt_create_pattern_fb(data.drm_fd, width, height, DRM_FORMAT_XRGB8888,
- DRM_FORMAT_MOD_LINEAR, &data.fb);
}
igt_describe("Verify the basic modeset on big joiner mode on all pipes");
igt_subtest_with_dynamic("basic") {
+ igt_require_f(data.no_of_big_joiner_outputs > 0, "No output with 5k+ mode found\n");
+ igt_create_pattern_fb(data.drm_fd, width, height, DRM_FORMAT_XRGB8888,
+ DRM_FORMAT_MOD_LINEAR, &data.fb);
for (i = 0; i < data.n_pipes - 1; i++) {
data.pipe1 = pipe_seq[i];
igt_dynamic_f("pipe-%s", kmstest_pipe_name(pipe_seq[i]))
@@ -263,6 +352,10 @@ igt_main
igt_describe("Verify if the modeset on the adjoining pipe is rejected "
"when the pipe is active with a big joiner modeset");
igt_subtest_with_dynamic("invalid-modeset") {
+ igt_require_f(data.no_of_big_joiner_outputs > 0, "No output with 5k+ mode found\n");
+ igt_create_pattern_fb(data.drm_fd, width, height, DRM_FORMAT_XRGB8888,
+ DRM_FORMAT_MOD_LINEAR, &data.fb);
+
data.pipe1 = pipe_seq[j - 1];
igt_display_reset(&data.display);
@@ -319,7 +412,9 @@ igt_main
igt_describe("Verify simultaneous modeset on 2 big joiner outputs");
igt_subtest_with_dynamic("2x-modeset") {
- igt_require_f(count > 1, "2 outputs with big joiner modes are required\n");
+ igt_require_f(data.no_of_big_joiner_outputs > 1, "2 outputs with big joiner modes are required\n");
+ igt_create_pattern_fb(data.drm_fd, width, height, DRM_FORMAT_XRGB8888,
+ DRM_FORMAT_MOD_LINEAR, &data.fb);
igt_require_f(data.n_pipes > 3, "Minumum of 4 pipes are required\n");
for (i = 0; (i + 2) < data.n_pipes - 1; i++) {
data.pipe1 = pipe_seq[i];
@@ -329,6 +424,10 @@ igt_main
}
}
+ igt_describe("Simultaneous moseset on all pipes possible");
+ igt_subtest("simultaneous-modeset")
+ igt_assert_f(run_simultaneous_modeset(&data)==0,"Commit failure\n");
+
igt_fixture {
igt_remove_fb(data.drm_fd, &data.fb);
igt_display_fini(&data.display);
--
2.25.1
More information about the igt-dev
mailing list