From 5e06fa4dfd0fdd68fecee3aca6f2c0aa1151f5ee Mon Sep 17 00:00:00 2001 From: Marek Szyprowski Date: Thu, 29 Mar 2018 12:35:51 +0200 Subject: [PATCH] drm: exynos: add support for prime vmap to exynos gem Change-Id: I9399ba024f2cc6e61c3b463071aef700ad4c9bed Signed-off-by: Marek Szyprowski --- drivers/gpu/drm/exynos/exynos_drm_gem.c | 25 +++++++++++++++++++++++-- drivers/gpu/drm/exynos/exynos_drm_gem.h | 1 + 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c index 11cc01b..ce5fd30 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.c +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c @@ -119,6 +119,12 @@ static void exynos_drm_free_buf(struct exynos_drm_gem *exynos_gem) DRM_DEBUG_KMS("dma_addr(0x%lx), size(0x%lx)\n", (unsigned long)exynos_gem->dma_addr, exynos_gem->size); + WARN_ON(exynos_gem->kvmap_count != 0); + if (exynos_gem->kvaddr) { + vunmap(exynos_gem->kvaddr); + exynos_gem->kvaddr = NULL; + } + dma_free_attrs(to_dma_dev(dev), exynos_gem->size, exynos_gem->cookie, (dma_addr_t)exynos_gem->dma_addr, exynos_gem->dma_attrs); @@ -587,12 +593,27 @@ err: void *exynos_drm_gem_prime_vmap(struct drm_gem_object *obj) { - return NULL; + struct exynos_drm_gem *exynos_gem = to_exynos_gem(obj); + int nr_pages = exynos_gem->size >> PAGE_SHIFT; + + if (!exynos_gem->kvaddr) { + exynos_gem->kvaddr = (void __iomem *) vmap(exynos_gem->pages, + nr_pages, VM_MAP, + pgprot_writecombine(PAGE_KERNEL)); + if (!exynos_gem->kvaddr) { + DRM_ERROR("failed to map pages to kernel space.\n"); + return ERR_PTR(-EIO); + } + } + exynos_gem->kvmap_count++; + return exynos_gem->kvaddr; } void exynos_drm_gem_prime_vunmap(struct drm_gem_object *obj, void *vaddr) { - /* Nothing to do */ + struct exynos_drm_gem *exynos_gem = to_exynos_gem(obj); + + WARN_ON(--exynos_gem->kvmap_count < 0); } int exynos_drm_gem_prime_mmap(struct drm_gem_object *obj, diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.h b/drivers/gpu/drm/exynos/exynos_drm_gem.h index 5a4c7de..c1e08e4 100644 --- a/drivers/gpu/drm/exynos/exynos_drm_gem.h +++ b/drivers/gpu/drm/exynos/exynos_drm_gem.h @@ -49,6 +49,7 @@ struct exynos_drm_gem { unsigned long size; void *cookie; void __iomem *kvaddr; + unsigned int kvmap_count; dma_addr_t dma_addr; unsigned long dma_attrs; struct page **pages; -- 2.7.4