All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/8] etnaviv: remove iommu fault handler
@ 2017-09-15 17:04 Lucas Stach
  2017-09-15 17:04 ` [PATCH 2/8] etnaviv: remove iova_to_phys iommu ops Lucas Stach
                   ` (8 more replies)
  0 siblings, 9 replies; 24+ messages in thread
From: Lucas Stach @ 2017-09-15 17:04 UTC (permalink / raw)
  To: dri-devel; +Cc: patchwork-lst, etnaviv, kernel, Russell King

The handler has never been used, so it's really just dead code.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
index f103e787de94..f3ed07db9b2d 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
@@ -22,13 +22,6 @@
 #include "etnaviv_iommu.h"
 #include "etnaviv_mmu.h"
 
-static int etnaviv_fault_handler(struct iommu_domain *iommu, struct device *dev,
-		unsigned long iova, int flags, void *arg)
-{
-	DBG("*** fault: iova=%08lx, flags=%d", iova, flags);
-	return 0;
-}
-
 int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
 		struct sg_table *sgt, unsigned len, int prot)
 {
@@ -307,8 +300,6 @@ struct etnaviv_iommu *etnaviv_iommu_new(struct etnaviv_gpu *gpu)
 		    mmu->domain->geometry.aperture_end -
 		    mmu->domain->geometry.aperture_start + 1);
 
-	iommu_set_fault_handler(mmu->domain, etnaviv_fault_handler, gpu->dev);
-
 	return mmu;
 }
 
-- 
2.11.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 2/8] etnaviv: remove iova_to_phys iommu ops
  2017-09-15 17:04 [PATCH 1/8] etnaviv: remove iommu fault handler Lucas Stach
@ 2017-09-15 17:04 ` Lucas Stach
  2017-09-18 18:40   ` Philipp Zabel
  2017-09-27 11:24   ` Wladimir J. van der Laan
  2017-09-15 17:04 ` [PATCH 3/8] etnaviv: iommuv1: fold pagetable alloc and free into caller Lucas Stach
                   ` (7 subsequent siblings)
  8 siblings, 2 replies; 24+ messages in thread
From: Lucas Stach @ 2017-09-15 17:04 UTC (permalink / raw)
  To: dri-devel; +Cc: patchwork-lst, etnaviv, kernel, Russell King

They are not used in any way, so can go away.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 drivers/gpu/drm/etnaviv/etnaviv_iommu.c    | 21 ---------------------
 drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c | 14 --------------
 2 files changed, 35 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
index 7a7c97f599d7..f804c0aaa7a2 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
@@ -66,18 +66,6 @@ static void pgtable_free(struct etnaviv_iommu_domain_pgtable *pgtable,
 	dma_free_coherent(NULL, size, pgtable->pgtable, pgtable->paddr);
 }
 
-static u32 pgtable_read(struct etnaviv_iommu_domain_pgtable *pgtable,
-			   unsigned long iova)
-{
-	/* calcuate index into page table */
-	unsigned int index = (iova - GPU_MEM_START) / SZ_4K;
-	phys_addr_t paddr;
-
-	paddr = pgtable->pgtable[index];
-
-	return paddr;
-}
-
 static void pgtable_write(struct etnaviv_iommu_domain_pgtable *pgtable,
 			  unsigned long iova, phys_addr_t paddr)
 {
@@ -164,14 +152,6 @@ static size_t etnaviv_iommuv1_unmap(struct iommu_domain *domain,
 	return SZ_4K;
 }
 
-static phys_addr_t etnaviv_iommu_iova_to_phys(struct iommu_domain *domain,
-	dma_addr_t iova)
-{
-	struct etnaviv_iommu_domain *etnaviv_domain = to_etnaviv_domain(domain);
-
-	return pgtable_read(&etnaviv_domain->pgtable, iova);
-}
-
 static size_t etnaviv_iommuv1_dump_size(struct iommu_domain *domain)
 {
 	return PT_SIZE;
@@ -189,7 +169,6 @@ static const struct etnaviv_iommu_ops etnaviv_iommu_ops = {
 		.domain_free = etnaviv_domain_free,
 		.map = etnaviv_iommuv1_map,
 		.unmap = etnaviv_iommuv1_unmap,
-		.iova_to_phys = etnaviv_iommu_iova_to_phys,
 		.pgsize_bitmap = SZ_4K,
 	},
 	.dump_size = etnaviv_iommuv1_dump_size,
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
index cbe447ac5974..d794e8c0dd7e 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
@@ -97,19 +97,6 @@ static size_t etnaviv_iommuv2_unmap(struct iommu_domain *domain,
 	return SZ_4K;
 }
 
-static phys_addr_t etnaviv_iommuv2_iova_to_phys(struct iommu_domain *domain,
-	dma_addr_t iova)
-{
-	struct etnaviv_iommuv2_domain *etnaviv_domain =
-			to_etnaviv_domain(domain);
-	int mtlb_entry, stlb_entry;
-
-	mtlb_entry = (iova & MMUv2_MTLB_MASK) >> MMUv2_MTLB_SHIFT;
-	stlb_entry = (iova & MMUv2_STLB_MASK) >> MMUv2_STLB_SHIFT;
-
-	return etnaviv_domain->stlb_cpu[mtlb_entry][stlb_entry] & ~(SZ_4K - 1);
-}
-
 static int etnaviv_iommuv2_init(struct etnaviv_iommuv2_domain *etnaviv_domain)
 {
 	u32 *p;
@@ -235,7 +222,6 @@ static const struct etnaviv_iommu_ops etnaviv_iommu_ops = {
 		.domain_free = etnaviv_iommuv2_domain_free,
 		.map = etnaviv_iommuv2_map,
 		.unmap = etnaviv_iommuv2_unmap,
-		.iova_to_phys = etnaviv_iommuv2_iova_to_phys,
 		.pgsize_bitmap = SZ_4K,
 	},
 	.dump_size = etnaviv_iommuv2_dump_size,
-- 
2.11.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 3/8] etnaviv: iommuv1: fold pagetable alloc and free into caller
  2017-09-15 17:04 [PATCH 1/8] etnaviv: remove iommu fault handler Lucas Stach
  2017-09-15 17:04 ` [PATCH 2/8] etnaviv: remove iova_to_phys iommu ops Lucas Stach
@ 2017-09-15 17:04 ` Lucas Stach
  2017-09-18 18:41   ` Philipp Zabel
  2017-09-27 11:26   ` Wladimir J. van der Laan
  2017-09-15 17:04 ` [PATCH 4/8] etnaviv: iommuv1: remove map_lock Lucas Stach
                   ` (6 subsequent siblings)
  8 siblings, 2 replies; 24+ messages in thread
From: Lucas Stach @ 2017-09-15 17:04 UTC (permalink / raw)
  To: dri-devel; +Cc: patchwork-lst, etnaviv, kernel, Russell King

Those functions are simple enough to fold them into the calling
function. This also fixes a correctness issue, as the alloc/free
functions didn't specifiy the device the memory was allocated for.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 drivers/gpu/drm/etnaviv/etnaviv_iommu.c | 27 ++++++++-------------------
 1 file changed, 8 insertions(+), 19 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
index f804c0aaa7a2..aaa8c4136f53 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
@@ -50,22 +50,6 @@ static struct etnaviv_iommu_domain *to_etnaviv_domain(struct iommu_domain *domai
 	return container_of(domain, struct etnaviv_iommu_domain, domain);
 }
 
-static int pgtable_alloc(struct etnaviv_iommu_domain_pgtable *pgtable,
-			 size_t size)
-{
-	pgtable->pgtable = dma_alloc_coherent(NULL, size, &pgtable->paddr, GFP_KERNEL);
-	if (!pgtable->pgtable)
-		return -ENOMEM;
-
-	return 0;
-}
-
-static void pgtable_free(struct etnaviv_iommu_domain_pgtable *pgtable,
-			 size_t size)
-{
-	dma_free_coherent(NULL, size, pgtable->pgtable, pgtable->paddr);
-}
-
 static void pgtable_write(struct etnaviv_iommu_domain_pgtable *pgtable,
 			  unsigned long iova, phys_addr_t paddr)
 {
@@ -91,8 +75,11 @@ static int __etnaviv_iommu_init(struct etnaviv_iommu_domain *etnaviv_domain)
 	for (i = 0; i < SZ_4K / 4; i++)
 		*p++ = 0xdead55aa;
 
-	ret = pgtable_alloc(&etnaviv_domain->pgtable, PT_SIZE);
-	if (ret < 0) {
+	etnaviv_domain->pgtable.pgtable =
+			dma_alloc_coherent(etnaviv_domain->dev, PT_SIZE,
+					   &etnaviv_domain->pgtable.paddr,
+					   GFP_KERNEL);
+	if (!etnaviv_domain->pgtable.pgtable) {
 		dma_free_coherent(etnaviv_domain->dev, SZ_4K,
 				  etnaviv_domain->bad_page_cpu,
 				  etnaviv_domain->bad_page_dma);
@@ -112,7 +99,9 @@ static void etnaviv_domain_free(struct iommu_domain *domain)
 {
 	struct etnaviv_iommu_domain *etnaviv_domain = to_etnaviv_domain(domain);
 
-	pgtable_free(&etnaviv_domain->pgtable, PT_SIZE);
+	dma_free_coherent(etnaviv_domain->dev, PT_SIZE,
+			  etnaviv_domain->pgtable.pgtable,
+			  etnaviv_domain->pgtable.paddr);
 
 	dma_free_coherent(etnaviv_domain->dev, SZ_4K,
 			  etnaviv_domain->bad_page_cpu,
-- 
2.11.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 4/8] etnaviv: iommuv1: remove map_lock
  2017-09-15 17:04 [PATCH 1/8] etnaviv: remove iommu fault handler Lucas Stach
  2017-09-15 17:04 ` [PATCH 2/8] etnaviv: remove iova_to_phys iommu ops Lucas Stach
  2017-09-15 17:04 ` [PATCH 3/8] etnaviv: iommuv1: fold pagetable alloc and free into caller Lucas Stach
@ 2017-09-15 17:04 ` Lucas Stach
  2017-09-18 18:41   ` Philipp Zabel
  2017-09-27 11:28   ` Wladimir J. van der Laan
  2017-09-15 17:04 ` [PATCH 5/8] etnaviv: iommuv1: fold pgtable_write into callers Lucas Stach
                   ` (5 subsequent siblings)
  8 siblings, 2 replies; 24+ messages in thread
From: Lucas Stach @ 2017-09-15 17:04 UTC (permalink / raw)
  To: dri-devel; +Cc: patchwork-lst, etnaviv, kernel, Russell King

It wasn't protecting anything, as the single word writes used to
set up or tear down a translation are already inherently atomic,
so the spinlock is pure overhead.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 drivers/gpu/drm/etnaviv/etnaviv_iommu.c | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
index aaa8c4136f53..78a7c0f3064a 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
@@ -42,7 +42,6 @@ struct etnaviv_iommu_domain {
 	void *bad_page_cpu;
 	dma_addr_t bad_page_dma;
 	struct etnaviv_iommu_domain_pgtable pgtable;
-	spinlock_t map_lock;
 };
 
 static struct etnaviv_iommu_domain *to_etnaviv_domain(struct iommu_domain *domain)
@@ -90,8 +89,6 @@ static int __etnaviv_iommu_init(struct etnaviv_iommu_domain *etnaviv_domain)
 		etnaviv_domain->pgtable.pgtable[i] =
 			etnaviv_domain->bad_page_dma;
 
-	spin_lock_init(&etnaviv_domain->map_lock);
-
 	return 0;
 }
 
@@ -118,9 +115,7 @@ static int etnaviv_iommuv1_map(struct iommu_domain *domain, unsigned long iova,
 	if (size != SZ_4K)
 		return -EINVAL;
 
-	spin_lock(&etnaviv_domain->map_lock);
 	pgtable_write(&etnaviv_domain->pgtable, iova, paddr);
-	spin_unlock(&etnaviv_domain->map_lock);
 
 	return 0;
 }
@@ -133,10 +128,8 @@ static size_t etnaviv_iommuv1_unmap(struct iommu_domain *domain,
 	if (size != SZ_4K)
 		return -EINVAL;
 
-	spin_lock(&etnaviv_domain->map_lock);
 	pgtable_write(&etnaviv_domain->pgtable, iova,
 		      etnaviv_domain->bad_page_dma);
-	spin_unlock(&etnaviv_domain->map_lock);
 
 	return SZ_4K;
 }
-- 
2.11.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 5/8] etnaviv: iommuv1: fold pgtable_write into callers
  2017-09-15 17:04 [PATCH 1/8] etnaviv: remove iommu fault handler Lucas Stach
                   ` (2 preceding siblings ...)
  2017-09-15 17:04 ` [PATCH 4/8] etnaviv: iommuv1: remove map_lock Lucas Stach
@ 2017-09-15 17:04 ` Lucas Stach
  2017-09-18 18:42   ` Philipp Zabel
  2017-09-27 11:30   ` Wladimir J. van der Laan
  2017-09-15 17:04 ` [PATCH 6/8] etnaviv: mmu: stop using iommu map/unmap functions Lucas Stach
                   ` (4 subsequent siblings)
  8 siblings, 2 replies; 24+ messages in thread
From: Lucas Stach @ 2017-09-15 17:04 UTC (permalink / raw)
  To: dri-devel; +Cc: patchwork-lst, etnaviv, kernel, Russell King

A function doing a single assignment is not really helping the
code flow.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 drivers/gpu/drm/etnaviv/etnaviv_iommu.c | 16 ++++------------
 1 file changed, 4 insertions(+), 12 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
index 78a7c0f3064a..43a0508bdbd7 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
@@ -49,15 +49,6 @@ static struct etnaviv_iommu_domain *to_etnaviv_domain(struct iommu_domain *domai
 	return container_of(domain, struct etnaviv_iommu_domain, domain);
 }
 
-static void pgtable_write(struct etnaviv_iommu_domain_pgtable *pgtable,
-			  unsigned long iova, phys_addr_t paddr)
-{
-	/* calcuate index into page table */
-	unsigned int index = (iova - GPU_MEM_START) / SZ_4K;
-
-	pgtable->pgtable[index] = paddr;
-}
-
 static int __etnaviv_iommu_init(struct etnaviv_iommu_domain *etnaviv_domain)
 {
 	u32 *p;
@@ -111,11 +102,12 @@ static int etnaviv_iommuv1_map(struct iommu_domain *domain, unsigned long iova,
 	   phys_addr_t paddr, size_t size, int prot)
 {
 	struct etnaviv_iommu_domain *etnaviv_domain = to_etnaviv_domain(domain);
+	unsigned int index = (iova - GPU_MEM_START) / SZ_4K;
 
 	if (size != SZ_4K)
 		return -EINVAL;
 
-	pgtable_write(&etnaviv_domain->pgtable, iova, paddr);
+	etnaviv_domain->pgtable.pgtable[index] = paddr;
 
 	return 0;
 }
@@ -124,12 +116,12 @@ static size_t etnaviv_iommuv1_unmap(struct iommu_domain *domain,
 	unsigned long iova, size_t size)
 {
 	struct etnaviv_iommu_domain *etnaviv_domain = to_etnaviv_domain(domain);
+	unsigned int index = (iova - GPU_MEM_START) / SZ_4K;
 
 	if (size != SZ_4K)
 		return -EINVAL;
 
-	pgtable_write(&etnaviv_domain->pgtable, iova,
-		      etnaviv_domain->bad_page_dma);
+	etnaviv_domain->pgtable.pgtable[index] = etnaviv_domain->bad_page_dma;
 
 	return SZ_4K;
 }
-- 
2.11.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 6/8] etnaviv: mmu: stop using iommu map/unmap functions
  2017-09-15 17:04 [PATCH 1/8] etnaviv: remove iommu fault handler Lucas Stach
                   ` (3 preceding siblings ...)
  2017-09-15 17:04 ` [PATCH 5/8] etnaviv: iommuv1: fold pgtable_write into callers Lucas Stach
@ 2017-09-15 17:04 ` Lucas Stach
  2017-09-18 18:35   ` Philipp Zabel
  2017-09-27 11:36   ` Wladimir J. van der Laan
  2017-09-15 17:04 ` [PATCH 7/8] etnaviv: mmu: mark local functions static Lucas Stach
                   ` (3 subsequent siblings)
  8 siblings, 2 replies; 24+ messages in thread
From: Lucas Stach @ 2017-09-15 17:04 UTC (permalink / raw)
  To: dri-devel; +Cc: patchwork-lst, etnaviv, kernel, Russell King

This is a preparation to remove the etnaviv dependency on the IOMMU
subsystem by importing the relevant parts of the iommu map/unamp
functions into the driver.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 66 +++++++++++++++++++++++++++++++----
 1 file changed, 60 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
index f3ed07db9b2d..0be28467af61 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
@@ -22,6 +22,60 @@
 #include "etnaviv_iommu.h"
 #include "etnaviv_mmu.h"
 
+size_t etnaviv_domain_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)
+{
+	size_t unmapped_page, unmapped = 0;
+	size_t pgsize = SZ_4K;
+
+	if (!IS_ALIGNED(iova | size, pgsize)) {
+		pr_err("unaligned: iova 0x%lx size 0x%zx min_pagesz 0x%x\n",
+		       iova, size, pgsize);
+		return -EINVAL;
+	}
+
+	while (unmapped < size) {
+		unmapped_page = domain->ops->unmap(domain, iova, pgsize);
+		if (!unmapped_page)
+			break;
+
+		iova += unmapped_page;
+		unmapped += unmapped_page;
+	}
+
+	return unmapped;
+}
+
+static int etnaviv_domain_map(struct iommu_domain *domain, unsigned long iova,
+		     phys_addr_t paddr, size_t size, int prot)
+{
+	unsigned long orig_iova = iova;
+	size_t pgsize = SZ_4K;
+	size_t orig_size = size;
+	int ret = 0;
+
+	if (!IS_ALIGNED(iova | paddr | size, pgsize)) {
+		pr_err("unaligned: iova 0x%lx pa %pa size 0x%zx min_pagesz 0x%x\n",
+		       iova, &paddr, size, pgsize);
+		return -EINVAL;
+	}
+
+	while (size) {
+		ret = domain->ops->map(domain, iova, paddr, pgsize, prot);
+		if (ret)
+			break;
+
+		iova += pgsize;
+		paddr += pgsize;
+		size -= pgsize;
+	}
+
+	/* unroll mapping in case something went wrong */
+	if (ret)
+		etnaviv_domain_unmap(domain, orig_iova, orig_size - size);
+
+	return ret;
+}
+
 int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
 		struct sg_table *sgt, unsigned len, int prot)
 {
@@ -40,7 +94,7 @@ int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
 
 		VERB("map[%d]: %08x %08x(%zx)", i, iova, pa, bytes);
 
-		ret = iommu_map(domain, da, pa, bytes, prot);
+		ret = etnaviv_domain_map(domain, da, pa, bytes, prot);
 		if (ret)
 			goto fail;
 
@@ -55,7 +109,7 @@ int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
 	for_each_sg(sgt->sgl, sg, i, j) {
 		size_t bytes = sg_dma_len(sg) + sg->offset;
 
-		iommu_unmap(domain, da, bytes);
+		etnaviv_domain_unmap(domain, da, bytes);
 		da += bytes;
 	}
 	return ret;
@@ -73,7 +127,7 @@ int etnaviv_iommu_unmap(struct etnaviv_iommu *iommu, u32 iova,
 		size_t bytes = sg_dma_len(sg) + sg->offset;
 		size_t unmapped;
 
-		unmapped = iommu_unmap(domain, da, bytes);
+		unmapped = etnaviv_domain_unmap(domain, da, bytes);
 		if (unmapped < bytes)
 			return unmapped;
 
@@ -329,8 +383,8 @@ int etnaviv_iommu_get_suballoc_va(struct etnaviv_gpu *gpu, dma_addr_t paddr,
 			mutex_unlock(&mmu->lock);
 			return ret;
 		}
-		ret = iommu_map(mmu->domain, vram_node->start, paddr, size,
-				IOMMU_READ);
+		ret = etnaviv_domain_map(mmu->domain, vram_node->start, paddr,
+					 size, IOMMU_READ);
 		if (ret < 0) {
 			drm_mm_remove_node(vram_node);
 			mutex_unlock(&mmu->lock);
@@ -353,7 +407,7 @@ void etnaviv_iommu_put_suballoc_va(struct etnaviv_gpu *gpu,
 
 	if (mmu->version == ETNAVIV_IOMMU_V2) {
 		mutex_lock(&mmu->lock);
-		iommu_unmap(mmu->domain,iova, size);
+		etnaviv_domain_unmap(mmu->domain, iova, size);
 		drm_mm_remove_node(vram_node);
 		mutex_unlock(&mmu->lock);
 	}
-- 
2.11.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 7/8] etnaviv: mmu: mark local functions static
  2017-09-15 17:04 [PATCH 1/8] etnaviv: remove iommu fault handler Lucas Stach
                   ` (4 preceding siblings ...)
  2017-09-15 17:04 ` [PATCH 6/8] etnaviv: mmu: stop using iommu map/unmap functions Lucas Stach
@ 2017-09-15 17:04 ` Lucas Stach
  2017-09-18 18:42   ` Philipp Zabel
  2017-09-27 11:37   ` Wladimir J. van der Laan
  2017-09-15 17:04 ` [PATCH 8/8] etnaviv: remove IOMMU dependency Lucas Stach
                   ` (2 subsequent siblings)
  8 siblings, 2 replies; 24+ messages in thread
From: Lucas Stach @ 2017-09-15 17:04 UTC (permalink / raw)
  To: dri-devel; +Cc: patchwork-lst, etnaviv, kernel, Russell King

And clean up the header file a bit.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 8 ++++----
 drivers/gpu/drm/etnaviv/etnaviv_mmu.h | 8 +-------
 2 files changed, 5 insertions(+), 11 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
index 0be28467af61..9f1f214e2918 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
@@ -76,8 +76,8 @@ static int etnaviv_domain_map(struct iommu_domain *domain, unsigned long iova,
 	return ret;
 }
 
-int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
-		struct sg_table *sgt, unsigned len, int prot)
+static int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
+			     struct sg_table *sgt, unsigned len, int prot)
 {
 	struct iommu_domain *domain = iommu->domain;
 	struct scatterlist *sg;
@@ -115,8 +115,8 @@ int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
 	return ret;
 }
 
-int etnaviv_iommu_unmap(struct etnaviv_iommu *iommu, u32 iova,
-		struct sg_table *sgt, unsigned len)
+static int etnaviv_iommu_unmap(struct etnaviv_iommu *iommu, u32 iova,
+			       struct sg_table *sgt, unsigned len)
 {
 	struct iommu_domain *domain = iommu->domain;
 	struct scatterlist *sg;
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.h b/drivers/gpu/drm/etnaviv/etnaviv_mmu.h
index 54be289e5981..d072eda7a00d 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.h
@@ -49,18 +49,11 @@ struct etnaviv_iommu {
 
 struct etnaviv_gem_object;
 
-int etnaviv_iommu_attach(struct etnaviv_iommu *iommu, const char **names,
-	int cnt);
-int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
-	struct sg_table *sgt, unsigned len, int prot);
-int etnaviv_iommu_unmap(struct etnaviv_iommu *iommu, u32 iova,
-	struct sg_table *sgt, unsigned len);
 int etnaviv_iommu_map_gem(struct etnaviv_iommu *mmu,
 	struct etnaviv_gem_object *etnaviv_obj, u32 memory_base,
 	struct etnaviv_vram_mapping *mapping);
 void etnaviv_iommu_unmap_gem(struct etnaviv_iommu *mmu,
 	struct etnaviv_vram_mapping *mapping);
-void etnaviv_iommu_destroy(struct etnaviv_iommu *iommu);
 
 int etnaviv_iommu_get_suballoc_va(struct etnaviv_gpu *gpu, dma_addr_t paddr,
 				  struct drm_mm_node *vram_node, size_t size,
@@ -73,6 +66,7 @@ size_t etnaviv_iommu_dump_size(struct etnaviv_iommu *iommu);
 void etnaviv_iommu_dump(struct etnaviv_iommu *iommu, void *buf);
 
 struct etnaviv_iommu *etnaviv_iommu_new(struct etnaviv_gpu *gpu);
+void etnaviv_iommu_destroy(struct etnaviv_iommu *iommu);
 void etnaviv_iommu_restore(struct etnaviv_gpu *gpu);
 
 #endif /* __ETNAVIV_MMU_H__ */
-- 
2.11.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* [PATCH 8/8] etnaviv: remove IOMMU dependency
  2017-09-15 17:04 [PATCH 1/8] etnaviv: remove iommu fault handler Lucas Stach
                   ` (5 preceding siblings ...)
  2017-09-15 17:04 ` [PATCH 7/8] etnaviv: mmu: mark local functions static Lucas Stach
@ 2017-09-15 17:04 ` Lucas Stach
  2017-09-18 18:33   ` Philipp Zabel
  2017-09-27 11:39   ` Wladimir J. van der Laan
  2017-09-18 18:40 ` [PATCH 1/8] etnaviv: remove iommu fault handler Philipp Zabel
  2017-09-27 11:24 ` Wladimir J. van der Laan
  8 siblings, 2 replies; 24+ messages in thread
From: Lucas Stach @ 2017-09-15 17:04 UTC (permalink / raw)
  To: dri-devel; +Cc: patchwork-lst, etnaviv, kernel, Russell King

Using the IOMMU API to manage the internal GPU MMU has been an
historical accident and it keeps getting in the way, as well as
entangling the driver with the inner workings of the IOMMU
subsystem.

Clean this up by removing the usage of iommu_domain, which is the
last piece linking etnaviv to the IOMMU subsystem.

Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
---
 drivers/gpu/drm/etnaviv/Kconfig            |  2 -
 drivers/gpu/drm/etnaviv/etnaviv_drv.h      |  1 -
 drivers/gpu/drm/etnaviv/etnaviv_iommu.c    | 71 +++++++++++++++---------------
 drivers/gpu/drm/etnaviv/etnaviv_iommu.h    |  6 ++-
 drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c | 55 +++++++++++------------
 drivers/gpu/drm/etnaviv/etnaviv_mmu.c      | 38 +++++++---------
 drivers/gpu/drm/etnaviv/etnaviv_mmu.h      | 20 ++++++---
 7 files changed, 93 insertions(+), 100 deletions(-)

diff --git a/drivers/gpu/drm/etnaviv/Kconfig b/drivers/gpu/drm/etnaviv/Kconfig
index 71cee4e9fefb..b0a4ee27eb05 100644
--- a/drivers/gpu/drm/etnaviv/Kconfig
+++ b/drivers/gpu/drm/etnaviv/Kconfig
@@ -7,8 +7,6 @@ config DRM_ETNAVIV
 	select SHMEM
 	select SYNC_FILE
 	select TMPFS
-	select IOMMU_API
-	select IOMMU_SUPPORT
 	select WANT_DEV_COREDUMP
 	help
 	  DRM driver for Vivante GPUs.
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
index 058389f93b69..d157d9379e68 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
@@ -26,7 +26,6 @@
 #include <linux/pm_runtime.h>
 #include <linux/slab.h>
 #include <linux/list.h>
-#include <linux/iommu.h>
 #include <linux/types.h>
 #include <linux/sizes.h>
 
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
index 43a0508bdbd7..f0390842441a 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
@@ -14,7 +14,6 @@
  * this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <linux/iommu.h>
 #include <linux/platform_device.h>
 #include <linux/sizes.h>
 #include <linux/slab.h>
@@ -36,20 +35,21 @@ struct etnaviv_iommu_domain_pgtable {
 	dma_addr_t paddr;
 };
 
-struct etnaviv_iommu_domain {
-	struct iommu_domain domain;
+struct etnaviv_iommuv1_domain {
+	struct etnaviv_iommu_domain base;
 	struct device *dev;
 	void *bad_page_cpu;
 	dma_addr_t bad_page_dma;
 	struct etnaviv_iommu_domain_pgtable pgtable;
 };
 
-static struct etnaviv_iommu_domain *to_etnaviv_domain(struct iommu_domain *domain)
+static struct etnaviv_iommuv1_domain *
+to_etnaviv_domain(struct etnaviv_iommu_domain *domain)
 {
-	return container_of(domain, struct etnaviv_iommu_domain, domain);
+	return container_of(domain, struct etnaviv_iommuv1_domain, base);
 }
 
-static int __etnaviv_iommu_init(struct etnaviv_iommu_domain *etnaviv_domain)
+static int __etnaviv_iommu_init(struct etnaviv_iommuv1_domain *etnaviv_domain)
 {
 	u32 *p;
 	int ret, i;
@@ -83,9 +83,10 @@ static int __etnaviv_iommu_init(struct etnaviv_iommu_domain *etnaviv_domain)
 	return 0;
 }
 
-static void etnaviv_domain_free(struct iommu_domain *domain)
+static void etnaviv_iommuv1_domain_free(struct etnaviv_iommu_domain *domain)
 {
-	struct etnaviv_iommu_domain *etnaviv_domain = to_etnaviv_domain(domain);
+	struct etnaviv_iommuv1_domain *etnaviv_domain =
+			to_etnaviv_domain(domain);
 
 	dma_free_coherent(etnaviv_domain->dev, PT_SIZE,
 			  etnaviv_domain->pgtable.pgtable,
@@ -98,10 +99,11 @@ static void etnaviv_domain_free(struct iommu_domain *domain)
 	kfree(etnaviv_domain);
 }
 
-static int etnaviv_iommuv1_map(struct iommu_domain *domain, unsigned long iova,
-	   phys_addr_t paddr, size_t size, int prot)
+static int etnaviv_iommuv1_map(struct etnaviv_iommu_domain *domain,
+			       unsigned long iova, phys_addr_t paddr,
+			       size_t size, int prot)
 {
-	struct etnaviv_iommu_domain *etnaviv_domain = to_etnaviv_domain(domain);
+	struct etnaviv_iommuv1_domain *etnaviv_domain = to_etnaviv_domain(domain);
 	unsigned int index = (iova - GPU_MEM_START) / SZ_4K;
 
 	if (size != SZ_4K)
@@ -112,10 +114,11 @@ static int etnaviv_iommuv1_map(struct iommu_domain *domain, unsigned long iova,
 	return 0;
 }
 
-static size_t etnaviv_iommuv1_unmap(struct iommu_domain *domain,
+static size_t etnaviv_iommuv1_unmap(struct etnaviv_iommu_domain *domain,
 	unsigned long iova, size_t size)
 {
-	struct etnaviv_iommu_domain *etnaviv_domain = to_etnaviv_domain(domain);
+	struct etnaviv_iommuv1_domain *etnaviv_domain =
+			to_etnaviv_domain(domain);
 	unsigned int index = (iova - GPU_MEM_START) / SZ_4K;
 
 	if (size != SZ_4K)
@@ -126,32 +129,22 @@ static size_t etnaviv_iommuv1_unmap(struct iommu_domain *domain,
 	return SZ_4K;
 }
 
-static size_t etnaviv_iommuv1_dump_size(struct iommu_domain *domain)
+static size_t etnaviv_iommuv1_dump_size(struct etnaviv_iommu_domain *domain)
 {
 	return PT_SIZE;
 }
 
-static void etnaviv_iommuv1_dump(struct iommu_domain *domain, void *buf)
+static void etnaviv_iommuv1_dump(struct etnaviv_iommu_domain *domain, void *buf)
 {
-	struct etnaviv_iommu_domain *etnaviv_domain = to_etnaviv_domain(domain);
+	struct etnaviv_iommuv1_domain *etnaviv_domain =
+			to_etnaviv_domain(domain);
 
 	memcpy(buf, etnaviv_domain->pgtable.pgtable, PT_SIZE);
 }
 
-static const struct etnaviv_iommu_ops etnaviv_iommu_ops = {
-	.ops = {
-		.domain_free = etnaviv_domain_free,
-		.map = etnaviv_iommuv1_map,
-		.unmap = etnaviv_iommuv1_unmap,
-		.pgsize_bitmap = SZ_4K,
-	},
-	.dump_size = etnaviv_iommuv1_dump_size,
-	.dump = etnaviv_iommuv1_dump,
-};
-
 void etnaviv_iommuv1_restore(struct etnaviv_gpu *gpu)
 {
-	struct etnaviv_iommu_domain *etnaviv_domain =
+	struct etnaviv_iommuv1_domain *etnaviv_domain =
 			to_etnaviv_domain(gpu->mmu->domain);
 	u32 pgtable;
 
@@ -172,9 +165,11 @@ void etnaviv_iommuv1_restore(struct etnaviv_gpu *gpu)
 	gpu_write(gpu, VIVS_MC_MMU_RA_PAGE_TABLE, pgtable);
 }
 
-struct iommu_domain *etnaviv_iommuv1_domain_alloc(struct etnaviv_gpu *gpu)
+struct etnaviv_iommu_domain *
+etnaviv_iommuv1_domain_alloc(struct etnaviv_gpu *gpu)
 {
-	struct etnaviv_iommu_domain *etnaviv_domain;
+	struct etnaviv_iommuv1_domain *etnaviv_domain;
+	struct etnaviv_iommu_domain *domain;
 	int ret;
 
 	etnaviv_domain = kzalloc(sizeof(*etnaviv_domain), GFP_KERNEL);
@@ -183,17 +178,21 @@ struct iommu_domain *etnaviv_iommuv1_domain_alloc(struct etnaviv_gpu *gpu)
 
 	etnaviv_domain->dev = gpu->dev;
 
-	etnaviv_domain->domain.type = __IOMMU_DOMAIN_PAGING;
-	etnaviv_domain->domain.ops = &etnaviv_iommu_ops.ops;
-	etnaviv_domain->domain.pgsize_bitmap = SZ_4K;
-	etnaviv_domain->domain.geometry.aperture_start = GPU_MEM_START;
-	etnaviv_domain->domain.geometry.aperture_end = GPU_MEM_START + PT_ENTRIES * SZ_4K - 1;
+	domain = &etnaviv_domain->base;
+
+	domain->free = etnaviv_iommuv1_domain_free;
+	domain->map = etnaviv_iommuv1_map;
+	domain->unmap = etnaviv_iommuv1_unmap,
+	domain->dump_size = etnaviv_iommuv1_dump_size;
+	domain->dump = etnaviv_iommuv1_dump;
+	domain->base = GPU_MEM_START;
+	domain->size = PT_ENTRIES * SZ_4K;
 
 	ret = __etnaviv_iommu_init(etnaviv_domain);
 	if (ret)
 		goto out_free;
 
-	return &etnaviv_domain->domain;
+	return &etnaviv_domain->base;
 
 out_free:
 	kfree(etnaviv_domain);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.h b/drivers/gpu/drm/etnaviv/etnaviv_iommu.h
index 8b51e7c16feb..750bc7e796c7 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.h
@@ -19,10 +19,12 @@
 
 struct etnaviv_gpu;
 
-struct iommu_domain *etnaviv_iommuv1_domain_alloc(struct etnaviv_gpu *gpu);
+struct etnaviv_iommu_domain *
+etnaviv_iommuv1_domain_alloc(struct etnaviv_gpu *gpu);
 void etnaviv_iommuv1_restore(struct etnaviv_gpu *gpu);
 
-struct iommu_domain *etnaviv_iommuv2_domain_alloc(struct etnaviv_gpu *gpu);
+struct etnaviv_iommu_domain *
+etnaviv_iommuv2_domain_alloc(struct etnaviv_gpu *gpu);
 void etnaviv_iommuv2_restore(struct etnaviv_gpu *gpu);
 
 #endif /* __ETNAVIV_IOMMU_H__ */
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
index d794e8c0dd7e..c7437a59034e 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
@@ -14,7 +14,6 @@
  * this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-#include <linux/iommu.h>
 #include <linux/platform_device.h>
 #include <linux/sizes.h>
 #include <linux/slab.h>
@@ -40,7 +39,7 @@
 #define MMUv2_MAX_STLB_ENTRIES		1024
 
 struct etnaviv_iommuv2_domain {
-	struct iommu_domain domain;
+	struct etnaviv_iommu_domain base;
 	struct device *dev;
 	void *bad_page_cpu;
 	dma_addr_t bad_page_dma;
@@ -52,13 +51,15 @@ struct etnaviv_iommuv2_domain {
 	dma_addr_t stlb_dma[1024];
 };
 
-static struct etnaviv_iommuv2_domain *to_etnaviv_domain(struct iommu_domain *domain)
+static struct etnaviv_iommuv2_domain *
+to_etnaviv_domain(struct etnaviv_iommu_domain *domain)
 {
-	return container_of(domain, struct etnaviv_iommuv2_domain, domain);
+	return container_of(domain, struct etnaviv_iommuv2_domain, base);
 }
 
-static int etnaviv_iommuv2_map(struct iommu_domain *domain, unsigned long iova,
-	   phys_addr_t paddr, size_t size, int prot)
+static int etnaviv_iommuv2_map(struct etnaviv_iommu_domain *domain,
+			       unsigned long iova, phys_addr_t paddr,
+			       size_t size, int prot)
 {
 	struct etnaviv_iommuv2_domain *etnaviv_domain =
 			to_etnaviv_domain(domain);
@@ -68,7 +69,7 @@ static int etnaviv_iommuv2_map(struct iommu_domain *domain, unsigned long iova,
 	if (size != SZ_4K)
 		return -EINVAL;
 
-	if (prot & IOMMU_WRITE)
+	if (prot & ETNAVIV_PROT_WRITE)
 		entry |= MMUv2_PTE_WRITEABLE;
 
 	mtlb_entry = (iova & MMUv2_MTLB_MASK) >> MMUv2_MTLB_SHIFT;
@@ -79,8 +80,8 @@ static int etnaviv_iommuv2_map(struct iommu_domain *domain, unsigned long iova,
 	return 0;
 }
 
-static size_t etnaviv_iommuv2_unmap(struct iommu_domain *domain,
-	unsigned long iova, size_t size)
+static size_t etnaviv_iommuv2_unmap(struct etnaviv_iommu_domain *domain,
+				    unsigned long iova, size_t size)
 {
 	struct etnaviv_iommuv2_domain *etnaviv_domain =
 			to_etnaviv_domain(domain);
@@ -166,7 +167,7 @@ static int etnaviv_iommuv2_init(struct etnaviv_iommuv2_domain *etnaviv_domain)
 	return ret;
 }
 
-static void etnaviv_iommuv2_domain_free(struct iommu_domain *domain)
+static void etnaviv_iommuv2_domain_free(struct etnaviv_iommu_domain *domain)
 {
 	struct etnaviv_iommuv2_domain *etnaviv_domain =
 			to_etnaviv_domain(domain);
@@ -190,7 +191,7 @@ static void etnaviv_iommuv2_domain_free(struct iommu_domain *domain)
 	vfree(etnaviv_domain);
 }
 
-static size_t etnaviv_iommuv2_dump_size(struct iommu_domain *domain)
+static size_t etnaviv_iommuv2_dump_size(struct etnaviv_iommu_domain *domain)
 {
 	struct etnaviv_iommuv2_domain *etnaviv_domain =
 			to_etnaviv_domain(domain);
@@ -204,7 +205,7 @@ static size_t etnaviv_iommuv2_dump_size(struct iommu_domain *domain)
 	return dump_size;
 }
 
-static void etnaviv_iommuv2_dump(struct iommu_domain *domain, void *buf)
+static void etnaviv_iommuv2_dump(struct etnaviv_iommu_domain *domain, void *buf)
 {
 	struct etnaviv_iommuv2_domain *etnaviv_domain =
 			to_etnaviv_domain(domain);
@@ -217,17 +218,6 @@ static void etnaviv_iommuv2_dump(struct iommu_domain *domain, void *buf)
 			memcpy(buf, etnaviv_domain->stlb_cpu[i], SZ_4K);
 }
 
-static const struct etnaviv_iommu_ops etnaviv_iommu_ops = {
-	.ops = {
-		.domain_free = etnaviv_iommuv2_domain_free,
-		.map = etnaviv_iommuv2_map,
-		.unmap = etnaviv_iommuv2_unmap,
-		.pgsize_bitmap = SZ_4K,
-	},
-	.dump_size = etnaviv_iommuv2_dump_size,
-	.dump = etnaviv_iommuv2_dump,
-};
-
 void etnaviv_iommuv2_restore(struct etnaviv_gpu *gpu)
 {
 	struct etnaviv_iommuv2_domain *etnaviv_domain =
@@ -247,9 +237,11 @@ void etnaviv_iommuv2_restore(struct etnaviv_gpu *gpu)
 
 	gpu_write(gpu, VIVS_MMUv2_CONTROL, VIVS_MMUv2_CONTROL_ENABLE);
 }
-struct iommu_domain *etnaviv_iommuv2_domain_alloc(struct etnaviv_gpu *gpu)
+struct etnaviv_iommu_domain *
+etnaviv_iommuv2_domain_alloc(struct etnaviv_gpu *gpu)
 {
 	struct etnaviv_iommuv2_domain *etnaviv_domain;
+	struct etnaviv_iommu_domain *domain;
 	int ret;
 
 	etnaviv_domain = vzalloc(sizeof(*etnaviv_domain));
@@ -257,18 +249,21 @@ struct iommu_domain *etnaviv_iommuv2_domain_alloc(struct etnaviv_gpu *gpu)
 		return NULL;
 
 	etnaviv_domain->dev = gpu->dev;
+	domain = &etnaviv_domain->base;
 
-	etnaviv_domain->domain.type = __IOMMU_DOMAIN_PAGING;
-	etnaviv_domain->domain.ops = &etnaviv_iommu_ops.ops;
-	etnaviv_domain->domain.pgsize_bitmap = SZ_4K;
-	etnaviv_domain->domain.geometry.aperture_start = 0;
-	etnaviv_domain->domain.geometry.aperture_end = ~0UL & ~(SZ_4K - 1);
+	domain->free = etnaviv_iommuv2_domain_free;
+	domain->map = etnaviv_iommuv2_map;
+	domain->unmap = etnaviv_iommuv2_unmap,
+	domain->dump_size = etnaviv_iommuv2_dump_size;
+	domain->dump = etnaviv_iommuv2_dump;
+	domain->base = 0;
+	domain->size = (u64)SZ_1G * 4;
 
 	ret = etnaviv_iommuv2_init(etnaviv_domain);
 	if (ret)
 		goto out_free;
 
-	return &etnaviv_domain->domain;
+	return &etnaviv_domain->base;
 
 out_free:
 	vfree(etnaviv_domain);
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
index 9f1f214e2918..7e52263623b8 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
+++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
@@ -22,7 +22,8 @@
 #include "etnaviv_iommu.h"
 #include "etnaviv_mmu.h"
 
-size_t etnaviv_domain_unmap(struct iommu_domain *domain, unsigned long iova, size_t size)
+size_t etnaviv_domain_unmap(struct etnaviv_iommu_domain *domain,
+			    unsigned long iova, size_t size)
 {
 	size_t unmapped_page, unmapped = 0;
 	size_t pgsize = SZ_4K;
@@ -34,7 +35,7 @@ size_t etnaviv_domain_unmap(struct iommu_domain *domain, unsigned long iova, siz
 	}
 
 	while (unmapped < size) {
-		unmapped_page = domain->ops->unmap(domain, iova, pgsize);
+		unmapped_page = domain->unmap(domain, iova, pgsize);
 		if (!unmapped_page)
 			break;
 
@@ -45,8 +46,9 @@ size_t etnaviv_domain_unmap(struct iommu_domain *domain, unsigned long iova, siz
 	return unmapped;
 }
 
-static int etnaviv_domain_map(struct iommu_domain *domain, unsigned long iova,
-		     phys_addr_t paddr, size_t size, int prot)
+static int etnaviv_domain_map(struct etnaviv_iommu_domain *domain,
+			      unsigned long iova, phys_addr_t paddr,
+			      size_t size, int prot)
 {
 	unsigned long orig_iova = iova;
 	size_t pgsize = SZ_4K;
@@ -60,7 +62,7 @@ static int etnaviv_domain_map(struct iommu_domain *domain, unsigned long iova,
 	}
 
 	while (size) {
-		ret = domain->ops->map(domain, iova, paddr, pgsize, prot);
+		ret = domain->map(domain, iova, paddr, pgsize, prot);
 		if (ret)
 			break;
 
@@ -79,7 +81,7 @@ static int etnaviv_domain_map(struct iommu_domain *domain, unsigned long iova,
 static int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
 			     struct sg_table *sgt, unsigned len, int prot)
 {
-	struct iommu_domain *domain = iommu->domain;
+	struct etnaviv_iommu_domain *domain = iommu->domain;
 	struct scatterlist *sg;
 	unsigned int da = iova;
 	unsigned int i, j;
@@ -118,7 +120,7 @@ static int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
 static int etnaviv_iommu_unmap(struct etnaviv_iommu *iommu, u32 iova,
 			       struct sg_table *sgt, unsigned len)
 {
-	struct iommu_domain *domain = iommu->domain;
+	struct etnaviv_iommu_domain *domain = iommu->domain;
 	struct scatterlist *sg;
 	unsigned int da = iova;
 	int i;
@@ -284,7 +286,7 @@ int etnaviv_iommu_map_gem(struct etnaviv_iommu *mmu,
 	mmu->last_iova = node->start + etnaviv_obj->base.size;
 	mapping->iova = node->start;
 	ret = etnaviv_iommu_map(mmu, node->start, sgt, etnaviv_obj->base.size,
-				IOMMU_READ | IOMMU_WRITE);
+				ETNAVIV_PROT_READ | ETNAVIV_PROT_WRITE);
 
 	if (ret < 0) {
 		drm_mm_remove_node(node);
@@ -318,7 +320,7 @@ void etnaviv_iommu_unmap_gem(struct etnaviv_iommu *mmu,
 void etnaviv_iommu_destroy(struct etnaviv_iommu *mmu)
 {
 	drm_mm_takedown(&mmu->mm);
-	iommu_domain_free(mmu->domain);
+	mmu->domain->free(mmu->domain);
 	kfree(mmu);
 }
 
@@ -350,9 +352,7 @@ struct etnaviv_iommu *etnaviv_iommu_new(struct etnaviv_gpu *gpu)
 	mutex_init(&mmu->lock);
 	INIT_LIST_HEAD(&mmu->mappings);
 
-	drm_mm_init(&mmu->mm, mmu->domain->geometry.aperture_start,
-		    mmu->domain->geometry.aperture_end -
-		    mmu->domain->geometry.aperture_start + 1);
+	drm_mm_init(&mmu->mm, mmu->domain->base, mmu->domain->size);
 
 	return mmu;
 }
@@ -384,7 +384,7 @@ int etnaviv_iommu_get_suballoc_va(struct etnaviv_gpu *gpu, dma_addr_t paddr,
 			return ret;
 		}
 		ret = etnaviv_domain_map(mmu->domain, vram_node->start, paddr,
-					 size, IOMMU_READ);
+					 size, ETNAVIV_PROT_READ);
 		if (ret < 0) {
 			drm_mm_remove_node(vram_node);
 			mutex_unlock(&mmu->lock);
@@ -414,18 +414,10 @@ void etnaviv_iommu_put_suballoc_va(struct etnaviv_gpu *gpu,
 }
 size_t etnaviv_iommu_dump_size(struct etnaviv_iommu *iommu)
 {
-	struct etnaviv_iommu_ops *ops;
-
-	ops = container_of(iommu->domain->ops, struct etnaviv_iommu_ops, ops);
-
-	return ops->dump_size(iommu->domain);
+	return iommu->domain->dump_size(iommu->domain);
 }
 
 void etnaviv_iommu_dump(struct etnaviv_iommu *iommu, void *buf)
 {
-	struct etnaviv_iommu_ops *ops;
-
-	ops = container_of(iommu->domain->ops, struct etnaviv_iommu_ops, ops);
-
-	ops->dump(iommu->domain, buf);
+	iommu->domain->dump(iommu->domain, buf);
 }
diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.h b/drivers/gpu/drm/etnaviv/etnaviv_mmu.h
index d072eda7a00d..38301b9d48e8 100644
--- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.h
+++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.h
@@ -17,7 +17,8 @@
 #ifndef __ETNAVIV_MMU_H__
 #define __ETNAVIV_MMU_H__
 
-#include <linux/iommu.h>
+#define ETNAVIV_PROT_READ	(1 << 0)
+#define ETNAVIV_PROT_WRITE	(1 << 1)
 
 enum etnaviv_iommu_version {
 	ETNAVIV_IOMMU_V1 = 0,
@@ -26,16 +27,23 @@ enum etnaviv_iommu_version {
 
 struct etnaviv_gpu;
 struct etnaviv_vram_mapping;
+struct etnaviv_iommu_domain;
 
-struct etnaviv_iommu_ops {
-	struct iommu_ops ops;
-	size_t (*dump_size)(struct iommu_domain *);
-	void (*dump)(struct iommu_domain *, void *);
+struct etnaviv_iommu_domain {
+	void (*free)(struct etnaviv_iommu_domain *);
+	int (*map)(struct etnaviv_iommu_domain *domain, unsigned long iova,
+		   phys_addr_t paddr, size_t size, int prot);
+	size_t (*unmap)(struct etnaviv_iommu_domain *domain, unsigned long iova,
+		     size_t size);
+	size_t (*dump_size)(struct etnaviv_iommu_domain *);
+	void (*dump)(struct etnaviv_iommu_domain *, void *);
+	u64 base;
+	u64 size;
 };
 
 struct etnaviv_iommu {
 	struct etnaviv_gpu *gpu;
-	struct iommu_domain *domain;
+	struct etnaviv_iommu_domain *domain;
 
 	enum etnaviv_iommu_version version;
 
-- 
2.11.0

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply related	[flat|nested] 24+ messages in thread

* Re: [PATCH 8/8] etnaviv: remove IOMMU dependency
  2017-09-15 17:04 ` [PATCH 8/8] etnaviv: remove IOMMU dependency Lucas Stach
@ 2017-09-18 18:33   ` Philipp Zabel
  2017-09-27 11:39   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Philipp Zabel @ 2017-09-18 18:33 UTC (permalink / raw)
  To: Lucas Stach, dri-devel; +Cc: Russell King, etnaviv, kernel, patchwork-lst

On Fri, 2017-09-15 at 19:04 +0200, Lucas Stach wrote:
> Using the IOMMU API to manage the internal GPU MMU has been an
> historical accident and it keeps getting in the way, as well as
> entangling the driver with the inner workings of the IOMMU
> subsystem.
> 
> Clean this up by removing the usage of iommu_domain, which is the
> last piece linking etnaviv to the IOMMU subsystem.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
> ---
>  drivers/gpu/drm/etnaviv/Kconfig            |  2 -
>  drivers/gpu/drm/etnaviv/etnaviv_drv.h      |  1 -
>  drivers/gpu/drm/etnaviv/etnaviv_iommu.c    | 71 +++++++++++++++----
> -----------
>  drivers/gpu/drm/etnaviv/etnaviv_iommu.h    |  6 ++-
>  drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c | 55 +++++++++++--------
> ----
>  drivers/gpu/drm/etnaviv/etnaviv_mmu.c      | 38 +++++++---------
>  drivers/gpu/drm/etnaviv/etnaviv_mmu.h      | 20 ++++++---
>  7 files changed, 93 insertions(+), 100 deletions(-)
> 
> diff --git a/drivers/gpu/drm/etnaviv/Kconfig
> b/drivers/gpu/drm/etnaviv/Kconfig
> index 71cee4e9fefb..b0a4ee27eb05 100644
> --- a/drivers/gpu/drm/etnaviv/Kconfig
> +++ b/drivers/gpu/drm/etnaviv/Kconfig
> @@ -7,8 +7,6 @@ config DRM_ETNAVIV
>  	select SHMEM
>  	select SYNC_FILE
>  	select TMPFS
> -	select IOMMU_API
> -	select IOMMU_SUPPORT
>  	select WANT_DEV_COREDUMP
>  	help
>  	  DRM driver for Vivante GPUs.
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.h
> b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
> index 058389f93b69..d157d9379e68 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.h
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.h
> @@ -26,7 +26,6 @@
>  #include <linux/pm_runtime.h>
>  #include <linux/slab.h>
>  #include <linux/list.h>
> -#include <linux/iommu.h>
>  #include <linux/types.h>
>  #include <linux/sizes.h>
>  
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> index 43a0508bdbd7..f0390842441a 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> @@ -14,7 +14,6 @@
>   * this program.  If not, see <http://www.gnu.org/licenses/>.
>   */
>  
> -#include <linux/iommu.h>
>  #include <linux/platform_device.h>
>  #include <linux/sizes.h>
>  #include <linux/slab.h>
> @@ -36,20 +35,21 @@ struct etnaviv_iommu_domain_pgtable {

Should this be renamed to etnaviv_iommuv2_domain_pgtable for
consistency?

>  	dma_addr_t paddr;
>  };
>  
> -struct etnaviv_iommu_domain {
> -	struct iommu_domain domain;
> +struct etnaviv_iommuv1_domain {
> +	struct etnaviv_iommu_domain base;
>  	struct device *dev;
>  	void *bad_page_cpu;
>  	dma_addr_t bad_page_dma;

Now that base is etnaviv specific, these three could be moved up into
etnaviv_iommu_domain.

>  	struct etnaviv_iommu_domain_pgtable pgtable;
>  };
>  
> -static struct etnaviv_iommu_domain *to_etnaviv_domain(struct
> iommu_domain *domain)
> +static struct etnaviv_iommuv1_domain *
> +to_etnaviv_domain(struct etnaviv_iommu_domain *domain)
>  {
> -	return container_of(domain, struct etnaviv_iommu_domain,
> domain);
> +	return container_of(domain, struct etnaviv_iommuv1_domain,
> base);
>  }
>  
> -static int __etnaviv_iommu_init(struct etnaviv_iommu_domain
> *etnaviv_domain)
> +static int __etnaviv_iommu_init(struct etnaviv_iommuv1_domain
> *etnaviv_domain)
>  {
>  	u32 *p;
>  	int ret, i;
> @@ -83,9 +83,10 @@ static int __etnaviv_iommu_init(struct
> etnaviv_iommu_domain *etnaviv_domain)
>  	return 0;
>  }
>  
> -static void etnaviv_domain_free(struct iommu_domain *domain)
> +static void etnaviv_iommuv1_domain_free(struct etnaviv_iommu_domain
> *domain)
>  {
> -	struct etnaviv_iommu_domain *etnaviv_domain =
> to_etnaviv_domain(domain);
> +	struct etnaviv_iommuv1_domain *etnaviv_domain =
> +			to_etnaviv_domain(domain);
>  
>  	dma_free_coherent(etnaviv_domain->dev, PT_SIZE,
>  			  etnaviv_domain->pgtable.pgtable,
> @@ -98,10 +99,11 @@ static void etnaviv_domain_free(struct
> iommu_domain *domain)
>  	kfree(etnaviv_domain);
>  }
>  
> -static int etnaviv_iommuv1_map(struct iommu_domain *domain, unsigned
> long iova,
> -	   phys_addr_t paddr, size_t size, int prot)
> +static int etnaviv_iommuv1_map(struct etnaviv_iommu_domain *domain,
> +			       unsigned long iova, phys_addr_t paddr,
> +			       size_t size, int prot)
>  {
> -	struct etnaviv_iommu_domain *etnaviv_domain =
> to_etnaviv_domain(domain);
> +	struct etnaviv_iommuv1_domain *etnaviv_domain =
> to_etnaviv_domain(domain);
>  	unsigned int index = (iova - GPU_MEM_START) / SZ_4K;
>  
>  	if (size != SZ_4K)
> @@ -112,10 +114,11 @@ static int etnaviv_iommuv1_map(struct
> iommu_domain *domain, unsigned long iova,
>  	return 0;
>  }
>  
> -static size_t etnaviv_iommuv1_unmap(struct iommu_domain *domain,
> +static size_t etnaviv_iommuv1_unmap(struct etnaviv_iommu_domain
> *domain,
>  	unsigned long iova, size_t size)
>  {
> -	struct etnaviv_iommu_domain *etnaviv_domain =
> to_etnaviv_domain(domain);
> +	struct etnaviv_iommuv1_domain *etnaviv_domain =
> +			to_etnaviv_domain(domain);
>  	unsigned int index = (iova - GPU_MEM_START) / SZ_4K;
>  
>  	if (size != SZ_4K)
> @@ -126,32 +129,22 @@ static size_t etnaviv_iommuv1_unmap(struct
> iommu_domain *domain,
>  	return SZ_4K;
>  }
>  
> -static size_t etnaviv_iommuv1_dump_size(struct iommu_domain *domain)
> +static size_t etnaviv_iommuv1_dump_size(struct etnaviv_iommu_domain
> *domain)
>  {
>  	return PT_SIZE;
>  }
>  
> -static void etnaviv_iommuv1_dump(struct iommu_domain *domain, void
> *buf)
> +static void etnaviv_iommuv1_dump(struct etnaviv_iommu_domain *domain,
> void *buf)
>  {
> -	struct etnaviv_iommu_domain *etnaviv_domain =
> to_etnaviv_domain(domain);
> +	struct etnaviv_iommuv1_domain *etnaviv_domain =
> +			to_etnaviv_domain(domain);
>  
>  	memcpy(buf, etnaviv_domain->pgtable.pgtable, PT_SIZE);
>  }
>  
> -static const struct etnaviv_iommu_ops etnaviv_iommu_ops = {
> -	.ops = {
> -		.domain_free = etnaviv_domain_free,
> -		.map = etnaviv_iommuv1_map,
> -		.unmap = etnaviv_iommuv1_unmap,
> -		.pgsize_bitmap = SZ_4K,
> -	},
> -	.dump_size = etnaviv_iommuv1_dump_size,
> -	.dump = etnaviv_iommuv1_dump,
> -};
> -
>  void etnaviv_iommuv1_restore(struct etnaviv_gpu *gpu)
>  {
> -	struct etnaviv_iommu_domain *etnaviv_domain =
> +	struct etnaviv_iommuv1_domain *etnaviv_domain =
>  			to_etnaviv_domain(gpu->mmu->domain);
>  	u32 pgtable;
>  
> @@ -172,9 +165,11 @@ void etnaviv_iommuv1_restore(struct etnaviv_gpu
> *gpu)
>  	gpu_write(gpu, VIVS_MC_MMU_RA_PAGE_TABLE, pgtable);
>  }
>  
> -struct iommu_domain *etnaviv_iommuv1_domain_alloc(struct etnaviv_gpu
> *gpu)
> +struct etnaviv_iommu_domain *
> +etnaviv_iommuv1_domain_alloc(struct etnaviv_gpu *gpu)
>  {
> -	struct etnaviv_iommu_domain *etnaviv_domain;
> +	struct etnaviv_iommuv1_domain *etnaviv_domain;
> +	struct etnaviv_iommu_domain *domain;
>  	int ret;
>  
>  	etnaviv_domain = kzalloc(sizeof(*etnaviv_domain),
> GFP_KERNEL);
> @@ -183,17 +178,21 @@ struct iommu_domain
> *etnaviv_iommuv1_domain_alloc(struct etnaviv_gpu *gpu)
>  
>  	etnaviv_domain->dev = gpu->dev;
>  
> -	etnaviv_domain->domain.type = __IOMMU_DOMAIN_PAGING;
> -	etnaviv_domain->domain.ops = &etnaviv_iommu_ops.ops;
> -	etnaviv_domain->domain.pgsize_bitmap = SZ_4K;
> -	etnaviv_domain->domain.geometry.aperture_start =
> GPU_MEM_START;
> -	etnaviv_domain->domain.geometry.aperture_end = GPU_MEM_START
> + PT_ENTRIES * SZ_4K - 1;
> +	domain = &etnaviv_domain->base;
> +
> +	domain->free = etnaviv_iommuv1_domain_free;
> +	domain->map = etnaviv_iommuv1_map;
> +	domain->unmap = etnaviv_iommuv1_unmap,
> +	domain->dump_size = etnaviv_iommuv1_dump_size;
> +	domain->dump = etnaviv_iommuv1_dump;
> +	domain->base = GPU_MEM_START;
> +	domain->size = PT_ENTRIES * SZ_4K;
>  
>  	ret = __etnaviv_iommu_init(etnaviv_domain);
>  	if (ret)
>  		goto out_free;
>  
> -	return &etnaviv_domain->domain;
> +	return &etnaviv_domain->base;
>  
>  out_free:
>  	kfree(etnaviv_domain);
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.h
> b/drivers/gpu/drm/etnaviv/etnaviv_iommu.h
> index 8b51e7c16feb..750bc7e796c7 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.h
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.h
> @@ -19,10 +19,12 @@
>  
>  struct etnaviv_gpu;

struct etnaviv_iommu_domain;

> -struct iommu_domain *etnaviv_iommuv1_domain_alloc(struct etnaviv_gpu
> *gpu);
> +struct etnaviv_iommu_domain *
> +etnaviv_iommuv1_domain_alloc(struct etnaviv_gpu *gpu);

This is missing a declaration of struct etnaviv_iommu_domain.

>  void etnaviv_iommuv1_restore(struct etnaviv_gpu *gpu);
>  
> -struct iommu_domain *etnaviv_iommuv2_domain_alloc(struct etnaviv_gpu
> *gpu);
> +struct etnaviv_iommu_domain *
> +etnaviv_iommuv2_domain_alloc(struct etnaviv_gpu *gpu);
>  void etnaviv_iommuv2_restore(struct etnaviv_gpu *gpu);
>  
>  #endif /* __ETNAVIV_IOMMU_H__ */
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
> b/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
> index d794e8c0dd7e..c7437a59034e 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
> @@ -14,7 +14,6 @@
>   * this program.  If not, see <http://www.gnu.org/licenses/>.
>   */
>  
> -#include <linux/iommu.h>
>  #include <linux/platform_device.h>
>  #include <linux/sizes.h>
>  #include <linux/slab.h>
> @@ -40,7 +39,7 @@
>  #define MMUv2_MAX_STLB_ENTRIES		1024
>  
>  struct etnaviv_iommuv2_domain {
> -	struct iommu_domain domain;
> +	struct etnaviv_iommu_domain base;
>  	struct device *dev;
>  	void *bad_page_cpu;
>  	dma_addr_t bad_page_dma;
> @@ -52,13 +51,15 @@ struct etnaviv_iommuv2_domain {
>  	dma_addr_t stlb_dma[1024];
>  };
>  
> -static struct etnaviv_iommuv2_domain *to_etnaviv_domain(struct
> iommu_domain *domain)
> +static struct etnaviv_iommuv2_domain *
> +to_etnaviv_domain(struct etnaviv_iommu_domain *domain)
>  {
> -	return container_of(domain, struct etnaviv_iommuv2_domain,
> domain);
> +	return container_of(domain, struct etnaviv_iommuv2_domain,
> base);
>  }
>  
> -static int etnaviv_iommuv2_map(struct iommu_domain *domain, unsigned
> long iova,
> -	   phys_addr_t paddr, size_t size, int prot)
> +static int etnaviv_iommuv2_map(struct etnaviv_iommu_domain *domain,
> +			       unsigned long iova, phys_addr_t paddr,
> +			       size_t size, int prot)
>  {
>  	struct etnaviv_iommuv2_domain *etnaviv_domain =
>  			to_etnaviv_domain(domain);
> @@ -68,7 +69,7 @@ static int etnaviv_iommuv2_map(struct iommu_domain
> *domain, unsigned long iova,
>  	if (size != SZ_4K)
>  		return -EINVAL;
>  
> -	if (prot & IOMMU_WRITE)
> +	if (prot & ETNAVIV_PROT_WRITE)
>  		entry |= MMUv2_PTE_WRITEABLE;
>  
>  	mtlb_entry = (iova & MMUv2_MTLB_MASK) >> MMUv2_MTLB_SHIFT;
> @@ -79,8 +80,8 @@ static int etnaviv_iommuv2_map(struct iommu_domain
> *domain, unsigned long iova,
>  	return 0;
>  }
>  
> -static size_t etnaviv_iommuv2_unmap(struct iommu_domain *domain,
> -	unsigned long iova, size_t size)
> +static size_t etnaviv_iommuv2_unmap(struct etnaviv_iommu_domain
> *domain,
> +				    unsigned long iova, size_t size)
>  {
>  	struct etnaviv_iommuv2_domain *etnaviv_domain =
>  			to_etnaviv_domain(domain);
> @@ -166,7 +167,7 @@ static int etnaviv_iommuv2_init(struct
> etnaviv_iommuv2_domain *etnaviv_domain)
>  	return ret;
>  }
>  
> -static void etnaviv_iommuv2_domain_free(struct iommu_domain *domain)
> +static void etnaviv_iommuv2_domain_free(struct etnaviv_iommu_domain
> *domain)
>  {
>  	struct etnaviv_iommuv2_domain *etnaviv_domain =
>  			to_etnaviv_domain(domain);
> @@ -190,7 +191,7 @@ static void etnaviv_iommuv2_domain_free(struct
> iommu_domain *domain)
>  	vfree(etnaviv_domain);
>  }
>  
> -static size_t etnaviv_iommuv2_dump_size(struct iommu_domain *domain)
> +static size_t etnaviv_iommuv2_dump_size(struct etnaviv_iommu_domain
> *domain)
>  {
>  	struct etnaviv_iommuv2_domain *etnaviv_domain =
>  			to_etnaviv_domain(domain);
> @@ -204,7 +205,7 @@ static size_t etnaviv_iommuv2_dump_size(struct
> iommu_domain *domain)
>  	return dump_size;
>  }
>  
> -static void etnaviv_iommuv2_dump(struct iommu_domain *domain, void
> *buf)
> +static void etnaviv_iommuv2_dump(struct etnaviv_iommu_domain *domain,
> void *buf)
>  {
>  	struct etnaviv_iommuv2_domain *etnaviv_domain =
>  			to_etnaviv_domain(domain);
> @@ -217,17 +218,6 @@ static void etnaviv_iommuv2_dump(struct
> iommu_domain *domain, void *buf)
>  			memcpy(buf, etnaviv_domain->stlb_cpu[i],
> SZ_4K);
>  }
>  
> -static const struct etnaviv_iommu_ops etnaviv_iommu_ops = {
> -	.ops = {
> -		.domain_free = etnaviv_iommuv2_domain_free,
> -		.map = etnaviv_iommuv2_map,
> -		.unmap = etnaviv_iommuv2_unmap,
> -		.pgsize_bitmap = SZ_4K,
> -	},
> -	.dump_size = etnaviv_iommuv2_dump_size,
> -	.dump = etnaviv_iommuv2_dump,
> -};
> -

Do we care about unconstification of these function pointers?

>  void etnaviv_iommuv2_restore(struct etnaviv_gpu *gpu)
>  {
>  	struct etnaviv_iommuv2_domain *etnaviv_domain =
> @@ -247,9 +237,11 @@ void etnaviv_iommuv2_restore(struct etnaviv_gpu
> *gpu)
>  
>  	gpu_write(gpu, VIVS_MMUv2_CONTROL,
> VIVS_MMUv2_CONTROL_ENABLE);
>  }
> -struct iommu_domain *etnaviv_iommuv2_domain_alloc(struct etnaviv_gpu
> *gpu)
> +struct etnaviv_iommu_domain *
> +etnaviv_iommuv2_domain_alloc(struct etnaviv_gpu *gpu)
>  {
>  	struct etnaviv_iommuv2_domain *etnaviv_domain;
> +	struct etnaviv_iommu_domain *domain;
>  	int ret;
>  
>  	etnaviv_domain = vzalloc(sizeof(*etnaviv_domain));
> @@ -257,18 +249,21 @@ struct iommu_domain
> *etnaviv_iommuv2_domain_alloc(struct etnaviv_gpu *gpu)
>  		return NULL;
>  
>  	etnaviv_domain->dev = gpu->dev;
> +	domain = &etnaviv_domain->base;
>  
> -	etnaviv_domain->domain.type = __IOMMU_DOMAIN_PAGING;
> -	etnaviv_domain->domain.ops = &etnaviv_iommu_ops.ops;
> -	etnaviv_domain->domain.pgsize_bitmap = SZ_4K;
> -	etnaviv_domain->domain.geometry.aperture_start = 0;
> -	etnaviv_domain->domain.geometry.aperture_end = ~0UL & ~(SZ_4K
> - 1);
> +	domain->free = etnaviv_iommuv2_domain_free;
> +	domain->map = etnaviv_iommuv2_map;
> +	domain->unmap = etnaviv_iommuv2_unmap,
> +	domain->dump_size = etnaviv_iommuv2_dump_size;
> +	domain->dump = etnaviv_iommuv2_dump;
> +	domain->base = 0;
> +	domain->size = (u64)SZ_1G * 4;
>  
>  	ret = etnaviv_iommuv2_init(etnaviv_domain);
>  	if (ret)
>  		goto out_free;
>  
> -	return &etnaviv_domain->domain;
> +	return &etnaviv_domain->base;
>  
>  out_free:
>  	vfree(etnaviv_domain);
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> index 9f1f214e2918..7e52263623b8 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> @@ -22,7 +22,8 @@
>  #include "etnaviv_iommu.h"
>  #include "etnaviv_mmu.h"
>  
> -size_t etnaviv_domain_unmap(struct iommu_domain *domain, unsigned
> long iova, size_t size)
> +size_t etnaviv_domain_unmap(struct etnaviv_iommu_domain *domain,
> +			    unsigned long iova, size_t size)
>  {
>  	size_t unmapped_page, unmapped = 0;
>  	size_t pgsize = SZ_4K;
> @@ -34,7 +35,7 @@ size_t etnaviv_domain_unmap(struct iommu_domain
> *domain, unsigned long iova, siz
>  	}
>  
>  	while (unmapped < size) {
> -		unmapped_page = domain->ops->unmap(domain, iova,
> pgsize);
> +		unmapped_page = domain->unmap(domain, iova, pgsize);
>  		if (!unmapped_page)
>  			break;
>  
> @@ -45,8 +46,9 @@ size_t etnaviv_domain_unmap(struct iommu_domain
> *domain, unsigned long iova, siz
>  	return unmapped;
>  }
>  
> -static int etnaviv_domain_map(struct iommu_domain *domain, unsigned
> long iova,
> -		     phys_addr_t paddr, size_t size, int prot)
> +static int etnaviv_domain_map(struct etnaviv_iommu_domain *domain,
> +			      unsigned long iova, phys_addr_t paddr,
> +			      size_t size, int prot)
>  {
>  	unsigned long orig_iova = iova;
>  	size_t pgsize = SZ_4K;
> @@ -60,7 +62,7 @@ static int etnaviv_domain_map(struct iommu_domain
> *domain, unsigned long iova,
>  	}
>  
>  	while (size) {
> -		ret = domain->ops->map(domain, iova, paddr, pgsize,
> prot);
> +		ret = domain->map(domain, iova, paddr, pgsize, prot);
>  		if (ret)
>  			break;
>  
> @@ -79,7 +81,7 @@ static int etnaviv_domain_map(struct iommu_domain
> *domain, unsigned long iova,
>  static int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
>  			     struct sg_table *sgt, unsigned len, int
> prot)
>  {
> -	struct iommu_domain *domain = iommu->domain;
> +	struct etnaviv_iommu_domain *domain = iommu->domain;
>  	struct scatterlist *sg;
>  	unsigned int da = iova;
>  	unsigned int i, j;
> @@ -118,7 +120,7 @@ static int etnaviv_iommu_map(struct etnaviv_iommu
> *iommu, u32 iova,
>  static int etnaviv_iommu_unmap(struct etnaviv_iommu *iommu, u32 iova,
>  			       struct sg_table *sgt, unsigned len)

Should this be changed to a static void function? The return value of
etnaviv_iommu_unmap is never checked.

>  {
> -	struct iommu_domain *domain = iommu->domain;
> +	struct etnaviv_iommu_domain *domain = iommu->domain;
>  	struct scatterlist *sg;
>  	unsigned int da = iova;
>  	int i;
> @@ -284,7 +286,7 @@ int etnaviv_iommu_map_gem(struct etnaviv_iommu
> *mmu,
>  	mmu->last_iova = node->start + etnaviv_obj->base.size;
>  	mapping->iova = node->start;
>  	ret = etnaviv_iommu_map(mmu, node->start, sgt, etnaviv_obj-
> >base.size,
> -				IOMMU_READ | IOMMU_WRITE);
> +				ETNAVIV_PROT_READ |
> ETNAVIV_PROT_WRITE);
>  
>  	if (ret < 0) {
>  		drm_mm_remove_node(node);
> @@ -318,7 +320,7 @@ void etnaviv_iommu_unmap_gem(struct etnaviv_iommu
> *mmu,
>  void etnaviv_iommu_destroy(struct etnaviv_iommu *mmu)
>  {
>  	drm_mm_takedown(&mmu->mm);
> -	iommu_domain_free(mmu->domain);
> +	mmu->domain->free(mmu->domain);
>  	kfree(mmu);
>  }
>  
> @@ -350,9 +352,7 @@ struct etnaviv_iommu *etnaviv_iommu_new(struct
> etnaviv_gpu *gpu)
>  	mutex_init(&mmu->lock);
>  	INIT_LIST_HEAD(&mmu->mappings);
>  
> -	drm_mm_init(&mmu->mm, mmu->domain->geometry.aperture_start,
> -		    mmu->domain->geometry.aperture_end -
> -		    mmu->domain->geometry.aperture_start + 1);
> +	drm_mm_init(&mmu->mm, mmu->domain->base, mmu->domain->size);
>  
>  	return mmu;
>  }
> @@ -384,7 +384,7 @@ int etnaviv_iommu_get_suballoc_va(struct
> etnaviv_gpu *gpu, dma_addr_t paddr,
>  			return ret;
>  		}
>  		ret = etnaviv_domain_map(mmu->domain, vram_node-
> >start, paddr,
> -					 size, IOMMU_READ);
> +					 size, ETNAVIV_PROT_READ);
>  		if (ret < 0) {
>  			drm_mm_remove_node(vram_node);
>  			mutex_unlock(&mmu->lock);
> @@ -414,18 +414,10 @@ void etnaviv_iommu_put_suballoc_va(struct
> etnaviv_gpu *gpu,
>  }
>  size_t etnaviv_iommu_dump_size(struct etnaviv_iommu *iommu)
>  {
> -	struct etnaviv_iommu_ops *ops;
> -
> -	ops = container_of(iommu->domain->ops, struct
> etnaviv_iommu_ops, ops);
> -
> -	return ops->dump_size(iommu->domain);
> +	return iommu->domain->dump_size(iommu->domain);
>  }
>  
>  void etnaviv_iommu_dump(struct etnaviv_iommu *iommu, void *buf)
>  {
> -	struct etnaviv_iommu_ops *ops;
> -
> -	ops = container_of(iommu->domain->ops, struct
> etnaviv_iommu_ops, ops);
> -
> -	ops->dump(iommu->domain, buf);
> +	iommu->domain->dump(iommu->domain, buf);
>  }
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.h
> b/drivers/gpu/drm/etnaviv/etnaviv_mmu.h
> index d072eda7a00d..38301b9d48e8 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.h
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.h
> @@ -17,7 +17,8 @@
>  #ifndef __ETNAVIV_MMU_H__
>  #define __ETNAVIV_MMU_H__
>  
> -#include <linux/iommu.h>
> +#define ETNAVIV_PROT_READ	(1 << 0)
> +#define ETNAVIV_PROT_WRITE	(1 << 1)
>  
>  enum etnaviv_iommu_version {
>  	ETNAVIV_IOMMU_V1 = 0,
> @@ -26,16 +27,23 @@ enum etnaviv_iommu_version {
>  
>  struct etnaviv_gpu;
>  struct etnaviv_vram_mapping;
> +struct etnaviv_iommu_domain;

This is superfluous, etnaviv_iommu_domain is defined right below:

> -struct etnaviv_iommu_ops {
> -	struct iommu_ops ops;
> -	size_t (*dump_size)(struct iommu_domain *);
> -	void (*dump)(struct iommu_domain *, void *);
> +struct etnaviv_iommu_domain {
> +	void (*free)(struct etnaviv_iommu_domain *);
> +	int (*map)(struct etnaviv_iommu_domain *domain, unsigned long
> iova,
> +		   phys_addr_t paddr, size_t size, int prot);
> +	size_t (*unmap)(struct etnaviv_iommu_domain *domain, unsigned
> long iova,
> +		     size_t size);
> +	size_t (*dump_size)(struct etnaviv_iommu_domain *);
> +	void (*dump)(struct etnaviv_iommu_domain *, void *);
> +	u64 base;
> +	u64 size;
>  };
>  
>  struct etnaviv_iommu {
>  	struct etnaviv_gpu *gpu;
> -	struct iommu_domain *domain;
> +	struct etnaviv_iommu_domain *domain;
>  
>  	enum etnaviv_iommu_version version;
>  

regards
Philipp
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 6/8] etnaviv: mmu: stop using iommu map/unmap functions
  2017-09-15 17:04 ` [PATCH 6/8] etnaviv: mmu: stop using iommu map/unmap functions Lucas Stach
@ 2017-09-18 18:35   ` Philipp Zabel
  2017-09-27 11:36   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Philipp Zabel @ 2017-09-18 18:35 UTC (permalink / raw)
  To: Lucas Stach, dri-devel; +Cc: Russell King, etnaviv, kernel, patchwork-lst

On Fri, 2017-09-15 at 19:04 +0200, Lucas Stach wrote:
> This is a preparation to remove the etnaviv dependency on the IOMMU
> subsystem by importing the relevant parts of the iommu map/unamp
> functions into the driver.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
> ---
>  drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 66
> +++++++++++++++++++++++++++++++----
>  1 file changed, 60 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> index f3ed07db9b2d..0be28467af61 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> @@ -22,6 +22,60 @@
>  #include "etnaviv_iommu.h"
>  #include "etnaviv_mmu.h"
>  
> +size_t etnaviv_domain_unmap(struct iommu_domain *domain, unsigned
> long iova, size_t size)
> +{
> +	size_t unmapped_page, unmapped = 0;
> +	size_t pgsize = SZ_4K;
> +
> +	if (!IS_ALIGNED(iova | size, pgsize)) {
> +		pr_err("unaligned: iova 0x%lx size 0x%zx min_pagesz
> 0x%x\n",
> +		       iova, size, pgsize);
> +		return -EINVAL;
> +	}
> +
> +	while (unmapped < size) {
> +		unmapped_page = domain->ops->unmap(domain, iova,
> pgsize);
> +		if (!unmapped_page)
> +			break;
> +
> +		iova += unmapped_page;
> +		unmapped += unmapped_page;
> +	}
> +
> +	return unmapped;
> +}
> +
> +static int etnaviv_domain_map(struct iommu_domain *domain, unsigned
> long iova,
> +		     phys_addr_t paddr, size_t size, int prot)
> +{
> +	unsigned long orig_iova = iova;
> +	size_t pgsize = SZ_4K;
> +	size_t orig_size = size;
> +	int ret = 0;
> +
> +	if (!IS_ALIGNED(iova | paddr | size, pgsize)) {
> +		pr_err("unaligned: iova 0x%lx pa %pa size 0x%zx
> min_pagesz 0x%x\n",
> +		       iova, &paddr, size, pgsize);
> +		return -EINVAL;
> +	}
> +
> +	while (size) {
> +		ret = domain->ops->map(domain, iova, paddr, pgsize,
> prot);
> +		if (ret)
> +			break;
> +
> +		iova += pgsize;
> +		paddr += pgsize;
> +		size -= pgsize;
> +	}
> +
> +	/* unroll mapping in case something went wrong */
> +	if (ret)
> +		etnaviv_domain_unmap(domain, orig_iova, orig_size -
> size);
> +
> +	return ret;
> +}
> +
>  int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
>  		struct sg_table *sgt, unsigned len, int prot)
>  {
> @@ -40,7 +94,7 @@ int etnaviv_iommu_map(struct etnaviv_iommu *iommu,
> u32 iova,
>  
>  		VERB("map[%d]: %08x %08x(%zx)", i, iova, pa, bytes);
>  
> -		ret = iommu_map(domain, da, pa, bytes, prot);
> +		ret = etnaviv_domain_map(domain, da, pa, bytes,
> prot);
>  		if (ret)
>  			goto fail;
>  
> @@ -55,7 +109,7 @@ int etnaviv_iommu_map(struct etnaviv_iommu *iommu,
> u32 iova,
>  	for_each_sg(sgt->sgl, sg, i, j) {
>  		size_t bytes = sg_dma_len(sg) + sg->offset;
>  
> -		iommu_unmap(domain, da, bytes);
> +		etnaviv_domain_unmap(domain, da, bytes);
>  		da += bytes;
>  	}
>  	return ret;
> @@ -73,7 +127,7 @@ int etnaviv_iommu_unmap(struct etnaviv_iommu
> *iommu, u32 iova,

This could be changed to void now, the return value isn't checked
anywhere.

>  		size_t bytes = sg_dma_len(sg) + sg->offset;
>  		size_t unmapped;
>  
> -		unmapped = iommu_unmap(domain, da, bytes);
> +		unmapped = etnaviv_domain_unmap(domain, da, bytes);
>  		if (unmapped < bytes)
>  			return unmapped;
>  
> @@ -329,8 +383,8 @@ int etnaviv_iommu_get_suballoc_va(struct
> etnaviv_gpu *gpu, dma_addr_t paddr,
>  			mutex_unlock(&mmu->lock);
>  			return ret;
>  		}
> -		ret = iommu_map(mmu->domain, vram_node->start, paddr,
> size,
> -				IOMMU_READ);
> +		ret = etnaviv_domain_map(mmu->domain, vram_node-
> >start, paddr,
> +					 size, IOMMU_READ);
>  		if (ret < 0) {
>  			drm_mm_remove_node(vram_node);
>  			mutex_unlock(&mmu->lock);
> @@ -353,7 +407,7 @@ void etnaviv_iommu_put_suballoc_va(struct
> etnaviv_gpu *gpu,
>  
>  	if (mmu->version == ETNAVIV_IOMMU_V2) {
>  		mutex_lock(&mmu->lock);
> -		iommu_unmap(mmu->domain,iova, size);
> +		etnaviv_domain_unmap(mmu->domain, iova, size);
>  		drm_mm_remove_node(vram_node);
>  		mutex_unlock(&mmu->lock);
>  	}

regards
Philipp
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 1/8] etnaviv: remove iommu fault handler
  2017-09-15 17:04 [PATCH 1/8] etnaviv: remove iommu fault handler Lucas Stach
                   ` (6 preceding siblings ...)
  2017-09-15 17:04 ` [PATCH 8/8] etnaviv: remove IOMMU dependency Lucas Stach
@ 2017-09-18 18:40 ` Philipp Zabel
  2017-09-27 11:24 ` Wladimir J. van der Laan
  8 siblings, 0 replies; 24+ messages in thread
From: Philipp Zabel @ 2017-09-18 18:40 UTC (permalink / raw)
  To: Lucas Stach, dri-devel; +Cc: Russell King, etnaviv, kernel, patchwork-lst

On Fri, 2017-09-15 at 19:04 +0200, Lucas Stach wrote:
> The handler has never been used, so it's really just dead code.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>

regards
Philipp
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 2/8] etnaviv: remove iova_to_phys iommu ops
  2017-09-15 17:04 ` [PATCH 2/8] etnaviv: remove iova_to_phys iommu ops Lucas Stach
@ 2017-09-18 18:40   ` Philipp Zabel
  2017-09-27 11:24   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Philipp Zabel @ 2017-09-18 18:40 UTC (permalink / raw)
  To: Lucas Stach, dri-devel; +Cc: Russell King, etnaviv, kernel, patchwork-lst

On Fri, 2017-09-15 at 19:04 +0200, Lucas Stach wrote:
> They are not used in any way, so can go away.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 3/8] etnaviv: iommuv1: fold pagetable alloc and free into caller
  2017-09-15 17:04 ` [PATCH 3/8] etnaviv: iommuv1: fold pagetable alloc and free into caller Lucas Stach
@ 2017-09-18 18:41   ` Philipp Zabel
  2017-09-27 11:26   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Philipp Zabel @ 2017-09-18 18:41 UTC (permalink / raw)
  To: Lucas Stach, dri-devel; +Cc: Russell King, etnaviv, kernel, patchwork-lst

On Fri, 2017-09-15 at 19:04 +0200, Lucas Stach wrote:
> Those functions are simple enough to fold them into the calling
> function. This also fixes a correctness issue, as the alloc/free
> functions didn't specifiy the device the memory was allocated for.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>

regards
Philipp
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 4/8] etnaviv: iommuv1: remove map_lock
  2017-09-15 17:04 ` [PATCH 4/8] etnaviv: iommuv1: remove map_lock Lucas Stach
@ 2017-09-18 18:41   ` Philipp Zabel
  2017-09-27 11:28   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Philipp Zabel @ 2017-09-18 18:41 UTC (permalink / raw)
  To: Lucas Stach, dri-devel; +Cc: Russell King, etnaviv, kernel, patchwork-lst

On Fri, 2017-09-15 at 19:04 +0200, Lucas Stach wrote:
> It wasn't protecting anything, as the single word writes used to
> set up or tear down a translation are already inherently atomic,
> so the spinlock is pure overhead.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

This would have been made clearer if patches 4 and 5 were switched.

Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>

regards
Philipp
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 5/8] etnaviv: iommuv1: fold pgtable_write into callers
  2017-09-15 17:04 ` [PATCH 5/8] etnaviv: iommuv1: fold pgtable_write into callers Lucas Stach
@ 2017-09-18 18:42   ` Philipp Zabel
  2017-09-27 11:30   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Philipp Zabel @ 2017-09-18 18:42 UTC (permalink / raw)
  To: Lucas Stach, dri-devel; +Cc: Russell King, etnaviv, kernel, patchwork-lst

On Fri, 2017-09-15 at 19:04 +0200, Lucas Stach wrote:
> A function doing a single assignment is not really helping the
> code flow.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

The two functions are very similar, but given the different return value
I think they are small enough to be mostly duplicated.

Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>

regards
Philipp
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 7/8] etnaviv: mmu: mark local functions static
  2017-09-15 17:04 ` [PATCH 7/8] etnaviv: mmu: mark local functions static Lucas Stach
@ 2017-09-18 18:42   ` Philipp Zabel
  2017-09-27 11:37   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Philipp Zabel @ 2017-09-18 18:42 UTC (permalink / raw)
  To: Lucas Stach, dri-devel; +Cc: Russell King, etnaviv, kernel, patchwork-lst

On Fri, 2017-09-15 at 19:04 +0200, Lucas Stach wrote:
> And clean up the header file a bit.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>

regards
Philipp
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 1/8] etnaviv: remove iommu fault handler
  2017-09-15 17:04 [PATCH 1/8] etnaviv: remove iommu fault handler Lucas Stach
                   ` (7 preceding siblings ...)
  2017-09-18 18:40 ` [PATCH 1/8] etnaviv: remove iommu fault handler Philipp Zabel
@ 2017-09-27 11:24 ` Wladimir J. van der Laan
  8 siblings, 0 replies; 24+ messages in thread
From: Wladimir J. van der Laan @ 2017-09-27 11:24 UTC (permalink / raw)
  To: Lucas Stach; +Cc: etnaviv, dri-devel, patchwork-lst, kernel, Russell King

On Fri, Sep 15, 2017 at 07:04:32PM +0200, Lucas Stach wrote:
> The handler has never been used, so it's really just dead code.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com>

> ---
>  drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 9 ---------
>  1 file changed, 9 deletions(-)
> 
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> index f103e787de94..f3ed07db9b2d 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_mmu.c
> @@ -22,13 +22,6 @@
>  #include "etnaviv_iommu.h"
>  #include "etnaviv_mmu.h"
>  
> -static int etnaviv_fault_handler(struct iommu_domain *iommu, struct device *dev,
> -		unsigned long iova, int flags, void *arg)
> -{
> -	DBG("*** fault: iova=%08lx, flags=%d", iova, flags);
> -	return 0;
> -}
> -
>  int etnaviv_iommu_map(struct etnaviv_iommu *iommu, u32 iova,
>  		struct sg_table *sgt, unsigned len, int prot)
>  {
> @@ -307,8 +300,6 @@ struct etnaviv_iommu *etnaviv_iommu_new(struct etnaviv_gpu *gpu)
>  		    mmu->domain->geometry.aperture_end -
>  		    mmu->domain->geometry.aperture_start + 1);
>  
> -	iommu_set_fault_handler(mmu->domain, etnaviv_fault_handler, gpu->dev);
> -
>  	return mmu;
>  }
>  
> -- 
> 2.11.0
> 
> _______________________________________________
> etnaviv mailing list
> etnaviv@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/etnaviv
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 2/8] etnaviv: remove iova_to_phys iommu ops
  2017-09-15 17:04 ` [PATCH 2/8] etnaviv: remove iova_to_phys iommu ops Lucas Stach
  2017-09-18 18:40   ` Philipp Zabel
@ 2017-09-27 11:24   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Wladimir J. van der Laan @ 2017-09-27 11:24 UTC (permalink / raw)
  To: Lucas Stach; +Cc: etnaviv, dri-devel, patchwork-lst, kernel, Russell King

On Fri, Sep 15, 2017 at 07:04:33PM +0200, Lucas Stach wrote:
> They are not used in any way, so can go away.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com>

> ---
>  drivers/gpu/drm/etnaviv/etnaviv_iommu.c    | 21 ---------------------
>  drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c | 14 --------------
>  2 files changed, 35 deletions(-)
> 
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> index 7a7c97f599d7..f804c0aaa7a2 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> @@ -66,18 +66,6 @@ static void pgtable_free(struct etnaviv_iommu_domain_pgtable *pgtable,
>  	dma_free_coherent(NULL, size, pgtable->pgtable, pgtable->paddr);
>  }
>  
> -static u32 pgtable_read(struct etnaviv_iommu_domain_pgtable *pgtable,
> -			   unsigned long iova)
> -{
> -	/* calcuate index into page table */
> -	unsigned int index = (iova - GPU_MEM_START) / SZ_4K;
> -	phys_addr_t paddr;
> -
> -	paddr = pgtable->pgtable[index];
> -
> -	return paddr;
> -}
> -
>  static void pgtable_write(struct etnaviv_iommu_domain_pgtable *pgtable,
>  			  unsigned long iova, phys_addr_t paddr)
>  {
> @@ -164,14 +152,6 @@ static size_t etnaviv_iommuv1_unmap(struct iommu_domain *domain,
>  	return SZ_4K;
>  }
>  
> -static phys_addr_t etnaviv_iommu_iova_to_phys(struct iommu_domain *domain,
> -	dma_addr_t iova)
> -{
> -	struct etnaviv_iommu_domain *etnaviv_domain = to_etnaviv_domain(domain);
> -
> -	return pgtable_read(&etnaviv_domain->pgtable, iova);
> -}
> -
>  static size_t etnaviv_iommuv1_dump_size(struct iommu_domain *domain)
>  {
>  	return PT_SIZE;
> @@ -189,7 +169,6 @@ static const struct etnaviv_iommu_ops etnaviv_iommu_ops = {
>  		.domain_free = etnaviv_domain_free,
>  		.map = etnaviv_iommuv1_map,
>  		.unmap = etnaviv_iommuv1_unmap,
> -		.iova_to_phys = etnaviv_iommu_iova_to_phys,
>  		.pgsize_bitmap = SZ_4K,
>  	},
>  	.dump_size = etnaviv_iommuv1_dump_size,
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
> index cbe447ac5974..d794e8c0dd7e 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c
> @@ -97,19 +97,6 @@ static size_t etnaviv_iommuv2_unmap(struct iommu_domain *domain,
>  	return SZ_4K;
>  }
>  
> -static phys_addr_t etnaviv_iommuv2_iova_to_phys(struct iommu_domain *domain,
> -	dma_addr_t iova)
> -{
> -	struct etnaviv_iommuv2_domain *etnaviv_domain =
> -			to_etnaviv_domain(domain);
> -	int mtlb_entry, stlb_entry;
> -
> -	mtlb_entry = (iova & MMUv2_MTLB_MASK) >> MMUv2_MTLB_SHIFT;
> -	stlb_entry = (iova & MMUv2_STLB_MASK) >> MMUv2_STLB_SHIFT;
> -
> -	return etnaviv_domain->stlb_cpu[mtlb_entry][stlb_entry] & ~(SZ_4K - 1);
> -}
> -
>  static int etnaviv_iommuv2_init(struct etnaviv_iommuv2_domain *etnaviv_domain)
>  {
>  	u32 *p;
> @@ -235,7 +222,6 @@ static const struct etnaviv_iommu_ops etnaviv_iommu_ops = {
>  		.domain_free = etnaviv_iommuv2_domain_free,
>  		.map = etnaviv_iommuv2_map,
>  		.unmap = etnaviv_iommuv2_unmap,
> -		.iova_to_phys = etnaviv_iommuv2_iova_to_phys,
>  		.pgsize_bitmap = SZ_4K,
>  	},
>  	.dump_size = etnaviv_iommuv2_dump_size,
> -- 
> 2.11.0
> 
> _______________________________________________
> etnaviv mailing list
> etnaviv@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/etnaviv
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 3/8] etnaviv: iommuv1: fold pagetable alloc and free into caller
  2017-09-15 17:04 ` [PATCH 3/8] etnaviv: iommuv1: fold pagetable alloc and free into caller Lucas Stach
  2017-09-18 18:41   ` Philipp Zabel
@ 2017-09-27 11:26   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Wladimir J. van der Laan @ 2017-09-27 11:26 UTC (permalink / raw)
  To: Lucas Stach; +Cc: etnaviv, dri-devel, patchwork-lst, kernel, Russell King

On Fri, Sep 15, 2017 at 07:04:34PM +0200, Lucas Stach wrote:
> Those functions are simple enough to fold them into the calling
> function. This also fixes a correctness issue, as the alloc/free
> functions didn't specifiy the device the memory was allocated for.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com>

> ---
>  drivers/gpu/drm/etnaviv/etnaviv_iommu.c | 27 ++++++++-------------------
>  1 file changed, 8 insertions(+), 19 deletions(-)
> 
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> index f804c0aaa7a2..aaa8c4136f53 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> @@ -50,22 +50,6 @@ static struct etnaviv_iommu_domain *to_etnaviv_domain(struct iommu_domain *domai
>  	return container_of(domain, struct etnaviv_iommu_domain, domain);
>  }
>  
> -static int pgtable_alloc(struct etnaviv_iommu_domain_pgtable *pgtable,
> -			 size_t size)
> -{
> -	pgtable->pgtable = dma_alloc_coherent(NULL, size, &pgtable->paddr, GFP_KERNEL);
> -	if (!pgtable->pgtable)
> -		return -ENOMEM;
> -
> -	return 0;
> -}
> -
> -static void pgtable_free(struct etnaviv_iommu_domain_pgtable *pgtable,
> -			 size_t size)
> -{
> -	dma_free_coherent(NULL, size, pgtable->pgtable, pgtable->paddr);
> -}
> -
>  static void pgtable_write(struct etnaviv_iommu_domain_pgtable *pgtable,
>  			  unsigned long iova, phys_addr_t paddr)
>  {
> @@ -91,8 +75,11 @@ static int __etnaviv_iommu_init(struct etnaviv_iommu_domain *etnaviv_domain)
>  	for (i = 0; i < SZ_4K / 4; i++)
>  		*p++ = 0xdead55aa;
>  
> -	ret = pgtable_alloc(&etnaviv_domain->pgtable, PT_SIZE);
> -	if (ret < 0) {
> +	etnaviv_domain->pgtable.pgtable =
> +			dma_alloc_coherent(etnaviv_domain->dev, PT_SIZE,
> +					   &etnaviv_domain->pgtable.paddr,
> +					   GFP_KERNEL);
> +	if (!etnaviv_domain->pgtable.pgtable) {
>  		dma_free_coherent(etnaviv_domain->dev, SZ_4K,
>  				  etnaviv_domain->bad_page_cpu,
>  				  etnaviv_domain->bad_page_dma);
> @@ -112,7 +99,9 @@ static void etnaviv_domain_free(struct iommu_domain *domain)
>  {
>  	struct etnaviv_iommu_domain *etnaviv_domain = to_etnaviv_domain(domain);
>  
> -	pgtable_free(&etnaviv_domain->pgtable, PT_SIZE);
> +	dma_free_coherent(etnaviv_domain->dev, PT_SIZE,
> +			  etnaviv_domain->pgtable.pgtable,
> +			  etnaviv_domain->pgtable.paddr);
>  
>  	dma_free_coherent(etnaviv_domain->dev, SZ_4K,
>  			  etnaviv_domain->bad_page_cpu,
> -- 
> 2.11.0
> 
> _______________________________________________
> etnaviv mailing list
> etnaviv@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/etnaviv
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 4/8] etnaviv: iommuv1: remove map_lock
  2017-09-15 17:04 ` [PATCH 4/8] etnaviv: iommuv1: remove map_lock Lucas Stach
  2017-09-18 18:41   ` Philipp Zabel
@ 2017-09-27 11:28   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Wladimir J. van der Laan @ 2017-09-27 11:28 UTC (permalink / raw)
  To: Lucas Stach; +Cc: etnaviv, dri-devel, patchwork-lst, kernel, Russell King

On Fri, Sep 15, 2017 at 07:04:35PM +0200, Lucas Stach wrote:
> It wasn't protecting anything, as the single word writes used to
> set up or tear down a translation are already inherently atomic,
> so the spinlock is pure overhead.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com>

> ---
>  drivers/gpu/drm/etnaviv/etnaviv_iommu.c | 7 -------
>  1 file changed, 7 deletions(-)
> 
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> index aaa8c4136f53..78a7c0f3064a 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> @@ -42,7 +42,6 @@ struct etnaviv_iommu_domain {
>  	void *bad_page_cpu;
>  	dma_addr_t bad_page_dma;
>  	struct etnaviv_iommu_domain_pgtable pgtable;
> -	spinlock_t map_lock;
>  };
>  
>  static struct etnaviv_iommu_domain *to_etnaviv_domain(struct iommu_domain *domain)
> @@ -90,8 +89,6 @@ static int __etnaviv_iommu_init(struct etnaviv_iommu_domain *etnaviv_domain)
>  		etnaviv_domain->pgtable.pgtable[i] =
>  			etnaviv_domain->bad_page_dma;
>  
> -	spin_lock_init(&etnaviv_domain->map_lock);
> -
>  	return 0;
>  }
>  
> @@ -118,9 +115,7 @@ static int etnaviv_iommuv1_map(struct iommu_domain *domain, unsigned long iova,
>  	if (size != SZ_4K)
>  		return -EINVAL;
>  
> -	spin_lock(&etnaviv_domain->map_lock);
>  	pgtable_write(&etnaviv_domain->pgtable, iova, paddr);
> -	spin_unlock(&etnaviv_domain->map_lock);
>  
>  	return 0;
>  }
> @@ -133,10 +128,8 @@ static size_t etnaviv_iommuv1_unmap(struct iommu_domain *domain,
>  	if (size != SZ_4K)
>  		return -EINVAL;
>  
> -	spin_lock(&etnaviv_domain->map_lock);
>  	pgtable_write(&etnaviv_domain->pgtable, iova,
>  		      etnaviv_domain->bad_page_dma);
> -	spin_unlock(&etnaviv_domain->map_lock);
>  
>  	return SZ_4K;
>  }
> -- 
> 2.11.0
> 
> _______________________________________________
> etnaviv mailing list
> etnaviv@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/etnaviv
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 5/8] etnaviv: iommuv1: fold pgtable_write into callers
  2017-09-15 17:04 ` [PATCH 5/8] etnaviv: iommuv1: fold pgtable_write into callers Lucas Stach
  2017-09-18 18:42   ` Philipp Zabel
@ 2017-09-27 11:30   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Wladimir J. van der Laan @ 2017-09-27 11:30 UTC (permalink / raw)
  To: Lucas Stach; +Cc: etnaviv, dri-devel, patchwork-lst, kernel, Russell King

On Fri, Sep 15, 2017 at 07:04:36PM +0200, Lucas Stach wrote:
> A function doing a single assignment is not really helping the
> code flow.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

agreed.

Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com>

> ---
>  drivers/gpu/drm/etnaviv/etnaviv_iommu.c | 16 ++++------------
>  1 file changed, 4 insertions(+), 12 deletions(-)
> 
> diff --git a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> index 78a7c0f3064a..43a0508bdbd7 100644
> --- a/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> +++ b/drivers/gpu/drm/etnaviv/etnaviv_iommu.c
> @@ -49,15 +49,6 @@ static struct etnaviv_iommu_domain *to_etnaviv_domain(struct iommu_domain *domai
>  	return container_of(domain, struct etnaviv_iommu_domain, domain);
>  }
>  
> -static void pgtable_write(struct etnaviv_iommu_domain_pgtable *pgtable,
> -			  unsigned long iova, phys_addr_t paddr)
> -{
> -	/* calcuate index into page table */
> -	unsigned int index = (iova - GPU_MEM_START) / SZ_4K;
> -
> -	pgtable->pgtable[index] = paddr;
> -}
> -
>  static int __etnaviv_iommu_init(struct etnaviv_iommu_domain *etnaviv_domain)
>  {
>  	u32 *p;
> @@ -111,11 +102,12 @@ static int etnaviv_iommuv1_map(struct iommu_domain *domain, unsigned long iova,
>  	   phys_addr_t paddr, size_t size, int prot)
>  {
>  	struct etnaviv_iommu_domain *etnaviv_domain = to_etnaviv_domain(domain);
> +	unsigned int index = (iova - GPU_MEM_START) / SZ_4K;
>  
>  	if (size != SZ_4K)
>  		return -EINVAL;
>  
> -	pgtable_write(&etnaviv_domain->pgtable, iova, paddr);
> +	etnaviv_domain->pgtable.pgtable[index] = paddr;
>  
>  	return 0;
>  }
> @@ -124,12 +116,12 @@ static size_t etnaviv_iommuv1_unmap(struct iommu_domain *domain,
>  	unsigned long iova, size_t size)
>  {
>  	struct etnaviv_iommu_domain *etnaviv_domain = to_etnaviv_domain(domain);
> +	unsigned int index = (iova - GPU_MEM_START) / SZ_4K;
>  
>  	if (size != SZ_4K)
>  		return -EINVAL;
>  
> -	pgtable_write(&etnaviv_domain->pgtable, iova,
> -		      etnaviv_domain->bad_page_dma);
> +	etnaviv_domain->pgtable.pgtable[index] = etnaviv_domain->bad_page_dma;
>  
>  	return SZ_4K;
>  }
> -- 
> 2.11.0
> 
> _______________________________________________
> etnaviv mailing list
> etnaviv@lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/etnaviv
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 6/8] etnaviv: mmu: stop using iommu map/unmap functions
  2017-09-15 17:04 ` [PATCH 6/8] etnaviv: mmu: stop using iommu map/unmap functions Lucas Stach
  2017-09-18 18:35   ` Philipp Zabel
@ 2017-09-27 11:36   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Wladimir J. van der Laan @ 2017-09-27 11:36 UTC (permalink / raw)
  To: Lucas Stach; +Cc: etnaviv, dri-devel, patchwork-lst, kernel, Russell King

On Fri, Sep 15, 2017 at 07:04:37PM +0200, Lucas Stach wrote:
> This is a preparation to remove the etnaviv dependency on the IOMMU
> subsystem by importing the relevant parts of the iommu map/unamp
> functions into the driver.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com>

_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 7/8] etnaviv: mmu: mark local functions static
  2017-09-15 17:04 ` [PATCH 7/8] etnaviv: mmu: mark local functions static Lucas Stach
  2017-09-18 18:42   ` Philipp Zabel
@ 2017-09-27 11:37   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Wladimir J. van der Laan @ 2017-09-27 11:37 UTC (permalink / raw)
  To: Lucas Stach; +Cc: etnaviv, dri-devel, patchwork-lst, kernel, Russell King

On Fri, Sep 15, 2017 at 07:04:38PM +0200, Lucas Stach wrote:
> And clean up the header file a bit.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com>

> ---
>  drivers/gpu/drm/etnaviv/etnaviv_mmu.c | 8 ++++----
>  drivers/gpu/drm/etnaviv/etnaviv_mmu.h | 8 +-------
>  2 files changed, 5 insertions(+), 11 deletions(-)
> 
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

* Re: [PATCH 8/8] etnaviv: remove IOMMU dependency
  2017-09-15 17:04 ` [PATCH 8/8] etnaviv: remove IOMMU dependency Lucas Stach
  2017-09-18 18:33   ` Philipp Zabel
@ 2017-09-27 11:39   ` Wladimir J. van der Laan
  1 sibling, 0 replies; 24+ messages in thread
From: Wladimir J. van der Laan @ 2017-09-27 11:39 UTC (permalink / raw)
  To: Lucas Stach; +Cc: etnaviv, dri-devel, patchwork-lst, kernel, Russell King

On Fri, Sep 15, 2017 at 07:04:39PM +0200, Lucas Stach wrote:
> Using the IOMMU API to manage the internal GPU MMU has been an
> historical accident and it keeps getting in the way, as well as
> entangling the driver with the inner workings of the IOMMU
> subsystem.
> 
> Clean this up by removing the usage of iommu_domain, which is the
> last piece linking etnaviv to the IOMMU subsystem.
> 
> Signed-off-by: Lucas Stach <l.stach@pengutronix.de>

Reviewed-by: Wladimir J. van der Laan <laanwj@gmail.com>

> ---
>  drivers/gpu/drm/etnaviv/Kconfig            |  2 -
>  drivers/gpu/drm/etnaviv/etnaviv_drv.h      |  1 -
>  drivers/gpu/drm/etnaviv/etnaviv_iommu.c    | 71 +++++++++++++++---------------
>  drivers/gpu/drm/etnaviv/etnaviv_iommu.h    |  6 ++-
>  drivers/gpu/drm/etnaviv/etnaviv_iommu_v2.c | 55 +++++++++++------------
>  drivers/gpu/drm/etnaviv/etnaviv_mmu.c      | 38 +++++++---------
>  drivers/gpu/drm/etnaviv/etnaviv_mmu.h      | 20 ++++++---
>  7 files changed, 93 insertions(+), 100 deletions(-)
> 
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 24+ messages in thread

end of thread, other threads:[~2017-09-27 11:39 UTC | newest]

Thread overview: 24+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-09-15 17:04 [PATCH 1/8] etnaviv: remove iommu fault handler Lucas Stach
2017-09-15 17:04 ` [PATCH 2/8] etnaviv: remove iova_to_phys iommu ops Lucas Stach
2017-09-18 18:40   ` Philipp Zabel
2017-09-27 11:24   ` Wladimir J. van der Laan
2017-09-15 17:04 ` [PATCH 3/8] etnaviv: iommuv1: fold pagetable alloc and free into caller Lucas Stach
2017-09-18 18:41   ` Philipp Zabel
2017-09-27 11:26   ` Wladimir J. van der Laan
2017-09-15 17:04 ` [PATCH 4/8] etnaviv: iommuv1: remove map_lock Lucas Stach
2017-09-18 18:41   ` Philipp Zabel
2017-09-27 11:28   ` Wladimir J. van der Laan
2017-09-15 17:04 ` [PATCH 5/8] etnaviv: iommuv1: fold pgtable_write into callers Lucas Stach
2017-09-18 18:42   ` Philipp Zabel
2017-09-27 11:30   ` Wladimir J. van der Laan
2017-09-15 17:04 ` [PATCH 6/8] etnaviv: mmu: stop using iommu map/unmap functions Lucas Stach
2017-09-18 18:35   ` Philipp Zabel
2017-09-27 11:36   ` Wladimir J. van der Laan
2017-09-15 17:04 ` [PATCH 7/8] etnaviv: mmu: mark local functions static Lucas Stach
2017-09-18 18:42   ` Philipp Zabel
2017-09-27 11:37   ` Wladimir J. van der Laan
2017-09-15 17:04 ` [PATCH 8/8] etnaviv: remove IOMMU dependency Lucas Stach
2017-09-18 18:33   ` Philipp Zabel
2017-09-27 11:39   ` Wladimir J. van der Laan
2017-09-18 18:40 ` [PATCH 1/8] etnaviv: remove iommu fault handler Philipp Zabel
2017-09-27 11:24 ` Wladimir J. van der Laan

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.