From: Ramalingam C <ramalingam.c@intel.com>
To: Arkadiusz Hiler <arkadiusz.hiler@intel.com>
Cc: igt-dev@lists.freedesktop.org
Subject: Re: [igt-dev] [Patch][i-g-t 2/2] tests/kms_content_protection: Use library functions for handling uevents
Date: Tue, 16 Jun 2020 19:47:27 +0530 [thread overview]
Message-ID: <20200616141727.GC26166@intel.com> (raw)
In-Reply-To: <20200616141015.lx33cyu7u74wxlbj@ahiler-desk1.fi.intel.com>
On 2020-06-16 at 17:10:15 +0300, Arkadiusz Hiler wrote:
> On Tue, Jun 16, 2020 at 07:33:04PM +0530, Ramalingam C wrote:
> > On 2020-06-16 at 16:28:12 +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.
> > >
> > > Signed-off-by: Ankit Nautiyal <ankit.k.nautiyal@intel.com>
> > > ---
> > > tests/kms_content_protection.c | 145 ++-------------------------------
> > > 1 file changed, 6 insertions(+), 139 deletions(-)
> > >
> > > diff --git a/tests/kms_content_protection.c b/tests/kms_content_protection.c
> > > index 3b9cedcb..475a5089 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,9 @@ 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_conn_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 +566,10 @@ igt_main
> > > igt_subtest("uevent") {
> > > igt_require(data.display.is_atomic);
> > > data.cp_tests = CP_UEVENT;
> > > + data.uevent_monitor = igt_watch_hotplug();
> > Ankit, this is really good.
> >
> > Any benefit with sporadic hdcp event missing issue?
> >
> > I would prefer to create generic implementations like igt_watch_udev.
> > Similarly for igt_flush_hotplugs and igt_cleanup_hotplug.
> >
> > -Ram.
>
> Agreed, the change is definatetly in the right direction! :-)
>
> I am not sure wheter there is a need to create something "new", but at
> least having a bit more generic names for the existing fuctions would be
> nice.
Agreed. Considering, only three igt files are using these funcs we could rename
them.
-Ram
>
> --
> Cheers,
> Arek
_______________________________________________
igt-dev mailing list
igt-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/igt-dev
next prev parent reply other threads:[~2020-06-16 14:17 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-06-16 10:58 [igt-dev] [Patch][i-g-t 0/2] Add support to detect HDCP events Ankit Nautiyal
2020-06-16 10:58 ` [igt-dev] [Patch][i-g-t 1/2] lib/igt_kms: Add support for detecting connector events Ankit Nautiyal
2020-06-16 14:12 ` Ramalingam C
2020-06-17 6:23 ` Nautiyal, Ankit K
2020-06-16 10:58 ` [igt-dev] [Patch][i-g-t 2/2] tests/kms_content_protection: Use library functions for handling uevents Ankit Nautiyal
2020-06-16 14:03 ` Ramalingam C
2020-06-16 14:10 ` Arkadiusz Hiler
2020-06-16 14:17 ` Ramalingam C [this message]
2020-06-17 4:18 ` Anshuman Gupta
2020-06-17 6:24 ` Nautiyal, Ankit K
2020-06-16 16:45 ` [igt-dev] ✓ Fi.CI.BAT: success for Add support to detect HDCP events Patchwork
2020-06-16 17:44 ` [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=20200616141727.GC26166@intel.com \
--to=ramalingam.c@intel.com \
--cc=arkadiusz.hiler@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