162306a36Sopenharmony_ciThis document describes the generic device tree binding for describing the
262306a36Sopenharmony_cirelationship between PCI devices and MSI controllers.
362306a36Sopenharmony_ci
462306a36Sopenharmony_ciEach PCI device under a root complex is uniquely identified by its Requester ID
562306a36Sopenharmony_ci(AKA RID). A Requester ID is a triplet of a Bus number, Device number, and
662306a36Sopenharmony_ciFunction number.
762306a36Sopenharmony_ci
862306a36Sopenharmony_ciFor the purpose of this document, when treated as a numeric value, a RID is
962306a36Sopenharmony_ciformatted such that:
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci* Bits [15:8] are the Bus number.
1262306a36Sopenharmony_ci* Bits [7:3] are the Device number.
1362306a36Sopenharmony_ci* Bits [2:0] are the Function number.
1462306a36Sopenharmony_ci* Any other bits required for padding must be zero.
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ciMSIs may be distinguished in part through the use of sideband data accompanying
1762306a36Sopenharmony_ciwrites. In the case of PCI devices, this sideband data may be derived from the
1862306a36Sopenharmony_ciRequester ID. A mechanism is required to associate a device with both the MSI
1962306a36Sopenharmony_cicontrollers it can address, and the sideband data that will be associated with
2062306a36Sopenharmony_ciits writes to those controllers.
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ciFor generic MSI bindings, see
2362306a36Sopenharmony_ciDocumentation/devicetree/bindings/interrupt-controller/msi.txt.
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ciPCI root complex
2762306a36Sopenharmony_ci================
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ciOptional properties
3062306a36Sopenharmony_ci-------------------
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci- msi-map: Maps a Requester ID to an MSI controller and associated
3362306a36Sopenharmony_ci  msi-specifier data. The property is an arbitrary number of tuples of
3462306a36Sopenharmony_ci  (rid-base,msi-controller,msi-base,length), where:
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci  * rid-base is a single cell describing the first RID matched by the entry.
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci  * msi-controller is a single phandle to an MSI controller
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci  * msi-base is an msi-specifier describing the msi-specifier produced for the
4162306a36Sopenharmony_ci    first RID matched by the entry.
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci  * length is a single cell describing how many consecutive RIDs are matched
4462306a36Sopenharmony_ci    following the rid-base.
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_ci  Any RID r in the interval [rid-base, rid-base + length) is associated with
4762306a36Sopenharmony_ci  the listed msi-controller, with the msi-specifier (r - rid-base + msi-base).
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci- msi-map-mask: A mask to be applied to each Requester ID prior to being mapped
5062306a36Sopenharmony_ci  to an msi-specifier per the msi-map property.
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci- msi-parent: Describes the MSI parent of the root complex itself. Where
5362306a36Sopenharmony_ci  the root complex and MSI controller do not pass sideband data with MSI
5462306a36Sopenharmony_ci  writes, this property may be used to describe the MSI controller(s)
5562306a36Sopenharmony_ci  used by PCI devices under the root complex, if defined as such in the
5662306a36Sopenharmony_ci  binding for the root complex.
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ciExample (1)
6062306a36Sopenharmony_ci===========
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/ {
6362306a36Sopenharmony_ci	#address-cells = <1>;
6462306a36Sopenharmony_ci	#size-cells = <1>;
6562306a36Sopenharmony_ci
6662306a36Sopenharmony_ci	msi: msi-controller@a {
6762306a36Sopenharmony_ci		reg = <0xa 0x1>;
6862306a36Sopenharmony_ci		compatible = "vendor,some-controller";
6962306a36Sopenharmony_ci		msi-controller;
7062306a36Sopenharmony_ci		#msi-cells = <1>;
7162306a36Sopenharmony_ci	};
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci	pci: pci@f {
7462306a36Sopenharmony_ci		reg = <0xf 0x1>;
7562306a36Sopenharmony_ci		compatible = "vendor,pcie-root-complex";
7662306a36Sopenharmony_ci		device_type = "pci";
7762306a36Sopenharmony_ci
7862306a36Sopenharmony_ci		/*
7962306a36Sopenharmony_ci		 * The sideband data provided to the MSI controller is
8062306a36Sopenharmony_ci		 * the RID, identity-mapped.
8162306a36Sopenharmony_ci		 */
8262306a36Sopenharmony_ci		msi-map = <0x0 &msi_a 0x0 0x10000>,
8362306a36Sopenharmony_ci	};
8462306a36Sopenharmony_ci};
8562306a36Sopenharmony_ci
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ciExample (2)
8862306a36Sopenharmony_ci===========
8962306a36Sopenharmony_ci
9062306a36Sopenharmony_ci/ {
9162306a36Sopenharmony_ci	#address-cells = <1>;
9262306a36Sopenharmony_ci	#size-cells = <1>;
9362306a36Sopenharmony_ci
9462306a36Sopenharmony_ci	msi: msi-controller@a {
9562306a36Sopenharmony_ci		reg = <0xa 0x1>;
9662306a36Sopenharmony_ci		compatible = "vendor,some-controller";
9762306a36Sopenharmony_ci		msi-controller;
9862306a36Sopenharmony_ci		#msi-cells = <1>;
9962306a36Sopenharmony_ci	};
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci	pci: pci@f {
10262306a36Sopenharmony_ci		reg = <0xf 0x1>;
10362306a36Sopenharmony_ci		compatible = "vendor,pcie-root-complex";
10462306a36Sopenharmony_ci		device_type = "pci";
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci		/*
10762306a36Sopenharmony_ci		 * The sideband data provided to the MSI controller is
10862306a36Sopenharmony_ci		 * the RID, masked to only the device and function bits.
10962306a36Sopenharmony_ci		 */
11062306a36Sopenharmony_ci		msi-map = <0x0 &msi_a 0x0 0x100>,
11162306a36Sopenharmony_ci		msi-map-mask = <0xff>
11262306a36Sopenharmony_ci	};
11362306a36Sopenharmony_ci};
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci
11662306a36Sopenharmony_ciExample (3)
11762306a36Sopenharmony_ci===========
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci/ {
12062306a36Sopenharmony_ci	#address-cells = <1>;
12162306a36Sopenharmony_ci	#size-cells = <1>;
12262306a36Sopenharmony_ci
12362306a36Sopenharmony_ci	msi: msi-controller@a {
12462306a36Sopenharmony_ci		reg = <0xa 0x1>;
12562306a36Sopenharmony_ci		compatible = "vendor,some-controller";
12662306a36Sopenharmony_ci		msi-controller;
12762306a36Sopenharmony_ci		#msi-cells = <1>;
12862306a36Sopenharmony_ci	};
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_ci	pci: pci@f {
13162306a36Sopenharmony_ci		reg = <0xf 0x1>;
13262306a36Sopenharmony_ci		compatible = "vendor,pcie-root-complex";
13362306a36Sopenharmony_ci		device_type = "pci";
13462306a36Sopenharmony_ci
13562306a36Sopenharmony_ci		/*
13662306a36Sopenharmony_ci		 * The sideband data provided to the MSI controller is
13762306a36Sopenharmony_ci		 * the RID, but the high bit of the bus number is
13862306a36Sopenharmony_ci		 * ignored.
13962306a36Sopenharmony_ci		 */
14062306a36Sopenharmony_ci		msi-map = <0x0000 &msi 0x0000 0x8000>,
14162306a36Sopenharmony_ci			  <0x8000 &msi 0x0000 0x8000>;
14262306a36Sopenharmony_ci	};
14362306a36Sopenharmony_ci};
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_ci
14662306a36Sopenharmony_ciExample (4)
14762306a36Sopenharmony_ci===========
14862306a36Sopenharmony_ci
14962306a36Sopenharmony_ci/ {
15062306a36Sopenharmony_ci	#address-cells = <1>;
15162306a36Sopenharmony_ci	#size-cells = <1>;
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci	msi: msi-controller@a {
15462306a36Sopenharmony_ci		reg = <0xa 0x1>;
15562306a36Sopenharmony_ci		compatible = "vendor,some-controller";
15662306a36Sopenharmony_ci		msi-controller;
15762306a36Sopenharmony_ci		#msi-cells = <1>;
15862306a36Sopenharmony_ci	};
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_ci	pci: pci@f {
16162306a36Sopenharmony_ci		reg = <0xf 0x1>;
16262306a36Sopenharmony_ci		compatible = "vendor,pcie-root-complex";
16362306a36Sopenharmony_ci		device_type = "pci";
16462306a36Sopenharmony_ci
16562306a36Sopenharmony_ci		/*
16662306a36Sopenharmony_ci		 * The sideband data provided to the MSI controller is
16762306a36Sopenharmony_ci		 * the RID, but the high bit of the bus number is
16862306a36Sopenharmony_ci		 * negated.
16962306a36Sopenharmony_ci		 */
17062306a36Sopenharmony_ci		msi-map = <0x0000 &msi 0x8000 0x8000>,
17162306a36Sopenharmony_ci			  <0x8000 &msi 0x0000 0x8000>;
17262306a36Sopenharmony_ci	};
17362306a36Sopenharmony_ci};
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ciExample (5)
17762306a36Sopenharmony_ci===========
17862306a36Sopenharmony_ci
17962306a36Sopenharmony_ci/ {
18062306a36Sopenharmony_ci	#address-cells = <1>;
18162306a36Sopenharmony_ci	#size-cells = <1>;
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci	msi_a: msi-controller@a {
18462306a36Sopenharmony_ci		reg = <0xa 0x1>;
18562306a36Sopenharmony_ci		compatible = "vendor,some-controller";
18662306a36Sopenharmony_ci		msi-controller;
18762306a36Sopenharmony_ci		#msi-cells = <1>;
18862306a36Sopenharmony_ci	};
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_ci	msi_b: msi-controller@b {
19162306a36Sopenharmony_ci		reg = <0xb 0x1>;
19262306a36Sopenharmony_ci		compatible = "vendor,some-controller";
19362306a36Sopenharmony_ci		msi-controller;
19462306a36Sopenharmony_ci		#msi-cells = <1>;
19562306a36Sopenharmony_ci	};
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci	msi_c: msi-controller@c {
19862306a36Sopenharmony_ci		reg = <0xc 0x1>;
19962306a36Sopenharmony_ci		compatible = "vendor,some-controller";
20062306a36Sopenharmony_ci		msi-controller;
20162306a36Sopenharmony_ci		#msi-cells = <1>;
20262306a36Sopenharmony_ci	};
20362306a36Sopenharmony_ci
20462306a36Sopenharmony_ci	pci: pci@f {
20562306a36Sopenharmony_ci		reg = <0xf 0x1>;
20662306a36Sopenharmony_ci		compatible = "vendor,pcie-root-complex";
20762306a36Sopenharmony_ci		device_type = "pci";
20862306a36Sopenharmony_ci
20962306a36Sopenharmony_ci		/*
21062306a36Sopenharmony_ci		 * The sideband data provided to MSI controller a is the
21162306a36Sopenharmony_ci		 * RID, but the high bit of the bus number is negated.
21262306a36Sopenharmony_ci		 * The sideband data provided to MSI controller b is the
21362306a36Sopenharmony_ci		 * RID, identity-mapped.
21462306a36Sopenharmony_ci		 * MSI controller c is not addressable.
21562306a36Sopenharmony_ci		 */
21662306a36Sopenharmony_ci		msi-map = <0x0000 &msi_a 0x8000 0x08000>,
21762306a36Sopenharmony_ci			  <0x8000 &msi_a 0x0000 0x08000>,
21862306a36Sopenharmony_ci			  <0x0000 &msi_b 0x0000 0x10000>;
21962306a36Sopenharmony_ci	};
22062306a36Sopenharmony_ci};
221