drm: Support gem_open_object() and gem_close_object() callbacks
... in struct drm_driver_info.
This commit is contained in:
parent
b5185a8933
commit
1eeccc8f4c
@ -737,6 +737,8 @@ struct drm_driver_info {
|
|||||||
|
|
||||||
int (*gem_init_object)(struct drm_gem_object *obj);
|
int (*gem_init_object)(struct drm_gem_object *obj);
|
||||||
void (*gem_free_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;
|
struct cdev_pager_ops *gem_pager_ops;
|
||||||
|
|
||||||
|
@ -242,24 +242,40 @@ int
|
|||||||
drm_gem_handle_create(struct drm_file *file_priv, struct drm_gem_object *obj,
|
drm_gem_handle_create(struct drm_file *file_priv, struct drm_gem_object *obj,
|
||||||
uint32_t *handle)
|
uint32_t *handle)
|
||||||
{
|
{
|
||||||
int error;
|
struct drm_device *dev = obj->dev;
|
||||||
|
int ret;
|
||||||
|
|
||||||
error = drm_gem_name_create(&file_priv->object_names, obj, handle);
|
ret = drm_gem_name_create(&file_priv->object_names, obj, handle);
|
||||||
if (error != 0)
|
if (ret != 0)
|
||||||
return (error);
|
return (ret);
|
||||||
drm_gem_object_handle_reference(obj);
|
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);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
drm_gem_handle_delete(struct drm_file *file_priv, uint32_t handle)
|
drm_gem_handle_delete(struct drm_file *file_priv, uint32_t handle)
|
||||||
{
|
{
|
||||||
|
struct drm_device *dev;
|
||||||
struct drm_gem_object *obj;
|
struct drm_gem_object *obj;
|
||||||
|
|
||||||
obj = drm_gem_names_remove(&file_priv->object_names, handle);
|
obj = drm_gem_names_remove(&file_priv->object_names, handle);
|
||||||
if (obj == NULL)
|
if (obj == NULL)
|
||||||
return (EINVAL);
|
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);
|
drm_gem_object_handle_unreference_unlocked(obj);
|
||||||
|
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user