diff options
| -rw-r--r-- | drivers/gpu/drm/exynos/exynos_drm_fbdev.c | 15 |
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c index 8e60bd61137f..f82a1d4a0fcb 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c +++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c | |||
| @@ -16,6 +16,7 @@ | |||
| 16 | #include <drm/drm_crtc.h> | 16 | #include <drm/drm_crtc.h> |
| 17 | #include <drm/drm_fb_helper.h> | 17 | #include <drm/drm_fb_helper.h> |
| 18 | #include <drm/drm_crtc_helper.h> | 18 | #include <drm/drm_crtc_helper.h> |
| 19 | #include <drm/exynos_drm.h> | ||
| 19 | 20 | ||
| 20 | #include "exynos_drm_drv.h" | 21 | #include "exynos_drm_drv.h" |
| 21 | #include "exynos_drm_fb.h" | 22 | #include "exynos_drm_fb.h" |
| @@ -165,8 +166,18 @@ static int exynos_drm_fbdev_create(struct drm_fb_helper *helper, | |||
| 165 | 166 | ||
| 166 | size = mode_cmd.pitches[0] * mode_cmd.height; | 167 | size = mode_cmd.pitches[0] * mode_cmd.height; |
| 167 | 168 | ||
| 168 | /* 0 means to allocate physically continuous memory */ | 169 | exynos_gem_obj = exynos_drm_gem_create(dev, EXYNOS_BO_CONTIG, size); |
| 169 | exynos_gem_obj = exynos_drm_gem_create(dev, 0, size); | 170 | /* |
| 171 | * If physically contiguous memory allocation fails and if IOMMU is | ||
| 172 | * supported then try to get buffer from non physically contiguous | ||
| 173 | * memory area. | ||
| 174 | */ | ||
| 175 | if (IS_ERR(exynos_gem_obj) && is_drm_iommu_supported(dev)) { | ||
| 176 | dev_warn(&pdev->dev, "contiguous FB allocation failed, falling back to non-contiguous\n"); | ||
| 177 | exynos_gem_obj = exynos_drm_gem_create(dev, EXYNOS_BO_NONCONTIG, | ||
| 178 | size); | ||
| 179 | } | ||
| 180 | |||
| 170 | if (IS_ERR(exynos_gem_obj)) { | 181 | if (IS_ERR(exynos_gem_obj)) { |
| 171 | ret = PTR_ERR(exynos_gem_obj); | 182 | ret = PTR_ERR(exynos_gem_obj); |
| 172 | goto err_release_framebuffer; | 183 | goto err_release_framebuffer; |
