18c2ecf20Sopenharmony_ci# SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci%YAML 1.2 38c2ecf20Sopenharmony_ci--- 48c2ecf20Sopenharmony_ci$id: http://devicetree.org/schemas/iommu/arm,smmu.yaml# 58c2ecf20Sopenharmony_ci$schema: http://devicetree.org/meta-schemas/core.yaml# 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_cititle: ARM System MMU Architecture Implementation 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_cimaintainers: 108c2ecf20Sopenharmony_ci - Will Deacon <will@kernel.org> 118c2ecf20Sopenharmony_ci - Robin Murphy <Robin.Murphy@arm.com> 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_cidescription: |+ 148c2ecf20Sopenharmony_ci ARM SoCs may contain an implementation of the ARM System Memory 158c2ecf20Sopenharmony_ci Management Unit Architecture, which can be used to provide 1 or 2 stages 168c2ecf20Sopenharmony_ci of address translation to bus masters external to the CPU. 178c2ecf20Sopenharmony_ci 188c2ecf20Sopenharmony_ci The SMMU may also raise interrupts in response to various fault 198c2ecf20Sopenharmony_ci conditions. 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ciproperties: 228c2ecf20Sopenharmony_ci $nodename: 238c2ecf20Sopenharmony_ci pattern: "^iommu@[0-9a-f]*" 248c2ecf20Sopenharmony_ci compatible: 258c2ecf20Sopenharmony_ci oneOf: 268c2ecf20Sopenharmony_ci - description: Qcom SoCs implementing "arm,smmu-v2" 278c2ecf20Sopenharmony_ci items: 288c2ecf20Sopenharmony_ci - enum: 298c2ecf20Sopenharmony_ci - qcom,msm8996-smmu-v2 308c2ecf20Sopenharmony_ci - qcom,msm8998-smmu-v2 318c2ecf20Sopenharmony_ci - qcom,sc7180-smmu-v2 328c2ecf20Sopenharmony_ci - qcom,sdm845-smmu-v2 338c2ecf20Sopenharmony_ci - const: qcom,smmu-v2 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci - description: Qcom SoCs implementing "arm,mmu-500" 368c2ecf20Sopenharmony_ci items: 378c2ecf20Sopenharmony_ci - enum: 388c2ecf20Sopenharmony_ci - qcom,sc7180-smmu-500 398c2ecf20Sopenharmony_ci - qcom,sdm845-smmu-500 408c2ecf20Sopenharmony_ci - qcom,sm8150-smmu-500 418c2ecf20Sopenharmony_ci - qcom,sm8250-smmu-500 428c2ecf20Sopenharmony_ci - const: arm,mmu-500 438c2ecf20Sopenharmony_ci - description: Marvell SoCs implementing "arm,mmu-500" 448c2ecf20Sopenharmony_ci items: 458c2ecf20Sopenharmony_ci - const: marvell,ap806-smmu-500 468c2ecf20Sopenharmony_ci - const: arm,mmu-500 478c2ecf20Sopenharmony_ci - description: NVIDIA SoCs that program two ARM MMU-500s identically 488c2ecf20Sopenharmony_ci items: 498c2ecf20Sopenharmony_ci - enum: 508c2ecf20Sopenharmony_ci - nvidia,tegra194-smmu 518c2ecf20Sopenharmony_ci - const: nvidia,smmu-500 528c2ecf20Sopenharmony_ci - items: 538c2ecf20Sopenharmony_ci - const: arm,mmu-500 548c2ecf20Sopenharmony_ci - const: arm,smmu-v2 558c2ecf20Sopenharmony_ci - items: 568c2ecf20Sopenharmony_ci - enum: 578c2ecf20Sopenharmony_ci - arm,mmu-400 588c2ecf20Sopenharmony_ci - arm,mmu-401 598c2ecf20Sopenharmony_ci - const: arm,smmu-v1 608c2ecf20Sopenharmony_ci - enum: 618c2ecf20Sopenharmony_ci - arm,smmu-v1 628c2ecf20Sopenharmony_ci - arm,smmu-v2 638c2ecf20Sopenharmony_ci - arm,mmu-400 648c2ecf20Sopenharmony_ci - arm,mmu-401 658c2ecf20Sopenharmony_ci - arm,mmu-500 668c2ecf20Sopenharmony_ci - cavium,smmu-v2 678c2ecf20Sopenharmony_ci 688c2ecf20Sopenharmony_ci reg: 698c2ecf20Sopenharmony_ci minItems: 1 708c2ecf20Sopenharmony_ci maxItems: 2 718c2ecf20Sopenharmony_ci 728c2ecf20Sopenharmony_ci '#global-interrupts': 738c2ecf20Sopenharmony_ci description: The number of global interrupts exposed by the device. 748c2ecf20Sopenharmony_ci $ref: /schemas/types.yaml#/definitions/uint32 758c2ecf20Sopenharmony_ci minimum: 0 768c2ecf20Sopenharmony_ci maximum: 260 # 2 secure, 2 non-secure, and up to 256 perf counters 778c2ecf20Sopenharmony_ci 788c2ecf20Sopenharmony_ci '#iommu-cells': 798c2ecf20Sopenharmony_ci enum: [ 1, 2 ] 808c2ecf20Sopenharmony_ci description: | 818c2ecf20Sopenharmony_ci See Documentation/devicetree/bindings/iommu/iommu.txt for details. With a 828c2ecf20Sopenharmony_ci value of 1, each IOMMU specifier represents a distinct stream ID emitted 838c2ecf20Sopenharmony_ci by that device into the relevant SMMU. 848c2ecf20Sopenharmony_ci 858c2ecf20Sopenharmony_ci SMMUs with stream matching support and complex masters may use a value of 868c2ecf20Sopenharmony_ci 2, where the second cell of the IOMMU specifier represents an SMR mask to 878c2ecf20Sopenharmony_ci combine with the ID in the first cell. Care must be taken to ensure the 888c2ecf20Sopenharmony_ci set of matched IDs does not result in conflicts. 898c2ecf20Sopenharmony_ci 908c2ecf20Sopenharmony_ci interrupts: 918c2ecf20Sopenharmony_ci minItems: 1 928c2ecf20Sopenharmony_ci maxItems: 388 # 260 plus 128 contexts 938c2ecf20Sopenharmony_ci description: | 948c2ecf20Sopenharmony_ci Interrupt list, with the first #global-interrupts entries corresponding to 958c2ecf20Sopenharmony_ci the global interrupts and any following entries corresponding to context 968c2ecf20Sopenharmony_ci interrupts, specified in order of their indexing by the SMMU. 978c2ecf20Sopenharmony_ci 988c2ecf20Sopenharmony_ci For SMMUv2 implementations, there must be exactly one interrupt per 998c2ecf20Sopenharmony_ci context bank. In the case of a single, combined interrupt, it must be 1008c2ecf20Sopenharmony_ci listed multiple times. 1018c2ecf20Sopenharmony_ci 1028c2ecf20Sopenharmony_ci dma-coherent: 1038c2ecf20Sopenharmony_ci description: | 1048c2ecf20Sopenharmony_ci Present if page table walks made by the SMMU are cache coherent with the 1058c2ecf20Sopenharmony_ci CPU. 1068c2ecf20Sopenharmony_ci 1078c2ecf20Sopenharmony_ci NOTE: this only applies to the SMMU itself, not masters connected 1088c2ecf20Sopenharmony_ci upstream of the SMMU. 1098c2ecf20Sopenharmony_ci 1108c2ecf20Sopenharmony_ci calxeda,smmu-secure-config-access: 1118c2ecf20Sopenharmony_ci type: boolean 1128c2ecf20Sopenharmony_ci description: 1138c2ecf20Sopenharmony_ci Enable proper handling of buggy implementations that always use secure 1148c2ecf20Sopenharmony_ci access to SMMU configuration registers. In this case non-secure aliases of 1158c2ecf20Sopenharmony_ci secure registers have to be used during SMMU configuration. 1168c2ecf20Sopenharmony_ci 1178c2ecf20Sopenharmony_ci stream-match-mask: 1188c2ecf20Sopenharmony_ci $ref: /schemas/types.yaml#/definitions/uint32 1198c2ecf20Sopenharmony_ci description: | 1208c2ecf20Sopenharmony_ci For SMMUs supporting stream matching and using #iommu-cells = <1>, 1218c2ecf20Sopenharmony_ci specifies a mask of bits to ignore when matching stream IDs (e.g. this may 1228c2ecf20Sopenharmony_ci be programmed into the SMRn.MASK field of every stream match register 1238c2ecf20Sopenharmony_ci used). For cases where it is desirable to ignore some portion of every 1248c2ecf20Sopenharmony_ci Stream ID (e.g. for certain MMU-500 configurations given globally unique 1258c2ecf20Sopenharmony_ci input IDs). This property is not valid for SMMUs using stream indexing, or 1268c2ecf20Sopenharmony_ci using stream matching with #iommu-cells = <2>, and may be ignored if 1278c2ecf20Sopenharmony_ci present in such cases. 1288c2ecf20Sopenharmony_ci 1298c2ecf20Sopenharmony_ci clock-names: 1308c2ecf20Sopenharmony_ci items: 1318c2ecf20Sopenharmony_ci - const: bus 1328c2ecf20Sopenharmony_ci - const: iface 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci clocks: 1358c2ecf20Sopenharmony_ci items: 1368c2ecf20Sopenharmony_ci - description: bus clock required for downstream bus access and for the 1378c2ecf20Sopenharmony_ci smmu ptw 1388c2ecf20Sopenharmony_ci - description: interface clock required to access smmu's registers 1398c2ecf20Sopenharmony_ci through the TCU's programming interface. 1408c2ecf20Sopenharmony_ci 1418c2ecf20Sopenharmony_ci power-domains: 1428c2ecf20Sopenharmony_ci maxItems: 1 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_cirequired: 1458c2ecf20Sopenharmony_ci - compatible 1468c2ecf20Sopenharmony_ci - reg 1478c2ecf20Sopenharmony_ci - '#global-interrupts' 1488c2ecf20Sopenharmony_ci - '#iommu-cells' 1498c2ecf20Sopenharmony_ci - interrupts 1508c2ecf20Sopenharmony_ci 1518c2ecf20Sopenharmony_ciadditionalProperties: false 1528c2ecf20Sopenharmony_ci 1538c2ecf20Sopenharmony_ciallOf: 1548c2ecf20Sopenharmony_ci - if: 1558c2ecf20Sopenharmony_ci properties: 1568c2ecf20Sopenharmony_ci compatible: 1578c2ecf20Sopenharmony_ci contains: 1588c2ecf20Sopenharmony_ci enum: 1598c2ecf20Sopenharmony_ci - nvidia,tegra194-smmu 1608c2ecf20Sopenharmony_ci then: 1618c2ecf20Sopenharmony_ci properties: 1628c2ecf20Sopenharmony_ci reg: 1638c2ecf20Sopenharmony_ci minItems: 2 1648c2ecf20Sopenharmony_ci maxItems: 2 1658c2ecf20Sopenharmony_ci else: 1668c2ecf20Sopenharmony_ci properties: 1678c2ecf20Sopenharmony_ci reg: 1688c2ecf20Sopenharmony_ci maxItems: 1 1698c2ecf20Sopenharmony_ci 1708c2ecf20Sopenharmony_ciexamples: 1718c2ecf20Sopenharmony_ci - |+ 1728c2ecf20Sopenharmony_ci /* SMMU with stream matching or stream indexing */ 1738c2ecf20Sopenharmony_ci smmu1: iommu@ba5e0000 { 1748c2ecf20Sopenharmony_ci compatible = "arm,smmu-v1"; 1758c2ecf20Sopenharmony_ci reg = <0xba5e0000 0x10000>; 1768c2ecf20Sopenharmony_ci #global-interrupts = <2>; 1778c2ecf20Sopenharmony_ci interrupts = <0 32 4>, 1788c2ecf20Sopenharmony_ci <0 33 4>, 1798c2ecf20Sopenharmony_ci <0 34 4>, /* This is the first context interrupt */ 1808c2ecf20Sopenharmony_ci <0 35 4>, 1818c2ecf20Sopenharmony_ci <0 36 4>, 1828c2ecf20Sopenharmony_ci <0 37 4>; 1838c2ecf20Sopenharmony_ci #iommu-cells = <1>; 1848c2ecf20Sopenharmony_ci }; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci /* device with two stream IDs, 0 and 7 */ 1878c2ecf20Sopenharmony_ci master1 { 1888c2ecf20Sopenharmony_ci iommus = <&smmu1 0>, 1898c2ecf20Sopenharmony_ci <&smmu1 7>; 1908c2ecf20Sopenharmony_ci }; 1918c2ecf20Sopenharmony_ci 1928c2ecf20Sopenharmony_ci 1938c2ecf20Sopenharmony_ci /* SMMU with stream matching */ 1948c2ecf20Sopenharmony_ci smmu2: iommu@ba5f0000 { 1958c2ecf20Sopenharmony_ci compatible = "arm,smmu-v1"; 1968c2ecf20Sopenharmony_ci reg = <0xba5f0000 0x10000>; 1978c2ecf20Sopenharmony_ci #global-interrupts = <2>; 1988c2ecf20Sopenharmony_ci interrupts = <0 38 4>, 1998c2ecf20Sopenharmony_ci <0 39 4>, 2008c2ecf20Sopenharmony_ci <0 40 4>, /* This is the first context interrupt */ 2018c2ecf20Sopenharmony_ci <0 41 4>, 2028c2ecf20Sopenharmony_ci <0 42 4>, 2038c2ecf20Sopenharmony_ci <0 43 4>; 2048c2ecf20Sopenharmony_ci #iommu-cells = <2>; 2058c2ecf20Sopenharmony_ci }; 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci /* device with stream IDs 0 and 7 */ 2088c2ecf20Sopenharmony_ci master2 { 2098c2ecf20Sopenharmony_ci iommus = <&smmu2 0 0>, 2108c2ecf20Sopenharmony_ci <&smmu2 7 0>; 2118c2ecf20Sopenharmony_ci }; 2128c2ecf20Sopenharmony_ci 2138c2ecf20Sopenharmony_ci /* device with stream IDs 1, 17, 33 and 49 */ 2148c2ecf20Sopenharmony_ci master3 { 2158c2ecf20Sopenharmony_ci iommus = <&smmu2 1 0x30>; 2168c2ecf20Sopenharmony_ci }; 2178c2ecf20Sopenharmony_ci 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ci /* ARM MMU-500 with 10-bit stream ID input configuration */ 2208c2ecf20Sopenharmony_ci smmu3: iommu@ba600000 { 2218c2ecf20Sopenharmony_ci compatible = "arm,mmu-500", "arm,smmu-v2"; 2228c2ecf20Sopenharmony_ci reg = <0xba600000 0x10000>; 2238c2ecf20Sopenharmony_ci #global-interrupts = <2>; 2248c2ecf20Sopenharmony_ci interrupts = <0 44 4>, 2258c2ecf20Sopenharmony_ci <0 45 4>, 2268c2ecf20Sopenharmony_ci <0 46 4>, /* This is the first context interrupt */ 2278c2ecf20Sopenharmony_ci <0 47 4>, 2288c2ecf20Sopenharmony_ci <0 48 4>, 2298c2ecf20Sopenharmony_ci <0 49 4>; 2308c2ecf20Sopenharmony_ci #iommu-cells = <1>; 2318c2ecf20Sopenharmony_ci /* always ignore appended 5-bit TBU number */ 2328c2ecf20Sopenharmony_ci stream-match-mask = <0x7c00>; 2338c2ecf20Sopenharmony_ci }; 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_ci bus { 2368c2ecf20Sopenharmony_ci /* bus whose child devices emit one unique 10-bit stream 2378c2ecf20Sopenharmony_ci ID each, but may master through multiple SMMU TBUs */ 2388c2ecf20Sopenharmony_ci iommu-map = <0 &smmu3 0 0x400>; 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ci 2418c2ecf20Sopenharmony_ci }; 2428c2ecf20Sopenharmony_ci 2438c2ecf20Sopenharmony_ci - |+ 2448c2ecf20Sopenharmony_ci /* Qcom's arm,smmu-v2 implementation */ 2458c2ecf20Sopenharmony_ci #include <dt-bindings/interrupt-controller/arm-gic.h> 2468c2ecf20Sopenharmony_ci #include <dt-bindings/interrupt-controller/irq.h> 2478c2ecf20Sopenharmony_ci smmu4: iommu@d00000 { 2488c2ecf20Sopenharmony_ci compatible = "qcom,msm8996-smmu-v2", "qcom,smmu-v2"; 2498c2ecf20Sopenharmony_ci reg = <0xd00000 0x10000>; 2508c2ecf20Sopenharmony_ci 2518c2ecf20Sopenharmony_ci #global-interrupts = <1>; 2528c2ecf20Sopenharmony_ci interrupts = <GIC_SPI 73 IRQ_TYPE_LEVEL_HIGH>, 2538c2ecf20Sopenharmony_ci <GIC_SPI 320 IRQ_TYPE_LEVEL_HIGH>, 2548c2ecf20Sopenharmony_ci <GIC_SPI 321 IRQ_TYPE_LEVEL_HIGH>; 2558c2ecf20Sopenharmony_ci #iommu-cells = <1>; 2568c2ecf20Sopenharmony_ci power-domains = <&mmcc 0>; 2578c2ecf20Sopenharmony_ci 2588c2ecf20Sopenharmony_ci clocks = <&mmcc 123>, 2598c2ecf20Sopenharmony_ci <&mmcc 124>; 2608c2ecf20Sopenharmony_ci clock-names = "bus", "iface"; 2618c2ecf20Sopenharmony_ci }; 262