diff options
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_dmabuf.c')
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_dmabuf.c | 24 | 
1 files changed, 11 insertions, 13 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c index 9df97714b6c..ba0a3aa7854 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_dmabuf.c @@ -19,6 +19,7 @@  struct exynos_drm_dmabuf_attachment {  	struct sg_table sgt;  	enum dma_data_direction dir; +	bool is_mapped;  };  static int exynos_gem_attach_dma_buf(struct dma_buf *dmabuf, @@ -72,17 +73,10 @@ static struct sg_table *  	DRM_DEBUG_PRIME("%s\n", __FILE__); -	if (WARN_ON(dir == DMA_NONE)) -		return ERR_PTR(-EINVAL); -  	/* just return current sgt if already requested. */ -	if (exynos_attach->dir == dir) +	if (exynos_attach->dir == dir && exynos_attach->is_mapped)  		return &exynos_attach->sgt; -	/* reattaching is not allowed. */ -	if (WARN_ON(exynos_attach->dir != DMA_NONE)) -		return ERR_PTR(-EBUSY); -  	buf = gem_obj->buffer;  	if (!buf) {  		DRM_ERROR("buffer is null.\n"); @@ -107,13 +101,17 @@ static struct sg_table *  		wr = sg_next(wr);  	} -	nents = dma_map_sg(attach->dev, sgt->sgl, sgt->orig_nents, dir); -	if (!nents) { -		DRM_ERROR("failed to map sgl with iommu.\n"); -		sgt = ERR_PTR(-EIO); -		goto err_unlock; +	if (dir != DMA_NONE) { +		nents = dma_map_sg(attach->dev, sgt->sgl, sgt->orig_nents, dir); +		if (!nents) { +			DRM_ERROR("failed to map sgl with iommu.\n"); +			sg_free_table(sgt); +			sgt = ERR_PTR(-EIO); +			goto err_unlock; +		}  	} +	exynos_attach->is_mapped = true;  	exynos_attach->dir = dir;  	attach->priv = exynos_attach;  |