To address the case where physically contiguous memory MAY NOT be a mandatory
requirement for framebuffer for the application calling 
exynos_drm_gem_dumb_create,
the patch adds a feature to get non physically contiguous memory for 
framebuffer,
if physically contiguous memory allocation fails and if IOMMU is supported.

Signed-off-by: Vikas Sajjan <vikas.saj...@linaro.org>
Signed-off-by: Arun Kumar <arun...@samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_gem.c |   13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c 
b/drivers/gpu/drm/exynos/exynos_drm_gem.c
index 2eabe1a..66d1b40 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gem.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c
@@ -17,6 +17,7 @@
 #include "exynos_drm_drv.h"
 #include "exynos_drm_gem.h"
 #include "exynos_drm_buf.h"
+#include "exynos_drm_iommu.h"
 
 static unsigned int convert_to_vm_err_msg(int msg)
 {
@@ -666,6 +667,18 @@ int exynos_drm_gem_dumb_create(struct drm_file *file_priv,
 
        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");
+               exynos_gem_obj = exynos_drm_gem_create(dev,
+                                       EXYNOS_BO_NONCONTIG | EXYNOS_BO_WC,
+                                       args->size);
+       }
+
        if (IS_ERR(exynos_gem_obj))
                return PTR_ERR(exynos_gem_obj);
 
-- 
1.7.9.5

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to