aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/exynos/exynos_drm_buf.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_buf.c')
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_buf.c60
1 files changed, 32 insertions, 28 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_buf.c b/drivers/gpu/drm/exynos/exynos_drm_buf.c
index f7bb7be..a0b27d9 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_buf.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_buf.c
@@ -47,7 +47,7 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,
return -EINVAL;
}
- if (buf->dma_addr) {
+ if (buf->paddr) {
DRM_DEBUG_KMS("already allocated.\n");
return 0;
}
@@ -78,21 +78,21 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,
}
#ifdef CONFIG_CMA
- buf->dma_addr = cma_alloc(dev->dev, "drm", buf->size,
+ buf->paddr = cma_alloc(dev->dev, "drm", buf->size,
buf->page_size);
- if (IS_ERR((void *)buf->dma_addr)) {
+ if (IS_ERR((void *)buf->paddr)) {
DRM_DEBUG_KMS("cma_alloc of size %ld failed\n",
buf->size);
ret = -ENOMEM;
goto err1;
}
- buf->kvaddr = phys_to_virt(buf->dma_addr);
+ buf->kvaddr = phys_to_virt(buf->paddr);
#else
/* align it as page size(page or section) TODO */
buf->kvaddr = dma_alloc_writecombine(dev->dev, buf->size,
- &buf->dma_addr, GFP_KERNEL);
+ &buf->paddr, GFP_KERNEL);
if (!buf->kvaddr) {
DRM_ERROR("failed to allocate buffer.\n");
ret = -ENOMEM;
@@ -107,7 +107,7 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,
}
sgl = buf->sgt->sgl;
- start_addr = buf->dma_addr;
+ start_addr = buf->paddr;
while (i < npages) {
buf->pages[i] = phys_to_page(start_addr);
@@ -118,20 +118,20 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,
i++;
}
- DRM_INFO("vaddr(0x%lx), dma_addr(0x%lx), size(0x%lx)\n",
+ DRM_INFO("vaddr(0x%lx), paddr(0x%lx), size(0x%lx)\n",
(unsigned long)buf->kvaddr,
- (unsigned long)buf->dma_addr,
+ (unsigned long)buf->paddr,
buf->size);
return ret;
err2:
#ifdef CONFIG_CMA
- cma_free(buf->dma_addr);
+ cma_free(buf->paddr);
#else
dma_free_writecombine(dev->dev, buf->size, buf->kvaddr,
- (dma_addr_t)buf->dma_addr);
+ (dma_addr_t)buf->paddr);
#endif
- buf->dma_addr = (dma_addr_t)NULL;
+ buf->paddr = (dma_addr_t)NULL;
err1:
sg_free_table(buf->sgt);
kfree(buf->sgt);
@@ -146,13 +146,6 @@ static void lowlevel_buffer_deallocate(struct drm_device *dev,
DRM_DEBUG_KMS("%s.\n", __FILE__);
/*
- * now buffer is being shared and it would be released
- * by original owner so ignor free action.
- */
- if (buf->shared || atomic_read(&buf->shared_refcount))
- return;
-
- /*
* release only physically continuous memory and
* non-continuous memory would be released by exynos
* gem framework.
@@ -162,25 +155,36 @@ static void lowlevel_buffer_deallocate(struct drm_device *dev,
return;
}
- if (!buf->dma_addr) {
- DRM_DEBUG_KMS("dma_addr is invalid.\n");
+ if (!buf->paddr) {
+ DRM_DEBUG_KMS("paddr is invalid.\n");
return;
}
- sg_free_table(buf->sgt);
-
- kfree(buf->sgt);
- buf->sgt = NULL;
+ if (buf->sgt) {
+ sg_free_table(buf->sgt);
+ kfree(buf->sgt);
+ buf->sgt = NULL;
+ }
kfree(buf->pages);
buf->pages = NULL;
+
+ /*
+ * now buffer is being shared and it would be released
+ * by original owner so ignor free action.
+ * this buffer was imported from physical memory to gem directly
+ * and this feature is used temporarily so removed later.
+ */
+ if (buf->shared)
+ return;
+
#ifdef CONFIG_CMA
- cma_free(buf->dma_addr);
+ cma_free(buf->paddr);
#else
dma_free_writecombine(dev->dev, buf->size, buf->kvaddr,
- (dma_addr_t)buf->dma_addr);
+ (dma_addr_t)buf->paddr);
#endif
- buf->dma_addr = (dma_addr_t)NULL;
+ buf->paddr = (dma_addr_t)NULL;
}
struct exynos_drm_gem_buf *exynos_drm_init_buf(struct drm_device *dev,
@@ -221,7 +225,7 @@ int exynos_drm_alloc_buf(struct drm_device *dev,
/*
* allocate memory region and set the memory information
- * to vaddr and dma_addr of a buffer object.
+ * to vaddr and paddr of a buffer object.
*/
if (lowlevel_buffer_allocate(dev, flags, buf) < 0)
return -ENOMEM;