iommu/mediatek: Always enable output PA over 32bits in isr
authorYong Wu <yong.wu@mediatek.com>
Tue, 3 May 2022 07:14:05 +0000 (15:14 +0800)
committerJoerg Roedel <jroedel@suse.de>
Wed, 4 May 2022 08:39:39 +0000 (10:39 +0200)
Currently the output PA[32:33] is contained by the flag IOVA_34.
This is not right. the iova_34 has no relation with pa[32:33], the 32bits
iova still could map to pa[32:33]. Move it out from the flag.

No need fix tag since currently only mt8192 use the calulation and it
always has this IOVA_34 flag.

Prepare for the IOMMU that still use IOVA 32bits but its dram size may be
over 4GB.

Signed-off-by: Yong Wu <yong.wu@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
Link: https://lore.kernel.org/r/20220503071427.2285-15-yong.wu@mediatek.com
Signed-off-by: Joerg Roedel <jroedel@suse.de>
drivers/iommu/mtk_iommu.c

index ca77e7f1ce5d37f79822a921e118b3f545b4641b..d9689e041336ae6b6a2d0e26caaea5893c3283de 100644 (file)
@@ -283,11 +283,11 @@ static irqreturn_t mtk_iommu_isr(int irq, void *dev_id)
        write = fault_iova & F_MMU_FAULT_VA_WRITE_BIT;
        if (MTK_IOMMU_HAS_FLAG(data->plat_data, IOVA_34_EN)) {
                va34_32 = FIELD_GET(F_MMU_INVAL_VA_34_32_MASK, fault_iova);
-               pa34_32 = FIELD_GET(F_MMU_INVAL_PA_34_32_MASK, fault_iova);
                fault_iova = fault_iova & F_MMU_INVAL_VA_31_12_MASK;
                fault_iova |= (u64)va34_32 << 32;
-               fault_pa |= (u64)pa34_32 << 32;
        }
+       pa34_32 = FIELD_GET(F_MMU_INVAL_PA_34_32_MASK, fault_iova);
+       fault_pa |= (u64)pa34_32 << 32;
 
        fault_port = F_MMU_INT_ID_PORT_ID(regval);
        if (MTK_IOMMU_HAS_FLAG(data->plat_data, HAS_SUB_COMM)) {