Use libudev in test case to only run gem tests for intel devices.

main
Kristian Høgsberg 2009-04-06 17:13:01 -04:00
parent 51d6346f9f
commit e9d6116e5b
8 changed files with 126 additions and 49 deletions

View File

@ -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([

View File

@ -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)

View File

@ -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;
}

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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;