[1/3] Ensure that DRM device uses the i915 driver

Submitted by Mark Thompson on Jan. 31, 2018, 7:58 p.m.

Details

Message ID f03d6dc4-3b01-54fb-c739-544069fe6c20@jkqxz.net
State New
Headers show
Series "Series without cover letter" ( rev: 1 ) in Beignet

Not browsing as part of any series.

Commit Message

Mark Thompson Jan. 31, 2018, 7:58 p.m.
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>
---
 src/intel/intel_driver.c | 30 ++++++++++++++++++++++++++++++
 1 file changed, 30 insertions(+)

Patch hide | download patch | download mbox

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;
 

Comments

The patchset LGTM, pushed, thanks.

> -----Original Message-----

> From: Beignet [mailto:beignet-bounces@lists.freedesktop.org] On Behalf Of

> Mark Thompson

> Sent: Thursday, February 1, 2018 3:58 AM

> To: beignet@lists.freedesktop.org

> Subject: [Beignet] [PATCH 1/3] 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>

> ---

>  src/intel/intel_driver.c | 30 ++++++++++++++++++++++++++++++

>  1 file changed, 30 insertions(+)

> 

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

> 

> --

> 2.11.0

> _______________________________________________

> Beignet mailing list

> Beignet@lists.freedesktop.org

> https://lists.freedesktop.org/mailman/listinfo/beignet