drm/exynos: fix allocation and cache mapping type
authorInki Dae <inki.dae@samsung.com>
Fri, 14 Dec 2012 05:34:31 +0000 (14:34 +0900)
committerInki Dae <inki.dae@samsung.com>
Fri, 14 Dec 2012 06:40:26 +0000 (15:40 +0900)
This patch fixes memory alloction(contiguous or not) and
cache mapping types(cachable or not).
For this, it converts each type from user request into dma
attribute properly.

Changelog v2:
- just code cleanup.

Signed-off-by: Inki Dae <inki.dae@samsung.com>
Signed-off-by: Kyungmin Park <kyungmin.park@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_buf.c

index 9732043d91ec39d351d57922848b5b3373d80c24..9601bad47a2e6d5a2bd04deffec5ec5744bfbcee 100644 (file)
@@ -34,7 +34,7 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,
                unsigned int flags, struct exynos_drm_gem_buf *buf)
 {
        int ret = 0;
-       enum dma_attr attr = DMA_ATTR_FORCE_CONTIGUOUS;
+       enum dma_attr attr;
        unsigned int nr_pages;
 
        DRM_DEBUG_KMS("%s\n", __FILE__);
@@ -46,8 +46,22 @@ static int lowlevel_buffer_allocate(struct drm_device *dev,
 
        init_dma_attrs(&buf->dma_attrs);
 
-       if (flags & EXYNOS_BO_NONCONTIG)
+       /*
+        * if EXYNOS_BO_CONTIG, fully physically contiguous memory
+        * region will be allocated else physically contiguous
+        * as possible.
+        */
+       if (flags & EXYNOS_BO_CONTIG)
+               dma_set_attr(DMA_ATTR_FORCE_CONTIGUOUS, &buf->dma_attrs);
+
+       /*
+        * if EXYNOS_BO_WC or EXYNOS_BO_NONCACHABLE, writecombine mapping
+        * else cachable mapping.
+        */
+       if (flags & EXYNOS_BO_WC || !(flags & EXYNOS_BO_CACHABLE))
                attr = DMA_ATTR_WRITE_COMBINE;
+       else
+               attr = DMA_ATTR_NON_CONSISTENT;
 
        dma_set_attr(attr, &buf->dma_attrs);
        dma_set_attr(DMA_ATTR_NO_KERNEL_MAPPING, &buf->dma_attrs);