drm: remove the dma_ioctl special-case
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Thu, 8 Aug 2013 13:41:29 +0000 (15:41 +0200)
committerDave Airlie <airlied@redhat.com>
Mon, 19 Aug 2013 04:15:50 +0000 (14:15 +1000)
We might as well have a real ioctl function which checks for the
callbacks. This seems to be a remnant from back in the days when each
drm driver had their own complete ioctl table, with no shared core
drm table at all.

To make really sure no mis-guided user in a kms driver pops up again
explicitly check for that in the new ioctl implementation.

v2: Drop the unused variable I've accidentally left in the code,
spotted by David Herrmann.

Cc: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Reviewed-by: David Herrmann <dh.herrmann@gmail.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
drivers/gpu/drm/drm_bufs.c
drivers/gpu/drm/drm_drv.c
include/drm/drmP.h

index f63133b0a9ab9a7478f89b937139a7f0f5ea57c7..471e051d295e383b61ebb2a2a19c0e0d67d8827a 100644 (file)
@@ -1455,6 +1455,18 @@ int drm_mapbufs(struct drm_device *dev, void *data,
        return retcode;
 }
 
+int drm_dma_ioctl(struct drm_device *dev, void *data,
+                 struct drm_file *file_priv)
+{
+       if (drm_core_check_feature(dev, DRIVER_MODESET))
+               return -EINVAL;
+
+       if (dev->driver->dma_ioctl)
+               return dev->driver->dma_ioctl(dev, data, file_priv);
+       else
+               return -EINVAL;
+}
+
 struct drm_local_map *drm_getsarea(struct drm_device *dev)
 {
        struct drm_map_list *entry;
index d97976cc51cd479db3f7f4f0bf8b86516d9a01ea..357a14ea3cb0772ef6e4433e5aeae817408d2e3e 100644 (file)
@@ -106,8 +106,7 @@ static const struct drm_ioctl_desc drm_ioctls[] = {
        DRM_IOCTL_DEF(DRM_IOCTL_INFO_BUFS, drm_infobufs, DRM_AUTH),
        DRM_IOCTL_DEF(DRM_IOCTL_MAP_BUFS, drm_mapbufs, DRM_AUTH),
        DRM_IOCTL_DEF(DRM_IOCTL_FREE_BUFS, drm_freebufs, DRM_AUTH),
-       /* The DRM_IOCTL_DMA ioctl should be defined by the driver. */
-       DRM_IOCTL_DEF(DRM_IOCTL_DMA, NULL, DRM_AUTH),
+       DRM_IOCTL_DEF(DRM_IOCTL_DMA, drm_dma_ioctl, DRM_AUTH),
 
        DRM_IOCTL_DEF(DRM_IOCTL_CONTROL, drm_control, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
 
@@ -397,9 +396,6 @@ long drm_ioctl(struct file *filp,
 
        /* Do not trust userspace, use our own definition */
        func = ioctl->func;
-       /* is there a local override? */
-       if ((nr == DRM_IOCTL_NR(DRM_IOCTL_DMA)) && dev->driver->dma_ioctl)
-               func = dev->driver->dma_ioctl;
 
        if (!func) {
                DRM_DEBUG("no function\n");
index 139d859adf16cf785ed795beee776e0f04231079..808eb237be0ef847f23e9262fdc733b4f3c7b01b 100644 (file)
@@ -1355,6 +1355,8 @@ extern int drm_freebufs(struct drm_device *dev, void *data,
                        struct drm_file *file_priv);
 extern int drm_mapbufs(struct drm_device *dev, void *data,
                       struct drm_file *file_priv);
+extern int drm_dma_ioctl(struct drm_device *dev, void *data,
+                        struct drm_file *file_priv);
 
                                /* DMA support (drm_dma.h) */
 extern int drm_legacy_dma_setup(struct drm_device *dev);