1* Marvell EBU PCIe interfaces
2
3Mandatory properties:
4
5- compatible: one of the following values:
6    marvell,armada-370-pcie
7    marvell,armada-xp-pcie
8    marvell,dove-pcie
9    marvell,kirkwood-pcie
10- #address-cells, set to <3>
11- #size-cells, set to <2>
12- #interrupt-cells, set to <1>
13- bus-range: PCI bus numbers covered
14- device_type, set to "pci"
15- ranges: ranges describing the MMIO registers to control the PCIe
16  interfaces, and ranges describing the MBus windows needed to access
17  the memory and I/O regions of each PCIe interface.
18- msi-parent: Link to the hardware entity that serves as the Message
19  Signaled Interrupt controller for this PCI controller.
20
21The ranges describing the MMIO registers have the following layout:
22
23    0x82000000 0 r MBUS_ID(0xf0, 0x01) r 0 s
24
25where:
26
27  * r is a 32-bits value that gives the offset of the MMIO
28  registers of this PCIe interface, from the base of the internal
29  registers.
30
31  * s is a 32-bits value that give the size of this MMIO
32  registers area. This range entry translates the '0x82000000 0 r' PCI
33  address into the 'MBUS_ID(0xf0, 0x01) r' CPU address, which is part
34  of the internal register window (as identified by MBUS_ID(0xf0,
35  0x01)).
36
37The ranges describing the MBus windows have the following layout:
38
39    0x8t000000 s 0     MBUS_ID(w, a) 0 1 0
40
41where:
42
43   * t is the type of the MBus window (as defined by the standard PCI DT
44   bindings), 1 for I/O and 2 for memory.
45
46   * s is the PCI slot that corresponds to this PCIe interface
47
48   * w is the 'target ID' value for the MBus window
49
50   * a the 'attribute' value for the MBus window.
51
52Since the location and size of the different MBus windows is not fixed in
53hardware, and only determined in runtime, those ranges cover the full first
544 GB of the physical address space, and do not translate into a valid CPU
55address.
56
57In addition, the device tree node must have sub-nodes describing each
58PCIe interface, having the following mandatory properties:
59
60- reg: used only for interrupt mapping, so only the first four bytes
61  are used to refer to the correct bus number and device number.
62- assigned-addresses: reference to the MMIO registers used to control
63  this PCIe interface.
64- clocks: the clock associated to this PCIe interface
65- marvell,pcie-port: the physical PCIe port number
66- status: either "disabled" or "okay"
67- device_type, set to "pci"
68- #address-cells, set to <3>
69- #size-cells, set to <2>
70- #interrupt-cells, set to <1>
71- ranges, translating the MBus windows ranges of the parent node into
72  standard PCI addresses.
73- interrupt-map-mask and interrupt-map, standard PCI properties to
74  define the mapping of the PCIe interface to interrupt numbers.
75
76and the following optional properties:
77- marvell,pcie-lane: the physical PCIe lane number, for ports having
78  multiple lanes. If this property is not found, we assume that the
79  value is 0.
80- reset-gpios: optional GPIO to PERST#
81- reset-delay-us: delay in us to wait after reset de-assertion, if not
82  specified will default to 100ms, as required by the PCIe specification.
83
84Example:
85
86pcie-controller {
87	compatible = "marvell,armada-xp-pcie";
88	device_type = "pci";
89
90	#address-cells = <3>;
91	#size-cells = <2>;
92
93	bus-range = <0x00 0xff>;
94	msi-parent = <&mpic>;
95
96	ranges =
97	       <0x82000000 0 0x40000 MBUS_ID(0xf0, 0x01) 0x40000 0 0x00002000	/* Port 0.0 registers */
98		0x82000000 0 0x42000 MBUS_ID(0xf0, 0x01) 0x42000 0 0x00002000	/* Port 2.0 registers */
99		0x82000000 0 0x44000 MBUS_ID(0xf0, 0x01) 0x44000 0 0x00002000	/* Port 0.1 registers */
100		0x82000000 0 0x48000 MBUS_ID(0xf0, 0x01) 0x48000 0 0x00002000	/* Port 0.2 registers */
101		0x82000000 0 0x4c000 MBUS_ID(0xf0, 0x01) 0x4c000 0 0x00002000	/* Port 0.3 registers */
102		0x82000000 0 0x80000 MBUS_ID(0xf0, 0x01) 0x80000 0 0x00002000	/* Port 1.0 registers */
103		0x82000000 0 0x82000 MBUS_ID(0xf0, 0x01) 0x82000 0 0x00002000	/* Port 3.0 registers */
104		0x82000000 0 0x84000 MBUS_ID(0xf0, 0x01) 0x84000 0 0x00002000	/* Port 1.1 registers */
105		0x82000000 0 0x88000 MBUS_ID(0xf0, 0x01) 0x88000 0 0x00002000	/* Port 1.2 registers */
106		0x82000000 0 0x8c000 MBUS_ID(0xf0, 0x01) 0x8c000 0 0x00002000	/* Port 1.3 registers */
107		0x82000000 0x1 0     MBUS_ID(0x04, 0xe8) 0 1 0 /* Port 0.0 MEM */
108		0x81000000 0x1 0     MBUS_ID(0x04, 0xe0) 0 1 0 /* Port 0.0 IO  */
109		0x82000000 0x2 0     MBUS_ID(0x04, 0xd8) 0 1 0 /* Port 0.1 MEM */
110		0x81000000 0x2 0     MBUS_ID(0x04, 0xd0) 0 1 0 /* Port 0.1 IO  */
111		0x82000000 0x3 0     MBUS_ID(0x04, 0xb8) 0 1 0 /* Port 0.2 MEM */
112		0x81000000 0x3 0     MBUS_ID(0x04, 0xb0) 0 1 0 /* Port 0.2 IO  */
113		0x82000000 0x4 0     MBUS_ID(0x04, 0x78) 0 1 0 /* Port 0.3 MEM */
114		0x81000000 0x4 0     MBUS_ID(0x04, 0x70) 0 1 0 /* Port 0.3 IO  */
115
116		0x82000000 0x5 0     MBUS_ID(0x08, 0xe8) 0 1 0 /* Port 1.0 MEM */
117		0x81000000 0x5 0     MBUS_ID(0x08, 0xe0) 0 1 0 /* Port 1.0 IO  */
118		0x82000000 0x6 0     MBUS_ID(0x08, 0xd8) 0 1 0 /* Port 1.1 MEM */
119		0x81000000 0x6 0     MBUS_ID(0x08, 0xd0) 0 1 0 /* Port 1.1 IO  */
120		0x82000000 0x7 0     MBUS_ID(0x08, 0xb8) 0 1 0 /* Port 1.2 MEM */
121		0x81000000 0x7 0     MBUS_ID(0x08, 0xb0) 0 1 0 /* Port 1.2 IO  */
122		0x82000000 0x8 0     MBUS_ID(0x08, 0x78) 0 1 0 /* Port 1.3 MEM */
123		0x81000000 0x8 0     MBUS_ID(0x08, 0x70) 0 1 0 /* Port 1.3 IO  */
124
125		0x82000000 0x9 0     MBUS_ID(0x04, 0xf8) 0 1 0 /* Port 2.0 MEM */
126		0x81000000 0x9 0     MBUS_ID(0x04, 0xf0) 0 1 0 /* Port 2.0 IO  */
127
128		0x82000000 0xa 0     MBUS_ID(0x08, 0xf8) 0 1 0 /* Port 3.0 MEM */
129		0x81000000 0xa 0     MBUS_ID(0x08, 0xf0) 0 1 0 /* Port 3.0 IO  */>;
130
131	pcie@1,0 {
132		device_type = "pci";
133		assigned-addresses = <0x82000800 0 0x40000 0 0x2000>;
134		reg = <0x0800 0 0 0 0>;
135		#address-cells = <3>;
136		#size-cells = <2>;
137		#interrupt-cells = <1>;
138		ranges = <0x82000000 0 0 0x82000000 0x1 0 1 0
139			  0x81000000 0 0 0x81000000 0x1 0 1 0>;
140		interrupt-map-mask = <0 0 0 0>;
141		interrupt-map = <0 0 0 0 &mpic 58>;
142		marvell,pcie-port = <0>;
143		marvell,pcie-lane = <0>;
144		/* low-active PERST# reset on GPIO 25 */
145		reset-gpios = <&gpio0 25 1>;
146		/* wait 20ms for device settle after reset deassertion */
147		reset-delay-us = <20000>;
148		clocks = <&gateclk 5>;
149	};
150
151	pcie@2,0 {
152		device_type = "pci";
153		assigned-addresses = <0x82001000 0 0x44000 0 0x2000>;
154		reg = <0x1000 0 0 0 0>;
155		#address-cells = <3>;
156		#size-cells = <2>;
157		#interrupt-cells = <1>;
158		ranges = <0x82000000 0 0 0x82000000 0x2 0 1 0
159			  0x81000000 0 0 0x81000000 0x2 0 1 0>;
160		interrupt-map-mask = <0 0 0 0>;
161		interrupt-map = <0 0 0 0 &mpic 59>;
162		marvell,pcie-port = <0>;
163		marvell,pcie-lane = <1>;
164		clocks = <&gateclk 6>;
165	};
166
167	pcie@3,0 {
168		device_type = "pci";
169		assigned-addresses = <0x82001800 0 0x48000 0 0x2000>;
170		reg = <0x1800 0 0 0 0>;
171		#address-cells = <3>;
172		#size-cells = <2>;
173		#interrupt-cells = <1>;
174		ranges = <0x82000000 0 0 0x82000000 0x3 0 1 0
175			  0x81000000 0 0 0x81000000 0x3 0 1 0>;
176		interrupt-map-mask = <0 0 0 0>;
177		interrupt-map = <0 0 0 0 &mpic 60>;
178		marvell,pcie-port = <0>;
179		marvell,pcie-lane = <2>;
180		clocks = <&gateclk 7>;
181	};
182
183	pcie@4,0 {
184		device_type = "pci";
185		assigned-addresses = <0x82002000 0 0x4c000 0 0x2000>;
186		reg = <0x2000 0 0 0 0>;
187		#address-cells = <3>;
188		#size-cells = <2>;
189		#interrupt-cells = <1>;
190		ranges = <0x82000000 0 0 0x82000000 0x4 0 1 0
191			  0x81000000 0 0 0x81000000 0x4 0 1 0>;
192		interrupt-map-mask = <0 0 0 0>;
193		interrupt-map = <0 0 0 0 &mpic 61>;
194		marvell,pcie-port = <0>;
195		marvell,pcie-lane = <3>;
196		clocks = <&gateclk 8>;
197	};
198
199	pcie@5,0 {
200		device_type = "pci";
201		assigned-addresses = <0x82002800 0 0x80000 0 0x2000>;
202		reg = <0x2800 0 0 0 0>;
203		#address-cells = <3>;
204		#size-cells = <2>;
205		#interrupt-cells = <1>;
206		ranges = <0x82000000 0 0 0x82000000 0x5 0 1 0
207			  0x81000000 0 0 0x81000000 0x5 0 1 0>;
208		interrupt-map-mask = <0 0 0 0>;
209		interrupt-map = <0 0 0 0 &mpic 62>;
210		marvell,pcie-port = <1>;
211		marvell,pcie-lane = <0>;
212		clocks = <&gateclk 9>;
213	};
214
215	pcie@6,0 {
216		device_type = "pci";
217		assigned-addresses = <0x82003000 0 0x84000 0 0x2000>;
218		reg = <0x3000 0 0 0 0>;
219		#address-cells = <3>;
220		#size-cells = <2>;
221		#interrupt-cells = <1>;
222		ranges = <0x82000000 0 0 0x82000000 0x6 0 1 0
223			  0x81000000 0 0 0x81000000 0x6 0 1 0>;
224		interrupt-map-mask = <0 0 0 0>;
225		interrupt-map = <0 0 0 0 &mpic 63>;
226		marvell,pcie-port = <1>;
227		marvell,pcie-lane = <1>;
228		clocks = <&gateclk 10>;
229	};
230
231	pcie@7,0 {
232		device_type = "pci";
233		assigned-addresses = <0x82003800 0 0x88000 0 0x2000>;
234		reg = <0x3800 0 0 0 0>;
235		#address-cells = <3>;
236		#size-cells = <2>;
237		#interrupt-cells = <1>;
238		ranges = <0x82000000 0 0 0x82000000 0x7 0 1 0
239			  0x81000000 0 0 0x81000000 0x7 0 1 0>;
240		interrupt-map-mask = <0 0 0 0>;
241		interrupt-map = <0 0 0 0 &mpic 64>;
242		marvell,pcie-port = <1>;
243		marvell,pcie-lane = <2>;
244		clocks = <&gateclk 11>;
245	};
246
247	pcie@8,0 {
248		device_type = "pci";
249		assigned-addresses = <0x82004000 0 0x8c000 0 0x2000>;
250		reg = <0x4000 0 0 0 0>;
251		#address-cells = <3>;
252		#size-cells = <2>;
253		#interrupt-cells = <1>;
254		ranges = <0x82000000 0 0 0x82000000 0x8 0 1 0
255			  0x81000000 0 0 0x81000000 0x8 0 1 0>;
256		interrupt-map-mask = <0 0 0 0>;
257		interrupt-map = <0 0 0 0 &mpic 65>;
258		marvell,pcie-port = <1>;
259		marvell,pcie-lane = <3>;
260		clocks = <&gateclk 12>;
261	};
262
263	pcie@9,0 {
264		device_type = "pci";
265		assigned-addresses = <0x82004800 0 0x42000 0 0x2000>;
266		reg = <0x4800 0 0 0 0>;
267		#address-cells = <3>;
268		#size-cells = <2>;
269		#interrupt-cells = <1>;
270		ranges = <0x82000000 0 0 0x82000000 0x9 0 1 0
271			  0x81000000 0 0 0x81000000 0x9 0 1 0>;
272		interrupt-map-mask = <0 0 0 0>;
273		interrupt-map = <0 0 0 0 &mpic 99>;
274		marvell,pcie-port = <2>;
275		marvell,pcie-lane = <0>;
276		clocks = <&gateclk 26>;
277	};
278
279	pcie@a,0 {
280		device_type = "pci";
281		assigned-addresses = <0x82005000 0 0x82000 0 0x2000>;
282		reg = <0x5000 0 0 0 0>;
283		#address-cells = <3>;
284		#size-cells = <2>;
285		#interrupt-cells = <1>;
286		ranges = <0x82000000 0 0 0x82000000 0xa 0 1 0
287			  0x81000000 0 0 0x81000000 0xa 0 1 0>;
288		interrupt-map-mask = <0 0 0 0>;
289		interrupt-map = <0 0 0 0 &mpic 103>;
290		marvell,pcie-port = <3>;
291		marvell,pcie-lane = <0>;
292		clocks = <&gateclk 27>;
293	};
294};
295