1# SPDX-License-Identifier: (GPL-2.0 OR BSD-2-Clause)
2%YAML 1.2
3---
4$id: http://devicetree.org/schemas/pci/mediatek-pcie-gen3.yaml#
5$schema: http://devicetree.org/meta-schemas/core.yaml#
6
7title: Gen3 PCIe controller on MediaTek SoCs
8
9maintainers:
10  - Jianjun Wang <jianjun.wang@mediatek.com>
11
12description: |+
13  PCIe Gen3 MAC controller for MediaTek SoCs, it supports Gen3 speed
14  and compatible with Gen2, Gen1 speed.
15
16  This PCIe controller supports up to 256 MSI vectors, the MSI hardware
17  block diagram is as follows:
18
19                    +-----+
20                    | GIC |
21                    +-----+
22                       ^
23                       |
24                   port->irq
25                       |
26               +-+-+-+-+-+-+-+-+
27               |0|1|2|3|4|5|6|7| (PCIe intc)
28               +-+-+-+-+-+-+-+-+
29                ^ ^           ^
30                | |    ...    |
31        +-------+ +------+    +-----------+
32        |                |                |
33  +-+-+---+--+--+  +-+-+---+--+--+  +-+-+---+--+--+
34  |0|1|...|30|31|  |0|1|...|30|31|  |0|1|...|30|31| (MSI sets)
35  +-+-+---+--+--+  +-+-+---+--+--+  +-+-+---+--+--+
36   ^ ^      ^  ^    ^ ^      ^  ^    ^ ^      ^  ^
37   | |      |  |    | |      |  |    | |      |  |  (MSI vectors)
38   | |      |  |    | |      |  |    | |      |  |
39
40    (MSI SET0)       (MSI SET1)  ...   (MSI SET7)
41
42  With 256 MSI vectors supported, the MSI vectors are composed of 8 sets,
43  each set has its own address for MSI message, and supports 32 MSI vectors
44  to generate interrupt.
45
46properties:
47  compatible:
48    oneOf:
49      - items:
50          - enum:
51              - mediatek,mt7986-pcie
52              - mediatek,mt8188-pcie
53              - mediatek,mt8195-pcie
54          - const: mediatek,mt8192-pcie
55      - const: mediatek,mt8192-pcie
56
57  reg:
58    maxItems: 1
59
60  reg-names:
61    items:
62      - const: pcie-mac
63
64  interrupts:
65    maxItems: 1
66
67  ranges:
68    minItems: 1
69    maxItems: 8
70
71  iommu-map:
72    maxItems: 1
73
74  iommu-map-mask:
75    const: 0
76
77  resets:
78    minItems: 1
79    maxItems: 2
80
81  reset-names:
82    minItems: 1
83    maxItems: 2
84    items:
85      enum: [ phy, mac ]
86
87  clocks:
88    minItems: 4
89    maxItems: 6
90
91  clock-names:
92    minItems: 4
93    maxItems: 6
94
95  assigned-clocks:
96    maxItems: 1
97
98  assigned-clock-parents:
99    maxItems: 1
100
101  phys:
102    maxItems: 1
103
104  phy-names:
105    items:
106      - const: pcie-phy
107
108  power-domains:
109    maxItems: 1
110
111  '#interrupt-cells':
112    const: 1
113
114  interrupt-controller:
115    description: Interrupt controller node for handling legacy PCI interrupts.
116    type: object
117    properties:
118      '#address-cells':
119        const: 0
120      '#interrupt-cells':
121        const: 1
122      interrupt-controller: true
123
124    required:
125      - '#address-cells'
126      - '#interrupt-cells'
127      - interrupt-controller
128
129    additionalProperties: false
130
131required:
132  - compatible
133  - reg
134  - reg-names
135  - interrupts
136  - ranges
137  - clocks
138  - clock-names
139  - '#interrupt-cells'
140  - interrupt-controller
141
142allOf:
143  - $ref: /schemas/pci/pci-bus.yaml#
144  - if:
145      properties:
146        compatible:
147          const: mediatek,mt8192-pcie
148    then:
149      properties:
150        clock-names:
151          items:
152            - const: pl_250m
153            - const: tl_26m
154            - const: tl_96m
155            - const: tl_32k
156            - const: peri_26m
157            - const: top_133m
158  - if:
159      properties:
160        compatible:
161          contains:
162            enum:
163              - mediatek,mt8188-pcie
164              - mediatek,mt8195-pcie
165    then:
166      properties:
167        clock-names:
168          items:
169            - const: pl_250m
170            - const: tl_26m
171            - const: tl_96m
172            - const: tl_32k
173            - const: peri_26m
174            - const: peri_mem
175  - if:
176      properties:
177        compatible:
178          contains:
179            enum:
180              - mediatek,mt7986-pcie
181    then:
182      properties:
183        clock-names:
184          items:
185            - const: pl_250m
186            - const: tl_26m
187            - const: peri_26m
188            - const: top_133m
189
190unevaluatedProperties: false
191
192examples:
193  - |
194    #include <dt-bindings/interrupt-controller/arm-gic.h>
195    #include <dt-bindings/interrupt-controller/irq.h>
196
197    bus {
198        #address-cells = <2>;
199        #size-cells = <2>;
200
201        pcie: pcie@11230000 {
202            compatible = "mediatek,mt8192-pcie";
203            device_type = "pci";
204            #address-cells = <3>;
205            #size-cells = <2>;
206            reg = <0x00 0x11230000 0x00 0x4000>;
207            reg-names = "pcie-mac";
208            interrupts = <GIC_SPI 251 IRQ_TYPE_LEVEL_HIGH 0>;
209            bus-range = <0x00 0xff>;
210            ranges = <0x82000000 0x00 0x12000000 0x00
211                      0x12000000 0x00 0x1000000>;
212            clocks = <&infracfg 44>,
213                     <&infracfg 40>,
214                     <&infracfg 43>,
215                     <&infracfg 97>,
216                     <&infracfg 99>,
217                     <&infracfg 111>;
218            clock-names = "pl_250m", "tl_26m", "tl_96m",
219                          "tl_32k", "peri_26m", "top_133m";
220            assigned-clocks = <&topckgen 50>;
221            assigned-clock-parents = <&topckgen 91>;
222
223            phys = <&pciephy>;
224            phy-names = "pcie-phy";
225
226            resets = <&infracfg_rst 2>,
227                     <&infracfg_rst 3>;
228            reset-names = "phy", "mac";
229
230            #interrupt-cells = <1>;
231            interrupt-map-mask = <0 0 0 0x7>;
232            interrupt-map = <0 0 0 1 &pcie_intc 0>,
233                            <0 0 0 2 &pcie_intc 1>,
234                            <0 0 0 3 &pcie_intc 2>,
235                            <0 0 0 4 &pcie_intc 3>;
236            pcie_intc: interrupt-controller {
237                      #address-cells = <0>;
238                      #interrupt-cells = <1>;
239                      interrupt-controller;
240            };
241        };
242    };
243