Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

iommu/mediatek: Add mt2712 IOMMU support

The M4U IP blocks in mt2712 is MTK's generation2 M4U which use the
ARM Short-descriptor like mt8173, and most of the HW registers are
the same.

The difference is that there are 2 M4U HWs in mt2712 while there's
only one in mt8173. The purpose of 2 M4U HWs is for balance the
bandwidth.

Normally if there are 2 M4U HWs, there should be 2 iommu domains,
each M4U has a iommu domain.

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

authored by

Yong Wu and committed by
Joerg Roedel
e6dec923 a9467d95

+93 -41
+34 -37
drivers/iommu/mtk_iommu.c
··· 53 53 54 54 #define REG_MMU_CTRL_REG 0x110 55 55 #define F_MMU_PREFETCH_RT_REPLACE_MOD BIT(4) 56 - #define F_MMU_TF_PROTECT_SEL(prot) (((prot) & 0x3) << 5) 56 + #define F_MMU_TF_PROTECT_SEL_SHIFT(data) \ 57 + ((data)->m4u_plat == M4U_MT2712 ? 4 : 5) 58 + /* It's named by F_MMU_TF_PROT_SEL in mt2712. */ 59 + #define F_MMU_TF_PROTECT_SEL(prot, data) \ 60 + (((prot) & 0x3) << F_MMU_TF_PROTECT_SEL_SHIFT(data)) 57 61 58 62 #define REG_MMU_IVRP_PADDR 0x114 59 63 #define F_MMU_IVRP_PA_SET(pa, ext) (((pa) >> 1) | ((!!(ext)) << 31)) ··· 100 96 * Get the local arbiter ID and the portid within the larb arbiter 101 97 * from mtk_m4u_id which is defined by MTK_M4U_ID. 102 98 */ 103 - #define MTK_M4U_TO_LARB(id) (((id) >> 5) & 0x7) 99 + #define MTK_M4U_TO_LARB(id) (((id) >> 5) & 0xf) 104 100 #define MTK_M4U_TO_PORT(id) ((id) & 0x1f) 105 101 106 102 struct mtk_iommu_domain { ··· 311 307 data->m4u_dom = NULL; 312 308 return ret; 313 309 } 314 - } else if (data->m4u_dom != dom) { 315 - /* All the client devices should be in the same m4u domain */ 316 - dev_err(dev, "try to attach into the error iommu domain\n"); 317 - return -EPERM; 318 310 } 319 311 320 312 mtk_iommu_config(data, dev, true); ··· 470 470 return ret; 471 471 } 472 472 473 - regval = F_MMU_PREFETCH_RT_REPLACE_MOD | 474 - F_MMU_TF_PROTECT_SEL(2); 473 + regval = F_MMU_TF_PROTECT_SEL(2, data); 474 + if (data->m4u_plat == M4U_MT8173) 475 + regval |= F_MMU_PREFETCH_RT_REPLACE_MOD; 475 476 writel_relaxed(regval, data->base + REG_MMU_CTRL_REG); 476 477 477 478 regval = F_L2_MULIT_HIT_EN | ··· 494 493 495 494 writel_relaxed(F_MMU_IVRP_PA_SET(data->protect_base, data->enable_4GB), 496 495 data->base + REG_MMU_IVRP_PADDR); 497 - 498 496 writel_relaxed(0, data->base + REG_MMU_DCM_DIS); 499 - writel_relaxed(0, data->base + REG_MMU_STANDARD_AXI_MODE); 497 + 498 + /* It's MISC control register whose default value is ok except mt8173.*/ 499 + if (data->m4u_plat == M4U_MT8173) 500 + writel_relaxed(0, data->base + REG_MMU_STANDARD_AXI_MODE); 500 501 501 502 if (devm_request_irq(data->dev, data->irq, mtk_iommu_isr, 0, 502 503 dev_name(data->dev), (void *)data)) { ··· 530 527 if (!data) 531 528 return -ENOMEM; 532 529 data->dev = dev; 530 + data->m4u_plat = (enum mtk_iommu_plat)of_device_get_match_data(dev); 533 531 534 532 /* Protect memory. HW will access here while translation fault.*/ 535 533 protect = devm_kzalloc(dev, MTK_PROTECT_PA_ALIGN * 2, GFP_KERNEL); ··· 564 560 for (i = 0; i < larb_nr; i++) { 565 561 struct device_node *larbnode; 566 562 struct platform_device *plarbdev; 563 + u32 id; 567 564 568 565 larbnode = of_parse_phandle(dev->of_node, "mediatek,larbs", i); 569 566 if (!larbnode) ··· 573 568 if (!of_device_is_available(larbnode)) 574 569 continue; 575 570 571 + ret = of_property_read_u32(larbnode, "mediatek,larb-id", &id); 572 + if (ret)/* The id is consecutive if there is no this property */ 573 + id = i; 574 + 576 575 plarbdev = of_find_device_by_node(larbnode); 577 - if (!plarbdev) { 578 - plarbdev = of_platform_device_create( 579 - larbnode, NULL, 580 - platform_bus_type.dev_root); 581 - if (!plarbdev) { 582 - of_node_put(larbnode); 583 - return -EPROBE_DEFER; 584 - } 585 - } 586 - data->smi_imu.larb_imu[i].dev = &plarbdev->dev; 576 + if (!plarbdev) 577 + return -EPROBE_DEFER; 578 + data->smi_imu.larb_imu[id].dev = &plarbdev->dev; 587 579 588 580 component_match_add_release(dev, &match, release_of, 589 581 compare_of, larbnode); ··· 648 646 struct mtk_iommu_suspend_reg *reg = &data->reg; 649 647 void __iomem *base = data->base; 650 648 651 - writel_relaxed(data->m4u_dom->cfg.arm_v7s_cfg.ttbr[0], 652 - base + REG_MMU_PT_BASE_ADDR); 653 649 writel_relaxed(reg->standard_axi_mode, 654 650 base + REG_MMU_STANDARD_AXI_MODE); 655 651 writel_relaxed(reg->dcm_dis, base + REG_MMU_DCM_DIS); ··· 656 656 writel_relaxed(reg->int_main_control, base + REG_MMU_INT_MAIN_CONTROL); 657 657 writel_relaxed(F_MMU_IVRP_PA_SET(data->protect_base, data->enable_4GB), 658 658 base + REG_MMU_IVRP_PADDR); 659 + if (data->m4u_dom) 660 + writel(data->m4u_dom->cfg.arm_v7s_cfg.ttbr[0], 661 + base + REG_MMU_PT_BASE_ADDR); 659 662 return 0; 660 663 } 661 664 662 - const struct dev_pm_ops mtk_iommu_pm_ops = { 665 + static const struct dev_pm_ops mtk_iommu_pm_ops = { 663 666 SET_SYSTEM_SLEEP_PM_OPS(mtk_iommu_suspend, mtk_iommu_resume) 664 667 }; 665 668 666 669 static const struct of_device_id mtk_iommu_of_ids[] = { 667 - { .compatible = "mediatek,mt8173-m4u", }, 670 + { .compatible = "mediatek,mt2712-m4u", .data = (void *)M4U_MT2712}, 671 + { .compatible = "mediatek,mt8173-m4u", .data = (void *)M4U_MT8173}, 668 672 {} 669 673 }; 670 674 ··· 677 673 .remove = mtk_iommu_remove, 678 674 .driver = { 679 675 .name = "mtk-iommu", 680 - .of_match_table = mtk_iommu_of_ids, 676 + .of_match_table = of_match_ptr(mtk_iommu_of_ids), 681 677 .pm = &mtk_iommu_pm_ops, 682 678 } 683 679 }; 684 680 685 - static int mtk_iommu_init_fn(struct device_node *np) 681 + static int __init mtk_iommu_init(void) 686 682 { 687 683 int ret; 688 - struct platform_device *pdev; 689 - 690 - pdev = of_platform_device_create(np, NULL, platform_bus_type.dev_root); 691 - if (!pdev) 692 - return -ENOMEM; 693 684 694 685 ret = platform_driver_register(&mtk_iommu_driver); 695 - if (ret) { 696 - pr_err("%s: Failed to register driver\n", __func__); 697 - return ret; 698 - } 686 + if (ret != 0) 687 + pr_err("Failed to register MTK IOMMU driver\n"); 699 688 700 - return 0; 689 + return ret; 701 690 } 702 691 703 - IOMMU_OF_DECLARE(mtkm4u, "mediatek,mt8173-m4u", mtk_iommu_init_fn); 692 + subsys_initcall(mtk_iommu_init)
+7
drivers/iommu/mtk_iommu.h
··· 34 34 u32 int_main_control; 35 35 }; 36 36 37 + enum mtk_iommu_plat { 38 + M4U_MT2701, 39 + M4U_MT2712, 40 + M4U_MT8173, 41 + }; 42 + 37 43 struct mtk_iommu_domain; 38 44 39 45 struct mtk_iommu_data { ··· 56 50 bool tlb_flush_active; 57 51 58 52 struct iommu_device iommu; 53 + enum mtk_iommu_plat m4u_plat; 59 54 }; 60 55 61 56 static inline int compare_of(struct device *dev, void *data)
+51 -3
drivers/memory/mtk-smi.c
··· 23 23 #include <soc/mediatek/smi.h> 24 24 #include <dt-bindings/memory/mt2701-larb-port.h> 25 25 26 + /* mt8173 */ 26 27 #define SMI_LARB_MMU_EN 0xf00 28 + 29 + /* mt2701 */ 27 30 #define REG_SMI_SECUR_CON_BASE 0x5c0 28 31 29 32 /* every register control 8 port, register offset 0x4 */ ··· 43 40 #define SMI_SECUR_CON_VAL_VIRT(id) BIT((((id) & 0x7) << 2) + 3) 44 41 /* mt2701 domain should be set to 3 */ 45 42 #define SMI_SECUR_CON_VAL_DOMAIN(id) (0x3 << ((((id) & 0x7) << 2) + 1)) 43 + 44 + /* mt2712 */ 45 + #define SMI_LARB_NONSEC_CON(id) (0x380 + ((id) * 4)) 46 + #define F_MMU_EN BIT(0) 46 47 47 48 struct mtk_smi_larb_gen { 48 49 bool need_larbid; ··· 156 149 struct mtk_smi_iommu *smi_iommu = data; 157 150 unsigned int i; 158 151 152 + if (larb->larb_gen->need_larbid) { 153 + larb->mmu = &smi_iommu->larb_imu[larb->larbid].mmu; 154 + return 0; 155 + } 156 + 157 + /* 158 + * If there is no larbid property, Loop to find the corresponding 159 + * iommu information. 160 + */ 159 161 for (i = 0; i < smi_iommu->larb_nr; i++) { 160 162 if (dev == smi_iommu->larb_imu[i].dev) { 161 163 /* The 'mmu' may be updated in iommu-attach/detach. */ ··· 175 159 return -ENODEV; 176 160 } 177 161 178 - static void mtk_smi_larb_config_port(struct device *dev) 162 + static void mtk_smi_larb_config_port_mt2712(struct device *dev) 163 + { 164 + struct mtk_smi_larb *larb = dev_get_drvdata(dev); 165 + u32 reg; 166 + int i; 167 + 168 + /* 169 + * larb 8/9 is the bdpsys larb, the iommu_en is enabled defaultly. 170 + * Don't need to set it again. 171 + */ 172 + if (larb->larbid == 8 || larb->larbid == 9) 173 + return; 174 + 175 + for_each_set_bit(i, (unsigned long *)larb->mmu, 32) { 176 + reg = readl_relaxed(larb->base + SMI_LARB_NONSEC_CON(i)); 177 + reg |= F_MMU_EN; 178 + writel(reg, larb->base + SMI_LARB_NONSEC_CON(i)); 179 + } 180 + } 181 + 182 + static void mtk_smi_larb_config_port_mt8173(struct device *dev) 179 183 { 180 184 struct mtk_smi_larb *larb = dev_get_drvdata(dev); 181 185 182 186 writel(*larb->mmu, larb->base + SMI_LARB_MMU_EN); 183 187 } 184 - 185 188 186 189 static void mtk_smi_larb_config_port_gen1(struct device *dev) 187 190 { ··· 246 211 247 212 static const struct mtk_smi_larb_gen mtk_smi_larb_mt8173 = { 248 213 /* mt8173 do not need the port in larb */ 249 - .config_port = mtk_smi_larb_config_port, 214 + .config_port = mtk_smi_larb_config_port_mt8173, 250 215 }; 251 216 252 217 static const struct mtk_smi_larb_gen mtk_smi_larb_mt2701 = { ··· 258 223 .config_port = mtk_smi_larb_config_port_gen1, 259 224 }; 260 225 226 + static const struct mtk_smi_larb_gen mtk_smi_larb_mt2712 = { 227 + .need_larbid = true, 228 + .config_port = mtk_smi_larb_config_port_mt2712, 229 + }; 230 + 261 231 static const struct of_device_id mtk_smi_larb_of_ids[] = { 262 232 { 263 233 .compatible = "mediatek,mt8173-smi-larb", ··· 271 231 { 272 232 .compatible = "mediatek,mt2701-smi-larb", 273 233 .data = &mtk_smi_larb_mt2701 234 + }, 235 + { 236 + .compatible = "mediatek,mt2712-smi-larb", 237 + .data = &mtk_smi_larb_mt2712 274 238 }, 275 239 {} 276 240 }; ··· 361 317 { 362 318 .compatible = "mediatek,mt2701-smi-common", 363 319 .data = (void *)MTK_SMI_GEN1 320 + }, 321 + { 322 + .compatible = "mediatek,mt2712-smi-common", 323 + .data = (void *)MTK_SMI_GEN2 364 324 }, 365 325 {} 366 326 };
+1 -1
include/soc/mediatek/smi.h
··· 19 19 20 20 #ifdef CONFIG_MTK_SMI 21 21 22 - #define MTK_LARB_NR_MAX 8 22 + #define MTK_LARB_NR_MAX 16 23 23 24 24 #define MTK_SMI_MMU_EN(port) BIT(port) 25 25