Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 | * 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 = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>; }; // venus_ns: iommu-ctx@5000 { compatible = "qcom,msm-iommu-v1-sec"; reg = <0x5000 0x1000>; interrupts = <GIC_SPI 70 IRQ_TYPE_LEVEL_HIGH>; }; }; 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 = <GIC_SPI 241 IRQ_TYPE_LEVEL_HIGH>; }; // gfx3d_priv: iommu-ctx@2000 { compatible = "qcom,msm-iommu-v1-ns"; reg = <0x2000 0x1000>; interrupts = <GIC_SPI 242 IRQ_TYPE_LEVEL_HIGH>; }; }; ... venus: video-codec@1d00000 { ... iommus = <&apps_iommu 5>; }; mdp: mdp@1a01000 { ... iommus = <&apps_iommu 4>; }; gpu@1c00000 { ... iommus = <&gpu_iommu 1>, <&gpu_iommu 2>; }; |