diff options
Diffstat (limited to 'drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c')
| -rw-r--r-- | drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c | 34 | 
1 files changed, 5 insertions, 29 deletions
| diff --git a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c index 809f86cfc540..57af3d97be77 100644 --- a/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c +++ b/drivers/gpu/drm/omapdrm/omap_gem_dmabuf.c @@ -23,45 +23,21 @@ static struct sg_table *omap_gem_map_dma_buf(  {  	struct drm_gem_object *obj = attachment->dmabuf->priv;  	struct sg_table *sg; -	dma_addr_t dma_addr; -	int ret; - -	sg = kzalloc(sizeof(*sg), GFP_KERNEL); -	if (!sg) -		return ERR_PTR(-ENOMEM); - -	/* camera, etc, need physically contiguous.. but we need a -	 * better way to know this.. -	 */ -	ret = omap_gem_pin(obj, &dma_addr); -	if (ret) -		goto out; - -	ret = sg_alloc_table(sg, 1, GFP_KERNEL); -	if (ret) -		goto out; - -	sg_init_table(sg->sgl, 1); -	sg_dma_len(sg->sgl) = obj->size; -	sg_set_page(sg->sgl, pfn_to_page(PFN_DOWN(dma_addr)), obj->size, 0); -	sg_dma_address(sg->sgl) = dma_addr; +	sg = omap_gem_get_sg(obj); +	if (IS_ERR(sg)) +		return sg;  	/* this must be after omap_gem_pin() to ensure we have pages attached */  	omap_gem_dma_sync_buffer(obj, dir);  	return sg; -out: -	kfree(sg); -	return ERR_PTR(ret);  }  static void omap_gem_unmap_dma_buf(struct dma_buf_attachment *attachment,  		struct sg_table *sg, enum dma_data_direction dir)  {  	struct drm_gem_object *obj = attachment->dmabuf->priv; -	omap_gem_unpin(obj); -	sg_free_table(sg); -	kfree(sg); +	omap_gem_put_sg(obj, sg);  }  static int omap_gem_dmabuf_begin_cpu_access(struct dma_buf *buffer, @@ -114,7 +90,7 @@ struct dma_buf *omap_gem_prime_export(struct drm_gem_object *obj, int flags)  	DEFINE_DMA_BUF_EXPORT_INFO(exp_info);  	exp_info.ops = &omap_dmabuf_ops; -	exp_info.size = obj->size; +	exp_info.size = omap_gem_mmap_size(obj);  	exp_info.flags = flags;  	exp_info.priv = obj; |