Skip to content

Commit 301c3ca

Browse files
yunfeimmjoergroedel
authored andcommitted
iommu/mediatek: Allow page table PA up to 35bit
Single memory zone feature will remove ZONE_DMA32 and ZONE_DMA. So add the quirk IO_PGTABLE_QUIRK_ARM_MTK_TTBR_EXT to let level 1 and level 2 pgtable support at most 35bit PA. Signed-off-by: Ning Li <ning.li@mediatek.com> Signed-off-by: Yunfei Wang <yf.wang@mediatek.com> Reviewed-by: Yong Wu <yong.wu@mediatek.com> Reviewed-by: Robin Murphy <robin.murphy@arm.com> Acked-by: Will Deacon <will@kernel.org> Link: https://lore.kernel.org/r/20220630092927.24925-3-yf.wang@mediatek.com Signed-off-by: Joerg Roedel <jroedel@suse.de>
1 parent bfdd231 commit 301c3ca

1 file changed

Lines changed: 7 additions & 6 deletions

File tree

drivers/iommu/mtk_iommu.c

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,6 @@
3434
#include <dt-bindings/memory/mtk-memory-port.h>
3535

3636
#define REG_MMU_PT_BASE_ADDR 0x000
37-
#define MMU_PT_ADDR_MASK GENMASK(31, 7)
3837

3938
#define REG_MMU_INVALIDATE 0x020
4039
#define F_ALL_INVLD 0x2
@@ -138,6 +137,7 @@
138137
/* PM and clock always on. e.g. infra iommu */
139138
#define PM_CLK_AO BIT(15)
140139
#define IFA_IOMMU_PCIE_SUPPORT BIT(16)
140+
#define PGTABLE_PA_35_EN BIT(17)
141141

142142
#define MTK_IOMMU_HAS_FLAG_MASK(pdata, _x, mask) \
143143
((((pdata)->flags) & (mask)) == (_x))
@@ -596,6 +596,9 @@ static int mtk_iommu_domain_finalise(struct mtk_iommu_domain *dom,
596596
.iommu_dev = data->dev,
597597
};
598598

599+
if (MTK_IOMMU_HAS_FLAG(data->plat_data, PGTABLE_PA_35_EN))
600+
dom->cfg.quirks |= IO_PGTABLE_QUIRK_ARM_MTK_TTBR_EXT;
601+
599602
if (MTK_IOMMU_HAS_FLAG(data->plat_data, HAS_4GB_MODE))
600603
dom->cfg.oas = data->enable_4GB ? 33 : 32;
601604
else
@@ -684,8 +687,7 @@ static int mtk_iommu_attach_device(struct iommu_domain *domain,
684687
goto err_unlock;
685688
}
686689
bank->m4u_dom = dom;
687-
writel(dom->cfg.arm_v7s_cfg.ttbr & MMU_PT_ADDR_MASK,
688-
bank->base + REG_MMU_PT_BASE_ADDR);
690+
writel(dom->cfg.arm_v7s_cfg.ttbr, bank->base + REG_MMU_PT_BASE_ADDR);
689691

690692
pm_runtime_put(m4udev);
691693
}
@@ -1374,8 +1376,7 @@ static int __maybe_unused mtk_iommu_runtime_resume(struct device *dev)
13741376
writel_relaxed(reg->int_control[i], base + REG_MMU_INT_CONTROL0);
13751377
writel_relaxed(reg->int_main_control[i], base + REG_MMU_INT_MAIN_CONTROL);
13761378
writel_relaxed(reg->ivrp_paddr[i], base + REG_MMU_IVRP_PADDR);
1377-
writel(m4u_dom->cfg.arm_v7s_cfg.ttbr & MMU_PT_ADDR_MASK,
1378-
base + REG_MMU_PT_BASE_ADDR);
1379+
writel(m4u_dom->cfg.arm_v7s_cfg.ttbr, base + REG_MMU_PT_BASE_ADDR);
13791380
} while (++i < data->plat_data->banks_num);
13801381

13811382
/*
@@ -1409,7 +1410,7 @@ static const struct mtk_iommu_plat_data mt2712_data = {
14091410
static const struct mtk_iommu_plat_data mt6779_data = {
14101411
.m4u_plat = M4U_MT6779,
14111412
.flags = HAS_SUB_COMM_2BITS | OUT_ORDER_WR_EN | WR_THROT_EN |
1412-
MTK_IOMMU_TYPE_MM,
1413+
MTK_IOMMU_TYPE_MM | PGTABLE_PA_35_EN,
14131414
.inv_sel_reg = REG_MMU_INV_SEL_GEN2,
14141415
.banks_num = 1,
14151416
.banks_enable = {true},

0 commit comments

Comments
 (0)