iommu/mediatek: Get rid of the pgtlock
authorYong Wu <yong.wu@mediatek.com>
Mon, 4 Nov 2019 07:01:07 +0000 (15:01 +0800)
committerJoerg Roedel <jroedel@suse.de>
Mon, 11 Nov 2019 14:02:34 +0000 (15:02 +0100)
Now we have tlb_lock for the HW tlb flush, then pgtable code hasn't
needed the external "pgtlock" for a while. this patch remove the
"pgtlock".

Signed-off-by: Yong Wu <yong.wu@mediatek.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/mtk_iommu.c

index 0e5f41f..c2b7ed5 100644 (file)
 #define MTK_M4U_TO_PORT(id)            ((id) & 0x1f)
 
 struct mtk_iommu_domain {
-       spinlock_t                      pgtlock; /* lock for page table */
-
        struct io_pgtable_cfg           cfg;
        struct io_pgtable_ops           *iop;
 
@@ -295,8 +293,6 @@ static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom)
 {
        struct mtk_iommu_data *data = mtk_iommu_get_m4u_data();
 
-       spin_lock_init(&dom->pgtlock);
-
        dom->cfg = (struct io_pgtable_cfg) {
                .quirks = IO_PGTABLE_QUIRK_ARM_NS |
                        IO_PGTABLE_QUIRK_NO_PERMS |
@@ -395,18 +391,13 @@ static int mtk_iommu_map(struct iommu_domain *domain, unsigned long iova,
 {
        struct mtk_iommu_domain *dom = to_mtk_domain(domain);
        struct mtk_iommu_data *data = mtk_iommu_get_m4u_data();
-       unsigned long flags;
-       int ret;
 
        /* The "4GB mode" M4U physically can not use the lower remap of Dram. */
        if (data->enable_4GB)
                paddr |= BIT_ULL(32);
 
-       spin_lock_irqsave(&dom->pgtlock, flags);
-       ret = dom->iop->map(dom->iop, iova, paddr, size, prot);
-       spin_unlock_irqrestore(&dom->pgtlock, flags);
-
-       return ret;
+       /* Synchronize with the tlb_lock */
+       return dom->iop->map(dom->iop, iova, paddr, size, prot);
 }
 
 static size_t mtk_iommu_unmap(struct iommu_domain *domain,
@@ -414,14 +405,8 @@ static size_t mtk_iommu_unmap(struct iommu_domain *domain,
                              struct iommu_iotlb_gather *gather)
 {
        struct mtk_iommu_domain *dom = to_mtk_domain(domain);
-       unsigned long flags;
-       size_t unmapsz;
-
-       spin_lock_irqsave(&dom->pgtlock, flags);
-       unmapsz = dom->iop->unmap(dom->iop, iova, size, gather);
-       spin_unlock_irqrestore(&dom->pgtlock, flags);
 
-       return unmapsz;
+       return dom->iop->unmap(dom->iop, iova, size, gather);
 }
 
 static void mtk_iommu_flush_iotlb_all(struct iommu_domain *domain)
@@ -447,13 +432,9 @@ static phys_addr_t mtk_iommu_iova_to_phys(struct iommu_domain *domain,
 {
        struct mtk_iommu_domain *dom = to_mtk_domain(domain);
        struct mtk_iommu_data *data = mtk_iommu_get_m4u_data();
-       unsigned long flags;
        phys_addr_t pa;
 
-       spin_lock_irqsave(&dom->pgtlock, flags);
        pa = dom->iop->iova_to_phys(dom->iop, iova);
-       spin_unlock_irqrestore(&dom->pgtlock, flags);
-
        if (data->enable_4GB && pa >= MTK_IOMMU_4GB_MODE_REMAP_BASE)
                pa &= ~BIT_ULL(32);