diff options
Diffstat (limited to 'drivers/gpu/drm/rockchip/rockchip_drm_gem.c')
| -rw-r--r-- | drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 35 | 
1 files changed, 26 insertions, 9 deletions
| diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index 62e5d0970525..7971f57436dd 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c @@ -10,6 +10,7 @@  #include <drm/drm.h>  #include <drm/drm_gem.h> +#include <drm/drm_gem_cma_helper.h>  #include <drm/drm_prime.h>  #include <drm/drm_vma_manager.h> @@ -295,6 +296,14 @@ static void rockchip_gem_release_object(struct rockchip_gem_object *rk_obj)  	kfree(rk_obj);  } +static const struct drm_gem_object_funcs rockchip_gem_object_funcs = { +	.free = rockchip_gem_free_object, +	.get_sg_table = rockchip_gem_prime_get_sg_table, +	.vmap = rockchip_gem_prime_vmap, +	.vunmap	= rockchip_gem_prime_vunmap, +	.vm_ops = &drm_gem_cma_vm_ops, +}; +  static struct rockchip_gem_object *  	rockchip_gem_alloc_object(struct drm_device *drm, unsigned int size)  { @@ -309,6 +318,8 @@ static struct rockchip_gem_object *  	obj = &rk_obj->base; +	obj->funcs = &rockchip_gem_object_funcs; +  	drm_gem_object_init(drm, obj, size);  	return rk_obj; @@ -337,7 +348,7 @@ err_free_rk_obj:  }  /* - * rockchip_gem_free_object - (struct drm_driver)->gem_free_object_unlocked + * rockchip_gem_free_object - (struct drm_gem_object_funcs)->free   * callback function   */  void rockchip_gem_free_object(struct drm_gem_object *obj) @@ -521,26 +532,32 @@ err_free_rk_obj:  	return ERR_PTR(ret);  } -void *rockchip_gem_prime_vmap(struct drm_gem_object *obj) +int rockchip_gem_prime_vmap(struct drm_gem_object *obj, struct dma_buf_map *map)  {  	struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj); -	if (rk_obj->pages) -		return vmap(rk_obj->pages, rk_obj->num_pages, VM_MAP, -			    pgprot_writecombine(PAGE_KERNEL)); +	if (rk_obj->pages) { +		void *vaddr = vmap(rk_obj->pages, rk_obj->num_pages, VM_MAP, +				  pgprot_writecombine(PAGE_KERNEL)); +		if (!vaddr) +			return -ENOMEM; +		dma_buf_map_set_vaddr(map, vaddr); +		return 0; +	}  	if (rk_obj->dma_attrs & DMA_ATTR_NO_KERNEL_MAPPING) -		return NULL; +		return -ENOMEM; +	dma_buf_map_set_vaddr(map, rk_obj->kvaddr); -	return rk_obj->kvaddr; +	return 0;  } -void rockchip_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) +void rockchip_gem_prime_vunmap(struct drm_gem_object *obj, struct dma_buf_map *map)  {  	struct rockchip_gem_object *rk_obj = to_rockchip_obj(obj);  	if (rk_obj->pages) { -		vunmap(vaddr); +		vunmap(map->vaddr);  		return;  	} | 
