[PATCH 32/43] drv-ioctl
Chris Wilson
chris at chris-wilson.co.uk
Fri Jun 2 18:10:13 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 5086d409fbb3..86a5cf70a066 100644
--- a/drivers/gpu/drm/i915/i915_drv.c
+++ b/drivers/gpu/drm/i915/i915_drv.c
@@ -2573,6 +2573,21 @@ static const struct drm_ioctl_desc i915_ioctls[] = {
DRM_IOCTL_DEF_DRV(I915_PERF_OPEN, i915_perf_open_ioctl, 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 = {
.fault = i915_gem_fault,
.open = drm_gem_vm_open,
@@ -2583,7 +2598,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 4a641555b960..8f1da22182c5 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_drv.c
@@ -144,8 +144,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 ee03b3c44b3b..c420481d2078 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);
#ifdef CONFIG_COMPAT
--
2.11.0
More information about the Intel-gfx-trybot
mailing list