[PATCH 8/9] drm/exynos: use DMA_ERROR_CODE

Joonyoung Shim jy0922.shim at samsung.com
Tue Oct 13 00:00:53 PDT 2015


The dma_addr of gem will be DMA_ERROR_CODE if gem is created and
will keep DMA_ERROR_CODE if gem has EXYNOS_BO_NONCONTIG flag on
non-iommu.

Signed-off-by: Joonyoung Shim <jy0922.shim at samsung.com>
---
 drivers/gpu/drm/exynos/exynos_drm_gem.c | 24 +++++++++---------------
 1 file changed, 9 insertions(+), 15 deletions(-)

diff --git a/drivers/gpu/drm/exynos/exynos_drm_gem.c b/drivers/gpu/drm/exynos/exynos_drm_gem.c
index 96a69468283b..01c5e0854016 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_gem.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_gem.c
@@ -44,7 +44,9 @@ static int exynos_drm_get_pages(struct exynos_drm_gem *exynos_gem)
 		goto err;
 	}
 
-	exynos_gem->dma_addr = sg_dma_address(sgt->sgl);
+	if (is_drm_iommu_supported(dev))
+		exynos_gem->dma_addr = sg_dma_address(sgt->sgl);
+
 	exynos_gem->sgt = sgt;
 	exynos_gem->pages = pages;
 
@@ -127,11 +129,6 @@ static int exynos_drm_alloc_buf(struct exynos_drm_gem *exynos_gem)
 	struct drm_device *dev = exynos_gem->base.dev;
 	int ret;
 
-	if (exynos_gem->dma_addr) {
-		DRM_DEBUG_KMS("already allocated.\n");
-		return 0;
-	}
-
 	if (!is_drm_iommu_supported(dev)) {
 		if (!(exynos_gem->flags & EXYNOS_BO_NONCONTIG))
 			return exynos_drm_alloc_dma(exynos_gem);
@@ -150,11 +147,6 @@ static void exynos_drm_free_buf(struct exynos_drm_gem *exynos_gem)
 {
 	struct drm_device *dev = exynos_gem->base.dev;
 
-	if (!exynos_gem->dma_addr) {
-		DRM_DEBUG_KMS("dma_addr is invalid.\n");
-		return;
-	}
-
 	if (!is_drm_iommu_supported(dev)) {
 		if (!(exynos_gem->flags & EXYNOS_BO_NONCONTIG))
 			return exynos_drm_free_dma(exynos_gem);
@@ -256,6 +248,8 @@ static struct exynos_drm_gem *exynos_drm_gem_init(struct drm_device *dev,
 		return ERR_PTR(ret);
 	}
 
+	exynos_gem->dma_addr = DMA_ERROR_CODE;
+
 	DRM_DEBUG_KMS("created file object = 0x%x\n", (unsigned int)obj->filp);
 
 	return exynos_gem;
@@ -594,18 +588,18 @@ exynos_drm_gem_prime_import_sg_table(struct drm_device *dev,
 		return ERR_PTR(ret);
 	}
 
-	exynos_gem->dma_addr = sg_dma_address(sgt->sgl);
-
 	/*
 	 * Always physically continuous memory if sgt->nents is 1. It
 	 * doesn't care if IOMMU is supported but EXYNOS_BO_NONCONTIG
 	 * flag will be cleared. It will mean the memory is continuous
 	 * for device. EXYNOS_BO_NONCONTIG flag will be set if not both.
 	 */
-	if (sgt->nents == 1 || is_drm_iommu_supported(dev))
+	if (sgt->nents == 1 || is_drm_iommu_supported(dev)) {
 		exynos_gem->flags &= ~EXYNOS_BO_NONCONTIG;
-	else
+		exynos_gem->dma_addr = sg_dma_address(sgt->sgl);
+	} else {
 		exynos_gem->flags |= EXYNOS_BO_NONCONTIG;
+	}
 
 	npages = exynos_gem->size >> PAGE_SHIFT;
 	exynos_gem->pages = drm_malloc_ab(npages, sizeof(struct page *));
-- 
1.9.1



More information about the dri-devel mailing list