diff options
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_buf.c')
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_buf.c | 47 | 
1 files changed, 14 insertions, 33 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_buf.c b/drivers/gpu/drm/exynos/exynos_drm_buf.c index 4a3a5f72ed4..de8d2090bce 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_buf.c +++ b/drivers/gpu/drm/exynos/exynos_drm_buf.c @@ -34,14 +34,14 @@  static int lowlevel_buffer_allocate(struct drm_device *dev,  		unsigned int flags, struct exynos_drm_gem_buf *buf)  { -	dma_addr_t start_addr, end_addr; +	dma_addr_t start_addr;  	unsigned int npages, page_size, i = 0;  	struct scatterlist *sgl;  	int ret = 0;  	DRM_DEBUG_KMS("%s\n", __FILE__); -	if (flags & EXYNOS_BO_NONCONTIG) { +	if (IS_NONCONTIG_BUFFER(flags)) {  		DRM_DEBUG_KMS("not support allocation type.\n");  		return -EINVAL;  	} @@ -52,13 +52,13 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,  	}  	if (buf->size >= SZ_1M) { -		npages = (buf->size >> SECTION_SHIFT) + 1; +		npages = buf->size >> SECTION_SHIFT;  		page_size = SECTION_SIZE;  	} else if (buf->size >= SZ_64K) { -		npages = (buf->size >> 16) + 1; +		npages = buf->size >> 16;  		page_size = SZ_64K;  	} else { -		npages = (buf->size >> PAGE_SHIFT) + 1; +		npages = buf->size >> PAGE_SHIFT;  		page_size = PAGE_SIZE;  	} @@ -76,26 +76,13 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,  		return -ENOMEM;  	} -		buf->kvaddr = dma_alloc_writecombine(dev->dev, buf->size, -				&buf->dma_addr, GFP_KERNEL); -		if (!buf->kvaddr) { -			DRM_ERROR("failed to allocate buffer.\n"); -			ret = -ENOMEM; -			goto err1; -		} - -		start_addr = buf->dma_addr; -		end_addr = buf->dma_addr + buf->size; - -		buf->pages = kzalloc(sizeof(struct page) * npages, GFP_KERNEL); -		if (!buf->pages) { -			DRM_ERROR("failed to allocate pages.\n"); -			ret = -ENOMEM; -			goto err2; -		} - -	start_addr = buf->dma_addr; -	end_addr = buf->dma_addr + buf->size; +	buf->kvaddr = dma_alloc_writecombine(dev->dev, buf->size, +			&buf->dma_addr, GFP_KERNEL); +	if (!buf->kvaddr) { +		DRM_ERROR("failed to allocate buffer.\n"); +		ret = -ENOMEM; +		goto err1; +	}  	buf->pages = kzalloc(sizeof(struct page) * npages, GFP_KERNEL);  	if (!buf->pages) { @@ -105,23 +92,17 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,  	}  	sgl = buf->sgt->sgl; +	start_addr = buf->dma_addr;  	while (i < npages) {  		buf->pages[i] = phys_to_page(start_addr);  		sg_set_page(sgl, buf->pages[i], page_size, 0);  		sg_dma_address(sgl) = start_addr;  		start_addr += page_size; -		if (end_addr - start_addr < page_size) -			break;  		sgl = sg_next(sgl);  		i++;  	} -	buf->pages[i] = phys_to_page(start_addr); - -	sgl = sg_next(sgl); -	sg_set_page(sgl, buf->pages[i+1], end_addr - start_addr, 0); -  	DRM_DEBUG_KMS("vaddr(0x%lx), dma_addr(0x%lx), size(0x%lx)\n",  			(unsigned long)buf->kvaddr,  			(unsigned long)buf->dma_addr, @@ -150,7 +131,7 @@ static void lowlevel_buffer_deallocate(struct drm_device *dev,  	 * non-continuous memory would be released by exynos  	 * gem framework.  	 */ -	if (flags & EXYNOS_BO_NONCONTIG) { +	if (IS_NONCONTIG_BUFFER(flags)) {  		DRM_DEBUG_KMS("not support allocation type.\n");  		return;  	}  |