diff options
Diffstat (limited to 'drivers/gpu/drm/udl/udl_gem.c')
| -rw-r--r-- | drivers/gpu/drm/udl/udl_gem.c | 25 | 
1 files changed, 22 insertions, 3 deletions
diff --git a/drivers/gpu/drm/udl/udl_gem.c b/drivers/gpu/drm/udl/udl_gem.c index 97acc9c6c95..7bd65bdd15a 100644 --- a/drivers/gpu/drm/udl/udl_gem.c +++ b/drivers/gpu/drm/udl/udl_gem.c @@ -180,6 +180,18 @@ int udl_gem_vmap(struct udl_gem_object *obj)  	int page_count = obj->base.size / PAGE_SIZE;  	int ret; +	if (obj->base.import_attach) { +		ret = dma_buf_begin_cpu_access(obj->base.import_attach->dmabuf, +					       0, obj->base.size, DMA_BIDIRECTIONAL); +		if (ret) +			return -EINVAL; + +		obj->vmapping = dma_buf_vmap(obj->base.import_attach->dmabuf); +		if (!obj->vmapping) +			return -ENOMEM; +		return 0; +	} +		  	ret = udl_gem_get_pages(obj, GFP_KERNEL);  	if (ret)  		return ret; @@ -192,6 +204,13 @@ int udl_gem_vmap(struct udl_gem_object *obj)  void udl_gem_vunmap(struct udl_gem_object *obj)  { +	if (obj->base.import_attach) { +		dma_buf_vunmap(obj->base.import_attach->dmabuf, obj->vmapping); +		dma_buf_end_cpu_access(obj->base.import_attach->dmabuf, 0, +				       obj->base.size, DMA_BIDIRECTIONAL); +		return; +	} +  	if (obj->vmapping)  		vunmap(obj->vmapping); @@ -202,12 +221,12 @@ void udl_gem_free_object(struct drm_gem_object *gem_obj)  {  	struct udl_gem_object *obj = to_udl_bo(gem_obj); -	if (gem_obj->import_attach) -		drm_prime_gem_destroy(gem_obj, obj->sg); -  	if (obj->vmapping)  		udl_gem_vunmap(obj); +	if (gem_obj->import_attach) +		drm_prime_gem_destroy(gem_obj, obj->sg); +  	if (obj->pages)  		udl_gem_put_pages(obj);  |