Commit 4c8e84b8 authored by Daniel Vetter's avatar Daniel Vetter

drm/managed: Cleanup of unused functions and polishing docs

Following functions are only used internally, not by drivers:
- devm_drm_dev_init

Also, now that we have a very slick and polished way to allocate a
drm_device with devm_drm_dev_alloc, update all the docs to reflect the
new reality. Mostly this consists of deleting old and misleading
hints. Two main ones:

- it is no longer required that the drm_device base class is first in
  the structure. devm_drm_dev_alloc can cope with it being anywhere

- obviously embedded now strongly recommends using devm_drm_dev_alloc

v2: Fix typos (Noralf)

v3: Split out the removal of drm_dev_init, that's blocked on some
discussions on how to convert vgem/vkms/i915-selftests. Adjust commit
message to reflect that.

Cc: Noralf Trønnes <noralf@tronnes.org>
Acked-by: Noralf Trønnes <noralf@tronnes.org> (v2)
Acked-by: default avatarSam Ravnborg <sam@ravnborg.org>
Cc: Luben Tuikov <luben.tuikov@amd.com>
Cc: amd-gfx@lists.freedesktop.org
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20200902072627.3617301-1-daniel.vetter@ffwll.ch
parent fe662d84
...@@ -263,7 +263,7 @@ DMA ...@@ -263,7 +263,7 @@ DMA
dmam_pool_destroy() dmam_pool_destroy()
DRM DRM
devm_drm_dev_init() devm_drm_dev_alloc()
GPIO GPIO
devm_gpiod_get() devm_gpiod_get()
......
...@@ -240,13 +240,13 @@ void drm_minor_release(struct drm_minor *minor) ...@@ -240,13 +240,13 @@ void drm_minor_release(struct drm_minor *minor)
* DOC: driver instance overview * DOC: driver instance overview
* *
* A device instance for a drm driver is represented by &struct drm_device. This * A device instance for a drm driver is represented by &struct drm_device. This
* is initialized with drm_dev_init(), usually from bus-specific ->probe() * is allocated and initialized with devm_drm_dev_alloc(), usually from
* callbacks implemented by the driver. The driver then needs to initialize all * bus-specific ->probe() callbacks implemented by the driver. The driver then
* the various subsystems for the drm device like memory management, vblank * needs to initialize all the various subsystems for the drm device like memory
* handling, modesetting support and intial output configuration plus obviously * management, vblank handling, modesetting support and initial output
* initialize all the corresponding hardware bits. Finally when everything is up * configuration plus obviously initialize all the corresponding hardware bits.
* and running and ready for userspace the device instance can be published * Finally when everything is up and running and ready for userspace the device
* using drm_dev_register(). * instance can be published using drm_dev_register().
* *
* There is also deprecated support for initalizing device instances using * There is also deprecated support for initalizing device instances using
* bus-specific helpers and the &drm_driver.load callback. But due to * bus-specific helpers and the &drm_driver.load callback. But due to
...@@ -274,7 +274,7 @@ void drm_minor_release(struct drm_minor *minor) ...@@ -274,7 +274,7 @@ void drm_minor_release(struct drm_minor *minor)
* *
* The following example shows a typical structure of a DRM display driver. * The following example shows a typical structure of a DRM display driver.
* The example focus on the probe() function and the other functions that is * The example focus on the probe() function and the other functions that is
* almost always present and serves as a demonstration of devm_drm_dev_init(). * almost always present and serves as a demonstration of devm_drm_dev_alloc().
* *
* .. code-block:: c * .. code-block:: c
* *
...@@ -294,22 +294,12 @@ void drm_minor_release(struct drm_minor *minor) ...@@ -294,22 +294,12 @@ void drm_minor_release(struct drm_minor *minor)
* struct drm_device *drm; * struct drm_device *drm;
* int ret; * int ret;
* *
* // devm_kzalloc() can't be used here because the drm_device ' * priv = devm_drm_dev_alloc(&pdev->dev, &driver_drm_driver,
* // lifetime can exceed the device lifetime if driver unbind * struct driver_device, drm);
* // happens when userspace still has open file descriptors. * if (IS_ERR(priv))
* priv = kzalloc(sizeof(*priv), GFP_KERNEL); * return PTR_ERR(priv);
* if (!priv)
* return -ENOMEM;
*
* drm = &priv->drm; * drm = &priv->drm;
* *
* ret = devm_drm_dev_init(&pdev->dev, drm, &driver_drm_driver);
* if (ret) {
* kfree(priv);
* return ret;
* }
* drmm_add_final_kfree(drm, priv);
*
* ret = drmm_mode_config_init(drm); * ret = drmm_mode_config_init(drm);
* if (ret) * if (ret)
* return ret; * return ret;
...@@ -550,9 +540,9 @@ static void drm_fs_inode_free(struct inode *inode) ...@@ -550,9 +540,9 @@ static void drm_fs_inode_free(struct inode *inode)
* following guidelines apply: * following guidelines apply:
* *
* - The entire device initialization procedure should be run from the * - The entire device initialization procedure should be run from the
* &component_master_ops.master_bind callback, starting with drm_dev_init(), * &component_master_ops.master_bind callback, starting with
* then binding all components with component_bind_all() and finishing with * devm_drm_dev_alloc(), then binding all components with
* drm_dev_register(). * component_bind_all() and finishing with drm_dev_register().
* *
* - The opaque pointer passed to all components through component_bind_all() * - The opaque pointer passed to all components through component_bind_all()
* should point at &struct drm_device of the device instance, not some driver * should point at &struct drm_device of the device instance, not some driver
...@@ -706,24 +696,9 @@ static void devm_drm_dev_init_release(void *data) ...@@ -706,24 +696,9 @@ static void devm_drm_dev_init_release(void *data)
drm_dev_put(data); drm_dev_put(data);
} }
/** static int devm_drm_dev_init(struct device *parent,
* devm_drm_dev_init - Resource managed drm_dev_init() struct drm_device *dev,
* @parent: Parent device object struct drm_driver *driver)
* @dev: DRM device
* @driver: DRM driver
*
* Managed drm_dev_init(). The DRM device initialized with this function is
* automatically put on driver detach using drm_dev_put().
*
* Note that drivers must call drmm_add_final_kfree() after this function has
* completed successfully.
*
* RETURNS:
* 0 on success, or error code on failure.
*/
int devm_drm_dev_init(struct device *parent,
struct drm_device *dev,
struct drm_driver *driver)
{ {
int ret; int ret;
...@@ -737,7 +712,6 @@ int devm_drm_dev_init(struct device *parent, ...@@ -737,7 +712,6 @@ int devm_drm_dev_init(struct device *parent,
return ret; return ret;
} }
EXPORT_SYMBOL(devm_drm_dev_init);
void *__devm_drm_dev_alloc(struct device *parent, struct drm_driver *driver, void *__devm_drm_dev_alloc(struct device *parent, struct drm_driver *driver,
size_t size, size_t offset) size_t size, size_t offset)
...@@ -767,19 +741,9 @@ EXPORT_SYMBOL(__devm_drm_dev_alloc); ...@@ -767,19 +741,9 @@ EXPORT_SYMBOL(__devm_drm_dev_alloc);
* @driver: DRM driver to allocate device for * @driver: DRM driver to allocate device for
* @parent: Parent device object * @parent: Parent device object
* *
* Allocate and initialize a new DRM device. No device registration is done. * This is the deprecated version of devm_drm_dev_alloc(), which does not support
* Call drm_dev_register() to advertice the device to user space and register it * subclassing through embedding the struct &drm_device in a driver private
* with other core subsystems. This should be done last in the device * structure, and which does not support automatic cleanup through devres.
* initialization sequence to make sure userspace can't access an inconsistent
* state.
*
* The initial ref-count of the object is 1. Use drm_dev_get() and
* drm_dev_put() to take and drop further ref-counts.
*
* Note that for purely virtual devices @parent can be NULL.
*
* Drivers that wish to subclass or embed &struct drm_device into their
* own struct should look at using drm_dev_init() instead.
* *
* RETURNS: * RETURNS:
* Pointer to new DRM device, or ERR_PTR on failure. * Pointer to new DRM device, or ERR_PTR on failure.
......
...@@ -27,7 +27,7 @@ ...@@ -27,7 +27,7 @@
* be done directly with drmm_kmalloc() and the related functions. Everything * be done directly with drmm_kmalloc() and the related functions. Everything
* will be released on the final drm_dev_put() in reverse order of how the * will be released on the final drm_dev_put() in reverse order of how the
* release actions have been added and memory has been allocated since driver * release actions have been added and memory has been allocated since driver
* loading started with drm_dev_init(). * loading started with devm_drm_dev_alloc().
* *
* Note that release actions and managed memory can also be added and removed * Note that release actions and managed memory can also be added and removed
* during the lifetime of the driver, all the functions are fully concurrent * during the lifetime of the driver, all the functions are fully concurrent
......
...@@ -92,7 +92,7 @@ struct drm_device { ...@@ -92,7 +92,7 @@ struct drm_device {
* NULL. * NULL.
* *
* Instead of using this pointer it is recommended that drivers use * Instead of using this pointer it is recommended that drivers use
* drm_dev_init() and embed struct &drm_device in their larger * devm_drm_dev_alloc() and embed struct &drm_device in their larger
* per-device structure. * per-device structure.
*/ */
void *dev_private; void *dev_private;
......
...@@ -163,13 +163,12 @@ struct drm_driver { ...@@ -163,13 +163,12 @@ struct drm_driver {
/** /**
* @load: * @load:
* *
* Backward-compatible driver callback to complete * Backward-compatible driver callback to complete initialization steps
* initialization steps after the driver is registered. For * after the driver is registered. For this reason, may suffer from
* this reason, may suffer from race conditions and its use is * race conditions and its use is deprecated for new drivers. It is
* deprecated for new drivers. It is therefore only supported * therefore only supported for existing drivers not yet converted to
* for existing drivers not yet converted to the new scheme. * the new scheme. See devm_drm_dev_alloc() and drm_dev_register() for
* See drm_dev_init() and drm_dev_register() for proper and * proper and race-free way to set up a &struct drm_device.
* race-free way to set up a &struct drm_device.
* *
* This is deprecated, do not use! * This is deprecated, do not use!
* *
...@@ -592,9 +591,6 @@ struct drm_driver { ...@@ -592,9 +591,6 @@ struct drm_driver {
int drm_dev_init(struct drm_device *dev, int drm_dev_init(struct drm_device *dev,
struct drm_driver *driver, struct drm_driver *driver,
struct device *parent); struct device *parent);
int devm_drm_dev_init(struct device *parent,
struct drm_device *dev,
struct drm_driver *driver);
void *__devm_drm_dev_alloc(struct device *parent, struct drm_driver *driver, void *__devm_drm_dev_alloc(struct device *parent, struct drm_driver *driver,
size_t size, size_t offset); size_t size, size_t offset);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment