Igt-dev Archive on lore.kernel.org
 help / color / mirror / Atom feed
From: Sowmiya S <sowmiya.s@intel.com>
To: igt-dev@lists.freedesktop.org
Cc: swati2.sharma@intel.com, karthik.b.s@intel.com,
	Sowmiya S <sowmiya.s@intel.com>
Subject: [PATCH i-g-t v2 2/3] tests/kms_content_protection: use shared igt_hdcp library
Date: Thu, 22 Oct 2026 16:20:57 +0530	[thread overview]
Message-ID: <20261022105102.384486-3-sowmiya.s@intel.com> (raw)
In-Reply-To: <20261022105102.384486-1-sowmiya.s@intel.com>

Replace the duplicated single-output/DP-MST HDCP helpers (enable,
disable, LIC wait, sink capability, force-HDCP1.4, output
capability/exemption discovery) with calls into the new igt_hdcp
library. Retry orchestration, FB/plane handling, SRM firmware writing,
and subtest policy remain in the test; only the HDCP mechanism moves
to the shared library.

The Link Integrity Check and MST-disable helpers preserve each call
site's original strictness: igt_hdcp_check_lic() takes a retry_once
flag and reports which output failed so the assert message names the
right connector, and test_mst_cp_disable() keeps a single immediate
read on secondary outputs instead of polling them.

Uevent-based waiting (only used by the uevent/uevent-hdcp14 subtests)
stays local as wait_for_prop_value(), keeping its original name,
falling back to the shared igt_hdcp_wait_for_prop_value() for the
plain-poll case used by every other subtest.

Signed-off-by: Sowmiya S <sowmiya.s@intel.com>
---
 tests/kms_content_protection.c | 444 +++++++--------------------------
 1 file changed, 95 insertions(+), 349 deletions(-)

diff --git a/tests/kms_content_protection.c b/tests/kms_content_protection.c
index d931ce768..64f167b3a 100644
--- a/tests/kms_content_protection.c
+++ b/tests/kms_content_protection.c
@@ -33,14 +33,11 @@
 #include <poll.h>
 #include <fcntl.h>
 #include <sys/epoll.h>
-#include <sys/stat.h>
 #include <libudev.h>
 #include "igt.h"
-#include "igt_edid.h"
-#include "igt_sysfs.h"
 #include "igt_kms.h"
 #include "igt_kmod.h"
-#include "igt_panel.h"
+#include "igt_hdcp.h"
 
 /**
  * SUBTEST: lic-type-0
@@ -124,23 +121,8 @@ struct data {
 #define CP_UEVENT				(1 << 4)
 #define SUSPEND_RESUME				(1 << 5)
 
-#define CP_UNDESIRED				0
-#define CP_DESIRED				1
-#define CP_ENABLED				2
 #define MAX_HDCP_OUTPUTS			10
 
-/*
- * HDCP_CONTENT_TYPE_0 can be handled on both HDCP1.4 and HDCP2.2. Where as
- * HDCP_CONTENT_TYPE_1 can be handled only through HDCP2.2.
- */
-#define HDCP_CONTENT_TYPE_0				0
-#define HDCP_CONTENT_TYPE_1				1
-
-#define LIC_PERIOD_MSEC				(4 * 1000)
-/* Kernel retry count=3, Max time per authentication allowed = 6Sec */
-#define KERNEL_AUTH_TIME_ALLOWED_MSEC		(3 *  6 * 1000)
-#define KERNEL_AUTH_TIME_ADDITIONAL_MSEC	100
-#define KERNEL_DISABLE_TIME_ALLOWED_MSEC	(1 * 1000)
 #define FLIP_EVENT_POLLING_TIMEOUT_MSEC		1000
 
 __u8 facsimile_srm[] = {
@@ -205,35 +187,30 @@ static int wait_flip_event(void)
 	return rc;
 }
 
-static bool
-wait_for_prop_value(igt_output_t *output, uint64_t expected,
-		    uint32_t timeout_mSec)
+/*
+ * uevent-based waiting is only exercised by the uevent/uevent-hdcp14
+ * subtests of this file, so it stays local here rather than in the shared
+ * igt_hdcp library - every other caller just polls via
+ * igt_hdcp_wait_for_prop_value().
+ */
+static bool wait_for_prop_value(igt_output_t *output, uint64_t expected,
+				uint32_t timeout_mSec)
 {
 	uint64_t val;
-	int i;
 
-	if (data.cp_tests & CP_UEVENT && expected != CP_UNDESIRED) {
-		igt_assert_f(igt_connector_event_detected(data.uevent_monitor,
-							  output->id,
+	if (!((data.cp_tests & CP_UEVENT) && expected != IGT_HDCP_UNDESIRED))
+		return igt_hdcp_wait_for_prop_value(output, expected, timeout_mSec);
+
+	igt_assert_f(igt_connector_event_detected(data.uevent_monitor,
+						  output->id,
 			     output->props[IGT_CONNECTOR_CONTENT_PROTECTION],
 			     timeout_mSec / 1000), "uevent is not received");
 
-		val = igt_output_get_prop(output,
-					  IGT_CONNECTOR_CONTENT_PROTECTION);
-		if (val == expected)
-			return true;
-	} else {
-		for (i = 0; i < timeout_mSec; i++) {
-			val = igt_output_get_prop(output,
-						  IGT_CONNECTOR_CONTENT_PROTECTION);
-			if (val == expected)
-				return true;
-			usleep(1000);
-		}
-	}
+	val = igt_output_get_prop(output, IGT_CONNECTOR_CONTENT_PROTECTION);
+	if (val == expected)
+		return true;
 
-	igt_info("prop_value mismatch %" PRId64 " != %" PRId64 "\n",
-		 val, expected);
+	igt_info("prop_value mismatch %" PRId64 " != %" PRId64 "\n", val, expected);
 
 	return false;
 }
@@ -296,19 +273,12 @@ static bool test_cp_enable(igt_output_t *output, enum igt_commit_style commit_st
 
 	primary = igt_output_get_plane_type(output, DRM_PLANE_TYPE_PRIMARY);
 
-	if (!type_change)
-		igt_output_set_prop_value(output,
-					  IGT_CONNECTOR_CONTENT_PROTECTION,
-					  CP_DESIRED);
-
-	if (output->props[IGT_CONNECTOR_HDCP_CONTENT_TYPE])
-		igt_output_set_prop_value(output,
-					  IGT_CONNECTOR_HDCP_CONTENT_TYPE,
-					  content_type);
+	igt_hdcp_set_content_protection_desired(output, content_type,
+						type_change);
 	igt_display_commit2(display, commit_style);
 
-	ret = wait_for_prop_value(output, CP_ENABLED,
-				  KERNEL_AUTH_TIME_ALLOWED_MSEC);
+	ret = wait_for_prop_value(output, IGT_HDCP_ENABLED,
+				  IGT_HDCP_KERNEL_AUTH_TIME_ALLOWED_MSEC);
 	if (ret) {
 		mode = igt_output_get_mode(output);
 		width = mode->hdisplay;
@@ -332,7 +302,7 @@ static void test_mst_cp_disable(igt_output_t *hdcp_mst_output[],
 	int width, height;
 	bool ret;
 	int count;
-	u64 val;
+	uint64_t val;
 
 	for (count = 0; count < valid_outputs; count++) {
 		primary = igt_output_get_plane_type(hdcp_mst_output[count], DRM_PLANE_TYPE_PRIMARY);
@@ -342,18 +312,17 @@ static void test_mst_cp_disable(igt_output_t *hdcp_mst_output[],
 		igt_plane_set_fb(primary, &data.red);
 		igt_fb_set_size(&data.red, primary, width, height);
 		igt_plane_set_size(primary, width, height);
-		igt_output_set_prop_value(hdcp_mst_output[count], IGT_CONNECTOR_CONTENT_PROTECTION,
-					  CP_UNDESIRED);
+		igt_hdcp_set_content_protection_undesired(hdcp_mst_output[count]);
 	}
 
 	igt_display_commit2(display, commit_style);
 
-	ret = wait_for_prop_value(hdcp_mst_output[0], CP_UNDESIRED,
-				  KERNEL_DISABLE_TIME_ALLOWED_MSEC);
+	ret = wait_for_prop_value(hdcp_mst_output[0], IGT_HDCP_UNDESIRED,
+				  IGT_HDCP_KERNEL_DISABLE_TIME_ALLOWED_MSEC);
 	for (count = 1; count < valid_outputs; count++) {
 		val = igt_output_get_prop(hdcp_mst_output[count],
 					  IGT_CONNECTOR_CONTENT_PROTECTION);
-		ret &= (val == CP_UNDESIRED);
+		ret &= (val == IGT_HDCP_UNDESIRED);
 	}
 
 	igt_assert_f(ret, "Content Protection not cleared on all MST outputs\n");
@@ -376,16 +345,15 @@ static void test_cp_disable(igt_output_t *output, enum igt_commit_style commit_s
 	 * Even on HDCP enable failed scenario, IGT should exit leaving the
 	 * "content protection" at "UNDESIRED".
 	 */
-	igt_output_set_prop_value(output, IGT_CONNECTOR_CONTENT_PROTECTION,
-				  CP_UNDESIRED);
+	igt_hdcp_set_content_protection_undesired(output);
 	igt_plane_set_fb(primary, &data.red);
 	igt_plane_set_size(primary, width, height);
 	igt_fb_set_size(&data.red, primary, width, height);
 	igt_display_commit2(display, commit_style);
 
 	/* Wait for HDCP to be disabled, before crtc off */
-	ret = wait_for_prop_value(output, CP_UNDESIRED,
-				  KERNEL_DISABLE_TIME_ALLOWED_MSEC);
+	ret = wait_for_prop_value(output, IGT_HDCP_UNDESIRED,
+				  IGT_HDCP_KERNEL_DISABLE_TIME_ALLOWED_MSEC);
 	igt_assert_f(ret, "Content Protection not cleared\n");
 }
 
@@ -434,18 +402,9 @@ static bool igt_crtc_is_free(igt_crtc_t *crtc)
 static void test_cp_lic(igt_output_t *output)
 {
 	bool ret;
-	uint64_t val;
 
-	/* Wait for 4Secs (min 2 cycles of Link Integrity Check) */
-	ret = wait_for_prop_value(output, CP_DESIRED, LIC_PERIOD_MSEC);
-	val = igt_output_get_prop(output,
-				  IGT_CONNECTOR_CONTENT_PROTECTION);
-	if (val == CP_DESIRED) {
-		igt_debug("Link Integrity Check failed, waiting for reauthentication\n");
-		ret = wait_for_prop_value(output, CP_DESIRED, LIC_PERIOD_MSEC);
-	}
-
-	igt_assert_f(!ret, "Content Protection LIC Failed\n");
+	ret = igt_hdcp_check_lic(&output, 1, 0, IGT_HDCP_LIC_PERIOD_MSEC, true, NULL);
+	igt_assert_f(ret, "Content Protection LIC Failed\n");
 }
 
 static bool write_srm_as_fw(const __u8 *srm, int len)
@@ -453,7 +412,7 @@ static bool write_srm_as_fw(const __u8 *srm, int len)
 	int fd, ret, total = 0;
 
 	fd = open("/lib/firmware/display_hdcp_srm.bin",
-		  O_WRONLY | O_CREAT, S_IRWXU);
+		  O_WRONLY | O_CREAT, 0700);
 	igt_require_f(fd >= 0, "Cannot write SRM binary to /lib/firmware\n");
 
 	do {
@@ -485,7 +444,7 @@ static void test_content_protection_on_output(igt_output_t *output,
 	if (data.cp_tests & CP_TYPE_CHANGE) {
 		/* Type 1 -> Type 0 */
 		test_cp_enable_with_retry(output, commit_style, 3,
-					  HDCP_CONTENT_TYPE_0, false,
+					  IGT_HDCP_CONTENT_TYPE_0, false,
 					  true);
 		/* Type 0 -> Type 1 */
 		test_cp_enable_with_retry(output, commit_style, 3,
@@ -521,8 +480,8 @@ static void test_content_protection_on_output(igt_output_t *output,
 					    IGT_CRTC_ACTIVE, 1);
 		igt_display_commit2(display, commit_style);
 
-		ret = wait_for_prop_value(output, CP_ENABLED,
-					  KERNEL_AUTH_TIME_ALLOWED_MSEC);
+		ret = wait_for_prop_value(output, IGT_HDCP_ENABLED,
+					  IGT_HDCP_KERNEL_AUTH_TIME_ALLOWED_MSEC);
 		if (!ret)
 			test_cp_enable_with_retry(output, commit_style, 2,
 						  content_type, false,
@@ -532,8 +491,8 @@ static void test_content_protection_on_output(igt_output_t *output,
 	if (data.cp_tests & SUSPEND_RESUME) {
 		igt_system_suspend_autoresume(SUSPEND_STATE_MEM, SUSPEND_TEST_NONE);
 
-		ret = wait_for_prop_value(output, CP_ENABLED,
-					  KERNEL_AUTH_TIME_ALLOWED_MSEC);
+		ret = wait_for_prop_value(output, IGT_HDCP_ENABLED,
+					  IGT_HDCP_KERNEL_AUTH_TIME_ALLOWED_MSEC);
 		if (!ret)
 			test_cp_enable_with_retry(output, commit_style, 2,
 						  content_type, false,
@@ -541,70 +500,6 @@ static void test_content_protection_on_output(igt_output_t *output,
 	}
 }
 
-static void __debugfs_read(int fd, const char *param, char *buf, int len)
-{
-	len = igt_debugfs_simple_read(fd, param, buf, len);
-	igt_require(len != -ENOENT);
-	if (len < 0)
-		igt_assert_eq(len, -ENODEV);
-}
-
-#define debugfs_read(fd, p, arr) __debugfs_read(fd, p, arr, sizeof(arr))
-
-#define MAX_SINK_HDCP_CAP_BUF_LEN	5000
-
-static bool sink_hdcp_capable(igt_output_t *output)
-{
-	char buf[MAX_SINK_HDCP_CAP_BUF_LEN];
-	int fd;
-
-	fd = igt_debugfs_connector_dir(data.drm_fd, output->name, O_RDONLY);
-	if (fd < 0)
-		return false;
-
-	/*
-	 * FIXME: As of now XE's debugfs is using i915 namespace. Once Kernel
-	 * changes got landed, please update this logic to use XE specific
-	 * debugfs.
-	 */
-	if (is_intel_device(data.drm_fd))
-		debugfs_read(fd, "i915_hdcp_sink_capability", buf);
-	else if (is_mtk_device(data.drm_fd))
-		debugfs_read(fd, "mtk_hdcp_sink_capability", buf);
-	else
-		debugfs_read(fd, "hdcp_sink_capability", buf);
-
-	close(fd);
-
-	igt_debug("Sink capability: %s\n", buf);
-
-	return strstr(buf, "HDCP1.4");
-}
-
-static bool sink_hdcp2_capable(igt_output_t *output)
-{
-	char buf[MAX_SINK_HDCP_CAP_BUF_LEN];
-	int fd;
-
-	fd = igt_debugfs_connector_dir(data.drm_fd, output->name, O_RDONLY);
-	if (fd < 0)
-		return false;
-
-	/* FIXME: XE specific debugfs as mentioned above. */
-	if (is_intel_device(data.drm_fd))
-		debugfs_read(fd, "i915_hdcp_sink_capability", buf);
-	else if (is_mtk_device(data.drm_fd))
-		debugfs_read(fd, "mtk_hdcp_sink_capability", buf);
-	else
-		debugfs_read(fd, "hdcp_sink_capability", buf);
-
-	close(fd);
-
-	igt_debug("Sink capability: %s\n", buf);
-
-	return strstr(buf, "HDCP2.2");
-}
-
 static void prepare_modeset_on_mst_output(igt_output_t *output, bool is_enabled)
 {
 	drmModeModeInfo *mode;
@@ -623,73 +518,6 @@ static void prepare_modeset_on_mst_output(igt_output_t *output, bool is_enabled)
 	igt_plane_set_size(primary, width, height);
 }
 
-static bool output_hdcp_capable(igt_output_t *output, int content_type)
-{
-		if (!output->props[IGT_CONNECTOR_CONTENT_PROTECTION])
-			return false;
-
-		if (!output->props[IGT_CONNECTOR_HDCP_CONTENT_TYPE] &&
-		    content_type)
-			return false;
-
-		if (content_type && !sink_hdcp2_capable(output)) {
-			igt_info("\tSkip %s (Sink has no HDCP2.2 support)\n",
-				 output->name);
-			return false;
-		} else if (!sink_hdcp_capable(output)) {
-			igt_info("\tSkip %s (Sink has no HDCP support)\n",
-				 output->name);
-			return false;
-		}
-
-		return true;
-}
-
-static void set_i915_force_hdcp14(igt_output_t *output)
-{
-	int fd, ret;
-	char buf[MAX_SINK_HDCP_CAP_BUF_LEN];
-
-	fd = igt_debugfs_connector_dir(data.drm_fd, output->name, O_RDONLY);
-	igt_require_f(fd >= 0, "Cannot open %s debugfs\n", output->name);
-
-	ret = igt_debugfs_simple_read(fd, "i915_force_hdcp14", buf, sizeof(buf));
-	if (ret <= 0) {
-		igt_info("i915_force_hdcp14 not supported\n");
-		close(fd);
-		return;
-	}
-
-	ret = igt_sysfs_write(fd, "i915_force_hdcp14", "1", 2);
-	igt_require_f(ret > 0, "i915_force_hdcp14 is not enabled\n");
-
-	ret = igt_debugfs_simple_read(fd, "i915_force_hdcp14", buf, sizeof(buf));
-	igt_assert_f(ret > 0 && strstr(buf, "yes"),
-			 "i915_force_hdcp14 is not set to 'yes' on %s debugfs\n",
-			 output->name);
-
-	close(fd);
-}
-
-static void reset_i915_force_hdcp14(igt_output_t *output)
-{
-	int fd, ret;
-	char buf[MAX_SINK_HDCP_CAP_BUF_LEN];
-
-	fd = igt_debugfs_connector_dir(data.drm_fd, output->name, O_RDONLY);
-	igt_require_f(fd >= 0, "Cannot open %s debugfs\n", output->name);
-
-	ret = igt_sysfs_write(fd, "i915_force_hdcp14", "0", 2);
-	igt_require_f(ret > 0, "i915_force_hdcp14 is not disabled\n");
-
-	ret = igt_debugfs_simple_read(fd, "i915_force_hdcp14", buf, sizeof(buf));
-	igt_assert_f(ret > 0 && strstr(buf, "no"),
-			 "i915_force_hdcp14 is not set to 'no' on %s debugfs\n",
-			 "i915_force_hdcp14");
-
-	close(fd);
-}
-
 static void
 test_fini(igt_output_t *output, enum igt_commit_style commit_style)
 {
@@ -703,62 +531,6 @@ test_fini(igt_output_t *output, enum igt_commit_style commit_style)
 	igt_display_commit2(&data.display, commit_style);
 }
 
-static bool is_output_hdcp_test_exempt(igt_output_t *output)
-{
-	drmModePropertyBlobPtr edid_blob = NULL;
-	uint64_t edid_blob_id;
-	const struct edid *edid;
-	char edid_vendor[4];
-	char sink_name[20];
-
-	igt_assert(kmstest_get_property(data.drm_fd,
-					output->config.connector->connector_id,
-					DRM_MODE_OBJECT_CONNECTOR, "EDID", NULL,
-					&edid_blob_id, NULL));
-
-	igt_assert(edid_blob = drmModeGetPropertyBlob(data.drm_fd, edid_blob_id));
-
-	edid = (const struct edid *)edid_blob->data;
-	edid_get_mfg(edid, edid_vendor);
-	edid_vendor[3] = '\0';
-
-	edid_get_monitor_name(edid, sink_name, ARRAY_SIZE(sink_name));
-
-	drmModeFreePropertyBlob(edid_blob);
-
-	/* Not all monitors have sink names */
-	if (sink_name[0] == '\0') {
-		igt_debug("no sink name\n");
-		return true;
-	}
-
-	return igt_is_panel_blocked(sink_name, hdcp_blocklist, ARRAY_SIZE(hdcp_blocklist));
-}
-
-static int get_hdcp_outputs(igt_display_t *display, int content_type,
-			    igt_output_t **hdcp_outputs)
-{
-	igt_output_t *output;
-	int count = 0;
-
-	for_each_connected_output(display, output) {
-		if (!output_hdcp_capable(output, content_type))
-			continue;
-
-		if (is_output_hdcp_test_exempt(output)) {
-			igt_info("Skipping HDCP test on %s, as the panel is blocklisted\n",
-				 output->name);
-			continue;
-		}
-
-
-		if (count < MAX_HDCP_OUTPUTS)
-			hdcp_outputs[count++] = output;
-	}
-
-	return count;
-}
-
 static void
 test_content_protection(enum igt_commit_style commit_style, int content_type)
 {
@@ -773,7 +545,12 @@ test_content_protection(enum igt_commit_style commit_style, int content_type)
 		igt_require_f(igt_kmod_is_loaded("mei_hdcp"),
 			      "mei_hdcp module is not loaded\n");
 
-	hdcp_panel_count = get_hdcp_outputs(display, content_type, hdcp_outputs);
+	hdcp_panel_count = igt_hdcp_get_capable_outputs(display, data.drm_fd,
+							content_type,
+							hdcp_blocklist,
+							ARRAY_SIZE(hdcp_blocklist),
+							hdcp_outputs,
+							MAX_HDCP_OUTPUTS);
 	igt_skip_on_f(hdcp_panel_count == 0, "No connected output with HDCP support found\n");
 
 	if (data.cp_tests & CP_UEVENT) {
@@ -793,7 +570,7 @@ test_content_protection(enum igt_commit_style commit_style, int content_type)
 
 			modeset_with_fb(output, commit_style);
 			if (data.is_force_hdcp14)
-				set_i915_force_hdcp14(output);
+				igt_hdcp_force_hdcp14(data.drm_fd, output, true);
 
 			igt_dynamic_f("pipe-%s-%s", igt_crtc_name(crtc),
 				      output->name)
@@ -803,7 +580,7 @@ test_content_protection(enum igt_commit_style commit_style, int content_type)
 								  content_type);
 
 			if (data.is_force_hdcp14)
-				reset_i915_force_hdcp14(output);
+				igt_hdcp_force_hdcp14(data.drm_fd, output, false);
 
 			test_fini(output, commit_style);
 			/*
@@ -819,43 +596,16 @@ test_content_protection(enum igt_commit_style commit_style, int content_type)
 		igt_cleanup_uevents(data.uevent_monitor);
 }
 
-static bool output_is_dp_mst(igt_output_t *output, int i)
-{
-	int connector_id;
-	static int prev_connector_id;
-
-	connector_id = igt_get_dp_mst_connector_id(output);
-	if (connector_id < 0)
-		return false;
-
-	/*
-	 * 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 test_cp_lic_on_mst(igt_output_t *mst_outputs[], int valid_outputs, int first_output)
 {
-	int ret, count;
-	uint64_t val;
+	bool ret;
+	int failed_index;
 
 	/* Only wait for the first output, this optimizes the test execution time */
-	ret = wait_for_prop_value(mst_outputs[first_output], CP_DESIRED, LIC_PERIOD_MSEC);
-	igt_assert_f(!ret, "Content Protection LIC Failed on %s\n",
-		     mst_outputs[first_output]->name);
-
-	for (count = first_output + 1; count < valid_outputs; count++) {
-		val = igt_output_get_prop(mst_outputs[count], IGT_CONNECTOR_CONTENT_PROTECTION);
-		igt_assert_f(val != CP_DESIRED, "Content Protection LIC Failed on %s\n", mst_outputs[count]->name);
-	}
+	ret = igt_hdcp_check_lic(mst_outputs, valid_outputs, first_output,
+				 IGT_HDCP_LIC_PERIOD_MSEC, false, &failed_index);
+	igt_assert_f(ret, "Content Protection LIC Failed on %s\n",
+		     mst_outputs[failed_index]->name);
 }
 
 static void
@@ -868,30 +618,23 @@ test_mst_cp_enable_with_retry(igt_output_t *hdcp_mst_output[], int valid_outputs
 
 	if (data.is_force_hdcp14) {
 		for (count = 0; count < valid_outputs; count++)
-			set_i915_force_hdcp14(hdcp_mst_output[count]);
+			igt_hdcp_force_hdcp14(data.drm_fd, hdcp_mst_output[count], true);
 	}
 
 	do {
 		if (retry_orig != retries)
 			test_mst_cp_disable(hdcp_mst_output, COMMIT_ATOMIC, valid_outputs);
 
-		for (count = 0; count < valid_outputs; count++) {
-			igt_output_set_prop_value(hdcp_mst_output[count],
-						  IGT_CONNECTOR_CONTENT_PROTECTION, CP_DESIRED);
-
-			if (hdcp_mst_output[count]->props[IGT_CONNECTOR_HDCP_CONTENT_TYPE])
-				igt_output_set_prop_value(hdcp_mst_output[count],
-							  IGT_CONNECTOR_HDCP_CONTENT_TYPE,
-							  content_type);
-		}
+		for (count = 0; count < valid_outputs; count++)
+			igt_hdcp_set_content_protection_desired(hdcp_mst_output[count],
+								content_type, false);
 
 		igt_display_commit2(display, COMMIT_ATOMIC);
 
-		ret = wait_for_prop_value(hdcp_mst_output[0], CP_ENABLED,
-					  KERNEL_AUTH_TIME_ALLOWED_MSEC);
-		for (count = 1; count < valid_outputs; count++)
-			ret &= wait_for_prop_value(hdcp_mst_output[count], CP_ENABLED,
-						  KERNEL_AUTH_TIME_ADDITIONAL_MSEC);
+		ret = igt_hdcp_wait_for_prop_value_multi(hdcp_mst_output, valid_outputs,
+							 IGT_HDCP_ENABLED,
+							 IGT_HDCP_KERNEL_AUTH_TIME_ALLOWED_MSEC,
+							 IGT_HDCP_KERNEL_AUTH_TIME_ADDITIONAL_MSEC);
 
 		retries -= 1;
 
@@ -906,7 +649,7 @@ test_mst_cp_enable_with_retry(igt_output_t *hdcp_mst_output[], int valid_outputs
 
 	if (data.is_force_hdcp14) {
 		for (count = 0; count < valid_outputs; count++)
-			reset_i915_force_hdcp14(hdcp_mst_output[count]);
+			igt_hdcp_force_hdcp14(data.drm_fd, hdcp_mst_output[count], false);
 	}
 
 	igt_assert_f(ret, "Content Protection not enabled on MST outputs\n");
@@ -918,12 +661,14 @@ test_content_protection_mst(int content_type)
 	igt_display_t *display = &data.display;
 	igt_output_t *output;
 	int valid_outputs = 0, dp_mst_outputs = 0, ret, count, i;
+	int prev_connector_id = -1;
 	igt_crtc_t *crtc;
 	bool pipe_found;
 	igt_output_t *hdcp_mst_output[IGT_MAX_PIPES];
 
 	for_each_connected_output(display, output) {
-		if (!output_is_dp_mst(output, dp_mst_outputs))
+		if (!igt_hdcp_output_is_dp_mst(output, dp_mst_outputs,
+					       &prev_connector_id))
 			continue;
 
 		pipe_found = false;
@@ -940,7 +685,7 @@ test_content_protection_mst(int content_type)
 		igt_output_set_crtc(output, crtc);
 		prepare_modeset_on_mst_output(output, false);
 		dp_mst_outputs++;
-		if (output_hdcp_capable(output, content_type))
+		if (igt_hdcp_output_capable(data.drm_fd, output, content_type))
 			hdcp_mst_output[valid_outputs++] = output;
 	}
 
@@ -969,8 +714,8 @@ test_content_protection_mst(int content_type)
 		igt_system_suspend_autoresume(SUSPEND_STATE_MEM, SUSPEND_TEST_NONE);
 
 		ret = wait_for_prop_value(hdcp_mst_output[0],
-						 CP_ENABLED,
-						 KERNEL_AUTH_TIME_ALLOWED_MSEC);
+					  IGT_HDCP_ENABLED,
+					  IGT_HDCP_KERNEL_AUTH_TIME_ALLOWED_MSEC);
 		if (!ret)
 			test_mst_cp_enable_with_retry(hdcp_mst_output, valid_outputs,
 						      2, content_type);
@@ -988,7 +733,8 @@ test_content_protection_mst(int content_type)
 	/* CP is expected to be still enabled on other outputs*/
 	for (i = 1; i < valid_outputs; i++) {
 		/* Wait for the timeout to verify CP is not disabled */
-		ret = wait_for_prop_value(hdcp_mst_output[i], CP_UNDESIRED, KERNEL_DISABLE_TIME_ALLOWED_MSEC);
+		ret = wait_for_prop_value(hdcp_mst_output[i], IGT_HDCP_UNDESIRED,
+					  IGT_HDCP_KERNEL_DISABLE_TIME_ALLOWED_MSEC);
 		igt_assert_f(!ret, "Content Protection not enabled on %s\n", hdcp_mst_output[i]->name);
 	}
 
@@ -1009,7 +755,7 @@ static void test_content_protection_cleanup(void)
 
 		val = igt_output_get_prop(output,
 					  IGT_CONNECTOR_CONTENT_PROTECTION);
-		if (val == CP_UNDESIRED)
+		if (val == IGT_HDCP_UNDESIRED)
 			continue;
 
 		igt_info("CP Prop being UNDESIRED on %s\n", output->name);
@@ -1052,44 +798,44 @@ static const struct {
 	{ .desc = "Test content protection with atomic modesetting",
 	  .name = "atomic",
 	  .cp_tests = 0,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	  .is_force_hdcp14 = false,
 	},
 	{ .desc = "Test for the integrity of link with type 0 content.",
 	  .name = "lic-type-0",
 	  .cp_tests = CP_LIC,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	},
 	{ .desc = "Test for the integrity of link with type 1 content",
 	  .name = "lic-type-1",
 	  .cp_tests = CP_LIC,
-	  .content_type = HDCP_CONTENT_TYPE_1,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_1,
 	  .is_force_hdcp14 = false,
 	},
 	{ .desc = "Test content protection with content type 1 "
 		  "that can be handled only through HDCP2.2.",
 	  .name = "type1",
 	  .cp_tests = 0,
-	  .content_type = HDCP_CONTENT_TYPE_1,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_1,
 	  .is_force_hdcp14 = false,
 	},
 	{ .desc = "Test the teardown and rebuild of the interface between "
 		  "Intel and mei hdcp.",
 	  .name = "mei-interface",
 	  .cp_tests = CP_MEI_RELOAD,
-	  .content_type = HDCP_CONTENT_TYPE_1,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_1,
 	  .is_force_hdcp14 = false,
 	},
 	{ .desc = "Test the content type change when the content protection already enabled",
 	  .name = "content-type-change",
 	  .cp_tests = CP_TYPE_CHANGE,
-	  .content_type = HDCP_CONTENT_TYPE_1,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_1,
 	},
 	{ .desc = "Test to detect the HDCP status change when we are reading the uevent "
 		  "sent with the corresponding connector id and property id.",
 	  .name = "uevent",
 	  .cp_tests = CP_UEVENT,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	  .is_force_hdcp14 = false,
 	},
 	/*
@@ -1104,45 +850,45 @@ static const struct {
 		  "and check the kernel parsing of it by invoking the hdcp authentication.",
 	  .name = "srm",
 	  .cp_tests = 0,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	  .is_force_hdcp14 = false,
 	},
 	{ .desc = "Test content protection with atomic modesetting with HDCP1.4.",
 	  .name = "atomic-hdcp14",
 	  .cp_tests = 0,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	  .is_force_hdcp14 = true,
 	},
 	{ .desc = "Test for the integrity of link with type 0 content.",
 	  .name = "lic-type-0-hdcp14",
 	  .cp_tests = CP_LIC,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	  .is_force_hdcp14 = true,
 	},
 	{ .desc = "Test to detect the HDCP status change when we are reading the uevent "
 		  "sent with the corresponding connector id and property id.",
 	  .name = "uevent-hdcp14",
 	  .cp_tests = CP_UEVENT,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	  .is_force_hdcp14 = true,
 	},
 	{ .desc = "Test content protection with DPMS ON/OFF during "
 		  "atomic modesetting with HDCP1.4.",
 	  .name = "atomic-dpms-hdcp14",
 	  .cp_tests = CP_DPMS,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	  .is_force_hdcp14 = true,
 	},
 	{ .desc = "Test content protection with DPMS ON/OFF during atomic modesetting.",
 	  .name = "atomic-dpms",
 	  .cp_tests = CP_DPMS,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	  .is_force_hdcp14 = false,
 	},
 	{.desc = "Test to verify the behaviour of HDCP after suspend resume cycles.",
 	 .name = "suspend-resume",
 	 .cp_tests = SUSPEND_RESUME,
-	 .content_type = HDCP_CONTENT_TYPE_0,
+	 .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	}
 };
 
@@ -1156,48 +902,48 @@ static const struct {
 	{ .desc = "Test Content protection(Type 0) over DP MST.",
 	  .name = "dp-mst-type-0",
 	  .cp_tests = 0,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	  .is_force_hdcp14 = false,
 	},
 	{ .desc = "Test Content protection(Type 1) over DP MST.",
 	  .name = "dp-mst-type-1",
 	  .cp_tests = 0,
-	  .content_type = HDCP_CONTENT_TYPE_1,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_1,
 	  .is_force_hdcp14 = false,
 	},
 	{ .desc = "Test Content protection(Type 0) over DP MST with LIC.",
 	  .name = "dp-mst-lic-type-0",
 	  .cp_tests = CP_LIC,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	  .is_force_hdcp14 = false,
 	},
 	{ .desc = "Test Content protection(Type 1) over DP MST with LIC.",
 	  .name = "dp-mst-lic-type-1",
 	  .cp_tests = CP_LIC,
-	  .content_type = HDCP_CONTENT_TYPE_1,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_1,
 	  .is_force_hdcp14 = false,
 	},
 	{ .desc = "Test Content protection(Type 0) over DP MST with HDCP1.4.",
 	  .name = "dp-mst-type-0-hdcp14",
 	  .cp_tests = 0,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	  .is_force_hdcp14 = true,
 	},
 	{ .desc = "Test Content protection(Type 0) over DP MST with LIC.",
 	  .name = "dp-mst-lic-type-0-hdcp14",
 	  .cp_tests = CP_LIC,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	  .is_force_hdcp14 = true,
 	},
 	{ .desc = "Test Content protection(Type 0) over DP MST with suspend resume.",
 	  .name = "dp-mst-type-0-suspend-resume",
 	  .cp_tests = SUSPEND_RESUME,
-	  .content_type = HDCP_CONTENT_TYPE_0,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_0,
 	},
 	{ .desc = "Test Content protection(Type 1) over DP MST with suspend resume.",
 	  .name = "dp-mst-type-1-suspend-resume",
 	  .cp_tests = SUSPEND_RESUME,
-	  .content_type = HDCP_CONTENT_TYPE_1,
+	  .content_type = IGT_HDCP_CONTENT_TYPE_1,
 	},
 };
 
@@ -1214,14 +960,14 @@ int igt_main()
 	igt_subtest_with_dynamic("legacy") {
 		data.cp_tests = 0;
 		data.is_force_hdcp14 = false;
-		test_content_protection(COMMIT_LEGACY, HDCP_CONTENT_TYPE_0);
+		test_content_protection(COMMIT_LEGACY, IGT_HDCP_CONTENT_TYPE_0);
 	}
 
 	igt_describe("Test content protection with legacy style commit with HDCP1.4");
 	igt_subtest_with_dynamic("legacy-hdcp14") {
 		data.cp_tests = 0;
 		data.is_force_hdcp14 = true;
-		test_content_protection(COMMIT_LEGACY, HDCP_CONTENT_TYPE_0);
+		test_content_protection(COMMIT_LEGACY, IGT_HDCP_CONTENT_TYPE_0);
 	}
 
 	igt_subtest_group() {
@@ -1239,7 +985,7 @@ int igt_main()
 					bool ret;
 
 					ret = write_srm_as_fw((const __u8 *)facsimile_srm,
-							     sizeof(facsimile_srm));
+							      sizeof(facsimile_srm));
 					igt_assert_f(ret, "SRM update failed");
 				}
 
-- 
2.43.0


  parent reply	other threads:[~2026-10-22 10:53 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-10-22 10:50 [PATCH i-g-t v2 0/3] lib/igt_hdcp: extract shared HDCP helpers from kms_content_protection Sowmiya S
2026-10-22 10:50 ` [PATCH i-g-t v2 1/3] lib/igt_hdcp: add shared HDCP helper library Sowmiya S
2026-10-22 10:50 ` Sowmiya S [this message]
2026-10-22 10:50 ` [PATCH i-g-t v2 3/3] tests/kms_feature_discovery: add hdcp capability discovery subtest Sowmiya S
2026-10-22 11:58 ` ✓ Xe.CI.BAT: success for lib/igt_hdcp: extract shared HDCP helpers from kms_content_protection (rev2) Patchwork
2026-10-22 12:39 ` ✓ i915.CI.BAT: " Patchwork
2026-10-22 18:01 ` ✓ Xe.CI.FULL: " Patchwork
2026-10-22 23:59 ` ✓ i915.CI.Full: " 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=20261022105102.384486-3-sowmiya.s@intel.com \
    --to=sowmiya.s@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    --cc=karthik.b.s@intel.com \
    --cc=swati2.sharma@intel.com \
    /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