drm: Remove obsolete GEM and PRIME callbacks from struct drm_driver
Several GEM and PRIME callbacks have been deprecated in favor of per-instance GEM object functions. Remove the callbacks as they are now unused. The only exception is .gem_prime_mmap, which is still in use by several drivers. What is also gone is gem_vm_ops in struct drm_driver. All drivers now use struct drm_gem_object_funcs.vm_ops instead. While at it, the patch also improves error handling around calls to .free and .get_sg_table callbacks. v3: * restore default call to drm_gem_prime_export() in drm_gem_prime_handle_to_fd() * return -ENOSYS if get_sg_table is not set * drop all checks for obj->funcs * clean up TODO list and documentation v2: * update related TODO item (Sam) Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Acked-by: Daniel Vetter <daniel.vetter@ffwll.ch> Acked-by: Christian König <christian.koenig@amd.com> Link: https://patchwork.freedesktop.org/patch/msgid/20200923102159.24084-23-tzimmermann@suse.de
This commit is contained in:
@@ -247,12 +247,9 @@ drm_gem_object_release_handle(int id, void *ptr, void *data)
|
||||
{
|
||||
struct drm_file *file_priv = data;
|
||||
struct drm_gem_object *obj = ptr;
|
||||
struct drm_device *dev = obj->dev;
|
||||
|
||||
if (obj->funcs && obj->funcs->close)
|
||||
if (obj->funcs->close)
|
||||
obj->funcs->close(obj, file_priv);
|
||||
else if (dev->driver->gem_close_object)
|
||||
dev->driver->gem_close_object(obj, file_priv);
|
||||
|
||||
drm_gem_remove_prime_handles(obj, file_priv);
|
||||
drm_vma_node_revoke(&obj->vma_node, file_priv);
|
||||
@@ -403,14 +400,10 @@ drm_gem_handle_create_tail(struct drm_file *file_priv,
|
||||
if (ret)
|
||||
goto err_remove;
|
||||
|
||||
if (obj->funcs && obj->funcs->open) {
|
||||
if (obj->funcs->open) {
|
||||
ret = obj->funcs->open(obj, file_priv);
|
||||
if (ret)
|
||||
goto err_revoke;
|
||||
} else if (dev->driver->gem_open_object) {
|
||||
ret = dev->driver->gem_open_object(obj, file_priv);
|
||||
if (ret)
|
||||
goto err_revoke;
|
||||
}
|
||||
|
||||
*handlep = handle;
|
||||
@@ -982,12 +975,11 @@ drm_gem_object_free(struct kref *kref)
|
||||
{
|
||||
struct drm_gem_object *obj =
|
||||
container_of(kref, struct drm_gem_object, refcount);
|
||||
struct drm_device *dev = obj->dev;
|
||||
|
||||
if (obj->funcs)
|
||||
obj->funcs->free(obj);
|
||||
else if (dev->driver->gem_free_object_unlocked)
|
||||
dev->driver->gem_free_object_unlocked(obj);
|
||||
if (WARN_ON(!obj->funcs->free))
|
||||
return;
|
||||
|
||||
obj->funcs->free(obj);
|
||||
}
|
||||
EXPORT_SYMBOL(drm_gem_object_free);
|
||||
|
||||
@@ -1049,9 +1041,9 @@ EXPORT_SYMBOL(drm_gem_vm_close);
|
||||
* @obj_size: the object size to be mapped, in bytes
|
||||
* @vma: VMA for the area to be mapped
|
||||
*
|
||||
* Set up the VMA to prepare mapping of the GEM object using the gem_vm_ops
|
||||
* provided by the driver. Depending on their requirements, drivers can either
|
||||
* provide a fault handler in their gem_vm_ops (in which case any accesses to
|
||||
* Set up the VMA to prepare mapping of the GEM object using the GEM object's
|
||||
* vm_ops. Depending on their requirements, GEM objects can either
|
||||
* provide a fault handler in their vm_ops (in which case any accesses to
|
||||
* the object will be trapped, to perform migration, GTT binding, surface
|
||||
* register allocation, or performance monitoring), or mmap the buffer memory
|
||||
* synchronously after calling drm_gem_mmap_obj.
|
||||
@@ -1065,12 +1057,11 @@ EXPORT_SYMBOL(drm_gem_vm_close);
|
||||
* callers must verify access restrictions before calling this helper.
|
||||
*
|
||||
* Return 0 or success or -EINVAL if the object size is smaller than the VMA
|
||||
* size, or if no gem_vm_ops are provided.
|
||||
* size, or if no vm_ops are provided.
|
||||
*/
|
||||
int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
|
||||
struct vm_area_struct *vma)
|
||||
{
|
||||
struct drm_device *dev = obj->dev;
|
||||
int ret;
|
||||
|
||||
/* Check for valid size. */
|
||||
@@ -1085,7 +1076,7 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
|
||||
*/
|
||||
drm_gem_object_get(obj);
|
||||
|
||||
if (obj->funcs && obj->funcs->mmap) {
|
||||
if (obj->funcs->mmap) {
|
||||
ret = obj->funcs->mmap(obj, vma);
|
||||
if (ret) {
|
||||
drm_gem_object_put(obj);
|
||||
@@ -1093,10 +1084,8 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,
|
||||
}
|
||||
WARN_ON(!(vma->vm_flags & VM_DONTEXPAND));
|
||||
} else {
|
||||
if (obj->funcs && obj->funcs->vm_ops)
|
||||
if (obj->funcs->vm_ops)
|
||||
vma->vm_ops = obj->funcs->vm_ops;
|
||||
else if (dev->driver->gem_vm_ops)
|
||||
vma->vm_ops = dev->driver->gem_vm_ops;
|
||||
else {
|
||||
drm_gem_object_put(obj);
|
||||
return -EINVAL;
|
||||
@@ -1198,36 +1187,30 @@ void drm_gem_print_info(struct drm_printer *p, unsigned int indent,
|
||||
drm_printf_indent(p, indent, "imported=%s\n",
|
||||
obj->import_attach ? "yes" : "no");
|
||||
|
||||
if (obj->funcs && obj->funcs->print_info)
|
||||
if (obj->funcs->print_info)
|
||||
obj->funcs->print_info(p, indent, obj);
|
||||
}
|
||||
|
||||
int drm_gem_pin(struct drm_gem_object *obj)
|
||||
{
|
||||
if (obj->funcs && obj->funcs->pin)
|
||||
if (obj->funcs->pin)
|
||||
return obj->funcs->pin(obj);
|
||||
else if (obj->dev->driver->gem_prime_pin)
|
||||
return obj->dev->driver->gem_prime_pin(obj);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
void drm_gem_unpin(struct drm_gem_object *obj)
|
||||
{
|
||||
if (obj->funcs && obj->funcs->unpin)
|
||||
if (obj->funcs->unpin)
|
||||
obj->funcs->unpin(obj);
|
||||
else if (obj->dev->driver->gem_prime_unpin)
|
||||
obj->dev->driver->gem_prime_unpin(obj);
|
||||
}
|
||||
|
||||
void *drm_gem_vmap(struct drm_gem_object *obj)
|
||||
{
|
||||
void *vaddr;
|
||||
|
||||
if (obj->funcs && obj->funcs->vmap)
|
||||
if (obj->funcs->vmap)
|
||||
vaddr = obj->funcs->vmap(obj);
|
||||
else if (obj->dev->driver->gem_prime_vmap)
|
||||
vaddr = obj->dev->driver->gem_prime_vmap(obj);
|
||||
else
|
||||
vaddr = ERR_PTR(-EOPNOTSUPP);
|
||||
|
||||
@@ -1242,10 +1225,8 @@ void drm_gem_vunmap(struct drm_gem_object *obj, void *vaddr)
|
||||
if (!vaddr)
|
||||
return;
|
||||
|
||||
if (obj->funcs && obj->funcs->vunmap)
|
||||
if (obj->funcs->vunmap)
|
||||
obj->funcs->vunmap(obj, vaddr);
|
||||
else if (obj->dev->driver->gem_prime_vunmap)
|
||||
obj->dev->driver->gem_prime_vunmap(obj, vaddr);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user