[PATCH igt 1/2] lib: Support opening vGEM device

Chris Wilson chris at chris-wilson.co.uk
Sat Jun 18 13:59:09 UTC 2016


Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
---
 lib/drmtest.c | 47 ++++++++++++++++++++++++++++++++---------------
 lib/drmtest.h |  7 ++++---
 2 files changed, 36 insertions(+), 18 deletions(-)

diff --git a/lib/drmtest.c b/lib/drmtest.c
index c59cabe..30eae19 100644
--- a/lib/drmtest.c
+++ b/lib/drmtest.c
@@ -90,24 +90,29 @@ static int __get_drm_device_name(int fd, char *name)
 	return -1;
 }
 
-bool is_i915_device(int fd)
+static bool __is_device(int fd, const char *expect)
 {
-	int ret;
 	char name[5] = "";
 
-	ret = __get_drm_device_name(fd, name);
+	if (__get_drm_device_name(fd, name))
+		return false;
 
-	return !ret && strcmp("i915", name) == 0;
+	return strcmp(expect, name) == 0;
 }
 
-static bool is_vc4_device(int fd)
+bool is_i915_device(int fd)
 {
-	int ret;
-	char name[5] = "";
+	return __is_device(fd, "i915");
+}
 
-	ret = __get_drm_device_name(fd, name);
+static bool is_vc4_device(int fd)
+{
+	return __is_device(fd, "vc4");
+}
 
-	return !ret && strcmp("vc4", name) == 0;
+static bool is_vgem_device(int fd)
+{
+	return __is_device(fd, "vgem");
 }
 
 static bool has_known_intel_chipset(int fd)
@@ -213,6 +218,13 @@ int drm_get_card(void)
 	return -1;
 }
 
+static void modprobe(const char *driver)
+{
+	char buf[128];
+	snprintf(buf, sizeof(buf), "/sbin/modprobe %s", driver);
+	system(buf);
+}
+
 /**
  * __drm_open_driver:
  * @chipset: OR'd flags for each chipset to search, eg. #DRIVER_INTEL
@@ -224,23 +236,28 @@ int drm_get_card(void)
  */
 int __drm_open_driver(int chipset)
 {
+	if (chipset & DRIVER_VGEM)
+		modprobe("vgem");
+
 	for (int i = 0; i < 16; i++) {
 		char name[80];
 		int fd;
-		bool found_intel, found_vc4;
 
 		sprintf(name, "/dev/dri/card%u", i);
 		fd = open(name, O_RDWR);
 		if (fd == -1)
 			continue;
 
-		found_intel = is_i915_device(fd) &&
-			      has_known_intel_chipset(fd) &&
-			      (chipset & DRIVER_INTEL);
+		if (chipset & DRIVER_INTEL && is_i915_device(fd) &&
+		    has_known_intel_chipset(fd))
+			return fd;
 
-		found_vc4 = is_vc4_device(fd) && (chipset & DRIVER_VC4);
+		if (chipset & DRIVER_VC4 &&
+		    is_vc4_device(fd))
+			return fd;
 
-		if ((chipset & DRIVER_ANY) || found_intel || found_vc4)
+		if (chipset & DRIVER_VGEM &&
+		    is_vgem_device(fd))
 			return fd;
 
 		close(fd);
diff --git a/lib/drmtest.h b/lib/drmtest.h
index c391464..8ce32a6 100644
--- a/lib/drmtest.h
+++ b/lib/drmtest.h
@@ -38,9 +38,10 @@
 
 #include "intel_batchbuffer.h"
 
-#define DRIVER_ANY 0x1
-#define DRIVER_INTEL (0x1 << 1)
-#define DRIVER_VC4 (0x1 << 2)
+#define DRIVER_INTEL	(1 << 0)
+#define DRIVER_VC4	(1 << 1)
+#define DRIVER_VGEM	(1 << 2)
+#define DRIVER_ANY 	~(DRIVER_VGEM)
 
 #ifdef ANDROID
 #if (!(defined HAVE_MMAP64)) && (!(defined __x86_64__))
-- 
2.8.1



More information about the dri-devel mailing list