diff options
Diffstat (limited to 'drivers/gpu/drm/drm_gem_cma_helper.c')
| -rw-r--r-- | drivers/gpu/drm/drm_gem_cma_helper.c | 38 | 
1 files changed, 14 insertions, 24 deletions
diff --git a/drivers/gpu/drm/drm_gem_cma_helper.c b/drivers/gpu/drm/drm_gem_cma_helper.c index 6b51bf90df0..05c97c5350a 100644 --- a/drivers/gpu/drm/drm_gem_cma_helper.c +++ b/drivers/gpu/drm/drm_gem_cma_helper.c @@ -79,7 +79,6 @@ struct drm_gem_cma_object *drm_gem_cma_create(struct drm_device *drm,  		unsigned int size)  {  	struct drm_gem_cma_object *cma_obj; -	struct sg_table *sgt = NULL;  	int ret;  	size = round_up(size, PAGE_SIZE); @@ -97,23 +96,9 @@ struct drm_gem_cma_object *drm_gem_cma_create(struct drm_device *drm,  		goto error;  	} -	sgt = kzalloc(sizeof(*cma_obj->sgt), GFP_KERNEL); -	if (sgt == NULL) { -		ret = -ENOMEM; -		goto error; -	} - -	ret = dma_get_sgtable(drm->dev, sgt, cma_obj->vaddr, -			      cma_obj->paddr, size); -	if (ret < 0) -		goto error; - -	cma_obj->sgt = sgt; -  	return cma_obj;  error: -	kfree(sgt);  	drm_gem_cma_free_object(&cma_obj->base);  	return ERR_PTR(ret);  } @@ -175,10 +160,6 @@ void drm_gem_cma_free_object(struct drm_gem_object *gem_obj)  	if (cma_obj->vaddr) {  		dma_free_writecombine(gem_obj->dev->dev, cma_obj->base.size,  				      cma_obj->vaddr, cma_obj->paddr); -		if (cma_obj->sgt) { -			sg_free_table(cma_obj->sgt); -			kfree(cma_obj->sgt); -		}  	} else if (gem_obj->import_attach) {  		drm_prime_gem_destroy(gem_obj, cma_obj->sgt);  	} @@ -253,8 +234,17 @@ static int drm_gem_cma_mmap_obj(struct drm_gem_cma_object *cma_obj,  {  	int ret; -	ret = remap_pfn_range(vma, vma->vm_start, cma_obj->paddr >> PAGE_SHIFT, -			vma->vm_end - vma->vm_start, vma->vm_page_prot); +	/* +	 * Clear the VM_PFNMAP flag that was set by drm_gem_mmap(), and set the +	 * vm_pgoff (used as a fake buffer offset by DRM) to 0 as we want to map +	 * the whole buffer. +	 */ +	vma->vm_flags &= ~VM_PFNMAP; +	vma->vm_pgoff = 0; + +	ret = dma_mmap_writecombine(cma_obj->base.dev->dev, vma, +				    cma_obj->vaddr, cma_obj->paddr, +				    vma->vm_end - vma->vm_start);  	if (ret)  		drm_gem_vm_close(vma); @@ -292,9 +282,9 @@ void drm_gem_cma_describe(struct drm_gem_cma_object *cma_obj, struct seq_file *m  	off = drm_vma_node_start(&obj->vma_node); -	seq_printf(m, "%2d (%2d) %08llx %08Zx %p %d", +	seq_printf(m, "%2d (%2d) %08llx %pad %p %d",  			obj->name, obj->refcount.refcount.counter, -			off, cma_obj->paddr, cma_obj->vaddr, obj->size); +			off, &cma_obj->paddr, cma_obj->vaddr, obj->size);  	seq_printf(m, "\n");  } @@ -342,7 +332,7 @@ drm_gem_cma_prime_import_sg_table(struct drm_device *dev, size_t size,  	cma_obj->paddr = sg_dma_address(sgt->sgl);  	cma_obj->sgt = sgt; -	DRM_DEBUG_PRIME("dma_addr = 0x%x, size = %zu\n", cma_obj->paddr, size); +	DRM_DEBUG_PRIME("dma_addr = %pad, size = %zu\n", &cma_obj->paddr, size);  	return &cma_obj->base;  }  | 
