drm/exynos: allocate non-contigous buffers when iommu is enabled
authorRahul Sharma <Rahul.Sharma@samsung.com>
Wed, 7 May 2014 11:51:29 +0000 (17:21 +0530)
committerInki Dae <daeinki@gmail.com>
Sun, 1 Jun 2014 17:07:09 +0000 (02:07 +0900)
Allow to allocate non-contigous buffers when iommu is enabled.
Currently, it tries to allocates contigous buffer which consistently
fail for large buffers and then fall back to non contigous. Apart
from being slow, this implementation is also very noisy and fills
the screen with alloc fail logs.

Signed-off-by: Rahul Sharma <Rahul.Sharma@samsung.com>
Reviewed-by: Sachin Kamat <sachin.kamat@linaro.org>
Signed-off-by: Inki Dae <inki.dae@samsung.com>
drivers/gpu/drm/exynos/exynos_drm_gem.c

index 42d2904d88c7e32d90cd6d2dd56f97a3c917dc84..163a054922cb89f1845e2fe23c4d46b6c442f0f2 100644 (file)
@@ -612,22 +612,20 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
        args->pitch = args->width * ((args->bpp + 7) / 8);
        args->size = args->pitch * args->height;
 
-       exynos_gem_obj = exynos_drm_gem_create(dev, EXYNOS_BO_CONTIG |
-                                               EXYNOS_BO_WC, args->size);
-       /*
-        * If physically contiguous memory allocation fails and if IOMMU is
-        * supported then try to get buffer from non physically contiguous
-        * memory area.
-        */
-       if (IS_ERR(exynos_gem_obj) && is_drm_iommu_supported(dev)) {
-               dev_warn(dev->dev, "contiguous FB allocation failed, falling back to non-contiguous\n");
+       if (is_drm_iommu_supported(dev)) {
+               exynos_gem_obj = exynos_drm_gem_create(dev,
+                       EXYNOS_BO_NONCONTIG | EXYNOS_BO_WC,
+                       args->size);
+       } else {
                exynos_gem_obj = exynos_drm_gem_create(dev,
-                                       EXYNOS_BO_NONCONTIG | EXYNOS_BO_WC,
-                                       args->size);
+                       EXYNOS_BO_CONTIG | EXYNOS_BO_WC,
+                       args->size);
        }
 
-       if (IS_ERR(exynos_gem_obj))
+       if (IS_ERR(exynos_gem_obj)) {
+               dev_warn(dev->dev, "FB allocation failed.\n");
                return PTR_ERR(exynos_gem_obj);
+       }
 
        ret = exynos_drm_gem_handle_create(&exynos_gem_obj->base, file_priv,
                        &args->handle);