Re: [PATCH v6 21/21] iommu/tegra: gart: Perform code refactoring

2018-12-12 Thread Thierry Reding
On Sun, Dec 09, 2018 at 11:29:50PM +0300, Dmitry Osipenko wrote:
> Removed redundant safety-checks in the code and some debug code that
> isn't actually very useful for debugging, like enormous pagetable dump
> on each fault. The majority of the changes are code reshuffling,
> variables/whitespaces clean up and removal of debug messages that
> duplicate messages of the IOMMU-core.
> 
> Signed-off-by: Dmitry Osipenko 
> ---
>  drivers/iommu/tegra-gart.c | 244 +++--
>  1 file changed, 96 insertions(+), 148 deletions(-)

This is a little over the top in some places, but there are enough good
changes to gloss that over:

Acked-by: Thierry Reding 


signature.asc
Description: PGP signature
___
iommu mailing list
iommu@lists.linux-foundation.org
https://lists.linuxfoundation.org/mailman/listinfo/iommu

[PATCH v6 21/21] iommu/tegra: gart: Perform code refactoring

2018-12-09 Thread Dmitry Osipenko
Removed redundant safety-checks in the code and some debug code that
isn't actually very useful for debugging, like enormous pagetable dump
on each fault. The majority of the changes are code reshuffling,
variables/whitespaces clean up and removal of debug messages that
duplicate messages of the IOMMU-core.

Signed-off-by: Dmitry Osipenko 
---
 drivers/iommu/tegra-gart.c | 244 +++--
 1 file changed, 96 insertions(+), 148 deletions(-)

diff --git a/drivers/iommu/tegra-gart.c b/drivers/iommu/tegra-gart.c
index 71de54aa845c..c732c6a2a165 100644
--- a/drivers/iommu/tegra-gart.c
+++ b/drivers/iommu/tegra-gart.c
@@ -1,5 +1,5 @@
 /*
- * IOMMU API for GART in Tegra20
+ * IOMMU API for Graphics Address Relocation Table on Tegra20
  *
  * Copyright (c) 2010-2012, NVIDIA CORPORATION.  All rights reserved.
  *
@@ -31,70 +31,63 @@
 
 #include 
 
-/* bitmap of the page sizes currently supported */
-#define GART_IOMMU_PGSIZES (SZ_4K)
-
 #define GART_REG_BASE  0x24
 #define GART_CONFIG(0x24 - GART_REG_BASE)
 #define GART_ENTRY_ADDR(0x28 - GART_REG_BASE)
 #define GART_ENTRY_DATA(0x2c - GART_REG_BASE)
-#define GART_ENTRY_PHYS_ADDR_VALID (1 << 31)
+
+#define GART_ENTRY_PHYS_ADDR_VALID BIT(31)
 
 #define GART_PAGE_SHIFT12
 #define GART_PAGE_SIZE (1 << GART_PAGE_SHIFT)
-#define GART_PAGE_MASK \
-   (~(GART_PAGE_SIZE - 1) & ~GART_ENTRY_PHYS_ADDR_VALID)
+#define GART_PAGE_MASK GENMASK(30, GART_PAGE_SHIFT)
+
+/* bitmap of the page sizes currently supported */
+#define GART_IOMMU_PGSIZES (GART_PAGE_SIZE)
 
 struct gart_device {
void __iomem*regs;
u32 *savedata;
-   u32 page_count; /* total remappable size */
-   dma_addr_t  iovmm_base; /* offset to vmm_area */
+   unsigned long   iovmm_base; /* offset to vmm_area start */
+   unsigned long   iovmm_end;  /* offset to vmm_area end */
spinlock_t  pte_lock;   /* for pagetable */
spinlock_t  dom_lock;   /* for active domain */
unsigned intactive_devices; /* number of active devices */
struct iommu_domain *active_domain; /* current active domain */
-   struct device   *dev;
-
struct iommu_device iommu;  /* IOMMU Core handle */
+   struct device   *dev;
 };
 
 static struct gart_device *gart_handle; /* unique for a system */
 
 static bool gart_debug;
 
-#define GART_PTE(_pfn) \
-   (GART_ENTRY_PHYS_ADDR_VALID | ((_pfn) << PAGE_SHIFT))
-
 /*
  * Any interaction between any block on PPSB and a block on APB or AHB
  * must have these read-back to ensure the APB/AHB bus transaction is
  * complete before initiating activity on the PPSB block.
  */
-#define FLUSH_GART_REGS(gart)  ((void)readl((gart)->regs + GART_CONFIG))
+#define FLUSH_GART_REGS(gart)  readl_relaxed((gart)->regs + GART_CONFIG)
 
 #define for_each_gart_pte(gart, iova)  \
for (iova = gart->iovmm_base;   \
-iova < gart->iovmm_base + GART_PAGE_SIZE * gart->page_count; \
+iova < gart->iovmm_end;\
 iova += GART_PAGE_SIZE)
 
 static inline void gart_set_pte(struct gart_device *gart,
-   unsigned long offs, u32 pte)
+   unsigned long iova, unsigned long pte)
 {
-   writel(offs, gart->regs + GART_ENTRY_ADDR);
-   writel(pte, gart->regs + GART_ENTRY_DATA);
-
-   dev_dbg(gart->dev, "%s %08lx:%08x\n",
-pte ? "map" : "unmap", offs, pte & GART_PAGE_MASK);
+   writel_relaxed(iova, gart->regs + GART_ENTRY_ADDR);
+   writel_relaxed(pte, gart->regs + GART_ENTRY_DATA);
 }
 
 static inline unsigned long gart_read_pte(struct gart_device *gart,
- unsigned long offs)
+ unsigned long iova)
 {
unsigned long pte;
 
-   writel(offs, gart->regs + GART_ENTRY_ADDR);
-   pte = readl(gart->regs + GART_ENTRY_DATA);
+   writel_relaxed(iova, gart->regs + GART_ENTRY_ADDR);
+   pte = readl_relaxed(gart->regs + GART_ENTRY_DATA);
 
return pte;
 }
@@ -106,49 +99,20 @@ static void do_gart_setup(struct gart_device *gart, const 
u32 *data)
for_each_gart_pte(gart, iova)
gart_set_pte(gart, iova, data ? *(data++) : 0);
 
-   writel(1, gart->regs + GART_CONFIG);
+   writel_relaxed(1, gart->regs + GART_CONFIG);
FLUSH_GART_REGS(gart);
 }
 
-#ifdef DEBUG
-static void gart_dump_table(struct gart_device *gart)
-{
-   unsigned long iova;
-   unsigned long flags;
-
-   spin_lock_irqsave(>pte_lock, flags);
-