[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