[PATCH 58/74] drv-ioctl

Chris Wilson chris at chris-wilson.co.uk
Thu Sep 14 17:34:32 UTC 2017


---
 drivers/gpu/drm/i915/i915_drv.c     | 17 ++++++++++++++++-
 drivers/gpu/drm/vmwgfx/vmwgfx_drv.c |  3 +--
 include/drm/drm_ioctl.h             | 15 ++++++++++++++-
 3 files changed, 31 insertions(+), 4 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_drv.c b/drivers/gpu/drm/i915/i915_drv.c
index 3fc9b5d46c0e..64420eb4ceba 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -2688,6 +2688,21 @@ static const struct drm_ioctl_desc i915_ioctls[] = {
 	DRM_IOCTL_DEF_DRV(I915_PERF_REMOVE_CONFIG, i915_perf_remove_config_ioctl, DRM_UNLOCKED|DRM_RENDER_ALLOW),
 };
 
+static long i915_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
+{
+	unsigned int nr = DRM_IOCTL_NR(cmd) - DRM_COMMAND_BASE;
+	const struct drm_ioctl_desc *ioctl;
+
+	if (nr >= ARRAY_SIZE(i915_ioctls))
+		return drm_ioctl(filp, cmd, arg);
+
+	ioctl = &i915_ioctls[nr];
+	if (!(ioctl->flags & DRM_DRIVER_IOCTL))
+		return drm_ioctl(filp, cmd, arg);
+
+	return ioctl->ioctl(filp, cmd, arg);
+}
+
 static const struct vm_operations_struct i915_gem_vm_ops = {
 	.access = i915_gem_vm_access,
 	.fault = i915_gem_fault,
@@ -2699,7 +2714,7 @@ static const struct file_operations i915_driver_fops = {
 	.owner = THIS_MODULE,
 	.open = drm_open,
 	.release = drm_release,
-	.unlocked_ioctl = drm_ioctl,
+	.unlocked_ioctl = i915_ioctl,
 	.mmap = drm_gem_mmap,
 	.poll = drm_poll,
 	.read = drm_read,
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
index e84fee3ec4f3..e317729a9859 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -143,8 +143,7 @@
  * DRM_COMMAND_BASE.
  */
 
-#define VMW_IOCTL_DEF(ioctl, func, flags) \
-  [DRM_IOCTL_NR(DRM_IOCTL_##ioctl) - DRM_COMMAND_BASE] = {DRM_IOCTL_##ioctl, flags, func}
+#define VMW_IOCTL_DEF(ioctl, func, flags) DRM_IOCTL_DEF_DRV(ioctl, func, flags)
 
 /**
  * Ioctl definitions.
diff --git a/include/drm/drm_ioctl.h b/include/drm/drm_ioctl.h
index add42809642a..917fe38a1757 100644
--- a/include/drm/drm_ioctl.h
+++ b/include/drm/drm_ioctl.h
@@ -133,6 +133,8 @@ enum drm_ioctl_flags {
 	 * not set DRM_AUTH because they do not require authentication.
 	 */
 	DRM_RENDER_ALLOW	= BIT(5),
+
+	DRM_DRIVER_IOCTL	= BIT(6),
 };
 
 /**
@@ -148,7 +150,10 @@ enum drm_ioctl_flags {
 struct drm_ioctl_desc {
 	unsigned int cmd;
 	enum drm_ioctl_flags flags;
-	drm_ioctl_t *func;
+	union {
+		drm_ioctl_t *func;
+		long (*ioctl)(struct file *, unsigned int, unsigned long);
+	};
 	const char *name;
 };
 
@@ -170,6 +175,14 @@ struct drm_ioctl_desc {
 		.name = #ioctl						\
 	}
 
+#define DRM_DRIVER_IOCTL_DEF(i, _func, _flags)				\
+	[DRM_IOCTL_NR(DRM_IOCTL_##i) - DRM_COMMAND_BASE] = {		\
+		.cmd = DRM_IOCTL_##i,					\
+		.ioctl = _func,						\
+		.flags = _flags | DRM_DRIVER_IOCTL,			\
+		.name = #i						\
+	}
+
 int drm_ioctl_permit(u32 flags, struct drm_file *file_priv);
 long drm_ioctl(struct file *filp, unsigned int cmd, unsigned long arg);
 long drm_ioctl_kernel(struct file *, drm_ioctl_t, void *, u32);
-- 
2.14.1



More information about the Intel-gfx-trybot mailing list