[PATCH i-g-t 4/4] tests/intel/kms_big_joiner: add tests for force joiner

Nautiyal, Ankit K ankit.k.nautiyal at intel.com
Thu Mar 28 07:06:02 UTC 2024


On 3/25/2024 10:21 PM, Kunal Joshi wrote:
> add tests for force joiner

Need to addwhy we need to use force joiner, and the subtests added.

>
> v2: check status after forcing (Ankit)
>      take out commoon code (Ankit)
>      fix missing force_joiner (Ankit)
>
> Cc: Stanislav Lisovskiy <stanislav.lisovskiy at intel.com>
> Cc: Ankit Nautiyal <ankit.k.nautiyal at intel.com>
> 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 | 102 +++++++++++++++++++++++++++++------
>   1 file changed, 85 insertions(+), 17 deletions(-)
>
> diff --git a/tests/intel/kms_big_joiner.c b/tests/intel/kms_big_joiner.c
> index b57996212..fd6baccc3 100644
> --- a/tests/intel/kms_big_joiner.c
> +++ b/tests/intel/kms_big_joiner.c
> @@ -44,9 +44,14 @@
>    * SUBTEST: basic
>    * Description: Verify the basic modeset on big joiner mode on all pipes
>    *
> + * SUBTEST: invalid-modeset-force-joiner
> + * Description: Verify if the modeset on the adjoining pipe is rejected when
> + *              the pipe is active with a force joiner modeset
> + *
> + * SUBTEST: basic-force-joiner
> + * Description: Verify the basic modeset on force joiner mode on all pipes
I think we need to document that force bigjoiner will be used to test 
bigjoiner funtionality with a non bigjoiner panel.

Where the config is already having, bigjoiner, force bigjoiner wouldnt 
be used.

With the above documentation changes, this is:

Reviewed-by: Ankit Nautiyal <ankit.k.nautiyal at intel.com>


>    */
> -
> -IGT_TEST_DESCRIPTION("Test big joiner");
> +IGT_TEST_DESCRIPTION("Test big joiner / force joiner");
>   
>   #define INVALID_TEST_OUTPUT 2
>   
> @@ -79,6 +84,19 @@ static void set_all_master_pipes_for_platform(data_t *data)
>   	}
>   }
>   
> +static void toggle_force_joiner_on_all_non_big_joiner_outputs(data_t *data, bool toggle)
> +{
> +	bool status;
> +	igt_output_t *output;
> +	int i;
> +
> +	for (i = 0; i < data->non_big_joiner_output_count; i++) {
> +		output = data->non_big_joiner_output[i];
> +		status = igt_force_and_check_bigjoiner_status(data->drm_fd, output->name, toggle);
> +		igt_assert_f(status, "Failed to toggle force joiner\n");
> +	}
> +}
> +
>   static enum pipe get_next_master_pipe(data_t *data, unsigned int available_pipe_mask)
>   {
>   	if ((data->master_pipes & available_pipe_mask) == 0)
> @@ -105,7 +123,7 @@ static enum pipe setup_pipe(data_t *data, igt_output_t *output, enum pipe pipe,
>   	return master_pipe;
>   }
>   
> -static void test_single_joiner(data_t *data, int output_count)
> +static void test_single_joiner(data_t *data, int output_count, bool force_joiner)
>   {
>   	int i;
>   	enum pipe pipe, master_pipe;
> @@ -116,7 +134,7 @@ static void test_single_joiner(data_t *data, int output_count)
>   	igt_fb_t fb;
>   	drmModeModeInfo *mode;
>   
> -	outputs = data->big_joiner_output;
> +	outputs = force_joiner ? data->non_big_joiner_output : data->big_joiner_output;
>   
>   	for (i = 0; i < output_count; i++) {
>   		output = outputs[i];
> @@ -137,7 +155,7 @@ static void test_single_joiner(data_t *data, int output_count)
>   	}
>   }
>   
> -static void test_multi_joiner(data_t *data, int output_count)
> +static void test_multi_joiner(data_t *data, int output_count, bool force_joiner)
>   {
>   	int i;
>   	unsigned int available_pipe_mask;
> @@ -149,7 +167,7 @@ static void test_multi_joiner(data_t *data, int output_count)
>   	drmModeModeInfo *mode;
>   
>   	available_pipe_mask = BIT(data->n_pipes) - 1;
> -	outputs = data->big_joiner_output;
> +	outputs = force_joiner ? data->non_big_joiner_output : data->big_joiner_output;
>   
>   	igt_display_reset(&data->display);
>   	for (i = 0; i < output_count; i++) {
> @@ -177,7 +195,7 @@ static void test_multi_joiner(data_t *data, int output_count)
>   }
>   
>   static void test_invalid_modeset_two_joiner(data_t *data,
> -					    bool combined)
> +					    bool combined, bool force_joiner)
>   {
>   	int i, j, ret;
>   	unsigned int available_pipe_mask;
> @@ -190,7 +208,8 @@ static void test_invalid_modeset_two_joiner(data_t *data,
>   	drmModeModeInfo *mode;
>   
>   	available_pipe_mask = BIT(data->n_pipes) - 1;
> -	outputs = combined ? data->combined_output : data->big_joiner_output;
> +	outputs = force_joiner ? data->non_big_joiner_output :
> +			  combined ? data->combined_output : data->big_joiner_output;
>   
>   	for (i = 0; i < data->n_pipes-1; i++) {
>   		igt_display_reset(&data->display);
> @@ -223,7 +242,7 @@ static void test_invalid_modeset_two_joiner(data_t *data,
>   	}
>   }
>   
> -static void test_big_joiner_on_last_pipe(data_t *data)
> +static void test_joiner_on_last_pipe(data_t *data, bool force_joiner)
>   {
>   	int i, len, ret;
>   	igt_output_t **outputs;
> @@ -232,8 +251,8 @@ static void test_big_joiner_on_last_pipe(data_t *data)
>   	igt_fb_t fb;
>   	drmModeModeInfo *mode;
>   
> -	len = data->big_joiner_output_count;
> -	outputs = data->big_joiner_output;
> +	len = force_joiner ? data->non_big_joiner_output_count : data->big_joiner_output_count;
> +	outputs = force_joiner ? data->non_big_joiner_output : data->big_joiner_output;
>   
>   	for (i = 0; i < len; i++) {
>   		igt_display_reset(&data->display);
> @@ -257,12 +276,14 @@ static void test_big_joiner_on_last_pipe(data_t *data)
>   
>   igt_main
>   {
> +	bool force_joiner_supported;
>   	int i, j;
>   	igt_output_t *output;
>   	drmModeModeInfo mode;
>   	data_t data;
>   
>   	igt_fixture {
> +		force_joiner_supported = false;
>   		data.big_joiner_output_count = 0;
>   		data.non_big_joiner_output_count = 0;
>   		data.combined_output_count = 0;
> @@ -290,7 +311,10 @@ igt_main
>   				data.big_joiner_output[data.big_joiner_output_count++] = output;
>   				igt_output_override_mode(output, &mode);
>   			} else {
> -				data.non_big_joiner_output[data.non_big_joiner_output_count++] = output;
> +				if (igt_has_force_joiner_debugfs(data.drm_fd, output)) {
> +					force_joiner_supported = true;
> +					data.non_big_joiner_output[data.non_big_joiner_output_count++] = output;
> +				}
>   			}
>   			data.output_count++;
>   		}
> @@ -313,10 +337,10 @@ igt_main
>   			igt_require_f(data.n_pipes > 1,
>   				      "Minimum 2 pipes required\n");
>   			igt_dynamic_f("single-joiner")
> -				test_single_joiner(&data, data.big_joiner_output_count);
> +				test_single_joiner(&data, data.big_joiner_output_count, false);
>   			if (data.big_joiner_output_count > 1)
>   				igt_dynamic_f("multi-joiner")
> -					test_multi_joiner(&data, data.big_joiner_output_count);
> +					test_multi_joiner(&data, data.big_joiner_output_count, false);
>   	}
>   
>   	igt_describe("Verify if the modeset on the adjoining pipe is rejected "
> @@ -326,13 +350,57 @@ igt_main
>   		igt_require_f(data.n_pipes > 1, "Minimum of 2 pipes are required\n");
>   		if (data.big_joiner_output_count >= 1)
>   			igt_dynamic_f("big_joiner_on_last_pipe")
> -				test_big_joiner_on_last_pipe(&data);
> +				test_joiner_on_last_pipe(&data, false);
>   		if (data.big_joiner_output_count > 1)
>   			igt_dynamic_f("invalid_combinations")
> -				test_invalid_modeset_two_joiner(&data, false);
> +				test_invalid_modeset_two_joiner(&data, false, false);
>   		if (data.combined_output_count)
>   			igt_dynamic_f("combined_output")
> -				test_invalid_modeset_two_joiner(&data, true);
> +				test_invalid_modeset_two_joiner(&data, true, false);
> +	}
> +
> +	igt_describe("Verify the basic modeset on big joiner mode on all pipes");
> +	igt_subtest_with_dynamic("basic-force-joiner") {
> +			igt_require_f(force_joiner_supported,
> +						 "force joiner not supported on this platform or none of the connected output supports it\n");
> +			igt_require_f(data.non_big_joiner_output_count > 0,
> +				      "No non big joiner output found\n");
> +			igt_require_f(data.n_pipes > 1,
> +				      "Minimum 2 pipes required\n");
> +			igt_dynamic_f("single") {
> +				toggle_force_joiner_on_all_non_big_joiner_outputs(&data, true);
> +				test_single_joiner(&data, data.non_big_joiner_output_count, true);
> +				toggle_force_joiner_on_all_non_big_joiner_outputs(&data, false);
> +			}
> +			if (data.non_big_joiner_output_count > 1) {
> +				igt_dynamic_f("multi") {
> +					toggle_force_joiner_on_all_non_big_joiner_outputs(&data, true);
> +					test_multi_joiner(&data, data.non_big_joiner_output_count, true);
> +					toggle_force_joiner_on_all_non_big_joiner_outputs(&data, false);
> +				}
> +			}
> +	}
> +
> +	igt_subtest_with_dynamic("invalid-modeset-force-joiner") {
> +			igt_require_f(force_joiner_supported,
> +						 "force joiner not supported on this platform or none of the connected output supports it\n");
> +		igt_require_f(data.non_big_joiner_output_count > 0, "Non big joiner output not found\n");
> +		igt_require_f(data.n_pipes > 1, "Minimum of 2 pipes are required\n");
> +
> +		if (data.non_big_joiner_output_count >= 1) {
> +			igt_dynamic_f("big_joiner_on_last_pipe") {
> +				toggle_force_joiner_on_all_non_big_joiner_outputs(&data, true);
> +				test_joiner_on_last_pipe(&data, true);
> +				toggle_force_joiner_on_all_non_big_joiner_outputs(&data, false);
> +			}
> +		}
> +		if (data.non_big_joiner_output_count > 1) {
> +			igt_dynamic_f("invalid_combinations") {
> +				toggle_force_joiner_on_all_non_big_joiner_outputs(&data, true);
> +				test_invalid_modeset_two_joiner(&data, false, true);
> +				toggle_force_joiner_on_all_non_big_joiner_outputs(&data, false);
> +			}
> +		}
>   	}
>   
>   	igt_fixture {


More information about the igt-dev mailing list