public inbox for igt-dev@lists.freedesktop.org
 help / color / mirror / Atom feed
From: Ramalingam C <ramalingam.c@intel.com>
To: igt-dev@lists.freedesktop.org, daniel.vetter@intel.com,
	arkadiusz.hiler@intel.com
Subject: [igt-dev] [PATCH i-g-t v6 6/8] kms_content_protection: uevent for HDCP status change
Date: Thu,  2 May 2019 18:46:23 +0530	[thread overview]
Message-ID: <20190502131625.27551-7-ramalingam.c@intel.com> (raw)
In-Reply-To: <20190502131625.27551-1-ramalingam.c@intel.com>

To detect the HDCP status change we are reading the uevent sent with the
corresponding connector id and property id.

This avoids the polling of the property every mSec.

v2:
  Made it as subtest. Remaining tests will use polling. [Daniel]

Signed-off-by: Ramalingam C <ramalingam.c@intel.com>
Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch>
---
 tests/kms_content_protection.c | 162 ++++++++++++++++++++++++++++++++-
 1 file changed, 158 insertions(+), 4 deletions(-)

diff --git a/tests/kms_content_protection.c b/tests/kms_content_protection.c
index 148aba92888c..cc8abda48702 100644
--- a/tests/kms_content_protection.c
+++ b/tests/kms_content_protection.c
@@ -24,6 +24,9 @@
 
 #include <poll.h>
 #include <fcntl.h>
+#include <sys/epoll.h>
+#include <sys/stat.h>
+#include <libudev.h>
 #include "igt.h"
 #include "igt_sysfs.h"
 #include "igt_kms.h"
@@ -43,6 +46,7 @@ struct data {
 #define CP_LIC					(1 << 1)
 #define CP_MEI_RELOAD				(1 << 2)
 #define CP_TYPE_CHANGE				(1 << 3)
+#define CP_UEVENT				(1 << 4)
 
 #define CP_UNDESIRED				0
 #define CP_DESIRED				1
@@ -102,6 +106,138 @@ static int wait_flip_event(void)
 	return rc;
 }
 
+static bool hdcp_event(struct udev_monitor *uevent_monitor,
+		       struct udev *udev, uint32_t conn_id, uint32_t prop_id)
+{
+	struct udev_device *dev;
+	dev_t udev_devnum;
+	struct stat s;
+	const char *hotplug, *connector, *property;
+	bool ret = false;
+
+	dev = udev_monitor_receive_device(uevent_monitor);
+	if (!dev)
+		goto out;
+
+	udev_devnum = udev_device_get_devnum(dev);
+	fstat(data.display.drm_fd, &s);
+
+	hotplug = udev_device_get_property_value(dev, "HOTPLUG");
+	if (!(memcmp(&s.st_rdev, &udev_devnum, sizeof(dev_t)) == 0 &&
+	    hotplug && atoi(hotplug) == 1)) {
+		igt_debug("Not a Hotplug event\n");
+		goto out_dev;
+	}
+
+	connector = udev_device_get_property_value(dev, "CONNECTOR");
+	if (!(memcmp(&s.st_rdev, &udev_devnum, sizeof(dev_t)) == 0 &&
+	    connector && atoi(connector) == conn_id)) {
+		igt_debug("Not for connector id: %u\n", conn_id);
+		goto out_dev;
+	}
+
+	property = udev_device_get_property_value(dev, "PROPERTY");
+	if (!(memcmp(&s.st_rdev, &udev_devnum, sizeof(dev_t)) == 0 &&
+	    property && atoi(property) == prop_id)) {
+		igt_debug("Not for property id: %u\n", prop_id);
+		goto out_dev;
+	}
+	ret = true;
+
+out_dev:
+	udev_device_unref(dev);
+out:
+	return ret;
+}
+
+static void hdcp_udev_fini(struct udev_monitor *uevent_monitor,
+			   struct udev *udev)
+{
+	if (uevent_monitor)
+		udev_monitor_unref(uevent_monitor);
+	if (udev)
+		udev_unref(udev);
+}
+
+static int hdcp_udev_init(struct udev_monitor *uevent_monitor,
+			  struct udev *udev)
+{
+	int ret = -EINVAL;
+
+	udev = udev_new();
+	if (!udev) {
+		igt_info("failed to create udev object\n");
+		goto out;
+	}
+
+	uevent_monitor = udev_monitor_new_from_netlink(udev, "udev");
+	if (!uevent_monitor) {
+		igt_info("failed to create udev event monitor\n");
+		goto out;
+	}
+
+	ret = udev_monitor_filter_add_match_subsystem_devtype(uevent_monitor,
+							      "drm",
+							      "drm_minor");
+	if (ret < 0) {
+		igt_info("failed to filter for drm events\n");
+		goto out;
+	}
+
+	ret = udev_monitor_enable_receiving(uevent_monitor);
+	if (ret < 0) {
+		igt_info("failed to enable udev event reception\n");
+		goto out;
+	}
+
+	return udev_monitor_get_fd(uevent_monitor);
+
+out:
+	hdcp_udev_fini(uevent_monitor, udev);
+	return ret;
+}
+
+#define MAX_EVENTS	10
+static bool wait_for_hdcp_event(uint32_t conn_id, uint32_t prop_id,
+				uint32_t timeout_mSec)
+{
+
+	struct udev_monitor *uevent_monitor = NULL;
+	struct udev *udev = NULL;
+	int udev_fd, epoll_fd;
+	struct epoll_event event, events[MAX_EVENTS];
+	bool ret = false;
+
+	udev_fd = hdcp_udev_init(uevent_monitor, udev);
+	if (udev_fd < 0)
+		return false;
+
+	epoll_fd = epoll_create1(0);
+	if (epoll_fd == -1) {
+		igt_info("Failed to create epoll fd. %d\n", epoll_fd);
+		goto out_ep_create;
+	}
+
+	event.events = EPOLLIN | EPOLLERR;
+	event.data.fd = 0;
+
+	if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, udev_fd, &event))
+	{
+		igt_info("failed to fd into epoll\n");
+		goto out_ep_ctl;
+	}
+
+	if (epoll_wait(epoll_fd, events, MAX_EVENTS, timeout_mSec))
+		ret = hdcp_event(uevent_monitor, udev, conn_id, prop_id);
+
+out_ep_ctl:
+	if (close(epoll_fd))
+		igt_info("failed to close the epoll fd\n");
+out_ep_create:
+	hdcp_udev_fini(uevent_monitor, udev);
+	return ret;
+}
+
 static bool
 wait_for_prop_value(igt_output_t *output, uint64_t expected,
 		    uint32_t timeout_mSec)
@@ -109,13 +245,25 @@ wait_for_prop_value(igt_output_t *output, uint64_t expected,
 	uint64_t val;
 	int i;
 
-	for (i = 0; i < timeout_mSec; i++) {
-		val = igt_output_get_prop(output,
-					  IGT_CONNECTOR_CONTENT_PROTECTION);
+	if (data.cp_tests & CP_UEVENT) {
+		if (wait_for_hdcp_event(output->id,
+				output->props[IGT_CONNECTOR_CONTENT_PROTECTION],
+				timeout_mSec))
+			igt_debug("hdcp event received\n");
+
+		val = igt_output_get_prop(output, IGT_CONNECTOR_CONTENT_PROTECTION);
 		if (val == expected)
 			return true;
-		usleep(1000);
+	} 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);
+		}
 	}
+
 	igt_info("prop_value mismatch %" PRId64 " != %" PRId64 "\n",
 		 val, expected);
 
@@ -484,6 +632,12 @@ igt_main
 		test_content_protection(COMMIT_ATOMIC, HDCP_CONTENT_TYPE_1);
 	}
 
+	igt_subtest("uevent") {
+		igt_require(data.display.is_atomic);
+		data.cp_tests = CP_UEVENT;
+		test_content_protection(COMMIT_ATOMIC, HDCP_CONTENT_TYPE_0);
+	}
+
 	igt_fixture
 		igt_display_fini(&data.display);
 }
-- 
2.19.1

_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

  parent reply	other threads:[~2019-05-02 13:14 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-05-02 13:16 [igt-dev] [PATCH i-g-t v6 0/8] HDCP2.2 Tests Ramalingam C
2019-05-02 13:16 ` [igt-dev] [PATCH i-g-t v6 1/8] kms_content_protection: Tests are defined by flags Ramalingam C
2019-05-06  6:01   ` Shankar, Uma
2019-05-06  6:26     ` Ramalingam C
2019-05-06  9:53       ` Shankar, Uma
2019-05-02 13:16 ` [igt-dev] [PATCH i-g-t v6 2/8] kms_content_protection: Link Integrity Check subtest Ramalingam C
2019-05-06  6:07   ` Shankar, Uma
2019-05-06  6:27     ` Ramalingam C
2019-05-02 13:16 ` [igt-dev] [PATCH i-g-t v6 3/8] kms_content_protection: Content type support Ramalingam C
2019-05-06 11:00   ` Shankar, Uma
2019-05-02 13:16 ` [igt-dev] [PATCH i-g-t v6 4/8] kms_content_protection: test teardown and rebuild of I915-mei I/F Ramalingam C
2019-05-06 11:09   ` Shankar, Uma
2019-05-02 13:16 ` [igt-dev] [PATCH i-g-t v6 5/8] kms_content_protection: test content type change Ramalingam C
2019-05-06 11:25   ` Shankar, Uma
2019-05-02 13:16 ` Ramalingam C [this message]
2019-05-02 13:16 ` [igt-dev] [PATCH i-g-t v6 7/8] kms_content_protection: SRM Testing Ramalingam C
2019-05-06 11:40   ` Shankar, Uma
2019-05-16 11:35   ` Mun, Gwan-gyeong
2019-05-02 13:16 ` [igt-dev] [PATCH i-g-t v6 8/8] DO NOT MERGE: CP in fast feedback list Ramalingam C
2019-05-02 14:13 ` [igt-dev] ✓ Fi.CI.BAT: success for HDCP2.2 Tests (rev6) Patchwork
2019-05-02 17:14 ` [igt-dev] ✓ Fi.CI.IGT: " 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=20190502131625.27551-7-ramalingam.c@intel.com \
    --to=ramalingam.c@intel.com \
    --cc=arkadiusz.hiler@intel.com \
    --cc=daniel.vetter@intel.com \
    --cc=igt-dev@lists.freedesktop.org \
    /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