Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> --- 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 _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel