[igt-dev] [PATCH i-g-t] tests/kms_big_joiner: Add test to validate big joiner

Karthik B S karthik.b.s at intel.com
Fri Aug 21 11:00:39 UTC 2020



On 8/17/2020 11:58 PM, Navare, Manasi wrote:
> On Mon, Aug 17, 2020 at 02:02:47PM +0530, Karthik B S wrote:
>>
>>
>> On 8/14/2020 4:28 AM, Navare, Manasi wrote:
>>> On Wed, Jun 24, 2020 at 03:12:38PM +0530, Karthik B S wrote:
>>>> Added negative test to verify the different scenarios for big joiner.
>>>> In the test, modeset is done on Pipe A for a big joiner mode and
>>>> a second modeset is attempted on Pipe B which is expected to fail.
>>>> Same functionality is validated for other pipes as well.
>>>>
>>>> Secondly, the reverse is tested where a modeset is done on Pipe B
>>>> and then a second big joiner modeset is attempted on Pipe A which is
>>>> expected to fail. Same functionality is validated for other pipes as well.
>>>>
>>>> Signed-off-by: Karthik B S <karthik.b.s at intel.com>
>>>> ---
>>>>   tests/Makefile.sources |   1 +
>>>>   tests/kms_big_joiner.c | 171 +++++++++++++++++++++++++++++++++++++++++
>>>>   tests/meson.build      |   1 +
>>>>   3 files changed, 173 insertions(+)
>>>>   create mode 100644 tests/kms_big_joiner.c
>>>>
>>>> diff --git a/tests/Makefile.sources b/tests/Makefile.sources
>>>> index af900bcf..c761eb92 100644
>>>> --- a/tests/Makefile.sources
>>>> +++ b/tests/Makefile.sources
>>>> @@ -35,6 +35,7 @@ TESTS_progs = \
>>>>   	kms_atomic_transition \
>>>>   	kms_available_modes_crc \
>>>>   	kms_big_fb \
>>>> +	kms_big_joiner \
>>>>   	kms_busy \
>>>>   	kms_ccs \
>>>>   	kms_concurrent \
>>>> diff --git a/tests/kms_big_joiner.c b/tests/kms_big_joiner.c
>>>> new file mode 100644
>>>> index 00000000..125ea0b1
>>>> --- /dev/null
>>>> +++ b/tests/kms_big_joiner.c
>>>> @@ -0,0 +1,171 @@
>>>> +/*
>>>> + * Copyright © 2020 Intel Corporation
>>>> + *
>>>> + * Permission is hereby granted, free of charge, to any person obtaining a
>>>> + * copy of this software and associated documentation files (the "Software"),
>>>> + * to deal in the Software without restriction, including without limitation
>>>> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
>>>> + * and/or sell copies of the Software, and to permit persons to whom the
>>>> + * Software is furnished to do so, subject to the following conditions:
>>>> + *
>>>> + * The above copyright notice and this permission notice (including the next
>>>> + * paragraph) shall be included in all copies or substantial portions of the
>>>> + * Software.
>>>> + *
>>>> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
>>>> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
>>>> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
>>>> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
>>>> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
>>>> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
>>>> + * IN THE SOFTWARE.
>>>> + *
>>>> + * Author:
>>>> + *  Karthik B S <karthik.b.s at intel.com>
>>>> + */
>>>> +
>>>> +#include "igt.h"
>>>> +
>>>> +#define HDISPLAY_5K 5120
>>>
>>> So here HDISPLAY_5K indicates the max per pipe plane hwidth limitation right?
>>> May be rename this to something like MAX_HDISPLAY_PER_PIPE so that we dont confuse this with some 5K test?
>>>
>>
>> Thanks for the review.
>> Sure, I'll rename it.
>> My understanding is that even the hwidth of 5120 can't be supported on one
>> pipe. So I've used the condition that any mode having hdisplay
>> '>=' 5120 can be treated as a big joiner mode.	
>>
>> Is this correct? Naming it MAX_HDISPLAY_PER_PIPE would mean hdisplay should
>> be greater than this and can't even be equal, for it to be considered a big
>> joiner mode? Could you please help me out here.
>>
> 
> Reading through the display resolution page in Bspec: "with each pipe and maximum plane size at 3840x4320"
> So anything greater than 5120 should require big joiner. The 5K resolution as such should not require
> this split.
> 

Sure. Thank you.
I'll update this condition accordingly.

Thanks,
Karthik.B.S

> Manasi
> 
>>>> +
>>>> +IGT_TEST_DESCRIPTION("Test big joiner");
>>>> +
>>>> +typedef struct {
>>>> +	int drm_fd;
>>>> +	igt_display_t display;
>>>> +	struct igt_fb fb;
>>>> +} data_t;
>>>> +
>>>> +static void test_invalid_modeset(data_t *data)
>>>> +{
>>>> +	drmModeModeInfo *mode;
>>>> +	igt_display_t *display = &data->display;
>>>> +	igt_output_t *output, *big_joiner_output = NULL, *second_output = NULL;
>>>> +	int width = 0, height = 0, i, ret;
>>>> +	igt_pipe_t *pipe;
>>>> +	igt_plane_t *plane;
>>>> +
>>>> +	for_each_connected_output(display, output) {
>>>> +		mode = &output->config.connector->modes[0];
>>>
>>> So here the assumption is that mode[0] is always the highest mode or in 8K display
>>> case the assumption that mode[0] will be the 8K mode.
>>> While in most cases that is true, some displays might actual advertise stable modes as
>>> preferred mode and 8K mode somewhere lower in the list.
>>> May be before even calling this test, in main(), loop through all modes to find mode > 5K and pass
>>> its mode number?
>>>
>>
>> Sure, I'll make these changes.
>>
>> Thanks,
>> Karthik.B.S
>>> Everything else does look good.
>>>
>>> Manasi
>>>
>>>> +
>>>> +		width = max(width, mode->hdisplay);
>>>> +		height = max(height, mode->vdisplay);
>>>> +
>>>> +		if (mode->hdisplay >= HDISPLAY_5K && big_joiner_output == NULL)
>>>> +			big_joiner_output = output;
>>>> +		else if (second_output == NULL)
>>>> +			second_output = output;
>>>> +
>>>> +		igt_output_set_pipe(output, PIPE_NONE);
>>>> +	}
>>>> +
>>>> +	igt_create_pattern_fb(data->drm_fd, width, height, DRM_FORMAT_XRGB8888,
>>>> +			      LOCAL_DRM_FORMAT_MOD_NONE, &data->fb);
>>>> +
>>>> +	for_each_pipe(display, i) {
>>>> +		if (i < (data->display.n_pipes - 1)) {
>>>> +			igt_output_set_pipe(big_joiner_output, i);
>>>> +
>>>> +			mode = &big_joiner_output->config.connector->modes[0];
>>>> +
>>>> +			pipe = &display->pipes[i];
>>>> +			plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
>>>> +
>>>> +			igt_plane_set_fb(plane, &data->fb);
>>>> +			igt_fb_set_size(&data->fb, plane, mode->hdisplay, mode->vdisplay);
>>>> +			igt_plane_set_size(plane, mode->hdisplay, mode->vdisplay);
>>>> +
>>>> +			igt_display_commit2(&data->display, COMMIT_ATOMIC);
>>>> +			igt_output_set_pipe(second_output, i + 1);
>>>> +
>>>> +			mode = igt_output_get_mode(second_output);
>>>> +
>>>> +			pipe = &display->pipes[i + 1];
>>>> +			plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
>>>> +
>>>> +			igt_plane_set_fb(plane, &data->fb);
>>>> +			igt_fb_set_size(&data->fb, plane, mode->hdisplay, mode->vdisplay);
>>>> +			igt_plane_set_size(plane, mode->hdisplay, mode->vdisplay);
>>>> +
>>>> +			/* This commit is expectd to fail as this pipe is being used for big joiner */
>>>> +			ret = igt_display_try_commit_atomic(&data->display, DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
>>>> +			igt_assert_lt(ret, 0);
>>>> +
>>>> +			igt_output_set_pipe(big_joiner_output, PIPE_NONE);
>>>> +			igt_output_set_pipe(second_output, PIPE_NONE);
>>>> +		}
>>>> +	}
>>>> +
>>>> +	for_each_pipe(display, i) {
>>>> +		if (i < (data->display.n_pipes - 1)) {
>>>> +			igt_output_set_pipe(second_output, i + 1);
>>>> +
>>>> +			mode = igt_output_get_mode(second_output);
>>>> +
>>>> +			pipe = &display->pipes[i + 1];
>>>> +			plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
>>>> +
>>>> +			igt_plane_set_fb(plane, &data->fb);
>>>> +			igt_fb_set_size(&data->fb, plane, mode->hdisplay, mode->vdisplay);
>>>> +			igt_plane_set_size(plane, mode->hdisplay, mode->vdisplay);
>>>> +
>>>> +			igt_display_commit2(&data->display, COMMIT_ATOMIC);
>>>> +
>>>> +			igt_output_set_pipe(big_joiner_output, i);
>>>> +
>>>> +			mode = &big_joiner_output->config.connector->modes[0];
>>>> +
>>>> +			pipe = &display->pipes[i];
>>>> +			plane = igt_pipe_get_plane_type(pipe, DRM_PLANE_TYPE_PRIMARY);
>>>> +
>>>> +			igt_plane_set_fb(plane, &data->fb);
>>>> +			igt_fb_set_size(&data->fb, plane, mode->hdisplay, mode->vdisplay);
>>>> +			igt_plane_set_size(plane, mode->hdisplay, mode->vdisplay);
>>>> +
>>>> +			/* This commit is expected to fail as the adjacent pipe is already in use*/
>>>> +			ret = igt_display_try_commit_atomic(&data->display, DRM_MODE_ATOMIC_TEST_ONLY | DRM_MODE_ATOMIC_ALLOW_MODESET, NULL);
>>>> +			igt_assert_lt(ret, 0);
>>>> +
>>>> +			igt_output_set_pipe(big_joiner_output, PIPE_NONE);
>>>> +			igt_output_set_pipe(second_output, PIPE_NONE);
>>>> +		}
>>>> +	}
>>>> +
>>>> +	igt_plane_set_fb(plane, NULL);
>>>> +	igt_remove_fb(data->drm_fd, &data->fb);
>>>> +}
>>>> +
>>>> +igt_main
>>>> +{
>>>> +	data_t data;
>>>> +	bool big_joiner_mode_found = false;
>>>> +	igt_output_t *output;
>>>> +	drmModeModeInfo *mode;
>>>> +	int valid_output = 0;
>>>> +
>>>> +	igt_fixture {
>>>> +		data.drm_fd = drm_open_driver_master(DRIVER_INTEL);
>>>> +		kmstest_set_vt_graphics_mode();
>>>> +
>>>> +		igt_display_require(&data.display, data.drm_fd);
>>>> +
>>>> +		for_each_connected_output(&data.display, output) {
>>>> +			mode = &output->config.connector->modes[0];
>>>> +			if (mode->hdisplay >= HDISPLAY_5K)
>>>> +				big_joiner_mode_found = true;
>>>> +
>>>> +			valid_output++;
>>>> +		}
>>>> +
>>>> +		igt_require_f(big_joiner_mode_found, "No output with 5k+ mode found\n");
>>>> +		igt_require_f(valid_output > 1, "No valid Second output found\n");
>>>> +	}
>>>> +
>>>> +	igt_describe("Verify if the modeset on the adjoining pipe is rejected"
>>>> +		     "when the pipe is active with a big joiner modeset");
>>>> +	igt_subtest("invalid-modeset")
>>>> +		test_invalid_modeset(&data);
>>>> +
>>>> +	igt_fixture
>>>> +		igt_display_fini(&data.display);
>>>> +}
>>>> diff --git a/tests/meson.build b/tests/meson.build
>>>> index 28091794..430b43de 100644
>>>> --- a/tests/meson.build
>>>> +++ b/tests/meson.build
>>>> @@ -19,6 +19,7 @@ test_progs = [
>>>>   	'kms_atomic_transition',
>>>>   	'kms_available_modes_crc',
>>>>   	'kms_big_fb',
>>>> +	'kms_big_joiner' ,
>>>>   	'kms_busy',
>>>>   	'kms_ccs',
>>>>   	'kms_concurrent',
>>>> -- 
>>>> 2.22.0
>>>>


More information about the igt-dev mailing list