xref: /openbmc/linux/Documentation/devicetree/bindings/pci/pci-msi.txt (revision 976e3645923bdd2fe7893aae33fd7a21098bfb28)
1b531566eSMark RutlandThis document describes the generic device tree binding for describing the
2b531566eSMark Rutlandrelationship between PCI devices and MSI controllers.
3b531566eSMark Rutland
4b531566eSMark RutlandEach PCI device under a root complex is uniquely identified by its Requester ID
5b531566eSMark Rutland(AKA RID). A Requester ID is a triplet of a Bus number, Device number, and
6b531566eSMark RutlandFunction number.
7b531566eSMark Rutland
8b531566eSMark RutlandFor the purpose of this document, when treated as a numeric value, a RID is
9b531566eSMark Rutlandformatted such that:
10b531566eSMark Rutland
11b531566eSMark Rutland* Bits [15:8] are the Bus number.
12b531566eSMark Rutland* Bits [7:3] are the Device number.
13b531566eSMark Rutland* Bits [2:0] are the Function number.
14b531566eSMark Rutland* Any other bits required for padding must be zero.
15b531566eSMark Rutland
16b531566eSMark RutlandMSIs may be distinguished in part through the use of sideband data accompanying
17b531566eSMark Rutlandwrites. In the case of PCI devices, this sideband data may be derived from the
18b531566eSMark RutlandRequester ID. A mechanism is required to associate a device with both the MSI
19b531566eSMark Rutlandcontrollers it can address, and the sideband data that will be associated with
20b531566eSMark Rutlandits writes to those controllers.
21b531566eSMark Rutland
22b531566eSMark RutlandFor generic MSI bindings, see
23b531566eSMark RutlandDocumentation/devicetree/bindings/interrupt-controller/msi.txt.
24b531566eSMark Rutland
25b531566eSMark Rutland
26b531566eSMark RutlandPCI root complex
27b531566eSMark Rutland================
28b531566eSMark Rutland
29b531566eSMark RutlandOptional properties
30b531566eSMark Rutland-------------------
31b531566eSMark Rutland
32b531566eSMark Rutland- msi-map: Maps a Requester ID to an MSI controller and associated
33b531566eSMark Rutland  msi-specifier data. The property is an arbitrary number of tuples of
34b531566eSMark Rutland  (rid-base,msi-controller,msi-base,length), where:
35b531566eSMark Rutland
36b531566eSMark Rutland  * rid-base is a single cell describing the first RID matched by the entry.
37b531566eSMark Rutland
38b531566eSMark Rutland  * msi-controller is a single phandle to an MSI controller
39b531566eSMark Rutland
40b531566eSMark Rutland  * msi-base is an msi-specifier describing the msi-specifier produced for the
41b531566eSMark Rutland    first RID matched by the entry.
42b531566eSMark Rutland
43b531566eSMark Rutland  * length is a single cell describing how many consecutive RIDs are matched
44b531566eSMark Rutland    following the rid-base.
45b531566eSMark Rutland
46b531566eSMark Rutland  Any RID r in the interval [rid-base, rid-base + length) is associated with
47b531566eSMark Rutland  the listed msi-controller, with the msi-specifier (r - rid-base + msi-base).
48b531566eSMark Rutland
49b531566eSMark Rutland- msi-map-mask: A mask to be applied to each Requester ID prior to being mapped
50b531566eSMark Rutland  to an msi-specifier per the msi-map property.
51b531566eSMark Rutland
52b531566eSMark Rutland- msi-parent: Describes the MSI parent of the root complex itself. Where
53b531566eSMark Rutland  the root complex and MSI controller do not pass sideband data with MSI
54b531566eSMark Rutland  writes, this property may be used to describe the MSI controller(s)
55b531566eSMark Rutland  used by PCI devices under the root complex, if defined as such in the
56b531566eSMark Rutland  binding for the root complex.
57b531566eSMark Rutland
58b531566eSMark Rutland
59b531566eSMark RutlandExample (1)
60b531566eSMark Rutland===========
61b531566eSMark Rutland
62b531566eSMark Rutland/ {
63b531566eSMark Rutland	#address-cells = <1>;
64b531566eSMark Rutland	#size-cells = <1>;
65b531566eSMark Rutland
66b531566eSMark Rutland	msi: msi-controller@a {
67b531566eSMark Rutland		reg = <0xa 0x1>;
68b531566eSMark Rutland		compatible = "vendor,some-controller";
69b531566eSMark Rutland		msi-controller;
70b531566eSMark Rutland		#msi-cells = <1>;
71b531566eSMark Rutland	};
72b531566eSMark Rutland
73b531566eSMark Rutland	pci: pci@f {
74b531566eSMark Rutland		reg = <0xf 0x1>;
75b531566eSMark Rutland		compatible = "vendor,pcie-root-complex";
76b531566eSMark Rutland		device_type = "pci";
77b531566eSMark Rutland
78b531566eSMark Rutland		/*
79b531566eSMark Rutland		 * The sideband data provided to the MSI controller is
80b531566eSMark Rutland		 * the RID, identity-mapped.
81b531566eSMark Rutland		 */
82b531566eSMark Rutland		msi-map = <0x0 &msi_a 0x0 0x10000>,
83b531566eSMark Rutland	};
84b531566eSMark Rutland};
85b531566eSMark Rutland
86b531566eSMark Rutland
87b531566eSMark RutlandExample (2)
88b531566eSMark Rutland===========
89b531566eSMark Rutland
90b531566eSMark Rutland/ {
91b531566eSMark Rutland	#address-cells = <1>;
92b531566eSMark Rutland	#size-cells = <1>;
93b531566eSMark Rutland
94b531566eSMark Rutland	msi: msi-controller@a {
95b531566eSMark Rutland		reg = <0xa 0x1>;
96b531566eSMark Rutland		compatible = "vendor,some-controller";
97b531566eSMark Rutland		msi-controller;
98b531566eSMark Rutland		#msi-cells = <1>;
99b531566eSMark Rutland	};
100b531566eSMark Rutland
101b531566eSMark Rutland	pci: pci@f {
102b531566eSMark Rutland		reg = <0xf 0x1>;
103b531566eSMark Rutland		compatible = "vendor,pcie-root-complex";
104b531566eSMark Rutland		device_type = "pci";
105b531566eSMark Rutland
106b531566eSMark Rutland		/*
107b531566eSMark Rutland		 * The sideband data provided to the MSI controller is
108b531566eSMark Rutland		 * the RID, masked to only the device and function bits.
109b531566eSMark Rutland		 */
110b531566eSMark Rutland		msi-map = <0x0 &msi_a 0x0 0x100>,
111b531566eSMark Rutland		msi-map-mask = <0xff>
112b531566eSMark Rutland	};
113b531566eSMark Rutland};
114b531566eSMark Rutland
115b531566eSMark Rutland
116b531566eSMark RutlandExample (3)
117b531566eSMark Rutland===========
118b531566eSMark Rutland
119b531566eSMark Rutland/ {
120b531566eSMark Rutland	#address-cells = <1>;
121b531566eSMark Rutland	#size-cells = <1>;
122b531566eSMark Rutland
123b531566eSMark Rutland	msi: msi-controller@a {
124b531566eSMark Rutland		reg = <0xa 0x1>;
125b531566eSMark Rutland		compatible = "vendor,some-controller";
126b531566eSMark Rutland		msi-controller;
127b531566eSMark Rutland		#msi-cells = <1>;
128b531566eSMark Rutland	};
129b531566eSMark Rutland
130b531566eSMark Rutland	pci: pci@f {
131b531566eSMark Rutland		reg = <0xf 0x1>;
132b531566eSMark Rutland		compatible = "vendor,pcie-root-complex";
133b531566eSMark Rutland		device_type = "pci";
134b531566eSMark Rutland
135b531566eSMark Rutland		/*
136b531566eSMark Rutland		 * The sideband data provided to the MSI controller is
137b531566eSMark Rutland		 * the RID, but the high bit of the bus number is
138b531566eSMark Rutland		 * ignored.
139b531566eSMark Rutland		 */
140b531566eSMark Rutland		msi-map = <0x0000 &msi 0x0000 0x8000>,
141b531566eSMark Rutland			  <0x8000 &msi 0x0000 0x8000>;
142b531566eSMark Rutland	};
143b531566eSMark Rutland};
144b531566eSMark Rutland
145b531566eSMark Rutland
146b531566eSMark RutlandExample (4)
147b531566eSMark Rutland===========
148b531566eSMark Rutland
149b531566eSMark Rutland/ {
150b531566eSMark Rutland	#address-cells = <1>;
151b531566eSMark Rutland	#size-cells = <1>;
152b531566eSMark Rutland
153b531566eSMark Rutland	msi: msi-controller@a {
154b531566eSMark Rutland		reg = <0xa 0x1>;
155b531566eSMark Rutland		compatible = "vendor,some-controller";
156b531566eSMark Rutland		msi-controller;
157b531566eSMark Rutland		#msi-cells = <1>;
158b531566eSMark Rutland	};
159b531566eSMark Rutland
160b531566eSMark Rutland	pci: pci@f {
161b531566eSMark Rutland		reg = <0xf 0x1>;
162b531566eSMark Rutland		compatible = "vendor,pcie-root-complex";
163b531566eSMark Rutland		device_type = "pci";
164b531566eSMark Rutland
165b531566eSMark Rutland		/*
166b531566eSMark Rutland		 * The sideband data provided to the MSI controller is
167b531566eSMark Rutland		 * the RID, but the high bit of the bus number is
168b531566eSMark Rutland		 * negated.
169b531566eSMark Rutland		 */
170b531566eSMark Rutland		msi-map = <0x0000 &msi 0x8000 0x8000>,
171b531566eSMark Rutland			  <0x8000 &msi 0x0000 0x8000>;
172b531566eSMark Rutland	};
173b531566eSMark Rutland};
174b531566eSMark Rutland
175b531566eSMark Rutland
176b531566eSMark RutlandExample (5)
177b531566eSMark Rutland===========
178b531566eSMark Rutland
179b531566eSMark Rutland/ {
180b531566eSMark Rutland	#address-cells = <1>;
181b531566eSMark Rutland	#size-cells = <1>;
182b531566eSMark Rutland
183b531566eSMark Rutland	msi_a: msi-controller@a {
184b531566eSMark Rutland		reg = <0xa 0x1>;
185b531566eSMark Rutland		compatible = "vendor,some-controller";
186b531566eSMark Rutland		msi-controller;
187b531566eSMark Rutland		#msi-cells = <1>;
188b531566eSMark Rutland	};
189b531566eSMark Rutland
190b531566eSMark Rutland	msi_b: msi-controller@b {
191b531566eSMark Rutland		reg = <0xb 0x1>;
192b531566eSMark Rutland		compatible = "vendor,some-controller";
193b531566eSMark Rutland		msi-controller;
194b531566eSMark Rutland		#msi-cells = <1>;
195b531566eSMark Rutland	};
196b531566eSMark Rutland
197b531566eSMark Rutland	msi_c: msi-controller@c {
198b531566eSMark Rutland		reg = <0xc 0x1>;
199b531566eSMark Rutland		compatible = "vendor,some-controller";
200b531566eSMark Rutland		msi-controller;
201b531566eSMark Rutland		#msi-cells = <1>;
202b531566eSMark Rutland	};
203b531566eSMark Rutland
204*523c6202SBin Meng	pci: pci@f {
205b531566eSMark Rutland		reg = <0xf 0x1>;
206b531566eSMark Rutland		compatible = "vendor,pcie-root-complex";
207b531566eSMark Rutland		device_type = "pci";
208b531566eSMark Rutland
209b531566eSMark Rutland		/*
210b531566eSMark Rutland		 * The sideband data provided to MSI controller a is the
211b531566eSMark Rutland		 * RID, but the high bit of the bus number is negated.
212b531566eSMark Rutland		 * The sideband data provided to MSI controller b is the
213b531566eSMark Rutland		 * RID, identity-mapped.
214b531566eSMark Rutland		 * MSI controller c is not addressable.
215b531566eSMark Rutland		 */
216b531566eSMark Rutland		msi-map = <0x0000 &msi_a 0x8000 0x08000>,
217b531566eSMark Rutland			  <0x8000 &msi_a 0x0000 0x08000>,
218b531566eSMark Rutland			  <0x0000 &msi_b 0x0000 0x10000>;
219b531566eSMark Rutland	};
220b531566eSMark Rutland};
221