1# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
2%YAML 1.2
3---
4$id: http://devicetree.org/schemas/pci/brcm,iproc-pcie.yaml#
5$schema: http://devicetree.org/meta-schemas/core.yaml#
6
7title: Broadcom iProc PCIe controller with the platform bus interface
8
9maintainers:
10  - Ray Jui <ray.jui@broadcom.com>
11  - Scott Branden <scott.branden@broadcom.com>
12
13allOf:
14  - $ref: /schemas/pci/pci-bus.yaml#
15  - $ref: /schemas/interrupt-controller/msi-controller.yaml#
16
17properties:
18  compatible:
19    items:
20      - enum:
21          # for the first generation of PAXB based controller, used in SoCs
22          # including NSP, Cygnus, NS2, and Pegasus
23          - brcm,iproc-pcie
24          # for the second generation of PAXB-based controllers, used in
25          # Stingray
26          - brcm,iproc-pcie-paxb-v2
27          # For the first generation of PAXC based controller, used in NS2
28          - brcm,iproc-pcie-paxc
29          # For the second generation of PAXC based controller, used in Stingray
30          - brcm,iproc-pcie-paxc-v2
31
32  reg:
33    maxItems: 1
34    description: >
35       Base address and length of the PCIe controller I/O register space
36
37  interrupt-map: true
38
39  interrupt-map-mask: true
40
41  "#interrupt-cells":
42    const: 1
43
44  ranges:
45    minItems: 1
46    maxItems: 2
47    description: >
48      Ranges for the PCI memory and I/O regions
49
50  phys:
51    maxItems: 1
52
53  phy-names:
54    items:
55      - const: pcie-phy
56
57  bus-range: true
58
59  dma-coherent: true
60
61  "#address-cells": true
62
63  "#size-cells": true
64
65  device_type: true
66
67  brcm,pcie-ob:
68    type: boolean
69    description: >
70      Some iProc SoCs do not have the outbound address mapping done by the
71      ASIC after power on reset. In this case, SW needs to configure it
72
73  brcm,pcie-ob-axi-offset:
74    $ref: /schemas/types.yaml#/definitions/uint32
75    description: >
76       The offset from the AXI address to the internal address used by the
77       iProc PCIe core (not the PCIe address)
78
79  msi:
80    type: object
81    properties:
82      compatible:
83        items:
84          - const: brcm,iproc-msi
85
86  msi-parent: true
87
88  msi-controller: true
89
90  brcm,pcie-msi-inten:
91    type: boolean
92    description: >
93      Needs to be present for some older iProc platforms that require the
94      interrupt enable registers to be set explicitly to enable MSI
95
96dependencies:
97  brcm,pcie-ob-axi-offset: ["brcm,pcie-ob"]
98  brcm,pcie-msi-inten: [msi-controller]
99
100required:
101  - compatible
102  - reg
103  - ranges
104
105if:
106  properties:
107    compatible:
108      contains:
109        enum:
110          - brcm,iproc-pcie
111then:
112  required:
113    - interrupt-map
114    - interrupt-map-mask
115
116unevaluatedProperties: false
117
118examples:
119  - |
120   #include <dt-bindings/interrupt-controller/arm-gic.h>
121
122   bus {
123      #address-cells = <1>;
124      #size-cells = <1>;
125           pcie0: pcie@18012000 {
126              compatible = "brcm,iproc-pcie";
127              reg = <0x18012000 0x1000>;
128
129              #interrupt-cells = <1>;
130              interrupt-map-mask = <0 0 0 0>;
131              interrupt-map = <0 0 0 0 &gic GIC_SPI 100 IRQ_TYPE_NONE>;
132
133              linux,pci-domain = <0>;
134
135              bus-range = <0x00 0xff>;
136
137              #address-cells = <3>;
138              #size-cells = <2>;
139              device_type = "pci";
140              ranges = <0x81000000 0 0     0x28000000 0 0x00010000>,
141                   <0x82000000 0 0x20000000 0x20000000 0 0x04000000>;
142
143              phys = <&phy 0 5>;
144              phy-names = "pcie-phy";
145
146              brcm,pcie-ob;
147              brcm,pcie-ob-axi-offset = <0x00000000>;
148
149              msi-parent = <&msi0>;
150
151              /* iProc event queue based MSI */
152              msi0: msi {
153                 compatible = "brcm,iproc-msi";
154                 msi-controller;
155                 interrupt-parent = <&gic>;
156                 interrupts = <GIC_SPI 96 IRQ_TYPE_NONE>,
157                         <GIC_SPI 97 IRQ_TYPE_NONE>,
158                         <GIC_SPI 98 IRQ_TYPE_NONE>,
159                         <GIC_SPI 99 IRQ_TYPE_NONE>;
160              };
161           };
162
163           pcie1: pcie@18013000 {
164              compatible = "brcm,iproc-pcie";
165              reg = <0x18013000 0x1000>;
166
167              #interrupt-cells = <1>;
168              interrupt-map-mask = <0 0 0 0>;
169              interrupt-map = <0 0 0 0 &gic GIC_SPI 106 IRQ_TYPE_NONE>;
170
171              linux,pci-domain = <1>;
172
173              bus-range = <0x00 0xff>;
174
175              #address-cells = <3>;
176              #size-cells = <2>;
177              device_type = "pci";
178              ranges = <0x81000000 0 0     0x48000000 0 0x00010000>,
179                   <0x82000000 0 0x40000000 0x40000000 0 0x04000000>;
180
181              phys = <&phy 1 6>;
182              phy-names = "pcie-phy";
183           };
184    };
185