[PATCH v3 1/4] drm: Introduce drm_dev_set_unique()

David Herrmann dh.herrmann at gmail.com
Thu May 22 04:06:08 PDT 2014


Hi

On Thu, May 22, 2014 at 12:21 PM, Thierry Reding
<thierry.reding at gmail.com> wrote:
> From: Thierry Reding <treding at nvidia.com>
>
> Add a helper function that allows drivers to statically set the unique
> name of the device. This will allow platform and USB drivers to get rid
> of their DRM bus implementations and directly use drm_dev_alloc() and
> drm_dev_register().
>
> Reviewed-by: Daniel Vetter <daniel.vetter at ffwll.ch>
> Signed-off-by: Thierry Reding <treding at nvidia.com>

Reviewed-by: David Herrmann <dh.herrmann at gmail.com>

Thanks
David

> ---
> Changes in v3:
> - address comments by David Herrmann:
>   - return -EINVAL when dev->unique not set in drm_set_busid()
>   - group together drm_dev_*() functions
>   - use drm_dev_ prefix
>
> Changes in v2:
> - move drm_set_unique() to drivers/gpu/drm/drm_stub.c
> - add kernel-doc
>
>  drivers/gpu/drm/drm_ioctl.c | 24 ++++++++++++++++++------
>  drivers/gpu/drm/drm_stub.c  | 26 ++++++++++++++++++++++++++
>  include/drm/drmP.h          |  2 ++
>  3 files changed, 46 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
> index 38269d5aa333..69c61f392e66 100644
> --- a/drivers/gpu/drm/drm_ioctl.c
> +++ b/drivers/gpu/drm/drm_ioctl.c
> @@ -131,13 +131,25 @@ static int drm_set_busid(struct drm_device *dev, struct drm_file *file_priv)
>         if (master->unique != NULL)
>                 drm_unset_busid(dev, master);
>
> -       ret = dev->driver->bus->set_busid(dev, master);
> -       if (ret)
> -               goto err;
> +       if (dev->driver->bus && dev->driver->bus->set_busid) {
> +               ret = dev->driver->bus->set_busid(dev, master);
> +               if (ret) {
> +                       drm_unset_busid(dev, master);
> +                       return ret;
> +               }
> +       } else {
> +               if (WARN(dev->unique == NULL,
> +                        "No drm_bus.set_busid() implementation provided by "
> +                        "%ps. Use drm_dev_set_unique() to set the unique "
> +                        "name explicitly.", dev->driver))
> +                       return -EINVAL;
> +
> +               master->unique = kstrdup(dev->unique, GFP_KERNEL);
> +               if (master->unique)
> +                       master->unique_len = strlen(dev->unique);
> +       }
> +
>         return 0;
> -err:
> -       drm_unset_busid(dev, master);
> -       return ret;
>  }
>
>  /**
> diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
> index 3727ac8bc310..6d55392376dd 100644
> --- a/drivers/gpu/drm/drm_stub.c
> +++ b/drivers/gpu/drm/drm_stub.c
> @@ -650,6 +650,7 @@ static void drm_dev_release(struct kref *ref)
>         drm_minor_free(dev, DRM_MINOR_CONTROL);
>
>         mutex_destroy(&dev->master_mutex);
> +       kfree(dev->unique);
>         kfree(dev);
>  }
>
> @@ -777,3 +778,28 @@ void drm_dev_unregister(struct drm_device *dev)
>         drm_minor_unregister(dev, DRM_MINOR_CONTROL);
>  }
>  EXPORT_SYMBOL(drm_dev_unregister);
> +
> +/**
> + * drm_dev_set_unique - Set the unique name of a DRM device
> + * @dev: device of which to set the unique name
> + * @fmt: format string for unique name
> + *
> + * Sets the unique name of a DRM device using the specified format string and
> + * a variable list of arguments. Drivers can use this at driver probe time if
> + * the unique name of the devices they drive is static.
> + *
> + * Return: 0 on success or a negative error code on failure.
> + */
> +int drm_dev_set_unique(struct drm_device *dev, const char *fmt, ...)
> +{
> +       va_list ap;
> +
> +       kfree(dev->unique);
> +
> +       va_start(ap, fmt);
> +       dev->unique = kvasprintf(GFP_KERNEL, fmt, ap);
> +       va_end(ap);
> +
> +       return dev->unique ? 0 : -ENOMEM;
> +}
> +EXPORT_SYMBOL(drm_dev_set_unique);
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index 12f10bc2395f..c511a3d63fd1 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -1055,6 +1055,7 @@ struct drm_device {
>         struct drm_minor *render;               /**< Render node */
>         atomic_t unplugged;                     /**< Flag whether dev is dead */
>         struct inode *anon_inode;               /**< inode for private address-space */
> +       char *unique;                           /**< unique name of the device */
>         /*@} */
>
>         /** \name Locks */
> @@ -1614,6 +1615,7 @@ void drm_dev_ref(struct drm_device *dev);
>  void drm_dev_unref(struct drm_device *dev);
>  int drm_dev_register(struct drm_device *dev, unsigned long flags);
>  void drm_dev_unregister(struct drm_device *dev);
> +int drm_dev_set_unique(struct drm_device *dev, const char *fmt, ...);
>
>  struct drm_minor *drm_minor_acquire(unsigned int minor_id);
>  void drm_minor_release(struct drm_minor *minor);
> --
> 1.9.2
>


More information about the dri-devel mailing list