diff options
Diffstat (limited to 'drivers/gpu/drm/vgem/vgem_drv.c')
| -rw-r--r-- | drivers/gpu/drm/vgem/vgem_drv.c | 39 | 
1 files changed, 26 insertions, 13 deletions
| diff --git a/drivers/gpu/drm/vgem/vgem_drv.c b/drivers/gpu/drm/vgem/vgem_drv.c index cb884c890065..9a413091abb6 100644 --- a/drivers/gpu/drm/vgem/vgem_drv.c +++ b/drivers/gpu/drm/vgem/vgem_drv.c @@ -50,6 +50,8 @@  #define DRIVER_MAJOR	1  #define DRIVER_MINOR	0 +static const struct drm_gem_object_funcs vgem_gem_object_funcs; +  static struct vgem_device {  	struct drm_device drm;  	struct platform_device *platform; @@ -167,6 +169,8 @@ static struct drm_vgem_gem_object *__vgem_gem_create(struct drm_device *dev,  	if (!obj)  		return ERR_PTR(-ENOMEM); +	obj->base.funcs = &vgem_gem_object_funcs; +  	ret = drm_gem_object_init(dev, &obj->base, roundup(size, PAGE_SIZE));  	if (ret) {  		kfree(obj); @@ -357,24 +361,30 @@ static struct drm_gem_object *vgem_prime_import_sg_table(struct drm_device *dev,  	return &obj->base;  } -static void *vgem_prime_vmap(struct drm_gem_object *obj) +static int vgem_prime_vmap(struct drm_gem_object *obj, struct dma_buf_map *map)  {  	struct drm_vgem_gem_object *bo = to_vgem_bo(obj);  	long n_pages = obj->size >> PAGE_SHIFT;  	struct page **pages; +	void *vaddr;  	pages = vgem_pin_pages(bo);  	if (IS_ERR(pages)) -		return NULL; +		return PTR_ERR(pages); + +	vaddr = vmap(pages, n_pages, 0, pgprot_writecombine(PAGE_KERNEL)); +	if (!vaddr) +		return -ENOMEM; +	dma_buf_map_set_vaddr(map, vaddr); -	return vmap(pages, n_pages, 0, pgprot_writecombine(PAGE_KERNEL)); +	return 0;  } -static void vgem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) +static void vgem_prime_vunmap(struct drm_gem_object *obj, struct dma_buf_map *map)  {  	struct drm_vgem_gem_object *bo = to_vgem_bo(obj); -	vunmap(vaddr); +	vunmap(map->vaddr);  	vgem_unpin_pages(bo);  } @@ -401,12 +411,20 @@ static int vgem_prime_mmap(struct drm_gem_object *obj,  	return 0;  } -static struct drm_driver vgem_driver = { +static const struct drm_gem_object_funcs vgem_gem_object_funcs = { +	.free = vgem_gem_free_object, +	.pin = vgem_prime_pin, +	.unpin = vgem_prime_unpin, +	.get_sg_table = vgem_prime_get_sg_table, +	.vmap = vgem_prime_vmap, +	.vunmap = vgem_prime_vunmap, +	.vm_ops = &vgem_gem_vm_ops, +}; + +static const struct drm_driver vgem_driver = {  	.driver_features		= DRIVER_GEM | DRIVER_RENDER,  	.open				= vgem_open,  	.postclose			= vgem_postclose, -	.gem_free_object_unlocked	= vgem_gem_free_object, -	.gem_vm_ops			= &vgem_gem_vm_ops,  	.ioctls				= vgem_ioctls,  	.num_ioctls 			= ARRAY_SIZE(vgem_ioctls),  	.fops				= &vgem_driver_fops, @@ -415,13 +433,8 @@ static struct drm_driver vgem_driver = {  	.prime_handle_to_fd = drm_gem_prime_handle_to_fd,  	.prime_fd_to_handle = drm_gem_prime_fd_to_handle, -	.gem_prime_pin = vgem_prime_pin, -	.gem_prime_unpin = vgem_prime_unpin,  	.gem_prime_import = vgem_prime_import,  	.gem_prime_import_sg_table = vgem_prime_import_sg_table, -	.gem_prime_get_sg_table = vgem_prime_get_sg_table, -	.gem_prime_vmap = vgem_prime_vmap, -	.gem_prime_vunmap = vgem_prime_vunmap,  	.gem_prime_mmap = vgem_prime_mmap,  	.name	= DRIVER_NAME, | 
