[PATCH] drm/core: add ioctl to query device/driver capabilities

Kristian Høgsberg krh at bitplanet.net
Mon Feb 21 06:46:16 PST 2011


On Sun, Feb 20, 2011 at 8:17 PM, Ben Skeggs <skeggsb at gmail.com> wrote:
> From: Ben Skeggs <bskeggs at redhat.com>
>
> We're coming to see a need to have a set of generic capability checks in
> the core DRM, in addition to the driver-specific ioctls that already
> exist.

Looks good to me, just one comment: I don't think we need the driver
callout.  We only need the drm get cap for generic drm features and
drm itself should know whether or not it has the support, typically by
looking at the driver_features flags.

Kristian

> This patch defines an ioctl to do as such, but does not yet define any
> capabilities.
>
> Signed-off-by: Ben Skeggs <bskeggs at redhat.com>
> ---
>  drivers/gpu/drm/drm_drv.c   |    1 +
>  drivers/gpu/drm/drm_ioctl.c |   13 +++++++++++++
>  include/drm/drm.h           |    7 +++++++
>  include/drm/drmP.h          |    9 +++++++++
>  4 files changed, 30 insertions(+), 0 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_drv.c b/drivers/gpu/drm/drm_drv.c
> index 271835a..ad86135 100644
> --- a/drivers/gpu/drm/drm_drv.c
> +++ b/drivers/gpu/drm/drm_drv.c
> @@ -67,6 +67,7 @@ static struct drm_ioctl_desc drm_ioctls[] = {
>        DRM_IOCTL_DEF(DRM_IOCTL_GET_MAP, drm_getmap, 0),
>        DRM_IOCTL_DEF(DRM_IOCTL_GET_CLIENT, drm_getclient, 0),
>        DRM_IOCTL_DEF(DRM_IOCTL_GET_STATS, drm_getstats, 0),
> +       DRM_IOCTL_DEF(DRM_IOCTL_GET_CAP, drm_getcap, 0),
>        DRM_IOCTL_DEF(DRM_IOCTL_SET_VERSION, drm_setversion, DRM_MASTER),
>
>        DRM_IOCTL_DEF(DRM_IOCTL_SET_UNIQUE, drm_setunique, DRM_AUTH|DRM_MASTER|DRM_ROOT_ONLY),
> diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
> index 47db4df..15a244b 100644
> --- a/drivers/gpu/drm/drm_ioctl.c
> +++ b/drivers/gpu/drm/drm_ioctl.c
> @@ -365,6 +365,19 @@ int drm_getstats(struct drm_device *dev, void *data,
>  }
>
>  /**
> + * Get device/driver capabilities
> + */
> +int drm_getcap(struct drm_device *dev, void *data, struct drm_file *file_priv)
> +{
> +       struct drm_get_cap *req = data;
> +
> +       req->value = 0;
> +       if (dev->driver->get_cap)
> +               req->value = (*dev->driver->get_cap)(dev, req->capability);
> +       return 0;
> +}
> +
> +/**
>  * Setversion ioctl.
>  *
>  * \param inode device inode.
> diff --git a/include/drm/drm.h b/include/drm/drm.h
> index e5f7061..7254f1a 100644
> --- a/include/drm/drm.h
> +++ b/include/drm/drm.h
> @@ -608,6 +608,12 @@ struct drm_gem_open {
>        __u64 size;
>  };
>
> +/** DRM_IOCTL_GET_CAP ioctl argument type */
> +struct drm_get_cap {
> +       __u64 capability;
> +       __u64 value;
> +};
> +
>  #include "drm_mode.h"
>
>  #define DRM_IOCTL_BASE                 'd'
> @@ -628,6 +634,7 @@ struct drm_gem_open {
>  #define DRM_IOCTL_GEM_CLOSE            DRM_IOW (0x09, struct drm_gem_close)
>  #define DRM_IOCTL_GEM_FLINK            DRM_IOWR(0x0a, struct drm_gem_flink)
>  #define DRM_IOCTL_GEM_OPEN             DRM_IOWR(0x0b, struct drm_gem_open)
> +#define DRM_IOCTL_GET_CAP              DRM_IOWR(0x0c, struct drm_get_cap)
>
>  #define DRM_IOCTL_SET_UNIQUE           DRM_IOW( 0x10, struct drm_unique)
>  #define DRM_IOCTL_AUTH_MAGIC           DRM_IOW( 0x11, struct drm_auth)
> diff --git a/include/drm/drmP.h b/include/drm/drmP.h
> index fe29aad..a3d5ce8 100644
> --- a/include/drm/drmP.h
> +++ b/include/drm/drmP.h
> @@ -869,6 +869,13 @@ struct drm_driver {
>        void (*debugfs_cleanup)(struct drm_minor *minor);
>
>        /**
> +        * Driver-specific routine to query capabilities of device/driver.
> +        *
> +        * If not present, core drm will assume a return value of 0.
> +        */
> +       u64 (*get_cap)(struct drm_device *dev, u64 cap);
> +
> +       /**
>         * Driver-specific constructor for drm_gem_objects, to set up
>         * obj->driver_private.
>         *
> @@ -1264,6 +1271,8 @@ extern int drm_getclient(struct drm_device *dev, void *data,
>                         struct drm_file *file_priv);
>  extern int drm_getstats(struct drm_device *dev, void *data,
>                        struct drm_file *file_priv);
> +extern int drm_getcap(struct drm_device *dev, void *data,
> +                     struct drm_file *file_priv);
>  extern int drm_setversion(struct drm_device *dev, void *data,
>                          struct drm_file *file_priv);
>  extern int drm_noop(struct drm_device *dev, void *data,
> --
> 1.7.4
>
>


More information about the dri-devel mailing list