summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--configure.ac7
-rw-r--r--tests/Makefile.am16
-rw-r--r--tests/drmtest.c117
-rw-r--r--tests/drmtest.h3
-rw-r--r--tests/gem_basic.c6
-rw-r--r--tests/gem_flink.c6
-rw-r--r--tests/gem_mmap.c6
-rw-r--r--tests/gem_readwrite.c6
8 files changed, 122 insertions, 45 deletions
diff --git a/configure.ac b/configure.ac
index 8be1e2a4..2e32c840 100644
--- a/configure.ac
+++ b/configure.ac
@@ -131,6 +131,13 @@ if test "x$HAVE_CAIRO" = xyes; then
fi
AM_CONDITIONAL(HAVE_CAIRO, [test "x$HAVE_CAIRO" = xyes])
+# For enumerating devices in test case
+PKG_CHECK_MODULES(LIBUDEV, libudev, [HAVE_LIBUDEV=yes], [HAVE_LIBUDEV=no])
+if test "x$HAVE_LIBUDEV" = xyes; then
+ AC_DEFINE(HAVE_LIBUDEV, 1, [Have libudev support])
+fi
+AM_CONDITIONAL(HAVE_LIBUDEV, [test "x$HAVE_LIBUDEV" = xyes])
+
AC_SUBST(WARN_CFLAGS)
AC_OUTPUT([
diff --git a/tests/Makefile.am b/tests/Makefile.am
index e66d1c82..123c5478 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -6,19 +6,22 @@ noinst_PROGRAMS = \
dristat \
drmstat
+SUBDIRS = \
+ modeprint \
+ modetest
+
+if HAVE_LIBUDEV
+
EXTRA_LTLIBRARIES = libdrmtest.la
libdrmtest_la_SOURCES = \
drmtest.c \
drmtest.h
libdrmtest_la_LIBADD = \
- $(top_builddir)/libdrm/libdrm.la
+ $(top_builddir)/libdrm/libdrm.la \
+ $(LIBUDEV_LIBS)
LDADD = libdrmtest.la
-SUBDIRS = \
- modeprint \
- modetest
-
TESTS = auth \
openclose \
getversion \
@@ -33,5 +36,8 @@ TESTS = auth \
gem_mmap
EXTRA_PROGRAMS = $(TESTS)
+
+endif
+
CLEANFILES = $(EXTRA_PROGRAMS) $(EXTRA_LTLIBRARIES)
diff --git a/tests/drmtest.c b/tests/drmtest.c
index 5453b105..15e5c4ae 100644
--- a/tests/drmtest.c
+++ b/tests/drmtest.c
@@ -26,58 +26,103 @@
*/
#include <fcntl.h>
+#include <fnmatch.h>
#include <sys/stat.h>
#include "drmtest.h"
-/** Open the first DRM device we can find, searching up to 16 device nodes */
-int drm_open_any(void)
+#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE
+#include <libudev.h>
+
+static int is_master(int fd)
{
- char name[20];
+ drm_client_t client;
+ int ret;
+
+ /* Check that we're the only opener and authed. */
+ client.idx = 0;
+ ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client);
+ assert (ret == 0);
+ if (!client.auth)
+ return 0;
+ client.idx = 1;
+ ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client);
+ if (ret != -1 || errno != EINVAL)
+ return 0;
+
+ return 1;
+}
+
+/** Open the first DRM device matching the criteria */
+int drm_open_matching(const char *pci_glob, int flags)
+{
+ struct udev *udev;
+ struct udev_enumerate *e;
+ struct udev_device *device, *parent;
+ struct udev_list_entry *entry;
+ const char *pci_id, *path;
int i, fd;
- for (i = 0; i < 16; i++) {
- sprintf(name, "/dev/dri/card%d", i);
- fd = open(name, O_RDWR);
- if (fd != -1)
- return fd;
+ udev = udev_new();
+ if (udev == NULL) {
+ fprintf(stderr, "failed to initialize udev context\n");
+ abort();
}
- abort();
+
+ fd = -1;
+ e = udev_enumerate_new(udev);
+ udev_enumerate_add_match_subsystem(e, "drm");
+ udev_enumerate_scan_devices(e);
+ udev_list_entry_foreach(entry, udev_enumerate_get_list_entry(e)) {
+ path = udev_list_entry_get_name(entry);
+ device = udev_device_new_from_syspath(udev, path);
+ parent = udev_device_get_parent(device);
+ /* Filter out KMS output devices. */
+ if (strcmp(udev_device_get_subsystem(parent), "pci") != 0)
+ continue;
+ pci_id = udev_device_get_property_value(parent, "PCI_ID");
+ if (fnmatch(pci_glob, pci_id, 0) != 0)
+ continue;
+ fd = open(udev_device_get_devnode(device), O_RDWR);
+ if (fd < 0)
+ continue;
+ if ((flags & DRM_TEST_MASTER) && !is_master(fd)) {
+ close(fd);
+ fd = -1;
+ continue;
+ }
+
+ break;
+ }
+ udev_enumerate_unref(e);
+ udev_unref(udev);
+
+ return fd;
}
+int drm_open_any(void)
+{
+ int fd = drm_open_matching("*:*", 0);
+
+ if (fd < 0) {
+ fprintf(stderr, "failed to open any drm device\n");
+ abort();
+ }
+
+ return fd;
+}
/**
* Open the first DRM device we can find where we end up being the master.
*/
int drm_open_any_master(void)
{
- char name[20];
- int i, fd;
+ int fd = drm_open_matching("*:*", DRM_TEST_MASTER);
- for (i = 0; i < 16; i++) {
- drm_client_t client;
- int ret;
+ if (fd < 0) {
+ fprintf(stderr, "failed to open any drm device\n");
+ abort();
+ }
- sprintf(name, "/dev/dri/card%d", i);
- fd = open(name, O_RDWR);
- if (fd == -1)
- continue;
+ return fd;
- /* Check that we're the only opener and authed. */
- client.idx = 0;
- ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client);
- assert (ret == 0);
- if (!client.auth) {
- close(fd);
- continue;
- }
- client.idx = 1;
- ret = ioctl(fd, DRM_IOCTL_GET_CLIENT, &client);
- if (ret != -1 || errno != EINVAL) {
- close(fd);
- continue;
- }
- return fd;
- }
- fprintf(stderr, "Couldn't find an un-controlled DRM device\n");
- abort();
}
diff --git a/tests/drmtest.h b/tests/drmtest.h
index afa0df4a..55bb4464 100644
--- a/tests/drmtest.h
+++ b/tests/drmtest.h
@@ -33,5 +33,8 @@
#include "xf86drm.h"
+#define DRM_TEST_MASTER 0x01
+
int drm_open_any(void);
int drm_open_any_master(void);
+int drm_open_matching(const char *pci_glob, int flags);
diff --git a/tests/gem_basic.c b/tests/gem_basic.c
index b2176fba..4e4b6cbd 100644
--- a/tests/gem_basic.c
+++ b/tests/gem_basic.c
@@ -88,7 +88,11 @@ int main(int argc, char **argv)
{
int fd;
- fd = drm_open_any();
+ fd = drm_open_matching("8086:*", 0);
+ if (fd < 0) {
+ fprintf(stderr, "failed to open intel drm device\n");
+ return 0;
+ }
test_bad_close(fd);
test_create_close(fd);
diff --git a/tests/gem_flink.c b/tests/gem_flink.c
index d2e062fd..ff999d2e 100644
--- a/tests/gem_flink.c
+++ b/tests/gem_flink.c
@@ -117,7 +117,11 @@ int main(int argc, char **argv)
{
int fd;
- fd = drm_open_any();
+ fd = drm_open_matching("8086:*", 0);
+ if (fd < 0) {
+ fprintf(stderr, "failed to open intel drm device, skipping\n");
+ return 0;
+ }
test_flink(fd);
test_double_flink(fd);
diff --git a/tests/gem_mmap.c b/tests/gem_mmap.c
index b5c15463..d24005ba 100644
--- a/tests/gem_mmap.c
+++ b/tests/gem_mmap.c
@@ -81,7 +81,11 @@ int main(int argc, char **argv)
int ret;
int handle;
- fd = drm_open_any();
+ fd = drm_open_matching("8086:*", 0);
+ if (fd < 0) {
+ fprintf(stderr, "failed to open intel drm device, skipping\n");
+ return 0;
+ }
memset(&mmap, 0, sizeof(mmap));
mmap.handle = 0x10101010;
diff --git a/tests/gem_readwrite.c b/tests/gem_readwrite.c
index bd1d232b..4f5cde6c 100644
--- a/tests/gem_readwrite.c
+++ b/tests/gem_readwrite.c
@@ -78,7 +78,11 @@ int main(int argc, char **argv)
int ret;
int handle;
- fd = drm_open_any();
+ fd = drm_open_matching("8086:*", 0);
+ if (fd < 0) {
+ fprintf(stderr, "failed to open intel drm device, skipping\n");
+ return 0;
+ }
memset(&create, 0, sizeof(create));
create.size = OBJECT_SIZE;