drm/gem: Add DEFINE_DRM_GEM_FOPS
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 8 Mar 2017 14:12:57 +0000 (15:12 +0100)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Tue, 14 Mar 2017 13:38:34 +0000 (14:38 +0100)
Sadly there's only 1 driver which can use it, everyone else is special
for some reason:

- gma500 has a horrible runtime PM ioctl wrapper that probably doesn't
  really work but meh.
- i915 needs special compat_ioctl handler because regrets.
- arcgpu needs to fixup the pgprot because (no idea why it can't do
  that in the fault handler like everyone else).
- tegra does even worse stuff with pgprot
- udl does something with vm_flags too ...
- cma helpers, etnaviv, mtk, msm, rockchip, omap all implement some
  variation on prefaulting.
- exynos is exynos, I got lost in the midlayers.
- vc4 has to reinvent half of cma helpers because those are too much
  midlayer, plus vm_flags dances.
- vgem also seems unhappy with the default vm_flags.

So pretty sad divergence and I'm sure we could do better, but not
really an idea. Oh well, maybe this macro here helps to encourage more
consistency at least going forward.

Reviewed-by: Sean Paul <seanpaul@chromium.org>
Reviewed-by: Liviu Dudau <Liviu.Dudau@arm.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/20170308141257.12119-25-daniel.vetter@ffwll.ch
drivers/gpu/drm/armada/armada_drv.c
drivers/gpu/drm/drm_file.c
include/drm/drm_gem.h

index 408e00b64cf61c03b6720ddbc61dd77c261cdca4..e618fab7f519d6b8602f65c1bb09de3f1186d814 100644 (file)
@@ -60,16 +60,7 @@ static void armada_drm_lastclose(struct drm_device *dev)
        armada_fbdev_lastclose(dev);
 }
 
-static const struct file_operations armada_drm_fops = {
-       .owner                  = THIS_MODULE,
-       .llseek                 = no_llseek,
-       .read                   = drm_read,
-       .poll                   = drm_poll,
-       .unlocked_ioctl         = drm_ioctl,
-       .mmap                   = drm_gem_mmap,
-       .open                   = drm_open,
-       .release                = drm_release,
-};
+DEFINE_DRM_GEM_FOPS(armada_drm_fops);
 
 static struct drm_driver armada_drm_driver = {
        .lastclose              = armada_drm_lastclose,
index b42c1334112c424d2309302cbc0973cb1a7a6c71..3783b659cd38a6b87f5418d8e2e6dccdb3e38800 100644 (file)
@@ -89,11 +89,9 @@ DEFINE_MUTEX(drm_global_mutex);
  *             .mmap = drm_gem_mmap,
  *     };
  *
- * For CMA based drivers there is the DEFINE_DRM_GEM_CMA_FOPS() macro to make
- * this simpler.
- *
- * FIXME: We should have a macro for this (and the CMA version) so that drivers
- * don't have to repeat it all the time.
+ * For plain GEM based drivers there is the DEFINE_DRM_GEM_FOPS() macro, and for
+ * CMA based drivers there is the DEFINE_DRM_GEM_CMA_FOPS() macro to make this
+ * simpler.
  */
 
 static int drm_open_helper(struct file *filp, struct drm_minor *minor);
index b9ade75ecd82ebd9502176187af40a68d5c47548..663d803580578b9ee198ff9f4402dfa8c86cd05c 100644 (file)
@@ -178,6 +178,32 @@ struct drm_gem_object {
        struct dma_buf_attachment *import_attach;
 };
 
+/**
+ * DEFINE_DRM_GEM_FOPS() - macro to generate file operations for GEM drivers
+ * @name: name for the generated structure
+ *
+ * This macro autogenerates a suitable &struct file_operations for GEM based
+ * drivers, which can be assigned to &drm_driver.fops. Note that this structure
+ * cannot be shared between drivers, because it contains a reference to the
+ * current module using THIS_MODULE.
+ *
+ * Note that the declaration is already marked as static - if you need a
+ * non-static version of this you're probably doing it wrong and will break the
+ * THIS_MODULE reference by accident.
+ */
+#define DEFINE_DRM_GEM_FOPS(name) \
+       static const struct file_operations name = {\
+               .owner          = THIS_MODULE,\
+               .open           = drm_open,\
+               .release        = drm_release,\
+               .unlocked_ioctl = drm_ioctl,\
+               .compat_ioctl   = drm_compat_ioctl,\
+               .poll           = drm_poll,\
+               .read           = drm_read,\
+               .llseek         = noop_llseek,\
+               .mmap           = drm_gem_mmap,\
+       }
+
 void drm_gem_object_release(struct drm_gem_object *obj);
 void drm_gem_object_free(struct kref *kref);
 int drm_gem_object_init(struct drm_device *dev,