summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Thompson <sw@jkqxz.net>2018-01-31 19:58:09 +0000
committerYang Rong <rong.r.yang@intel.com>2018-02-05 18:04:24 +0800
commitb70d65ba25a32a965cc122bf944ba14a1aa0a095 (patch)
treeac449b9807b8f2dd31cb70ea36b8fd23f9ae1915
parentd1b99a1da56757971753288986419f1b8b9d55f4 (diff)
downloadbeignet-b70d65ba25a32a965cc122bf944ba14a1aa0a095.tar.gz
Ensure that DRM device uses the i915 driver
This avoids calling random ioctl()s and returning nonsensical errors for unsupported devices. In particular, loading is much cleaner on setups where the driver needs to iterate over multiple devices to find the correct one because the Intel graphics device is not the first DRM device. Signed-off-by: Mark Thompson <sw@jkqxz.net>
-rw-r--r--src/intel/intel_driver.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/intel/intel_driver.c b/src/intel/intel_driver.c
index 45719785..10fe3cc8 100644
--- a/src/intel/intel_driver.c
+++ b/src/intel/intel_driver.c
@@ -312,6 +312,26 @@ return ret;
}
#endif
+static int
+intel_driver_check_device(int dev_fd)
+{
+ // Ensure that this is actually an i915 DRM device.
+ drmVersion *version;
+ int ret;
+ version = drmGetVersion(dev_fd);
+ if (!version) {
+ fprintf(stderr, "drmGetVersion(%d) failed: %s\n", dev_fd, strerror(errno));
+ close(dev_fd);
+ return 0;
+ }
+ ret = !strcmp(version->name, "i915");
+ drmFreeVersion(version);
+ // Don't print an error here if this device is using a different driver,
+ // because we might be iterating over multiple devices looking for a
+ // compatible one.
+ return ret;
+}
+
LOCAL int
intel_driver_init_master(intel_driver_t *driver, const char* dev_name)
{
@@ -326,6 +346,11 @@ if (dev_fd == -1) {
return 0;
}
+if (!intel_driver_check_device(dev_fd)) {
+ close(dev_fd);
+ return 0;
+}
+
// Check that we're authenticated
memset(&client, 0, sizeof(drm_client_t));
ret = ioctl(dev_fd, DRM_IOCTL_GET_CLIENT, &client);
@@ -356,6 +381,11 @@ dev_fd = open(dev_name, O_RDWR);
if (dev_fd == -1)
return 0;
+if (!intel_driver_check_device(dev_fd)) {
+ close(dev_fd);
+ return 0;
+}
+
ret = intel_driver_init(driver, dev_fd);
driver->need_close = 1;