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