All of lore.kernel.org
 help / color / mirror / Atom feed
* [igt-dev] [Patch][i-g-t v2 0/3] Add support to detect HDCP events
@ 2020-06-23 10:32 Ankit Nautiyal
  2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 1/3] lib/igt_kms: Add support for detecting connector events Ankit Nautiyal
                   ` (3 more replies)
  0 siblings, 4 replies; 9+ messages in thread
From: Ankit Nautiyal @ 2020-06-23 10:32 UTC (permalink / raw)
  To: igt-dev

This patch-series modifies the igt_kms to add support to detect
connector events. This support is then used for detecting
HDCP events in kms_content_protection. 
Third patch, renames the APIs to have generic names.

Ankit Nautiyal (3):
  lib/igt_kms: Add support for detecting connector events
  tests/kms_content_protection: Use library functions for handling
    uevents
  lib: Use generic names for APIs that handle uevents

 lib/igt_kms.c                  |  89 +++++++++++++-------
 lib/igt_kms.h                  |   8 +-
 tests/kms_chamelium.c          |  40 ++++-----
 tests/kms_content_protection.c | 146 ++-------------------------------
 tests/kms_lease.c              |   6 +-
 5 files changed, 95 insertions(+), 194 deletions(-)

-- 
2.17.1

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

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [igt-dev] [Patch][i-g-t v2 1/3] lib/igt_kms: Add support for detecting connector events
  2020-06-23 10:32 [igt-dev] [Patch][i-g-t v2 0/3] Add support to detect HDCP events Ankit Nautiyal
@ 2020-06-23 10:32 ` Ankit Nautiyal
  2020-06-23 11:50   ` Ramalingam C
  2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 2/3] tests/kms_content_protection: Use library functions for handling uevents Ankit Nautiyal
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 9+ messages in thread
From: Ankit Nautiyal @ 2020-06-23 10:32 UTC (permalink / raw)
  To: igt-dev

Currently, the event_detect function checks the property val for
"HOTPLUG" and "LEASE" both of which are set to '1' when these events
are sent.

This cannot be used for detecting connector events such as HDCP event
as connector events are sent along with property to signify which
property of which connector has changed. Connector ID and property id
are provided along with "CONNECTOR" and "PROPERTY" as udev
property-value pairs. Eg. for HDCP, the connector id of the connector
whose hdcp status changed, and the property id of the
‘CONTENT_PROTECTION’ property are sent with uevent.

This patch modifies the event_detect function to check multiple
properties with different expected values. It also adds support to
detect connector event for a given pair of connector and property ids.

v2: Simplified the event_detect conditional statements. (Ram)
    Changed the api name for detecting connnector events. (Anshuman)
    Added check for "HOTPLUG" property value for connector events.

Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
 lib/igt_kms.c | 61 ++++++++++++++++++++++++++++++++++++++-------------
 lib/igt_kms.h |  2 ++
 2 files changed, 48 insertions(+), 15 deletions(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index 54de45e5..a9c444e6 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -4164,32 +4164,57 @@ struct udev_monitor *igt_watch_hotplug(void)
 }
 
 static bool event_detected(struct udev_monitor *mon, int timeout_secs,
-			   const char *property)
+			   const char **property, int *expected_val, int num_props)
 {
 	struct udev_device *dev;
-	const char *hotplug_val;
+	const char *prop_val;
 	struct pollfd fd = {
 		.fd = udev_monitor_get_fd(mon),
 		.events = POLLIN
 	};
-	bool hotplug_received = false;
+	bool event_received = false;
+	int i;
 
-	/* Go through all of the events pending on the udev monitor. Once we
-	 * receive a hotplug, we continue going through the rest of the events
-	 * so that redundant hotplug events don't change the results of future
-	 * checks
+	/* Go through all of the events pending on the udev monitor.
+	 * Match the given set of properties and their values to
+	 * the expected values.
 	 */
-	while (!hotplug_received && poll(&fd, 1, timeout_secs * 1000)) {
+	while (!event_received && poll(&fd, 1, timeout_secs * 1000)) {
 		dev = udev_monitor_receive_device(mon);
-
-		hotplug_val = udev_device_get_property_value(dev, property);
-		if (hotplug_val && atoi(hotplug_val) == 1)
-			hotplug_received = true;
+		for (i = 0; i < num_props; i++) {
+			prop_val = udev_device_get_property_value(dev,
+								  property[i]);
+			if (!prop_val || atoi(prop_val) != expected_val[i])
+				break;
+		}
+		if (i == num_props)
+			event_received = true;
 
 		udev_device_unref(dev);
 	}
 
-	return hotplug_received;
+	return event_received;
+}
+
+/**
+ * igt_connector_event_detected:
+ * @mon: A udev monitor initialized with #igt_watch_hotplug
+ * @conn_id: Connector id of the Connector for which the property change is
+ * expected.
+ * @prop_id: Property id for which the change is expected.
+ * @timeout_secs: How long to wait for a connector event to occur.
+ *
+ * Assert that a connector event is received for a given connector and property.
+ *
+ * Returns: true if the connector event was received, false if we timed out
+ */
+bool igt_connector_event_detected(struct udev_monitor *mon, uint32_t conn_id,
+				  uint32_t prop_id, int timeout_secs)
+{
+	const char *props[3] = {"HOTPLUG", "CONNECTOR", "PROPERTY"};
+	int expected_val[3] = {1, conn_id, prop_id};
+
+	return event_detected(mon, timeout_secs, props, expected_val, 3);
 }
 
 /**
@@ -4203,7 +4228,10 @@ static bool event_detected(struct udev_monitor *mon, int timeout_secs,
  */
 bool igt_hotplug_detected(struct udev_monitor *mon, int timeout_secs)
 {
-	return event_detected(mon, timeout_secs, "HOTPLUG");
+	const char *props[1] = {"HOTPLUG"};
+	int expected_val = 1;
+
+	return event_detected(mon, timeout_secs, props, &expected_val, 1);
 }
 
 /**
@@ -4217,7 +4245,10 @@ bool igt_hotplug_detected(struct udev_monitor *mon, int timeout_secs)
  */
 bool igt_lease_change_detected(struct udev_monitor *mon, int timeout_secs)
 {
-	return event_detected(mon, timeout_secs, "LEASE");
+	const char *props[1] = {"LEASE"};
+	int expected_val = 1;
+
+	return event_detected(mon, timeout_secs, props, &expected_val, 1);
 }
 
 /**
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index cd3fdbc0..0b4d7c94 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -777,6 +777,8 @@ bool igt_hotplug_detected(struct udev_monitor *mon,
 			  int timeout_secs);
 bool igt_lease_change_detected(struct udev_monitor *mon,
 			       int timeout_secs);
+bool igt_connector_event_detected(struct udev_monitor *mon, uint32_t conn_id,
+				  uint32_t prop_id, int timeout_msecs);
 void igt_flush_hotplugs(struct udev_monitor *mon);
 void igt_cleanup_hotplug(struct udev_monitor *mon);
 
-- 
2.17.1

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

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [igt-dev] [Patch][i-g-t v2 2/3] tests/kms_content_protection: Use library functions for handling uevents
  2020-06-23 10:32 [igt-dev] [Patch][i-g-t v2 0/3] Add support to detect HDCP events Ankit Nautiyal
  2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 1/3] lib/igt_kms: Add support for detecting connector events Ankit Nautiyal
@ 2020-06-23 10:32 ` Ankit Nautiyal
  2020-06-23 11:57   ` Ramalingam C
  2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 3/3] lib: Use generic names for APIs that handle uevents Ankit Nautiyal
  2020-06-23 11:29 ` [igt-dev] ✗ Fi.CI.BUILD: failure for Add support to detect HDCP events (rev2) Patchwork
  3 siblings, 1 reply; 9+ messages in thread
From: Ankit Nautiyal @ 2020-06-23 10:32 UTC (permalink / raw)
  To: igt-dev

Currently, the test has its own version of uevent handling used
for detecting hdcp events. This patch modifies the test to use
the igt_kms lib support for handling the uevent monitor and detect
hdcp events.

v2: Rebased

Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
---
 tests/kms_content_protection.c | 146 ++-------------------------------
 1 file changed, 7 insertions(+), 139 deletions(-)

diff --git a/tests/kms_content_protection.c b/tests/kms_content_protection.c
index 3b9cedcb..a80aa5bb 100644
--- a/tests/kms_content_protection.c
+++ b/tests/kms_content_protection.c
@@ -39,6 +39,7 @@ struct data {
 	igt_display_t display;
 	struct igt_fb red, green;
 	unsigned int cp_tests;
+	struct udev_monitor *uevent_monitor;
 } data;
 
 /* Test flags */
@@ -112,143 +113,6 @@ 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 *udev_fd)
-{
-	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;
-	}
-
-	*udev_fd = udev_monitor_get_fd(*uevent_monitor);
-	if (*udev_fd < 0) {
-		igt_info("failed to get udev_fd on uevent monitor\n");
-		ret = *udev_fd;
-		goto out;
-	}
-
-	return ret;
-
-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;
-
-	if (hdcp_udev_init(&uevent_monitor, &udev, &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)
@@ -257,9 +121,10 @@ wait_for_prop_value(igt_output_t *output, uint64_t expected,
 	int i;
 
 	if (data.cp_tests & CP_UEVENT && expected != CP_UNDESIRED) {
-		igt_assert_f(wait_for_hdcp_event(output->id,
+		igt_assert_f(igt_connector_event_detected(data.uevent_monitor,
+							  output->id,
 			     output->props[IGT_CONNECTOR_CONTENT_PROTECTION],
-			     timeout_mSec), "uevent is not received");
+			     timeout_mSec / 1000), "uevent is not received");
 
 		val = igt_output_get_prop(output,
 					  IGT_CONNECTOR_CONTENT_PROTECTION);
@@ -702,7 +567,10 @@ igt_main
 	igt_subtest("uevent") {
 		igt_require(data.display.is_atomic);
 		data.cp_tests = CP_UEVENT;
+		data.uevent_monitor = igt_watch_hotplug();
+		igt_flush_hotplugs(data.uevent_monitor);
 		test_content_protection(COMMIT_ATOMIC, HDCP_CONTENT_TYPE_0);
+		igt_cleanup_hotplug(data.uevent_monitor);
 	}
 
 	/*
-- 
2.17.1

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

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [igt-dev] [Patch][i-g-t v2 3/3] lib: Use generic names for APIs that handle uevents
  2020-06-23 10:32 [igt-dev] [Patch][i-g-t v2 0/3] Add support to detect HDCP events Ankit Nautiyal
  2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 1/3] lib/igt_kms: Add support for detecting connector events Ankit Nautiyal
  2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 2/3] tests/kms_content_protection: Use library functions for handling uevents Ankit Nautiyal
@ 2020-06-23 10:32 ` Ankit Nautiyal
  2020-06-23 11:58   ` Ramalingam C
  2020-06-23 11:29 ` [igt-dev] ✗ Fi.CI.BUILD: failure for Add support to detect HDCP events (rev2) Patchwork
  3 siblings, 1 reply; 9+ messages in thread
From: Ankit Nautiyal @ 2020-06-23 10:32 UTC (permalink / raw)
  To: igt-dev

The functions for handling uevents are named with "_hotplug" as suffix
such as igt_watch_hotplug(). Earlier hotplug was the only uevent that
was requested to be detected, but in fact, these APIs are generic and
can be used for detecting other uevents too.

Currently we have tests like kms_lease, kms_content_protection using
the uevent handling infrastructure for detecting uevents other than
hotplug.

This patch renames the functions and replace the "_hotplug" suffix
with "_uevents".

Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Suggested-by: Ramalingam C <ramalingam.c@intel.com>
Suggested-by: Hiler, Arkadiusz <arkadiusz.hiler@intel.com>
---
 lib/igt_kms.c                  | 30 ++++++++++++-------------
 lib/igt_kms.h                  |  6 ++---
 tests/kms_chamelium.c          | 40 +++++++++++++++++-----------------
 tests/kms_content_protection.c |  6 ++---
 tests/kms_lease.c              |  6 ++---
 5 files changed, 44 insertions(+), 44 deletions(-)

diff --git a/lib/igt_kms.c b/lib/igt_kms.c
index a9c444e6..39f8c09a 100644
--- a/lib/igt_kms.c
+++ b/lib/igt_kms.c
@@ -4125,13 +4125,13 @@ void igt_reset_connectors(void)
 }
 
 /**
- * igt_watch_hotplug:
+ * igt_watch_uevents:
  *
- * Begin monitoring udev for sysfs hotplug events.
+ * Begin monitoring udev for sysfs uevents.
  *
- * Returns: a udev monitor for detecting hotplugs on
+ * Returns: a udev monitor for detecting uevents on
  */
-struct udev_monitor *igt_watch_hotplug(void)
+struct udev_monitor *igt_watch_uevents(void)
 {
 	struct udev *udev;
 	struct udev_monitor *mon;
@@ -4198,7 +4198,7 @@ static bool event_detected(struct udev_monitor *mon, int timeout_secs,
 
 /**
  * igt_connector_event_detected:
- * @mon: A udev monitor initialized with #igt_watch_hotplug
+ * @mon: A udev monitor initialized with #igt_watch_uevents
  * @conn_id: Connector id of the Connector for which the property change is
  * expected.
  * @prop_id: Property id for which the change is expected.
@@ -4219,7 +4219,7 @@ bool igt_connector_event_detected(struct udev_monitor *mon, uint32_t conn_id,
 
 /**
  * igt_hotplug_detected:
- * @mon: A udev monitor initialized with #igt_watch_hotplug
+ * @mon: A udev monitor initialized with #igt_watch_uevents
  * @timeout_secs: How long to wait for a hotplug event to occur.
  *
  * Assert that a hotplug event was received since we last checked the monitor.
@@ -4236,7 +4236,7 @@ bool igt_hotplug_detected(struct udev_monitor *mon, int timeout_secs)
 
 /**
  * igt_lease_change_detected:
- * @mon: A udev monitor initialized with #igt_watch_hotplug
+ * @mon: A udev monitor initialized with #igt_watch_uevents
  * @timeout_secs: How long to wait for a lease change event to occur.
  *
  * Assert that a lease change event was received since we last checked the monitor.
@@ -4252,12 +4252,12 @@ bool igt_lease_change_detected(struct udev_monitor *mon, int timeout_secs)
 }
 
 /**
- * igt_flush_hotplugs:
- * @mon: A udev monitor initialized with #igt_watch_hotplug
+ * igt_flush_uevents:
+ * @mon: A udev monitor initialized with #igt_watch_uevents
  *
- * Get rid of any pending hotplug events
+ * Get rid of any pending uevents
  */
-void igt_flush_hotplugs(struct udev_monitor *mon)
+void igt_flush_uevents(struct udev_monitor *mon)
 {
 	struct udev_device *dev;
 
@@ -4266,12 +4266,12 @@ void igt_flush_hotplugs(struct udev_monitor *mon)
 }
 
 /**
- * igt_cleanup_hotplug:
- * @mon: A udev monitor initialized with #igt_watch_hotplug
+ * igt_cleanup_uevents:
+ * @mon: A udev monitor initialized with #igt_watch_uevents
  *
- * Cleanup the resources allocated by #igt_watch_hotplug
+ * Cleanup the resources allocated by #igt_watch_uevents
  */
-void igt_cleanup_hotplug(struct udev_monitor *mon)
+void igt_cleanup_uevents(struct udev_monitor *mon)
 {
 	struct udev *udev = udev_monitor_get_udev(mon);
 
diff --git a/lib/igt_kms.h b/lib/igt_kms.h
index 0b4d7c94..afa18406 100644
--- a/lib/igt_kms.h
+++ b/lib/igt_kms.h
@@ -772,15 +772,15 @@ const struct edid *igt_kms_get_dp_audio_edid(void);
 const struct edid *igt_kms_get_4k_edid(void);
 const struct edid *igt_kms_get_3d_edid(void);
 
-struct udev_monitor *igt_watch_hotplug(void);
+struct udev_monitor *igt_watch_uevents(void);
 bool igt_hotplug_detected(struct udev_monitor *mon,
 			  int timeout_secs);
 bool igt_lease_change_detected(struct udev_monitor *mon,
 			       int timeout_secs);
 bool igt_connector_event_detected(struct udev_monitor *mon, uint32_t conn_id,
 				  uint32_t prop_id, int timeout_msecs);
-void igt_flush_hotplugs(struct udev_monitor *mon);
-void igt_cleanup_hotplug(struct udev_monitor *mon);
+void igt_flush_uevents(struct udev_monitor *mon);
+void igt_cleanup_uevents(struct udev_monitor *mon);
 
 bool igt_display_has_format_mod(igt_display_t *display, uint32_t format, uint64_t modifier);
 bool igt_plane_has_format_mod(igt_plane_t *plane, uint32_t format, uint64_t modifier);
diff --git a/tests/kms_chamelium.c b/tests/kms_chamelium.c
index 5c4a1892..2b63e075 100644
--- a/tests/kms_chamelium.c
+++ b/tests/kms_chamelium.c
@@ -248,7 +248,7 @@ static const char test_basic_hotplug_desc[] =
 static void
 test_basic_hotplug(data_t *data, struct chamelium_port *port, int toggle_count)
 {
-	struct udev_monitor *mon = igt_watch_hotplug();
+	struct udev_monitor *mon = igt_watch_uevents();
 	int i;
 	drmModeConnection status;
 
@@ -256,7 +256,7 @@ test_basic_hotplug(data_t *data, struct chamelium_port *port, int toggle_count)
 	igt_hpd_storm_set_threshold(data->drm_fd, 0);
 
 	for (i = 0; i < toggle_count; i++) {
-		igt_flush_hotplugs(mon);
+		igt_flush_uevents(mon);
 
 		/* Check if we get a sysfs hotplug event */
 		chamelium_plug(data->chamelium, port);
@@ -268,7 +268,7 @@ test_basic_hotplug(data_t *data, struct chamelium_port *port, int toggle_count)
 			     "got %s, expected connected\n",
 			     connection_str(status));
 
-		igt_flush_hotplugs(mon);
+		igt_flush_uevents(mon);
 
 		/* Now check if we get a hotplug from disconnection */
 		chamelium_unplug(data->chamelium, port);
@@ -281,7 +281,7 @@ test_basic_hotplug(data_t *data, struct chamelium_port *port, int toggle_count)
 			     connection_str(status));
 	}
 
-	igt_cleanup_hotplug(mon);
+	igt_cleanup_uevents(mon);
 	igt_hpd_storm_reset(data->drm_fd);
 }
 
@@ -357,7 +357,7 @@ try_suspend_resume_hpd(data_t *data, struct chamelium_port *port,
 	int delay;
 	int p;
 
-	igt_flush_hotplugs(mon);
+	igt_flush_uevents(mon);
 
 	delay = igt_get_autoresume_delay(state) * 1000 / 2;
 
@@ -413,7 +413,7 @@ test_suspend_resume_hpd(data_t *data, struct chamelium_port *port,
 			enum igt_suspend_state state,
 			enum igt_suspend_test test)
 {
-	struct udev_monitor *mon = igt_watch_hotplug();
+	struct udev_monitor *mon = igt_watch_uevents();
 
 	reset_state(data, port);
 
@@ -423,7 +423,7 @@ test_suspend_resume_hpd(data_t *data, struct chamelium_port *port,
 	/* Now make sure we notice disconnected connectors after resuming */
 	try_suspend_resume_hpd(data, port, state, test, mon, true);
 
-	igt_cleanup_hotplug(mon);
+	igt_cleanup_uevents(mon);
 }
 
 static const char test_suspend_resume_hpd_common_desc[] =
@@ -433,7 +433,7 @@ static void
 test_suspend_resume_hpd_common(data_t *data, enum igt_suspend_state state,
 			       enum igt_suspend_test test)
 {
-	struct udev_monitor *mon = igt_watch_hotplug();
+	struct udev_monitor *mon = igt_watch_uevents();
 	struct chamelium_port *port;
 	int p;
 
@@ -450,7 +450,7 @@ test_suspend_resume_hpd_common(data_t *data, enum igt_suspend_state state,
 	/* Now make sure we notice disconnected connectors after resuming */
 	try_suspend_resume_hpd(data, NULL, state, test, mon, true);
 
-	igt_cleanup_hotplug(mon);
+	igt_cleanup_uevents(mon);
 }
 
 static const char test_suspend_resume_edid_change_desc[] =
@@ -464,7 +464,7 @@ test_suspend_resume_edid_change(data_t *data, struct chamelium_port *port,
 				enum test_edid edid,
 				enum test_edid alt_edid)
 {
-	struct udev_monitor *mon = igt_watch_hotplug();
+	struct udev_monitor *mon = igt_watch_uevents();
 	bool link_status_failed[2][data->port_count];
 	int p;
 
@@ -472,7 +472,7 @@ test_suspend_resume_edid_change(data_t *data, struct chamelium_port *port,
 
 	/* Catch the event and flush all remaining ones. */
 	igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT));
-	igt_flush_hotplugs(mon);
+	igt_flush_uevents(mon);
 
 	/* First plug in the port */
 	set_edid(data, port, edid);
@@ -489,7 +489,7 @@ test_suspend_resume_edid_change(data_t *data, struct chamelium_port *port,
 
 	get_connectors_link_status_failed(data, link_status_failed[0]);
 
-	igt_flush_hotplugs(mon);
+	igt_flush_uevents(mon);
 
 	igt_system_suspend_autoresume(state, test);
 	igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT));
@@ -659,7 +659,7 @@ test_link_status(data_t *data, struct chamelium_port *port)
 	memcpy(prev_modes, connector->modes,
 	       prev_modes_len * sizeof(drmModeModeInfo));
 
-	mon = igt_watch_hotplug();
+	mon = igt_watch_uevents();
 
 	while (1) {
 		if (link_status == DRM_MODE_LINK_STATUS_BAD) {
@@ -693,7 +693,7 @@ test_link_status(data_t *data, struct chamelium_port *port)
 		igt_assert_eq(reprobe_connector(data, port),
 			      DRM_MODE_CONNECTED);
 
-		igt_flush_hotplugs(mon);
+		igt_flush_uevents(mon);
 
 		drmModeFreeConnector(connector);
 		connector = chamelium_port_get_connector(data->chamelium, port,
@@ -715,7 +715,7 @@ test_link_status(data_t *data, struct chamelium_port *port)
 		}
 	}
 
-	igt_cleanup_hotplug(mon);
+	igt_cleanup_uevents(mon);
 	igt_remove_fb(data->drm_fd, &fb);
 	free(prev_modes);
 	drmModeFreeConnector(connector);
@@ -2518,10 +2518,10 @@ static const char test_hpd_without_ddc_desc[] =
 static void
 test_hpd_without_ddc(data_t *data, struct chamelium_port *port)
 {
-	struct udev_monitor *mon = igt_watch_hotplug();
+	struct udev_monitor *mon = igt_watch_uevents();
 
 	reset_state(data, port);
-	igt_flush_hotplugs(mon);
+	igt_flush_uevents(mon);
 
 	/* Disable the DDC on the connector and make sure we still get a
 	 * hotplug
@@ -2532,7 +2532,7 @@ test_hpd_without_ddc(data_t *data, struct chamelium_port *port)
 	igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT));
 	igt_assert_eq(reprobe_connector(data, port), DRM_MODE_CONNECTED);
 
-	igt_cleanup_hotplug(mon);
+	igt_cleanup_uevents(mon);
 }
 
 static const char test_hpd_storm_detect_desc[] =
@@ -2552,7 +2552,7 @@ test_hpd_storm_detect(data_t *data, struct chamelium_port *port, int width)
 	chamelium_fire_hpd_pulses(data->chamelium, port, width, 10);
 	igt_assert(igt_hpd_storm_detected(data->drm_fd));
 
-	mon = igt_watch_hotplug();
+	mon = igt_watch_uevents();
 	chamelium_fire_hpd_pulses(data->chamelium, port, width, 10);
 
 	/*
@@ -2563,7 +2563,7 @@ test_hpd_storm_detect(data_t *data, struct chamelium_port *port, int width)
 		count += igt_hotplug_detected(mon, 1);
 	igt_assert_lt(count, 2);
 
-	igt_cleanup_hotplug(mon);
+	igt_cleanup_uevents(mon);
 	igt_hpd_storm_reset(data->drm_fd);
 }
 
diff --git a/tests/kms_content_protection.c b/tests/kms_content_protection.c
index a80aa5bb..303ed418 100644
--- a/tests/kms_content_protection.c
+++ b/tests/kms_content_protection.c
@@ -567,10 +567,10 @@ igt_main
 	igt_subtest("uevent") {
 		igt_require(data.display.is_atomic);
 		data.cp_tests = CP_UEVENT;
-		data.uevent_monitor = igt_watch_hotplug();
-		igt_flush_hotplugs(data.uevent_monitor);
+		data.uevent_monitor = igt_watch_uevents();
+		igt_flush_uevents(data.uevent_monitor);
 		test_content_protection(COMMIT_ATOMIC, HDCP_CONTENT_TYPE_0);
-		igt_cleanup_hotplug(data.uevent_monitor);
+		igt_cleanup_uevents(data.uevent_monitor);
 	}
 
 	/*
diff --git a/tests/kms_lease.c b/tests/kms_lease.c
index 927c2315..2e6cf9b0 100644
--- a/tests/kms_lease.c
+++ b/tests/kms_lease.c
@@ -1238,9 +1238,9 @@ static void lease_uevent(data_t *data)
 	struct local_drm_mode_list_lessees mll;
 	struct udev_monitor *uevent_monitor;
 
-	uevent_monitor = igt_watch_hotplug();
+	uevent_monitor = igt_watch_uevents();
 
-	igt_flush_hotplugs(uevent_monitor);
+	igt_flush_uevents(uevent_monitor);
 
 	lease_fd = create_simple_lease(data->master.fd, data);
 
@@ -1260,7 +1260,7 @@ static void lease_uevent(data_t *data)
 	igt_assert_eq(list_lessees(data->master.fd, &mll), 0);
 	igt_assert_eq(mll.count_lessees, 0);
 
-	igt_cleanup_hotplug(uevent_monitor);
+	igt_cleanup_uevents(uevent_monitor);
 }
 
 igt_main
-- 
2.17.1

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

^ permalink raw reply related	[flat|nested] 9+ messages in thread

* [igt-dev] ✗ Fi.CI.BUILD: failure for Add support to detect HDCP events (rev2)
  2020-06-23 10:32 [igt-dev] [Patch][i-g-t v2 0/3] Add support to detect HDCP events Ankit Nautiyal
                   ` (2 preceding siblings ...)
  2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 3/3] lib: Use generic names for APIs that handle uevents Ankit Nautiyal
@ 2020-06-23 11:29 ` Patchwork
  3 siblings, 0 replies; 9+ messages in thread
From: Patchwork @ 2020-06-23 11:29 UTC (permalink / raw)
  To: Ankit Nautiyal; +Cc: igt-dev

== Series Details ==

Series: Add support to detect HDCP events (rev2)
URL   : https://patchwork.freedesktop.org/series/78413/
State : failure

== Summary ==

Applying: lib/igt_kms: Add support for detecting connector events
Applying: tests/kms_content_protection: Use library functions for handling uevents
Applying: lib: Use generic names for APIs that handle uevents
Patch failed at 0003 lib: Use generic names for APIs that handle uevents
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".

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

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [igt-dev] [Patch][i-g-t v2 1/3] lib/igt_kms: Add support for detecting connector events
  2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 1/3] lib/igt_kms: Add support for detecting connector events Ankit Nautiyal
@ 2020-06-23 11:50   ` Ramalingam C
  2020-06-23 13:37     ` Nautiyal, Ankit K
  0 siblings, 1 reply; 9+ messages in thread
From: Ramalingam C @ 2020-06-23 11:50 UTC (permalink / raw)
  To: Ankit Nautiyal; +Cc: igt-dev

On 2020-06-23 at 16:02:52 +0530, Ankit Nautiyal wrote:
> Currently, the event_detect function checks the property val for
> "HOTPLUG" and "LEASE" both of which are set to '1' when these events
> are sent.
> 
> This cannot be used for detecting connector events such as HDCP event
> as connector events are sent along with property to signify which
> property of which connector has changed. Connector ID and property id
> are provided along with "CONNECTOR" and "PROPERTY" as udev
> property-value pairs. Eg. for HDCP, the connector id of the connector
> whose hdcp status changed, and the property id of the
> ‘CONTENT_PROTECTION’ property are sent with uevent.
> 
> This patch modifies the event_detect function to check multiple
> properties with different expected values. It also adds support to
> detect connector event for a given pair of connector and property ids.
> 
> v2: Simplified the event_detect conditional statements. (Ram)
>     Changed the api name for detecting connnector events. (Anshuman)
>     Added check for "HOTPLUG" property value for connector events.
> 
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> ---
>  lib/igt_kms.c | 61 ++++++++++++++++++++++++++++++++++++++-------------
>  lib/igt_kms.h |  2 ++
>  2 files changed, 48 insertions(+), 15 deletions(-)
> 
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index 54de45e5..a9c444e6 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -4164,32 +4164,57 @@ struct udev_monitor *igt_watch_hotplug(void)
>  }
>  
>  static bool event_detected(struct udev_monitor *mon, int timeout_secs,
> -			   const char *property)
> +			   const char **property, int *expected_val, int num_props)
>  {
>  	struct udev_device *dev;
> -	const char *hotplug_val;
> +	const char *prop_val;
>  	struct pollfd fd = {
>  		.fd = udev_monitor_get_fd(mon),
>  		.events = POLLIN
>  	};
> -	bool hotplug_received = false;
> +	bool event_received = false;
> +	int i;
>  
> -	/* Go through all of the events pending on the udev monitor. Once we
> -	 * receive a hotplug, we continue going through the rest of the events
> -	 * so that redundant hotplug events don't change the results of future
> -	 * checks
> +	/* Go through all of the events pending on the udev monitor.
> +	 * Match the given set of properties and their values to
> +	 * the expected values.
>  	 */
> -	while (!hotplug_received && poll(&fd, 1, timeout_secs * 1000)) {
> +	while (!event_received && poll(&fd, 1, timeout_secs * 1000)) {
>  		dev = udev_monitor_receive_device(mon);
> -
> -		hotplug_val = udev_device_get_property_value(dev, property);
> -		if (hotplug_val && atoi(hotplug_val) == 1)
> -			hotplug_received = true;
> +		for (i = 0; i < num_props; i++) {
> +			prop_val = udev_device_get_property_value(dev,
> +								  property[i]);
> +			if (!prop_val || atoi(prop_val) != expected_val[i])
> +				break;
> +		}
> +		if (i == num_props)
> +			event_received = true;
>  
>  		udev_device_unref(dev);
>  	}
>  
> -	return hotplug_received;
> +	return event_received;
> +}
> +
> +/**
> + * igt_connector_event_detected:
> + * @mon: A udev monitor initialized with #igt_watch_hotplug
> + * @conn_id: Connector id of the Connector for which the property change is
> + * expected.
> + * @prop_id: Property id for which the change is expected.
> + * @timeout_secs: How long to wait for a connector event to occur.
> + *
> + * Assert that a connector event is received for a given connector and property.
You mean detect the connector event? Assert in IGT perspective might be
different?
> + *
> + * Returns: true if the connector event was received, false if we timed out
> + */
> +bool igt_connector_event_detected(struct udev_monitor *mon, uint32_t conn_id,
> +				  uint32_t prop_id, int timeout_secs)
> +{
> +	const char *props[3] = {"HOTPLUG", "CONNECTOR", "PROPERTY"};
> +	int expected_val[3] = {1, conn_id, prop_id};
> +
> +	return event_detected(mon, timeout_secs, props, expected_val, 3);
ARRAY_SIZE could be used instead of constant..

-Ram.
>  }
>  
>  /**
> @@ -4203,7 +4228,10 @@ static bool event_detected(struct udev_monitor *mon, int timeout_secs,
>   */
>  bool igt_hotplug_detected(struct udev_monitor *mon, int timeout_secs)
>  {
> -	return event_detected(mon, timeout_secs, "HOTPLUG");
> +	const char *props[1] = {"HOTPLUG"};
> +	int expected_val = 1;
> +
> +	return event_detected(mon, timeout_secs, props, &expected_val, 1);
>  }
>  
>  /**
> @@ -4217,7 +4245,10 @@ bool igt_hotplug_detected(struct udev_monitor *mon, int timeout_secs)
>   */
>  bool igt_lease_change_detected(struct udev_monitor *mon, int timeout_secs)
>  {
> -	return event_detected(mon, timeout_secs, "LEASE");
> +	const char *props[1] = {"LEASE"};
> +	int expected_val = 1;
> +
> +	return event_detected(mon, timeout_secs, props, &expected_val, 1);
>  }
>  
>  /**
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index cd3fdbc0..0b4d7c94 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -777,6 +777,8 @@ bool igt_hotplug_detected(struct udev_monitor *mon,
>  			  int timeout_secs);
>  bool igt_lease_change_detected(struct udev_monitor *mon,
>  			       int timeout_secs);
> +bool igt_connector_event_detected(struct udev_monitor *mon, uint32_t conn_id,
> +				  uint32_t prop_id, int timeout_msecs);
>  void igt_flush_hotplugs(struct udev_monitor *mon);
>  void igt_cleanup_hotplug(struct udev_monitor *mon);
>  
> -- 
> 2.17.1
> 
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [igt-dev] [Patch][i-g-t v2 2/3] tests/kms_content_protection: Use library functions for handling uevents
  2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 2/3] tests/kms_content_protection: Use library functions for handling uevents Ankit Nautiyal
@ 2020-06-23 11:57   ` Ramalingam C
  0 siblings, 0 replies; 9+ messages in thread
From: Ramalingam C @ 2020-06-23 11:57 UTC (permalink / raw)
  To: Ankit Nautiyal; +Cc: igt-dev

On 2020-06-23 at 16:02:53 +0530, Ankit Nautiyal wrote:
> Currently, the test has its own version of uevent handling used
> for detecting hdcp events. This patch modifies the test to use
> the igt_kms lib support for handling the uevent monitor and detect
> hdcp events.
> 
> v2: Rebased
> 
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Looks good to me.

Reviewed-by: Ramalingam C <ramalingam.c@intel.com>
> ---
>  tests/kms_content_protection.c | 146 ++-------------------------------
>  1 file changed, 7 insertions(+), 139 deletions(-)
> 
> diff --git a/tests/kms_content_protection.c b/tests/kms_content_protection.c
> index 3b9cedcb..a80aa5bb 100644
> --- a/tests/kms_content_protection.c
> +++ b/tests/kms_content_protection.c
> @@ -39,6 +39,7 @@ struct data {
>  	igt_display_t display;
>  	struct igt_fb red, green;
>  	unsigned int cp_tests;
> +	struct udev_monitor *uevent_monitor;
>  } data;
>  
>  /* Test flags */
> @@ -112,143 +113,6 @@ 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 *udev_fd)
> -{
> -	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;
> -	}
> -
> -	*udev_fd = udev_monitor_get_fd(*uevent_monitor);
> -	if (*udev_fd < 0) {
> -		igt_info("failed to get udev_fd on uevent monitor\n");
> -		ret = *udev_fd;
> -		goto out;
> -	}
> -
> -	return ret;
> -
> -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;
> -
> -	if (hdcp_udev_init(&uevent_monitor, &udev, &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)
> @@ -257,9 +121,10 @@ wait_for_prop_value(igt_output_t *output, uint64_t expected,
>  	int i;
>  
>  	if (data.cp_tests & CP_UEVENT && expected != CP_UNDESIRED) {
> -		igt_assert_f(wait_for_hdcp_event(output->id,
> +		igt_assert_f(igt_connector_event_detected(data.uevent_monitor,
> +							  output->id,
>  			     output->props[IGT_CONNECTOR_CONTENT_PROTECTION],
> -			     timeout_mSec), "uevent is not received");
> +			     timeout_mSec / 1000), "uevent is not received");
>  
>  		val = igt_output_get_prop(output,
>  					  IGT_CONNECTOR_CONTENT_PROTECTION);
> @@ -702,7 +567,10 @@ igt_main
>  	igt_subtest("uevent") {
>  		igt_require(data.display.is_atomic);
>  		data.cp_tests = CP_UEVENT;
> +		data.uevent_monitor = igt_watch_hotplug();
> +		igt_flush_hotplugs(data.uevent_monitor);
>  		test_content_protection(COMMIT_ATOMIC, HDCP_CONTENT_TYPE_0);
> +		igt_cleanup_hotplug(data.uevent_monitor);
>  	}
>  
>  	/*
> -- 
> 2.17.1
> 
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [igt-dev] [Patch][i-g-t v2 3/3] lib: Use generic names for APIs that handle uevents
  2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 3/3] lib: Use generic names for APIs that handle uevents Ankit Nautiyal
@ 2020-06-23 11:58   ` Ramalingam C
  0 siblings, 0 replies; 9+ messages in thread
From: Ramalingam C @ 2020-06-23 11:58 UTC (permalink / raw)
  To: Ankit Nautiyal; +Cc: igt-dev

On 2020-06-23 at 16:02:54 +0530, Ankit Nautiyal wrote:
> The functions for handling uevents are named with "_hotplug" as suffix
> such as igt_watch_hotplug(). Earlier hotplug was the only uevent that
> was requested to be detected, but in fact, these APIs are generic and
> can be used for detecting other uevents too.
> 
> Currently we have tests like kms_lease, kms_content_protection using
> the uevent handling infrastructure for detecting uevents other than
> hotplug.
> 
> This patch renames the functions and replace the "_hotplug" suffix
> with "_uevents".
> 
> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
Looks good to me.

Reviewed-by: Ramalingam C <ramalingam.c@intel.com>
> Suggested-by: Ramalingam C <ramalingam.c@intel.com>
> Suggested-by: Hiler, Arkadiusz <arkadiusz.hiler@intel.com>
> ---
>  lib/igt_kms.c                  | 30 ++++++++++++-------------
>  lib/igt_kms.h                  |  6 ++---
>  tests/kms_chamelium.c          | 40 +++++++++++++++++-----------------
>  tests/kms_content_protection.c |  6 ++---
>  tests/kms_lease.c              |  6 ++---
>  5 files changed, 44 insertions(+), 44 deletions(-)
> 
> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
> index a9c444e6..39f8c09a 100644
> --- a/lib/igt_kms.c
> +++ b/lib/igt_kms.c
> @@ -4125,13 +4125,13 @@ void igt_reset_connectors(void)
>  }
>  
>  /**
> - * igt_watch_hotplug:
> + * igt_watch_uevents:
>   *
> - * Begin monitoring udev for sysfs hotplug events.
> + * Begin monitoring udev for sysfs uevents.
>   *
> - * Returns: a udev monitor for detecting hotplugs on
> + * Returns: a udev monitor for detecting uevents on
>   */
> -struct udev_monitor *igt_watch_hotplug(void)
> +struct udev_monitor *igt_watch_uevents(void)
>  {
>  	struct udev *udev;
>  	struct udev_monitor *mon;
> @@ -4198,7 +4198,7 @@ static bool event_detected(struct udev_monitor *mon, int timeout_secs,
>  
>  /**
>   * igt_connector_event_detected:
> - * @mon: A udev monitor initialized with #igt_watch_hotplug
> + * @mon: A udev monitor initialized with #igt_watch_uevents
>   * @conn_id: Connector id of the Connector for which the property change is
>   * expected.
>   * @prop_id: Property id for which the change is expected.
> @@ -4219,7 +4219,7 @@ bool igt_connector_event_detected(struct udev_monitor *mon, uint32_t conn_id,
>  
>  /**
>   * igt_hotplug_detected:
> - * @mon: A udev monitor initialized with #igt_watch_hotplug
> + * @mon: A udev monitor initialized with #igt_watch_uevents
>   * @timeout_secs: How long to wait for a hotplug event to occur.
>   *
>   * Assert that a hotplug event was received since we last checked the monitor.
> @@ -4236,7 +4236,7 @@ bool igt_hotplug_detected(struct udev_monitor *mon, int timeout_secs)
>  
>  /**
>   * igt_lease_change_detected:
> - * @mon: A udev monitor initialized with #igt_watch_hotplug
> + * @mon: A udev monitor initialized with #igt_watch_uevents
>   * @timeout_secs: How long to wait for a lease change event to occur.
>   *
>   * Assert that a lease change event was received since we last checked the monitor.
> @@ -4252,12 +4252,12 @@ bool igt_lease_change_detected(struct udev_monitor *mon, int timeout_secs)
>  }
>  
>  /**
> - * igt_flush_hotplugs:
> - * @mon: A udev monitor initialized with #igt_watch_hotplug
> + * igt_flush_uevents:
> + * @mon: A udev monitor initialized with #igt_watch_uevents
>   *
> - * Get rid of any pending hotplug events
> + * Get rid of any pending uevents
>   */
> -void igt_flush_hotplugs(struct udev_monitor *mon)
> +void igt_flush_uevents(struct udev_monitor *mon)
>  {
>  	struct udev_device *dev;
>  
> @@ -4266,12 +4266,12 @@ void igt_flush_hotplugs(struct udev_monitor *mon)
>  }
>  
>  /**
> - * igt_cleanup_hotplug:
> - * @mon: A udev monitor initialized with #igt_watch_hotplug
> + * igt_cleanup_uevents:
> + * @mon: A udev monitor initialized with #igt_watch_uevents
>   *
> - * Cleanup the resources allocated by #igt_watch_hotplug
> + * Cleanup the resources allocated by #igt_watch_uevents
>   */
> -void igt_cleanup_hotplug(struct udev_monitor *mon)
> +void igt_cleanup_uevents(struct udev_monitor *mon)
>  {
>  	struct udev *udev = udev_monitor_get_udev(mon);
>  
> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
> index 0b4d7c94..afa18406 100644
> --- a/lib/igt_kms.h
> +++ b/lib/igt_kms.h
> @@ -772,15 +772,15 @@ const struct edid *igt_kms_get_dp_audio_edid(void);
>  const struct edid *igt_kms_get_4k_edid(void);
>  const struct edid *igt_kms_get_3d_edid(void);
>  
> -struct udev_monitor *igt_watch_hotplug(void);
> +struct udev_monitor *igt_watch_uevents(void);
>  bool igt_hotplug_detected(struct udev_monitor *mon,
>  			  int timeout_secs);
>  bool igt_lease_change_detected(struct udev_monitor *mon,
>  			       int timeout_secs);
>  bool igt_connector_event_detected(struct udev_monitor *mon, uint32_t conn_id,
>  				  uint32_t prop_id, int timeout_msecs);
> -void igt_flush_hotplugs(struct udev_monitor *mon);
> -void igt_cleanup_hotplug(struct udev_monitor *mon);
> +void igt_flush_uevents(struct udev_monitor *mon);
> +void igt_cleanup_uevents(struct udev_monitor *mon);
>  
>  bool igt_display_has_format_mod(igt_display_t *display, uint32_t format, uint64_t modifier);
>  bool igt_plane_has_format_mod(igt_plane_t *plane, uint32_t format, uint64_t modifier);
> diff --git a/tests/kms_chamelium.c b/tests/kms_chamelium.c
> index 5c4a1892..2b63e075 100644
> --- a/tests/kms_chamelium.c
> +++ b/tests/kms_chamelium.c
> @@ -248,7 +248,7 @@ static const char test_basic_hotplug_desc[] =
>  static void
>  test_basic_hotplug(data_t *data, struct chamelium_port *port, int toggle_count)
>  {
> -	struct udev_monitor *mon = igt_watch_hotplug();
> +	struct udev_monitor *mon = igt_watch_uevents();
>  	int i;
>  	drmModeConnection status;
>  
> @@ -256,7 +256,7 @@ test_basic_hotplug(data_t *data, struct chamelium_port *port, int toggle_count)
>  	igt_hpd_storm_set_threshold(data->drm_fd, 0);
>  
>  	for (i = 0; i < toggle_count; i++) {
> -		igt_flush_hotplugs(mon);
> +		igt_flush_uevents(mon);
>  
>  		/* Check if we get a sysfs hotplug event */
>  		chamelium_plug(data->chamelium, port);
> @@ -268,7 +268,7 @@ test_basic_hotplug(data_t *data, struct chamelium_port *port, int toggle_count)
>  			     "got %s, expected connected\n",
>  			     connection_str(status));
>  
> -		igt_flush_hotplugs(mon);
> +		igt_flush_uevents(mon);
>  
>  		/* Now check if we get a hotplug from disconnection */
>  		chamelium_unplug(data->chamelium, port);
> @@ -281,7 +281,7 @@ test_basic_hotplug(data_t *data, struct chamelium_port *port, int toggle_count)
>  			     connection_str(status));
>  	}
>  
> -	igt_cleanup_hotplug(mon);
> +	igt_cleanup_uevents(mon);
>  	igt_hpd_storm_reset(data->drm_fd);
>  }
>  
> @@ -357,7 +357,7 @@ try_suspend_resume_hpd(data_t *data, struct chamelium_port *port,
>  	int delay;
>  	int p;
>  
> -	igt_flush_hotplugs(mon);
> +	igt_flush_uevents(mon);
>  
>  	delay = igt_get_autoresume_delay(state) * 1000 / 2;
>  
> @@ -413,7 +413,7 @@ test_suspend_resume_hpd(data_t *data, struct chamelium_port *port,
>  			enum igt_suspend_state state,
>  			enum igt_suspend_test test)
>  {
> -	struct udev_monitor *mon = igt_watch_hotplug();
> +	struct udev_monitor *mon = igt_watch_uevents();
>  
>  	reset_state(data, port);
>  
> @@ -423,7 +423,7 @@ test_suspend_resume_hpd(data_t *data, struct chamelium_port *port,
>  	/* Now make sure we notice disconnected connectors after resuming */
>  	try_suspend_resume_hpd(data, port, state, test, mon, true);
>  
> -	igt_cleanup_hotplug(mon);
> +	igt_cleanup_uevents(mon);
>  }
>  
>  static const char test_suspend_resume_hpd_common_desc[] =
> @@ -433,7 +433,7 @@ static void
>  test_suspend_resume_hpd_common(data_t *data, enum igt_suspend_state state,
>  			       enum igt_suspend_test test)
>  {
> -	struct udev_monitor *mon = igt_watch_hotplug();
> +	struct udev_monitor *mon = igt_watch_uevents();
>  	struct chamelium_port *port;
>  	int p;
>  
> @@ -450,7 +450,7 @@ test_suspend_resume_hpd_common(data_t *data, enum igt_suspend_state state,
>  	/* Now make sure we notice disconnected connectors after resuming */
>  	try_suspend_resume_hpd(data, NULL, state, test, mon, true);
>  
> -	igt_cleanup_hotplug(mon);
> +	igt_cleanup_uevents(mon);
>  }
>  
>  static const char test_suspend_resume_edid_change_desc[] =
> @@ -464,7 +464,7 @@ test_suspend_resume_edid_change(data_t *data, struct chamelium_port *port,
>  				enum test_edid edid,
>  				enum test_edid alt_edid)
>  {
> -	struct udev_monitor *mon = igt_watch_hotplug();
> +	struct udev_monitor *mon = igt_watch_uevents();
>  	bool link_status_failed[2][data->port_count];
>  	int p;
>  
> @@ -472,7 +472,7 @@ test_suspend_resume_edid_change(data_t *data, struct chamelium_port *port,
>  
>  	/* Catch the event and flush all remaining ones. */
>  	igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT));
> -	igt_flush_hotplugs(mon);
> +	igt_flush_uevents(mon);
>  
>  	/* First plug in the port */
>  	set_edid(data, port, edid);
> @@ -489,7 +489,7 @@ test_suspend_resume_edid_change(data_t *data, struct chamelium_port *port,
>  
>  	get_connectors_link_status_failed(data, link_status_failed[0]);
>  
> -	igt_flush_hotplugs(mon);
> +	igt_flush_uevents(mon);
>  
>  	igt_system_suspend_autoresume(state, test);
>  	igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT));
> @@ -659,7 +659,7 @@ test_link_status(data_t *data, struct chamelium_port *port)
>  	memcpy(prev_modes, connector->modes,
>  	       prev_modes_len * sizeof(drmModeModeInfo));
>  
> -	mon = igt_watch_hotplug();
> +	mon = igt_watch_uevents();
>  
>  	while (1) {
>  		if (link_status == DRM_MODE_LINK_STATUS_BAD) {
> @@ -693,7 +693,7 @@ test_link_status(data_t *data, struct chamelium_port *port)
>  		igt_assert_eq(reprobe_connector(data, port),
>  			      DRM_MODE_CONNECTED);
>  
> -		igt_flush_hotplugs(mon);
> +		igt_flush_uevents(mon);
>  
>  		drmModeFreeConnector(connector);
>  		connector = chamelium_port_get_connector(data->chamelium, port,
> @@ -715,7 +715,7 @@ test_link_status(data_t *data, struct chamelium_port *port)
>  		}
>  	}
>  
> -	igt_cleanup_hotplug(mon);
> +	igt_cleanup_uevents(mon);
>  	igt_remove_fb(data->drm_fd, &fb);
>  	free(prev_modes);
>  	drmModeFreeConnector(connector);
> @@ -2518,10 +2518,10 @@ static const char test_hpd_without_ddc_desc[] =
>  static void
>  test_hpd_without_ddc(data_t *data, struct chamelium_port *port)
>  {
> -	struct udev_monitor *mon = igt_watch_hotplug();
> +	struct udev_monitor *mon = igt_watch_uevents();
>  
>  	reset_state(data, port);
> -	igt_flush_hotplugs(mon);
> +	igt_flush_uevents(mon);
>  
>  	/* Disable the DDC on the connector and make sure we still get a
>  	 * hotplug
> @@ -2532,7 +2532,7 @@ test_hpd_without_ddc(data_t *data, struct chamelium_port *port)
>  	igt_assert(igt_hotplug_detected(mon, HOTPLUG_TIMEOUT));
>  	igt_assert_eq(reprobe_connector(data, port), DRM_MODE_CONNECTED);
>  
> -	igt_cleanup_hotplug(mon);
> +	igt_cleanup_uevents(mon);
>  }
>  
>  static const char test_hpd_storm_detect_desc[] =
> @@ -2552,7 +2552,7 @@ test_hpd_storm_detect(data_t *data, struct chamelium_port *port, int width)
>  	chamelium_fire_hpd_pulses(data->chamelium, port, width, 10);
>  	igt_assert(igt_hpd_storm_detected(data->drm_fd));
>  
> -	mon = igt_watch_hotplug();
> +	mon = igt_watch_uevents();
>  	chamelium_fire_hpd_pulses(data->chamelium, port, width, 10);
>  
>  	/*
> @@ -2563,7 +2563,7 @@ test_hpd_storm_detect(data_t *data, struct chamelium_port *port, int width)
>  		count += igt_hotplug_detected(mon, 1);
>  	igt_assert_lt(count, 2);
>  
> -	igt_cleanup_hotplug(mon);
> +	igt_cleanup_uevents(mon);
>  	igt_hpd_storm_reset(data->drm_fd);
>  }
>  
> diff --git a/tests/kms_content_protection.c b/tests/kms_content_protection.c
> index a80aa5bb..303ed418 100644
> --- a/tests/kms_content_protection.c
> +++ b/tests/kms_content_protection.c
> @@ -567,10 +567,10 @@ igt_main
>  	igt_subtest("uevent") {
>  		igt_require(data.display.is_atomic);
>  		data.cp_tests = CP_UEVENT;
> -		data.uevent_monitor = igt_watch_hotplug();
> -		igt_flush_hotplugs(data.uevent_monitor);
> +		data.uevent_monitor = igt_watch_uevents();
> +		igt_flush_uevents(data.uevent_monitor);
>  		test_content_protection(COMMIT_ATOMIC, HDCP_CONTENT_TYPE_0);
> -		igt_cleanup_hotplug(data.uevent_monitor);
> +		igt_cleanup_uevents(data.uevent_monitor);
>  	}
>  
>  	/*
> diff --git a/tests/kms_lease.c b/tests/kms_lease.c
> index 927c2315..2e6cf9b0 100644
> --- a/tests/kms_lease.c
> +++ b/tests/kms_lease.c
> @@ -1238,9 +1238,9 @@ static void lease_uevent(data_t *data)
>  	struct local_drm_mode_list_lessees mll;
>  	struct udev_monitor *uevent_monitor;
>  
> -	uevent_monitor = igt_watch_hotplug();
> +	uevent_monitor = igt_watch_uevents();
>  
> -	igt_flush_hotplugs(uevent_monitor);
> +	igt_flush_uevents(uevent_monitor);
>  
>  	lease_fd = create_simple_lease(data->master.fd, data);
>  
> @@ -1260,7 +1260,7 @@ static void lease_uevent(data_t *data)
>  	igt_assert_eq(list_lessees(data->master.fd, &mll), 0);
>  	igt_assert_eq(mll.count_lessees, 0);
>  
> -	igt_cleanup_hotplug(uevent_monitor);
> +	igt_cleanup_uevents(uevent_monitor);
>  }
>  
>  igt_main
> -- 
> 2.17.1
> 
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [igt-dev] [Patch][i-g-t v2 1/3] lib/igt_kms: Add support for detecting connector events
  2020-06-23 11:50   ` Ramalingam C
@ 2020-06-23 13:37     ` Nautiyal, Ankit K
  0 siblings, 0 replies; 9+ messages in thread
From: Nautiyal, Ankit K @ 2020-06-23 13:37 UTC (permalink / raw)
  To: C, Ramalingam; +Cc: igt-dev

Hi Ram,

Thanks for the suggestions.

I agree with the comments and will be addressing them in next patch set.

Regards,

Ankit


On 6/23/2020 5:20 PM, C, Ramalingam wrote:
> On 2020-06-23 at 16:02:52 +0530, Ankit Nautiyal wrote:
>> Currently, the event_detect function checks the property val for
>> "HOTPLUG" and "LEASE" both of which are set to '1' when these events
>> are sent.
>>
>> This cannot be used for detecting connector events such as HDCP event
>> as connector events are sent along with property to signify which
>> property of which connector has changed. Connector ID and property id
>> are provided along with "CONNECTOR" and "PROPERTY" as udev
>> property-value pairs. Eg. for HDCP, the connector id of the connector
>> whose hdcp status changed, and the property id of the
>> ‘CONTENT_PROTECTION’ property are sent with uevent.
>>
>> This patch modifies the event_detect function to check multiple
>> properties with different expected values. It also adds support to
>> detect connector event for a given pair of connector and property ids.
>>
>> v2: Simplified the event_detect conditional statements. (Ram)
>>      Changed the api name for detecting connnector events. (Anshuman)
>>      Added check for "HOTPLUG" property value for connector events.
>>
>> Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
>> ---
>>   lib/igt_kms.c | 61 ++++++++++++++++++++++++++++++++++++++-------------
>>   lib/igt_kms.h |  2 ++
>>   2 files changed, 48 insertions(+), 15 deletions(-)
>>
>> diff --git a/lib/igt_kms.c b/lib/igt_kms.c
>> index 54de45e5..a9c444e6 100644
>> --- a/lib/igt_kms.c
>> +++ b/lib/igt_kms.c
>> @@ -4164,32 +4164,57 @@ struct udev_monitor *igt_watch_hotplug(void)
>>   }
>>   
>>   static bool event_detected(struct udev_monitor *mon, int timeout_secs,
>> -			   const char *property)
>> +			   const char **property, int *expected_val, int num_props)
>>   {
>>   	struct udev_device *dev;
>> -	const char *hotplug_val;
>> +	const char *prop_val;
>>   	struct pollfd fd = {
>>   		.fd = udev_monitor_get_fd(mon),
>>   		.events = POLLIN
>>   	};
>> -	bool hotplug_received = false;
>> +	bool event_received = false;
>> +	int i;
>>   
>> -	/* Go through all of the events pending on the udev monitor. Once we
>> -	 * receive a hotplug, we continue going through the rest of the events
>> -	 * so that redundant hotplug events don't change the results of future
>> -	 * checks
>> +	/* Go through all of the events pending on the udev monitor.
>> +	 * Match the given set of properties and their values to
>> +	 * the expected values.
>>   	 */
>> -	while (!hotplug_received && poll(&fd, 1, timeout_secs * 1000)) {
>> +	while (!event_received && poll(&fd, 1, timeout_secs * 1000)) {
>>   		dev = udev_monitor_receive_device(mon);
>> -
>> -		hotplug_val = udev_device_get_property_value(dev, property);
>> -		if (hotplug_val && atoi(hotplug_val) == 1)
>> -			hotplug_received = true;
>> +		for (i = 0; i < num_props; i++) {
>> +			prop_val = udev_device_get_property_value(dev,
>> +								  property[i]);
>> +			if (!prop_val || atoi(prop_val) != expected_val[i])
>> +				break;
>> +		}
>> +		if (i == num_props)
>> +			event_received = true;
>>   
>>   		udev_device_unref(dev);
>>   	}
>>   
>> -	return hotplug_received;
>> +	return event_received;
>> +}
>> +
>> +/**
>> + * igt_connector_event_detected:
>> + * @mon: A udev monitor initialized with #igt_watch_hotplug
>> + * @conn_id: Connector id of the Connector for which the property change is
>> + * expected.
>> + * @prop_id: Property id for which the change is expected.
>> + * @timeout_secs: How long to wait for a connector event to occur.
>> + *
>> + * Assert that a connector event is received for a given connector and property.
> You mean detect the connector event? Assert in IGT perspective might be
> different?
>> + *
>> + * Returns: true if the connector event was received, false if we timed out
>> + */
>> +bool igt_connector_event_detected(struct udev_monitor *mon, uint32_t conn_id,
>> +				  uint32_t prop_id, int timeout_secs)
>> +{
>> +	const char *props[3] = {"HOTPLUG", "CONNECTOR", "PROPERTY"};
>> +	int expected_val[3] = {1, conn_id, prop_id};
>> +
>> +	return event_detected(mon, timeout_secs, props, expected_val, 3);
> ARRAY_SIZE could be used instead of constant..
>
> -Ram.
>>   }
>>   
>>   /**
>> @@ -4203,7 +4228,10 @@ static bool event_detected(struct udev_monitor *mon, int timeout_secs,
>>    */
>>   bool igt_hotplug_detected(struct udev_monitor *mon, int timeout_secs)
>>   {
>> -	return event_detected(mon, timeout_secs, "HOTPLUG");
>> +	const char *props[1] = {"HOTPLUG"};
>> +	int expected_val = 1;
>> +
>> +	return event_detected(mon, timeout_secs, props, &expected_val, 1);
>>   }
>>   
>>   /**
>> @@ -4217,7 +4245,10 @@ bool igt_hotplug_detected(struct udev_monitor *mon, int timeout_secs)
>>    */
>>   bool igt_lease_change_detected(struct udev_monitor *mon, int timeout_secs)
>>   {
>> -	return event_detected(mon, timeout_secs, "LEASE");
>> +	const char *props[1] = {"LEASE"};
>> +	int expected_val = 1;
>> +
>> +	return event_detected(mon, timeout_secs, props, &expected_val, 1);
>>   }
>>   
>>   /**
>> diff --git a/lib/igt_kms.h b/lib/igt_kms.h
>> index cd3fdbc0..0b4d7c94 100644
>> --- a/lib/igt_kms.h
>> +++ b/lib/igt_kms.h
>> @@ -777,6 +777,8 @@ bool igt_hotplug_detected(struct udev_monitor *mon,
>>   			  int timeout_secs);
>>   bool igt_lease_change_detected(struct udev_monitor *mon,
>>   			       int timeout_secs);
>> +bool igt_connector_event_detected(struct udev_monitor *mon, uint32_t conn_id,
>> +				  uint32_t prop_id, int timeout_msecs);
>>   void igt_flush_hotplugs(struct udev_monitor *mon);
>>   void igt_cleanup_hotplug(struct udev_monitor *mon);
>>   
>> -- 
>> 2.17.1
>>

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

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2020-06-23 13:37 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-06-23 10:32 [igt-dev] [Patch][i-g-t v2 0/3] Add support to detect HDCP events Ankit Nautiyal
2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 1/3] lib/igt_kms: Add support for detecting connector events Ankit Nautiyal
2020-06-23 11:50   ` Ramalingam C
2020-06-23 13:37     ` Nautiyal, Ankit K
2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 2/3] tests/kms_content_protection: Use library functions for handling uevents Ankit Nautiyal
2020-06-23 11:57   ` Ramalingam C
2020-06-23 10:32 ` [igt-dev] [Patch][i-g-t v2 3/3] lib: Use generic names for APIs that handle uevents Ankit Nautiyal
2020-06-23 11:58   ` Ramalingam C
2020-06-23 11:29 ` [igt-dev] ✗ Fi.CI.BUILD: failure for Add support to detect HDCP events (rev2) Patchwork

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.