139139/* 2 bits: iommu type */
140140#define MTK_IOMMU_TYPE_MM (0x0 << 13)
141141#define MTK_IOMMU_TYPE_INFRA (0x1 << 13)
142+ #define MTK_IOMMU_TYPE_APU (0x2 << 13)
142143#define MTK_IOMMU_TYPE_MASK (0x3 << 13)
143144/* PM and clock always on. e.g. infra iommu */
144145#define PM_CLK_AO BIT(15)
@@ -173,6 +174,7 @@ enum mtk_iommu_plat {
173174 M4U_MT8183 ,
174175 M4U_MT8186 ,
175176 M4U_MT8188 ,
177+ M4U_MT8189 ,
176178 M4U_MT8192 ,
177179 M4U_MT8195 ,
178180 M4U_MT8365 ,
@@ -336,6 +338,7 @@ static int mtk_iommu_hw_init(const struct mtk_iommu_data *data, unsigned int ban
336338 */
337339#define MTK_IOMMU_4GB_MODE_REMAP_BASE 0x140000000UL
338340
341+ static LIST_HEAD (apulist ); /* List the apu iommu HWs */
339342static LIST_HEAD (m4ulist ); /* List all the M4U HWs */
340343
341344#define for_each_m4u (data , head ) list_for_each_entry(data, head, list)
@@ -351,6 +354,15 @@ static const struct mtk_iommu_iova_region single_domain[] = {
351354#define MT8192_MULTI_REGION_NR (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT) ? \
352355 MT8192_MULTI_REGION_NR_MAX : 1)
353356
357+ static const struct mtk_iommu_iova_region mt8189_multi_dom_apu [] = {
358+ { .iova_base = 0x200000ULL , .size = SZ_512M }, /* APU SECURE */
359+ #if IS_ENABLED (CONFIG_ARCH_DMA_ADDR_T_64BIT )
360+ { .iova_base = SZ_1G , .size = 0xc0000000 }, /* APU CODE */
361+ { .iova_base = 0x70000000ULL , .size = 0x12600000 }, /* APU VLM */
362+ { .iova_base = SZ_4G , .size = SZ_4G * 3 }, /* APU VPU */
363+ #endif
364+ };
365+
354366static const struct mtk_iommu_iova_region mt8192_multi_dom [MT8192_MULTI_REGION_NR ] = {
355367 { .iova_base = 0x0 , .size = MTK_IOMMU_IOVA_SZ_4G }, /* 0 ~ 4G, */
356368 #if IS_ENABLED (CONFIG_ARCH_DMA_ADDR_T_64BIT )
@@ -1725,6 +1737,27 @@ static const struct mtk_iommu_plat_data mt8188_data_vpp = {
17251737 27 , 28 /* ccu0 */ , MTK_INVALID_LARBID }, {4 , 6 }},
17261738};
17271739
1740+ static const unsigned int mt8189_apu_region_msk [][MTK_LARB_NR_MAX ] = {
1741+ [0 ] = {[0 ] = BIT (2 )}, /* Region0: fake larb 0 APU_SECURE */
1742+ [1 ] = {[0 ] = BIT (1 )}, /* Region1: fake larb 0 APU_CODE */
1743+ [2 ] = {[0 ] = BIT (3 )}, /* Region2: fake larb 0 APU_VLM */
1744+ [3 ] = {[0 ] = BIT (0 )}, /* Region3: fake larb 0 APU_DATA */
1745+ };
1746+
1747+ static const struct mtk_iommu_plat_data mt8189_data_apu = {
1748+ .m4u_plat = M4U_MT8189 ,
1749+ .flags = IOVA_34_EN | DCM_DISABLE |
1750+ MTK_IOMMU_TYPE_APU | PGTABLE_PA_35_EN ,
1751+ .hw_list = & apulist ,
1752+ .inv_sel_reg = REG_MMU_INV_SEL_GEN2 ,
1753+ .banks_num = 1 ,
1754+ .banks_enable = {true},
1755+ .iova_region = mt8189_multi_dom_apu ,
1756+ .iova_region_nr = ARRAY_SIZE (mt8189_multi_dom_apu ),
1757+ .larbid_remap = {{0 }, {1 }, {2 }, {3 }, {4 }, {5 }, {6 }, {7 }},
1758+ .iova_region_larb_msk = mt8189_apu_region_msk ,
1759+ };
1760+
17281761static const struct mtk_iommu_plat_data mt8192_data = {
17291762 .m4u_plat = M4U_MT8192 ,
17301763 .flags = HAS_BCLK | HAS_SUB_COMM_2BITS | OUT_ORDER_WR_EN |
@@ -1826,6 +1859,7 @@ static const struct of_device_id mtk_iommu_of_ids[] = {
18261859 { .compatible = "mediatek,mt8188-iommu-infra" , .data = & mt8188_data_infra },
18271860 { .compatible = "mediatek,mt8188-iommu-vdo" , .data = & mt8188_data_vdo },
18281861 { .compatible = "mediatek,mt8188-iommu-vpp" , .data = & mt8188_data_vpp },
1862+ { .compatible = "mediatek,mt8189-iommu-apu" , .data = & mt8189_data_apu },
18291863 { .compatible = "mediatek,mt8192-m4u" , .data = & mt8192_data },
18301864 { .compatible = "mediatek,mt8195-iommu-infra" , .data = & mt8195_data_infra },
18311865 { .compatible = "mediatek,mt8195-iommu-vdo" , .data = & mt8195_data_vdo },
0 commit comments