aboutsummaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/exynos/exynos_drm_gem.c
diff options
context:
space:
mode:
authorPrathyush K <prathyush.k@samsung.com>2012-11-20 19:32:56 +0900
committerInki Dae <inki.dae@samsung.com>2012-12-05 14:39:20 +0900
commit465ed6606018b56d55219b6c58a7b98793d8cbcc (patch)
tree974610e76ec23feef25f873cbe4441b319154214 /drivers/gpu/drm/exynos/exynos_drm_gem.c
parentdd265850f10a16e4525ed002f0173a1acd8c8876 (diff)
drm/exynos: remove 'pages' and 'page_size' elements in exynos gem buffer
Changelog v2: Removed redundant check for invalid sgl. Added check for valid page_offset in the beginning of exynos_drm_gem_map_buf. Changelog v1: The 'pages' structure is not required since we can use the 'sgt'. Even for CONTIG buffers, a SGT is created (which will have just one sgl). This SGT can be used during mmap instead of 'pages'. The 'page_size' element of the structure is also not used anywhere and is removed. This patch also fixes a memory leak where the 'pages' structure was being allocated during gem buffer allocation but not being freed during deallocate. Signed-off-by: Prathyush K <prathyush.k@samsung.com> Signed-off-by: Inki Dae <inki.dae@samsung.com> Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_gem.c')
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_gem.c37
1 files changed, 13 insertions, 24 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c
index 52187aec869..99227246ce8 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gem.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c
@@ -99,34 +99,23 @@ static int exynos_drm_gem_map_buf(struct drm_gem_object *obj,
unsigned long pfn;
int i;
- if (exynos_gem_obj->flags & EXYNOS_BO_NONCONTIG) {
- if (!buf->sgt)
- return -EINTR;
-
- sgl = buf->sgt->sgl;
- for_each_sg(buf->sgt->sgl, sgl, buf->sgt->nents, i) {
- if (!sgl) {
- DRM_ERROR("invalid SG table\n");
- return -EINTR;
- }
- if (page_offset < (sgl->length >> PAGE_SHIFT))
- break;
- page_offset -= (sgl->length >> PAGE_SHIFT);
- }
-
- if (i >= buf->sgt->nents) {
- DRM_ERROR("invalid page offset\n");
- return -EINVAL;
- }
+ if (!buf->sgt)
+ return -EINTR;
- pfn = __phys_to_pfn(sg_phys(sgl)) + page_offset;
- } else {
- if (!buf->pages)
- return -EINTR;
+ if (page_offset >= (buf->size >> PAGE_SHIFT)) {
+ DRM_ERROR("invalid page offset\n");
+ return -EINVAL;
+ }
- pfn = page_to_pfn(buf->pages[0]) + page_offset;
+ sgl = buf->sgt->sgl;
+ for_each_sg(buf->sgt->sgl, sgl, buf->sgt->nents, i) {
+ if (page_offset < (sgl->length >> PAGE_SHIFT))
+ break;
+ page_offset -= (sgl->length >> PAGE_SHIFT);
}
+ pfn = __phys_to_pfn(sg_phys(sgl)) + page_offset;
+
return vm_insert_mixed(vma, f_vaddr, pfn);
}