* QCOM IOMMU v1 Implementation Qualcomm "B" family devices which are not compatible with arm-smmu have a similar looking IOMMU but without access to the global register space, and optionally requiring additional configuration to route context irqs to non-secure vs secure interrupt line. ** Required properties: - compatible : Should be one of: "qcom,msm8916-iommu" Followed by "qcom,msm-iommu-v1". - clock-names : Should be a pair of "iface" (required for IOMMUs register group access) and "bus" (required for the IOMMUs underlying bus access). - clocks : Phandles for respective clocks described by clock-names. - #address-cells : must be 1. - #size-cells : must be 1. - #iommu-cells : Must be 1. Index identifies the context-bank #. - ranges : Base address and size of the iommu context banks. - qcom,iommu-secure-id : secure-id. - List of sub-nodes, one per translation context bank. Each sub-node has the following required properties: - compatible : Should be one of: - "qcom,msm-iommu-v1-ns" : non-secure context bank - "qcom,msm-iommu-v1-sec" : secure context bank - reg : Base address and size of context bank within the iommu - interrupts : The context fault irq. ** Optional properties: - reg : Base address and size of the SMMU local base, should be only specified if the iommu requires configuration for routing of context bank irq's to secure vs non- secure lines. (Ie. if the iommu contains secure context banks) ** Examples: apps_iommu: iommu@1e20000 { #address-cells = <1>; #size-cells = <1>; #iommu-cells = <1>; compatible = "qcom,msm8916-iommu", "qcom,msm-iommu-v1"; ranges = <0 0x1e20000 0x40000>; reg = <0x1ef0000 0x3000>; clocks = <&gcc GCC_SMMU_CFG_CLK>, <&gcc GCC_APSS_TCU_CLK>; clock-names = "iface", "bus"; qcom,iommu-secure-id = <17>; // mdp_0: iommu-ctx@4000 { compatible = "qcom,msm-iommu-v1-ns"; reg = <0x4000 0x1000>; interrupts = ; }; // venus_ns: iommu-ctx@5000 { compatible = "qcom,msm-iommu-v1-sec"; reg = <0x5000 0x1000>; interrupts = ; }; }; gpu_iommu: iommu@1f08000 { #address-cells = <1>; #size-cells = <1>; #iommu-cells = <1>; compatible = "qcom,msm8916-iommu", "qcom,msm-iommu-v1"; ranges = <0 0x1f08000 0x10000>; clocks = <&gcc GCC_SMMU_CFG_CLK>, <&gcc GCC_GFX_TCU_CLK>; clock-names = "iface", "bus"; qcom,iommu-secure-id = <18>; // gfx3d_user: iommu-ctx@1000 { compatible = "qcom,msm-iommu-v1-ns"; reg = <0x1000 0x1000>; interrupts = ; }; // gfx3d_priv: iommu-ctx@2000 { compatible = "qcom,msm-iommu-v1-ns"; reg = <0x2000 0x1000>; interrupts = ; }; }; ... venus: video-codec@1d00000 { ... iommus = <&apps_iommu 5>; }; mdp: mdp@1a01000 { ... iommus = <&apps_iommu 4>; }; gpu@1c00000 { ... iommus = <&gpu_iommu 1>, <&gpu_iommu 2>; };