diff options
Diffstat (limited to 'drivers/gpu/drm/tegra/gem.c')
| -rw-r--r-- | drivers/gpu/drm/tegra/gem.c | 31 | 
1 files changed, 23 insertions, 8 deletions
| diff --git a/drivers/gpu/drm/tegra/gem.c b/drivers/gpu/drm/tegra/gem.c index a2bac20ff19d..26af8daa9a16 100644 --- a/drivers/gpu/drm/tegra/gem.c +++ b/drivers/gpu/drm/tegra/gem.c @@ -132,24 +132,29 @@ static void tegra_bo_unpin(struct device *dev, struct sg_table *sgt)  static void *tegra_bo_mmap(struct host1x_bo *bo)  {  	struct tegra_bo *obj = host1x_to_tegra_bo(bo); +	struct dma_buf_map map; +	int ret; -	if (obj->vaddr) +	if (obj->vaddr) {  		return obj->vaddr; -	else if (obj->gem.import_attach) -		return dma_buf_vmap(obj->gem.import_attach->dmabuf); -	else +	} else if (obj->gem.import_attach) { +		ret = dma_buf_vmap(obj->gem.import_attach->dmabuf, &map); +		return ret ? NULL : map.vaddr; +	} else {  		return vmap(obj->pages, obj->num_pages, VM_MAP,  			    pgprot_writecombine(PAGE_KERNEL)); +	}  }  static void tegra_bo_munmap(struct host1x_bo *bo, void *addr)  {  	struct tegra_bo *obj = host1x_to_tegra_bo(bo); +	struct dma_buf_map map = DMA_BUF_MAP_INIT_VADDR(addr);  	if (obj->vaddr)  		return;  	else if (obj->gem.import_attach) -		dma_buf_vunmap(obj->gem.import_attach->dmabuf, addr); +		dma_buf_vunmap(obj->gem.import_attach->dmabuf, &map);  	else  		vunmap(addr);  } @@ -230,6 +235,12 @@ static int tegra_bo_iommu_unmap(struct tegra_drm *tegra, struct tegra_bo *bo)  	return 0;  } +static const struct drm_gem_object_funcs tegra_gem_object_funcs = { +	.free = tegra_bo_free_object, +	.export = tegra_gem_prime_export, +	.vm_ops = &tegra_bo_vm_ops, +}; +  static struct tegra_bo *tegra_bo_alloc_object(struct drm_device *drm,  					      size_t size)  { @@ -240,6 +251,8 @@ static struct tegra_bo *tegra_bo_alloc_object(struct drm_device *drm,  	if (!bo)  		return ERR_PTR(-ENOMEM); +	bo->gem.funcs = &tegra_gem_object_funcs; +  	host1x_bo_init(&bo->base, &tegra_bo_ops);  	size = round_up(size, PAGE_SIZE); @@ -634,15 +647,17 @@ static int tegra_gem_prime_mmap(struct dma_buf *buf, struct vm_area_struct *vma)  	return __tegra_gem_mmap(gem, vma);  } -static void *tegra_gem_prime_vmap(struct dma_buf *buf) +static int tegra_gem_prime_vmap(struct dma_buf *buf, struct dma_buf_map *map)  {  	struct drm_gem_object *gem = buf->priv;  	struct tegra_bo *bo = to_tegra_bo(gem); -	return bo->vaddr; +	dma_buf_map_set_vaddr(map, bo->vaddr); + +	return 0;  } -static void tegra_gem_prime_vunmap(struct dma_buf *buf, void *vaddr) +static void tegra_gem_prime_vunmap(struct dma_buf *buf, struct dma_buf_map *map)  {  } | 
