diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/Makefile.am | 16 | ||||
-rw-r--r-- | tests/drmtest.c | 117 | ||||
-rw-r--r-- | tests/drmtest.h | 3 | ||||
-rw-r--r-- | tests/gem_basic.c | 6 | ||||
-rw-r--r-- | tests/gem_flink.c | 6 | ||||
-rw-r--r-- | tests/gem_mmap.c | 6 | ||||
-rw-r--r-- | tests/gem_readwrite.c | 6 |
7 files changed, 115 insertions, 45 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am index e66d1c829..123c54782 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 5453b1053..15e5c4aed 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 afa0df4a8..55bb44644 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 b2176fba4..4e4b6cbdf 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 d2e062fd1..ff999d2ec 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 b5c154635..d24005ba3 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 bd1d232bb..4f5cde6cd 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; |