diff options
Diffstat (limited to 'drivers/gpu/drm/drm_gem.c')
| -rw-r--r-- | drivers/gpu/drm/drm_gem.c | 84 | 
1 files changed, 35 insertions, 49 deletions
| diff --git a/drivers/gpu/drm/drm_gem.c b/drivers/gpu/drm/drm_gem.c index 69c2c079d803..92f89cee213e 100644 --- a/drivers/gpu/drm/drm_gem.c +++ b/drivers/gpu/drm/drm_gem.c @@ -36,6 +36,7 @@  #include <linux/pagemap.h>  #include <linux/shmem_fs.h>  #include <linux/dma-buf.h> +#include <linux/dma-buf-map.h>  #include <linux/mem_encrypt.h>  #include <linux/pagevec.h> @@ -247,12 +248,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 +401,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; @@ -873,7 +867,7 @@ err:  }  /** - * drm_gem_open - implementation of the GEM_OPEN ioctl + * drm_gem_open_ioctl - implementation of the GEM_OPEN ioctl   * @dev: drm_device   * @data: ioctl data   * @file_priv: drm file-private structure @@ -918,7 +912,7 @@ err:  }  /** - * gem_gem_open - initalizes GEM file-private structures at devnode open time + * drm_gem_open - initalizes GEM file-private structures at devnode open time   * @dev: drm_device which is being opened by userspace   * @file_private: drm file-private structure to set up   * @@ -982,12 +976,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 +1042,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 +1058,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. */ @@ -1087,7 +1079,7 @@ int drm_gem_mmap_obj(struct drm_gem_object *obj, unsigned long obj_size,  	vma->vm_private_data = obj; -	if (obj->funcs && obj->funcs->mmap) { +	if (obj->funcs->mmap) {  		ret = obj->funcs->mmap(obj, vma);  		if (ret) {  			drm_gem_object_put(obj); @@ -1095,10 +1087,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,54 +1188,50 @@ 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) +int drm_gem_vmap(struct drm_gem_object *obj, struct dma_buf_map *map)  { -	void *vaddr; +	int ret; -	if (obj->funcs && 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); +	if (!obj->funcs->vmap) +		return -EOPNOTSUPP; -	if (!vaddr) -		vaddr = ERR_PTR(-ENOMEM); +	ret = obj->funcs->vmap(obj, map); +	if (ret) +		return ret; +	else if (dma_buf_map_is_null(map)) +		return -ENOMEM; -	return vaddr; +	return 0;  } -void drm_gem_vunmap(struct drm_gem_object *obj, void *vaddr) +void drm_gem_vunmap(struct drm_gem_object *obj, struct dma_buf_map *map)  { -	if (!vaddr) +	if (dma_buf_map_is_null(map))  		return; -	if (obj->funcs && obj->funcs->vunmap) -		obj->funcs->vunmap(obj, vaddr); -	else if (obj->dev->driver->gem_prime_vunmap) -		obj->dev->driver->gem_prime_vunmap(obj, vaddr); +	if (obj->funcs->vunmap) +		obj->funcs->vunmap(obj, map); + +	/* Always set the mapping to NULL. Callers may rely on this. */ +	dma_buf_map_clear(map);  }  /** | 
