aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/exynos/exynos_drm_fbdev.c')
-rw-r--r--drivers/gpu/drm/exynos/exynos_drm_fbdev.c29
1 files changed, 9 insertions, 20 deletions
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
index e12ea90c6237..84f8dfe1c5ec 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fbdev.c
@@ -79,9 +79,9 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,
79 struct drm_framebuffer *fb) 79 struct drm_framebuffer *fb)
80{ 80{
81 struct fb_info *fbi = helper->fbdev; 81 struct fb_info *fbi = helper->fbdev;
82 struct drm_device *dev = helper->dev;
83 struct exynos_drm_gem_buf *buffer; 82 struct exynos_drm_gem_buf *buffer;
84 unsigned int size = fb->width * fb->height * (fb->bits_per_pixel >> 3); 83 unsigned int size = fb->width * fb->height * (fb->bits_per_pixel >> 3);
84 unsigned int nr_pages;
85 unsigned long offset; 85 unsigned long offset;
86 86
87 drm_fb_helper_fill_fix(fbi, fb->pitches[0], fb->depth); 87 drm_fb_helper_fill_fix(fbi, fb->pitches[0], fb->depth);
@@ -94,25 +94,14 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,
94 return -EFAULT; 94 return -EFAULT;
95 } 95 }
96 96
97 /* map pages with kernel virtual space. */ 97 nr_pages = buffer->size >> PAGE_SHIFT;
98
99 buffer->kvaddr = (void __iomem *) vmap(buffer->pages,
100 nr_pages, VM_MAP,
101 pgprot_writecombine(PAGE_KERNEL));
98 if (!buffer->kvaddr) { 102 if (!buffer->kvaddr) {
99 if (is_drm_iommu_supported(dev)) { 103 DRM_ERROR("failed to map pages to kernel space.\n");
100 unsigned int nr_pages = buffer->size >> PAGE_SHIFT; 104 return -EIO;
101
102 buffer->kvaddr = (void __iomem *) vmap(buffer->pages,
103 nr_pages, VM_MAP,
104 pgprot_writecombine(PAGE_KERNEL));
105 } else {
106 phys_addr_t dma_addr = buffer->dma_addr;
107 if (dma_addr)
108 buffer->kvaddr = (void __iomem *)phys_to_virt(dma_addr);
109 else
110 buffer->kvaddr = (void __iomem *)NULL;
111 }
112 if (!buffer->kvaddr) {
113 DRM_ERROR("failed to map pages to kernel space.\n");
114 return -EIO;
115 }
116 } 105 }
117 106
118 /* buffer count to framebuffer always is 1 at booting time. */ 107 /* buffer count to framebuffer always is 1 at booting time. */
@@ -313,7 +302,7 @@ static void exynos_drm_fbdev_destroy(struct drm_device *dev,
313 struct exynos_drm_gem_obj *exynos_gem_obj = exynos_fbd->exynos_gem_obj; 302 struct exynos_drm_gem_obj *exynos_gem_obj = exynos_fbd->exynos_gem_obj;
314 struct drm_framebuffer *fb; 303 struct drm_framebuffer *fb;
315 304
316 if (is_drm_iommu_supported(dev) && exynos_gem_obj->buffer->kvaddr) 305 if (exynos_gem_obj->buffer->kvaddr)
317 vunmap(exynos_gem_obj->buffer->kvaddr); 306 vunmap(exynos_gem_obj->buffer->kvaddr);
318 307
319 /* release drm framebuffer and real buffer */ 308 /* release drm framebuffer and real buffer */