Use libudev in test case to only run gem tests for intel devices.
parent
51d6346f9f
commit
e9d6116e5b
|
@ -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([
|
||||
|
|
|
@ -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)
|
||||
|
||||
|
|
125
tests/drmtest.c
125
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)
|
||||
{
|
||||
char name[20];
|
||||
int i, fd;
|
||||
#define LIBUDEV_I_KNOW_THE_API_IS_SUBJECT_TO_CHANGE
|
||||
#include <libudev.h>
|
||||
|
||||
for (i = 0; i < 16; i++) {
|
||||
sprintf(name, "/dev/dri/card%d", i);
|
||||
fd = open(name, O_RDWR);
|
||||
if (fd != -1)
|
||||
return fd;
|
||||
}
|
||||
abort();
|
||||
static int is_master(int fd)
|
||||
{
|
||||
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;
|
||||
|
||||
udev = udev_new();
|
||||
if (udev == NULL) {
|
||||
fprintf(stderr, "failed to initialize udev context\n");
|
||||
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;
|
||||
|
||||
sprintf(name, "/dev/dri/card%d", i);
|
||||
fd = open(name, O_RDWR);
|
||||
if (fd == -1)
|
||||
continue;
|
||||
|
||||
/* 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;
|
||||
if (fd < 0) {
|
||||
fprintf(stderr, "failed to open any drm device\n");
|
||||
abort();
|
||||
}
|
||||
fprintf(stderr, "Couldn't find an un-controlled DRM device\n");
|
||||
abort();
|
||||
|
||||
return fd;
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue