#include <drm/drm_crtc.h>
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_crtc_helper.h>
+#include <drm/exynos_drm.h>
 
 #include "exynos_drm_drv.h"
 #include "exynos_drm_fb.h"
 
        size = mode_cmd.pitches[0] * mode_cmd.height;
 
-       /* 0 means to allocate physically continuous memory */
-       exynos_gem_obj = exynos_drm_gem_create(dev, 0, size);
+       exynos_gem_obj = exynos_drm_gem_create(dev, EXYNOS_BO_CONTIG, 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(&pdev->dev, "contiguous FB allocation failed, falling back to non-contiguous\n");
+               exynos_gem_obj = exynos_drm_gem_create(dev, EXYNOS_BO_NONCONTIG,
+                                                       size);
+       }
+
        if (IS_ERR(exynos_gem_obj)) {
                ret = PTR_ERR(exynos_gem_obj);
                goto err_release_framebuffer;