drm: Document device unplug infrastructure
authorDaniel Vetter <daniel.vetter@ffwll.ch>
Wed, 2 Aug 2017 11:56:02 +0000 (13:56 +0200)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Fri, 11 Aug 2017 08:48:03 +0000 (10:48 +0200)
While at it, also ocd and give them a consistent drm_dev_ prefix, like
the other device instance functionality. Plus move the functions into
the right places.

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20170802115604.12734-3-daniel.vetter@ffwll.ch
12 files changed:
drivers/gpu/drm/drm_drv.c
drivers/gpu/drm/drm_file.c
drivers/gpu/drm/drm_gem.c
drivers/gpu/drm/drm_gem_cma_helper.c
drivers/gpu/drm/drm_ioctl.c
drivers/gpu/drm/drm_vm.c
drivers/gpu/drm/tinydrm/core/tinydrm-pipe.c
drivers/gpu/drm/udl/udl_connector.c
drivers/gpu/drm/udl/udl_drv.c
drivers/gpu/drm/udl/udl_fb.c
include/drm/drmP.h
include/drm/drm_drv.h

index 2ed2d919beaeaf841c531e1fc0b1d2794cceb15d..39191e5c240edc4be7aa0ebe58ecd408d813b653 100644 (file)
@@ -291,7 +291,7 @@ struct drm_minor *drm_minor_acquire(unsigned int minor_id)
 
        if (!minor) {
                return ERR_PTR(-ENODEV);
-       } else if (drm_device_is_unplugged(minor->dev)) {
+       } else if (drm_dev_is_unplugged(minor->dev)) {
                drm_dev_unref(minor->dev);
                return ERR_PTR(-ENODEV);
        }
@@ -364,7 +364,22 @@ void drm_put_dev(struct drm_device *dev)
 }
 EXPORT_SYMBOL(drm_put_dev);
 
-void drm_unplug_dev(struct drm_device *dev)
+static void drm_device_set_unplugged(struct drm_device *dev)
+{
+       smp_wmb();
+       atomic_set(&dev->unplugged, 1);
+}
+
+/**
+ * drm_dev_unplug - unplug a DRM device
+ * @dev: DRM device
+ *
+ * This unplugs a hotpluggable DRM device, which makes it inaccessible to
+ * userspace operations. Entry-points can use drm_dev_is_unplugged(). This
+ * essentially unregisters the device like drm_dev_unregister(), but can be
+ * called while there are still open users of @dev.
+ */
+void drm_dev_unplug(struct drm_device *dev)
 {
        /* for a USB device */
        if (drm_core_check_feature(dev, DRIVER_MODESET))
@@ -383,7 +398,7 @@ void drm_unplug_dev(struct drm_device *dev)
        }
        mutex_unlock(&drm_global_mutex);
 }
-EXPORT_SYMBOL(drm_unplug_dev);
+EXPORT_SYMBOL(drm_dev_unplug);
 
 /*
  * DRM internal mount
@@ -835,6 +850,9 @@ EXPORT_SYMBOL(drm_dev_register);
  * drm_dev_register() but does not deallocate the device. The caller must call
  * drm_dev_unref() to drop their final reference.
  *
+ * A special form of unregistering for hotpluggable devices is drm_dev_unplug(),
+ * which can be called while there are still open users of @dev.
+ *
  * This should be called first in the device teardown code to make sure
  * userspace can't access the device instance any more.
  */
index 59b75a9743578f5fbba06be2b87906ffc101267d..b3c6e997ccdb0920c47fb19077ee9bd75ae91ab8 100644 (file)
@@ -436,7 +436,7 @@ int drm_release(struct inode *inode, struct file *filp)
 
        if (!--dev->open_count) {
                drm_lastclose(dev);
-               if (drm_device_is_unplugged(dev))
+               if (drm_dev_is_unplugged(dev))
                        drm_put_dev(dev);
        }
        mutex_unlock(&drm_global_mutex);
index a8d396bed6a46fa683ffb5f47ace8a828e75c2ef..ad4e9cfe48a2d3f2d25e8bee01a80d6c2d14192d 100644 (file)
@@ -1001,7 +1001,7 @@ int drm_gem_mmap(struct file *filp, struct vm_area_struct *vma)
        struct drm_vma_offset_node *node;
        int ret;
 
-       if (drm_device_is_unplugged(dev))
+       if (drm_dev_is_unplugged(dev))
                return -ENODEV;
 
        drm_vma_offset_lock_lookup(dev->vma_offset_manager);
index 275ab872b34f6cba602a8b267119cf7234e5a02d..f4e00571839d52fcb89408ca63890c5712ff085e 100644 (file)
@@ -390,7 +390,7 @@ unsigned long drm_gem_cma_get_unmapped_area(struct file *filp,
        struct drm_device *dev = priv->minor->dev;
        struct drm_vma_offset_node *node;
 
-       if (drm_device_is_unplugged(dev))
+       if (drm_dev_is_unplugged(dev))
                return -ENODEV;
 
        drm_vma_offset_lock_lookup(dev->vma_offset_manager);
index 8bfeb32f8a10177dc80b3e6b1581b1e61752e165..d920b2118a3905f5af2f8e1d0179e468cccabb27 100644 (file)
@@ -716,7 +716,7 @@ long drm_ioctl_kernel(struct file *file, drm_ioctl_t *func, void *kdata,
        struct drm_device *dev = file_priv->minor->dev;
        int retcode;
 
-       if (drm_device_is_unplugged(dev))
+       if (drm_dev_is_unplugged(dev))
                return -ENODEV;
 
        retcode = drm_ioctl_permit(flags, file_priv);
@@ -765,7 +765,7 @@ long drm_ioctl(struct file *filp,
 
        dev = file_priv->minor->dev;
 
-       if (drm_device_is_unplugged(dev))
+       if (drm_dev_is_unplugged(dev))
                return -ENODEV;
 
        is_driver_ioctl = nr >= DRM_COMMAND_BASE && nr < DRM_COMMAND_END;
index 1170b3209a1269aff7c1cfa3692b0fe73b413bb8..13a59ed2afbc4112568a62aba71d9857aadf940a 100644 (file)
@@ -631,7 +631,7 @@ int drm_legacy_mmap(struct file *filp, struct vm_area_struct *vma)
        struct drm_device *dev = priv->minor->dev;
        int ret;
 
-       if (drm_device_is_unplugged(dev))
+       if (drm_dev_is_unplugged(dev))
                return -ENODEV;
 
        mutex_lock(&dev->struct_mutex);
index f224b54a30f6b96b1492cce8f88b9ded00abac56..177e9d861001ad1d386d7d7c76398174c347fe0b 100644 (file)
@@ -56,7 +56,7 @@ static const struct drm_connector_helper_funcs tinydrm_connector_hfuncs = {
 static enum drm_connector_status
 tinydrm_connector_detect(struct drm_connector *connector, bool force)
 {
-       if (drm_device_is_unplugged(connector->dev))
+       if (drm_dev_is_unplugged(connector->dev))
                return connector_status_disconnected;
 
        return connector->status;
index d2f57c52f7db2c74dcba7bcc35a6a3c622009cbe..9f9a49748d176c7e8b53833968daded5ea646631 100644 (file)
@@ -96,7 +96,7 @@ static int udl_mode_valid(struct drm_connector *connector,
 static enum drm_connector_status
 udl_detect(struct drm_connector *connector, bool force)
 {
-       if (drm_device_is_unplugged(connector->dev))
+       if (drm_dev_is_unplugged(connector->dev))
                return connector_status_disconnected;
        return connector_status_connected;
 }
index 0f02e1acf0bab45d6f9633163b31ab603fc5de5e..96c44ede5d69323fd314c2926e2394806090a7d8 100644 (file)
@@ -102,7 +102,7 @@ static void udl_usb_disconnect(struct usb_interface *interface)
        drm_kms_helper_poll_disable(dev);
        udl_fbdev_unplug(dev);
        udl_drop_usb(dev);
-       drm_unplug_dev(dev);
+       drm_dev_unplug(dev);
 }
 
 /*
index a5c54dc60defca97b4775adeac3b9987274968da..77a2c59c56a1af153dd41d8bbc0b8755e61f10d8 100644 (file)
@@ -198,7 +198,7 @@ static int udl_fb_open(struct fb_info *info, int user)
        struct udl_device *udl = dev->dev_private;
 
        /* If the USB device is gone, we don't accept new opens */
-       if (drm_device_is_unplugged(udl->ddev))
+       if (drm_dev_is_unplugged(udl->ddev))
                return -ENODEV;
 
        ufbdev->fb_count++;
index 3031c256105ef1f92c78ad230ba9b816eaf69567..7277783a4ff00c1db7c3816c73547f4e0defd96b 100644 (file)
@@ -320,19 +320,6 @@ static __inline__ int drm_core_check_feature(struct drm_device *dev,
        return ((dev->driver->driver_features & feature) ? 1 : 0);
 }
 
-static inline void drm_device_set_unplugged(struct drm_device *dev)
-{
-       smp_wmb();
-       atomic_set(&dev->unplugged, 1);
-}
-
-static inline int drm_device_is_unplugged(struct drm_device *dev)
-{
-       int ret = atomic_read(&dev->unplugged);
-       smp_rmb();
-       return ret;
-}
-
 /******************************************************************/
 /** \name Internal function definitions */
 /*@{*/
index 505c9135480237ebffd82a883f5d5ad82e33b053..71bbaaec836d29f491fc78c74c5fa4801873fa9b 100644 (file)
@@ -30,7 +30,8 @@
 #include <linux/list.h>
 #include <linux/irqreturn.h>
 
-struct drm_device;
+#include <drm/drm_device.h>
+
 struct drm_file;
 struct drm_gem_object;
 struct drm_master;
@@ -613,7 +614,24 @@ void drm_dev_unregister(struct drm_device *dev);
 void drm_dev_ref(struct drm_device *dev);
 void drm_dev_unref(struct drm_device *dev);
 void drm_put_dev(struct drm_device *dev);
-void drm_unplug_dev(struct drm_device *dev);
+void drm_dev_unplug(struct drm_device *dev);
+
+/**
+ * drm_dev_is_unplugged - is a DRM device unplugged
+ * @dev: DRM device
+ *
+ * This function can be called to check whether a hotpluggable is unplugged.
+ * Unplugging itself is singalled through drm_dev_unplug(). If a device is
+ * unplugged, these two functions guarantee that any store before calling
+ * drm_dev_unplug() is visible to callers of this function after it completes
+ */
+static inline int drm_dev_is_unplugged(struct drm_device *dev)
+{
+       int ret = atomic_read(&dev->unplugged);
+       smp_rmb();
+       return ret;
+}
+
 
 int drm_dev_set_unique(struct drm_device *dev, const char *name);