18c2ecf20Sopenharmony_ci* QCOM IOMMU v1 Implementation 28c2ecf20Sopenharmony_ci 38c2ecf20Sopenharmony_ciQualcomm "B" family devices which are not compatible with arm-smmu have 48c2ecf20Sopenharmony_cia similar looking IOMMU but without access to the global register space, 58c2ecf20Sopenharmony_ciand optionally requiring additional configuration to route context irqs 68c2ecf20Sopenharmony_cito non-secure vs secure interrupt line. 78c2ecf20Sopenharmony_ci 88c2ecf20Sopenharmony_ci** Required properties: 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci- compatible : Should be one of: 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci "qcom,msm8916-iommu" 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_ci Followed by "qcom,msm-iommu-v1". 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ci- clock-names : Should be a pair of "iface" (required for IOMMUs 178c2ecf20Sopenharmony_ci register group access) and "bus" (required for 188c2ecf20Sopenharmony_ci the IOMMUs underlying bus access). 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci- clocks : Phandles for respective clocks described by 218c2ecf20Sopenharmony_ci clock-names. 228c2ecf20Sopenharmony_ci 238c2ecf20Sopenharmony_ci- #address-cells : must be 1. 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci- #size-cells : must be 1. 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci- #iommu-cells : Must be 1. Index identifies the context-bank #. 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci- ranges : Base address and size of the iommu context banks. 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci- qcom,iommu-secure-id : secure-id. 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci- List of sub-nodes, one per translation context bank. Each sub-node 348c2ecf20Sopenharmony_ci has the following required properties: 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci - compatible : Should be one of: 378c2ecf20Sopenharmony_ci - "qcom,msm-iommu-v1-ns" : non-secure context bank 388c2ecf20Sopenharmony_ci - "qcom,msm-iommu-v1-sec" : secure context bank 398c2ecf20Sopenharmony_ci - reg : Base address and size of context bank within the iommu 408c2ecf20Sopenharmony_ci - interrupts : The context fault irq. 418c2ecf20Sopenharmony_ci 428c2ecf20Sopenharmony_ci** Optional properties: 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci- reg : Base address and size of the SMMU local base, should 458c2ecf20Sopenharmony_ci be only specified if the iommu requires configuration 468c2ecf20Sopenharmony_ci for routing of context bank irq's to secure vs non- 478c2ecf20Sopenharmony_ci secure lines. (Ie. if the iommu contains secure 488c2ecf20Sopenharmony_ci context banks) 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci** Examples: 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci apps_iommu: iommu@1e20000 { 548c2ecf20Sopenharmony_ci #address-cells = <1>; 558c2ecf20Sopenharmony_ci #size-cells = <1>; 568c2ecf20Sopenharmony_ci #iommu-cells = <1>; 578c2ecf20Sopenharmony_ci compatible = "qcom,msm8916-iommu", "qcom,msm-iommu-v1"; 588c2ecf20Sopenharmony_ci ranges = <0 0x1e20000 0x40000>; 598c2ecf20Sopenharmony_ci reg = <0x1ef0000 0x3000>; 608c2ecf20Sopenharmony_ci clocks = <&gcc GCC_SMMU_CFG_CLK>, 618c2ecf20Sopenharmony_ci <&gcc GCC_APSS_TCU_CLK>; 628c2ecf20Sopenharmony_ci clock-names = "iface", "bus"; 638c2ecf20Sopenharmony_ci qcom,iommu-secure-id = <17>; 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci // mdp_0: 668c2ecf20Sopenharmony_ci iommu-ctx@4000 { 678c2ecf20Sopenharmony_ci compatible = "qcom,msm-iommu-v1-ns"; 688c2ecf20Sopenharmony_ci reg = <0x4000 0x1000>; 698c2ecf20Sopenharmony_ci interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>; 708c2ecf20Sopenharmony_ci }; 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci // venus_ns: 738c2ecf20Sopenharmony_ci iommu-ctx@5000 { 748c2ecf20Sopenharmony_ci compatible = "qcom,msm-iommu-v1-sec"; 758c2ecf20Sopenharmony_ci reg = <0x5000 0x1000>; 768c2ecf20Sopenharmony_ci interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>; 778c2ecf20Sopenharmony_ci }; 788c2ecf20Sopenharmony_ci }; 798c2ecf20Sopenharmony_ci 808c2ecf20Sopenharmony_ci gpu_iommu: iommu@1f08000 { 818c2ecf20Sopenharmony_ci #address-cells = <1>; 828c2ecf20Sopenharmony_ci #size-cells = <1>; 838c2ecf20Sopenharmony_ci #iommu-cells = <1>; 848c2ecf20Sopenharmony_ci compatible = "qcom,msm8916-iommu", "qcom,msm-iommu-v1"; 858c2ecf20Sopenharmony_ci ranges = <0 0x1f08000 0x10000>; 868c2ecf20Sopenharmony_ci clocks = <&gcc GCC_SMMU_CFG_CLK>, 878c2ecf20Sopenharmony_ci <&gcc GCC_GFX_TCU_CLK>; 888c2ecf20Sopenharmony_ci clock-names = "iface", "bus"; 898c2ecf20Sopenharmony_ci qcom,iommu-secure-id = <18>; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_ci // gfx3d_user: 928c2ecf20Sopenharmony_ci iommu-ctx@1000 { 938c2ecf20Sopenharmony_ci compatible = "qcom,msm-iommu-v1-ns"; 948c2ecf20Sopenharmony_ci reg = <0x1000 0x1000>; 958c2ecf20Sopenharmony_ci interrupts = <GIC_SPI 241 IRQ_TYPE_LEVEL_HIGH>; 968c2ecf20Sopenharmony_ci }; 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci // gfx3d_priv: 998c2ecf20Sopenharmony_ci iommu-ctx@2000 { 1008c2ecf20Sopenharmony_ci compatible = "qcom,msm-iommu-v1-ns"; 1018c2ecf20Sopenharmony_ci reg = <0x2000 0x1000>; 1028c2ecf20Sopenharmony_ci interrupts = <GIC_SPI 242 IRQ_TYPE_LEVEL_HIGH>; 1038c2ecf20Sopenharmony_ci }; 1048c2ecf20Sopenharmony_ci }; 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci ... 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci venus: video-codec@1d00000 { 1098c2ecf20Sopenharmony_ci ... 1108c2ecf20Sopenharmony_ci iommus = <&apps_iommu 5>; 1118c2ecf20Sopenharmony_ci }; 1128c2ecf20Sopenharmony_ci 1138c2ecf20Sopenharmony_ci mdp: mdp@1a01000 { 1148c2ecf20Sopenharmony_ci ... 1158c2ecf20Sopenharmony_ci iommus = <&apps_iommu 4>; 1168c2ecf20Sopenharmony_ci }; 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci gpu@1c00000 { 1198c2ecf20Sopenharmony_ci ... 1208c2ecf20Sopenharmony_ci iommus = <&gpu_iommu 1>, <&gpu_iommu 2>; 1218c2ecf20Sopenharmony_ci }; 122