diff options
author | dumbbell <dumbbell@FreeBSD.org> | 2013-08-25 09:58:31 +0000 |
---|---|---|
committer | dumbbell <dumbbell@FreeBSD.org> | 2013-08-25 09:58:31 +0000 |
commit | 71cbc49bf8557d2544373c2468241a0178d34fdc (patch) | |
tree | 4df0fffce27d7b476376a6331ab8af0e03f8971b | |
parent | 1102975996e1a5a7022338cf02297fce47e29901 (diff) | |
download | FreeBSD-src-71cbc49bf8557d2544373c2468241a0178d34fdc.zip FreeBSD-src-71cbc49bf8557d2544373c2468241a0178d34fdc.tar.gz |
drm: Support gem_open_object() and gem_close_object() callbacks
... in struct drm_driver_info.
-rw-r--r-- | sys/dev/drm2/drmP.h | 2 | ||||
-rw-r--r-- | sys/dev/drm2/drm_gem.c | 24 |
2 files changed, 22 insertions, 4 deletions
diff --git a/sys/dev/drm2/drmP.h b/sys/dev/drm2/drmP.h index 089f277..23e57a9 100644 --- a/sys/dev/drm2/drmP.h +++ b/sys/dev/drm2/drmP.h @@ -737,6 +737,8 @@ struct drm_driver_info { int (*gem_init_object)(struct drm_gem_object *obj); void (*gem_free_object)(struct drm_gem_object *obj); + int (*gem_open_object)(struct drm_gem_object *, struct drm_file *); + void (*gem_close_object)(struct drm_gem_object *, struct drm_file *); struct cdev_pager_ops *gem_pager_ops; diff --git a/sys/dev/drm2/drm_gem.c b/sys/dev/drm2/drm_gem.c index fc97764..5604580 100644 --- a/sys/dev/drm2/drm_gem.c +++ b/sys/dev/drm2/drm_gem.c @@ -242,24 +242,40 @@ int drm_gem_handle_create(struct drm_file *file_priv, struct drm_gem_object *obj, uint32_t *handle) { - int error; + struct drm_device *dev = obj->dev; + int ret; - error = drm_gem_name_create(&file_priv->object_names, obj, handle); - if (error != 0) - return (error); + ret = drm_gem_name_create(&file_priv->object_names, obj, handle); + if (ret != 0) + return (ret); drm_gem_object_handle_reference(obj); + + if (dev->driver->gem_open_object) { + ret = dev->driver->gem_open_object(obj, file_priv); + if (ret) { + drm_gem_handle_delete(file_priv, *handle); + return ret; + } + } + return (0); } int drm_gem_handle_delete(struct drm_file *file_priv, uint32_t handle) { + struct drm_device *dev; struct drm_gem_object *obj; obj = drm_gem_names_remove(&file_priv->object_names, handle); if (obj == NULL) return (EINVAL); + + dev = obj->dev; + if (dev->driver->gem_close_object) + dev->driver->gem_close_object(obj, file_priv); drm_gem_object_handle_unreference_unlocked(obj); + return (0); } |