[igt-dev] [PATCH i-g-t] tests/kms_content_protection: Add a test for HDCP-MST with suspend resume

Ville Syrjälä ville.syrjala at linux.intel.com
Fri Oct 28 16:46:34 UTC 2022


On Fri, Oct 28, 2022 at 09:37:39PM +0530, Jeevan B wrote:
> adding new test to validate HDCP-MST with suspend resume
> test check for valid output which supports MST and HDCP
> then commits and check if the content protection is enabled
> before and after suspend-resume.

The MST HDCP code looks still totally broken [1]. Is someone actually going to
fix it some day?

[] https://lists.freedesktop.org/archives/intel-gfx/2021-October/279457.html

> 
> v2: Change type-0 to type-1, try to authenticate hdcp few more times
> as suggested. (Suraj)
> 
> Signed-off-by: Jeevan B <jeevan.b at intel.com>
> ---
>  tests/kms_content_protection.c | 94 +++++++++++++++++++++++++++++++++-
>  1 file changed, 93 insertions(+), 1 deletion(-)
> 
> diff --git a/tests/kms_content_protection.c b/tests/kms_content_protection.c
> index aa28b7bf..53f50115 100644
> --- a/tests/kms_content_protection.c
> +++ b/tests/kms_content_protection.c
> @@ -48,6 +48,7 @@ struct data {
>  #define CP_MEI_RELOAD				(1 << 2)
>  #define CP_TYPE_CHANGE				(1 << 3)
>  #define CP_UEVENT				(1 << 4)
> +#define SUSPEND_RESUME				(1 << 5)
>  
>  #define CP_UNDESIRED				0
>  #define CP_DESIRED				1
> @@ -686,6 +687,89 @@ test_content_protection_mst(int content_type)
>  		test_cp_lic_on_mst(hdcp_mst_output, valid_outputs, 1);
>  }
>  
> +static void
> +test_content_protection_mst_suspend_resume(int content_type)
> +{
> +	igt_display_t *display = &data.display;
> +	igt_output_t *output;
> +	int valid_outputs = 0, dp_mst_outputs = 0, ret, count, max_pipe = 0;
> +	enum pipe pipe;
> +	igt_output_t *mst_output[IGT_MAX_PIPES], *hdcp_mst_output[IGT_MAX_PIPES];
> +
> +	for_each_pipe(display, pipe)
> +		max_pipe++;
> +
> +	pipe = PIPE_A;
> +
> +	for_each_connected_output(display, output) {
> +		if (!output_is_dp_mst(output, dp_mst_outputs))
> +			continue;
> +
> +		igt_assert_f(igt_pipe_connector_valid(pipe, output), "Output-pipe combination invalid\n");
> +
> +		igt_output_set_pipe(output, pipe);
> +		prepare_modeset_on_mst_output(output);
> +		mst_output[dp_mst_outputs++] = output;
> +
> +		pipe++;
> +
> +		if (pipe >= max_pipe)
> +			break;
> +	}
> +
> +	igt_require_f(dp_mst_outputs > 1, "No DP MST set up with >= 2 outputs found in a single topology\n");
> +
> +	if (igt_display_try_commit_atomic(display,
> +				DRM_MODE_ATOMIC_TEST_ONLY |
> +				DRM_MODE_ATOMIC_ALLOW_MODESET,
> +				NULL) != 0) {
> +		bool found = igt_override_all_active_output_modes_to_fit_bw(display);
> +		igt_require_f(found, "No valid mode combo found for MST modeset\n");
> +
> +		for (count = 0; count < dp_mst_outputs; count++)
> +			prepare_modeset_on_mst_output(mst_output[count]);
> +	}
> +
> +	ret = igt_display_try_commit2(display, COMMIT_ATOMIC);
> +	igt_require_f(ret == 0, "Commit failure during MST modeset\n");
> +
> +	for (count = 0; count < dp_mst_outputs; count++) {
> +		if (!output_hdcp_capable(mst_output[count], content_type))
> +			continue;
> +
> +		hdcp_mst_output[valid_outputs++] = mst_output[count];
> +	}
> +
> +	igt_require_f(valid_outputs > 1, "DP MST outputs do not have the required HDCP support\n");
> +
> +	for (count = 0; count < valid_outputs; count++) {
> +		igt_output_set_prop_value(hdcp_mst_output[count], IGT_CONNECTOR_CONTENT_PROTECTION, CP_DESIRED);
> +
> +		if (output->props[IGT_CONNECTOR_HDCP_CONTENT_TYPE])
> +			igt_output_set_prop_value(hdcp_mst_output[count], IGT_CONNECTOR_HDCP_CONTENT_TYPE, content_type);
> +	}
> +
> +	igt_display_commit2(display, COMMIT_ATOMIC);
> +
> +	for (count = 0; count < valid_outputs; count++) {
> +		ret = igt_wait(wait_for_prop_value(hdcp_mst_output[count],
> +				CP_ENABLED, KERNEL_AUTH_TIME_ALLOWED_MSEC),
> +				1000, 100);
> +		igt_assert_f(ret, "Content Protection not enabled on %s\n", hdcp_mst_output[count]->name);
> +	}
> +
> +	igt_system_suspend_autoresume(SUSPEND_STATE_MEM, SUSPEND_TEST_NONE);
> +
> +	igt_display_commit2(display, COMMIT_ATOMIC);
> +
> +	for (count = 0; count < valid_outputs; count++) {
> +		ret = igt_wait(wait_for_prop_value(hdcp_mst_output[count],
> +				CP_ENABLED, KERNEL_AUTH_TIME_ALLOWED_MSEC),
> +				1000, 100);
> +		igt_assert_f(ret, "Content Protection not enabled on %s\n", hdcp_mst_output[count]->name);
> +	}
> +}
> +
>  static void test_content_protection_cleanup(void)
>  {
>  	igt_display_t *display = &data.display;
> @@ -817,6 +901,11 @@ static const struct {
>  	  .cp_tests = CP_LIC,
>  	  .content_type = HDCP_CONTENT_TYPE_1,
>  	},
> +	{ .desc = "Test Content protection(Type 1) over DP MST with suspend resume.",
> +	  .name = "dp-mst-suspend_resume",
> +	  .cp_tests = SUSPEND_RESUME,
> +	  .content_type = HDCP_CONTENT_TYPE_1,
> +	},
>  };
>  
>  igt_main
> @@ -866,7 +955,10 @@ igt_main
>  
>  			igt_subtest(mst_subtests[i].name) {
>  				data.cp_tests = mst_subtests[i].cp_tests;
> -				test_content_protection_mst(mst_subtests[i].content_type);
> +				if (data.cp_tests == SUSPEND_RESUME)
> +				       test_content_protection_mst_suspend_resume(mst_subtests[i].content_type);
> +				else
> +					test_content_protection_mst(mst_subtests[i].content_type);
>  			}
>  		}
>  	}
> -- 
> 2.36.0

-- 
Ville Syrjälä
Intel


More information about the igt-dev mailing list