Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c704f1b4 authored by Inki Dae's avatar Inki Dae
Browse files

drm/exynos: consider no iommu support to console framebuffer



This patch considers no iommu support to kernel space mapping
of console framebuffer.

Without iommu, we get physical address instead of device address
after dma_alloc_attrs function is called. So we should consider
the case without iommu when it maps console framebuffer with
kernel space.

Changelog v2:
- calll vunmap function only with iommu support.

Signed-off-by: default avatarInki Dae <inki.dae@samsung.com>
Signed-off-by: default avatarKyungmin Park <kyungmin.park@samsung.com>
parent f4fd9bd4
Loading
Loading
Loading
Loading
+18 −4
Original line number Diff line number Diff line
@@ -34,6 +34,7 @@
#include "exynos_drm_drv.h"
#include "exynos_drm_fb.h"
#include "exynos_drm_gem.h"
#include "exynos_drm_iommu.h"

#define MAX_CONNECTOR		4
#define PREFERRED_BPP		32
@@ -111,9 +112,18 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,

	/* map pages with kernel virtual space. */
	if (!buffer->kvaddr) {
		if (is_drm_iommu_supported(dev)) {
			unsigned int nr_pages = buffer->size >> PAGE_SHIFT;

			buffer->kvaddr = vmap(buffer->pages, nr_pages, VM_MAP,
					pgprot_writecombine(PAGE_KERNEL));
		} else {
			phys_addr_t dma_addr = buffer->dma_addr;
			if (dma_addr)
				buffer->kvaddr = phys_to_virt(dma_addr);
			else
				buffer->kvaddr = (void __iomem *)NULL;
		}
		if (!buffer->kvaddr) {
			DRM_ERROR("failed to map pages to kernel space.\n");
			return -EIO;
@@ -128,8 +138,12 @@ static int exynos_drm_fbdev_update(struct drm_fb_helper *helper,

	dev->mode_config.fb_base = (resource_size_t)buffer->dma_addr;
	fbi->screen_base = buffer->kvaddr + offset;
	if (is_drm_iommu_supported(dev))
		fbi->fix.smem_start = (unsigned long)
			(page_to_phys(sg_page(buffer->sgt->sgl)) + offset);
	else
		fbi->fix.smem_start = (unsigned long)buffer->dma_addr;

	fbi->screen_size = size;
	fbi->fix.smem_len = size;

@@ -320,7 +334,7 @@ static void exynos_drm_fbdev_destroy(struct drm_device *dev,
	struct exynos_drm_gem_obj *exynos_gem_obj = exynos_fbd->exynos_gem_obj;
	struct drm_framebuffer *fb;

	if (exynos_gem_obj->buffer->kvaddr)
	if (is_drm_iommu_supported(dev) && exynos_gem_obj->buffer->kvaddr)
		vunmap(exynos_gem_obj->buffer->kvaddr);

	/* release drm framebuffer and real buffer */