xref: /freebsd/sys/contrib/device-tree/Bindings/pci/pci-iommu.txt (revision c66ec88fed842fbaad62c30d510644ceb7bd2d71)
1*c66ec88fSEmmanuel VadotThis document describes the generic device tree binding for describing the
2*c66ec88fSEmmanuel Vadotrelationship between PCI(e) devices and IOMMU(s).
3*c66ec88fSEmmanuel Vadot
4*c66ec88fSEmmanuel VadotEach PCI(e) device under a root complex is uniquely identified by its Requester
5*c66ec88fSEmmanuel VadotID (AKA RID). A Requester ID is a triplet of a Bus number, Device number, and
6*c66ec88fSEmmanuel VadotFunction number.
7*c66ec88fSEmmanuel Vadot
8*c66ec88fSEmmanuel VadotFor the purpose of this document, when treated as a numeric value, a RID is
9*c66ec88fSEmmanuel Vadotformatted such that:
10*c66ec88fSEmmanuel Vadot
11*c66ec88fSEmmanuel Vadot* Bits [15:8] are the Bus number.
12*c66ec88fSEmmanuel Vadot* Bits [7:3] are the Device number.
13*c66ec88fSEmmanuel Vadot* Bits [2:0] are the Function number.
14*c66ec88fSEmmanuel Vadot* Any other bits required for padding must be zero.
15*c66ec88fSEmmanuel Vadot
16*c66ec88fSEmmanuel VadotIOMMUs may distinguish PCI devices through sideband data derived from the
17*c66ec88fSEmmanuel VadotRequester ID. While a given PCI device can only master through one IOMMU, a
18*c66ec88fSEmmanuel Vadotroot complex may split masters across a set of IOMMUs (e.g. with one IOMMU per
19*c66ec88fSEmmanuel Vadotbus).
20*c66ec88fSEmmanuel Vadot
21*c66ec88fSEmmanuel VadotThe generic 'iommus' property is insufficient to describe this relationship,
22*c66ec88fSEmmanuel Vadotand a mechanism is required to map from a PCI device to its IOMMU and sideband
23*c66ec88fSEmmanuel Vadotdata.
24*c66ec88fSEmmanuel Vadot
25*c66ec88fSEmmanuel VadotFor generic IOMMU bindings, see
26*c66ec88fSEmmanuel VadotDocumentation/devicetree/bindings/iommu/iommu.txt.
27*c66ec88fSEmmanuel Vadot
28*c66ec88fSEmmanuel Vadot
29*c66ec88fSEmmanuel VadotPCI root complex
30*c66ec88fSEmmanuel Vadot================
31*c66ec88fSEmmanuel Vadot
32*c66ec88fSEmmanuel VadotOptional properties
33*c66ec88fSEmmanuel Vadot-------------------
34*c66ec88fSEmmanuel Vadot
35*c66ec88fSEmmanuel Vadot- iommu-map: Maps a Requester ID to an IOMMU and associated IOMMU specifier
36*c66ec88fSEmmanuel Vadot  data.
37*c66ec88fSEmmanuel Vadot
38*c66ec88fSEmmanuel Vadot  The property is an arbitrary number of tuples of
39*c66ec88fSEmmanuel Vadot  (rid-base,iommu,iommu-base,length).
40*c66ec88fSEmmanuel Vadot
41*c66ec88fSEmmanuel Vadot  Any RID r in the interval [rid-base, rid-base + length) is associated with
42*c66ec88fSEmmanuel Vadot  the listed IOMMU, with the IOMMU specifier (r - rid-base + iommu-base).
43*c66ec88fSEmmanuel Vadot
44*c66ec88fSEmmanuel Vadot- iommu-map-mask: A mask to be applied to each Requester ID prior to being
45*c66ec88fSEmmanuel Vadot  mapped to an IOMMU specifier per the iommu-map property.
46*c66ec88fSEmmanuel Vadot
47*c66ec88fSEmmanuel Vadot
48*c66ec88fSEmmanuel VadotExample (1)
49*c66ec88fSEmmanuel Vadot===========
50*c66ec88fSEmmanuel Vadot
51*c66ec88fSEmmanuel Vadot/ {
52*c66ec88fSEmmanuel Vadot	#address-cells = <1>;
53*c66ec88fSEmmanuel Vadot	#size-cells = <1>;
54*c66ec88fSEmmanuel Vadot
55*c66ec88fSEmmanuel Vadot	iommu: iommu@a {
56*c66ec88fSEmmanuel Vadot		reg = <0xa 0x1>;
57*c66ec88fSEmmanuel Vadot		compatible = "vendor,some-iommu";
58*c66ec88fSEmmanuel Vadot		#iommu-cells = <1>;
59*c66ec88fSEmmanuel Vadot	};
60*c66ec88fSEmmanuel Vadot
61*c66ec88fSEmmanuel Vadot	pci: pci@f {
62*c66ec88fSEmmanuel Vadot		reg = <0xf 0x1>;
63*c66ec88fSEmmanuel Vadot		compatible = "vendor,pcie-root-complex";
64*c66ec88fSEmmanuel Vadot		device_type = "pci";
65*c66ec88fSEmmanuel Vadot
66*c66ec88fSEmmanuel Vadot		/*
67*c66ec88fSEmmanuel Vadot		 * The sideband data provided to the IOMMU is the RID,
68*c66ec88fSEmmanuel Vadot		 * identity-mapped.
69*c66ec88fSEmmanuel Vadot		 */
70*c66ec88fSEmmanuel Vadot		iommu-map = <0x0 &iommu 0x0 0x10000>;
71*c66ec88fSEmmanuel Vadot	};
72*c66ec88fSEmmanuel Vadot};
73*c66ec88fSEmmanuel Vadot
74*c66ec88fSEmmanuel Vadot
75*c66ec88fSEmmanuel VadotExample (2)
76*c66ec88fSEmmanuel Vadot===========
77*c66ec88fSEmmanuel Vadot
78*c66ec88fSEmmanuel Vadot/ {
79*c66ec88fSEmmanuel Vadot	#address-cells = <1>;
80*c66ec88fSEmmanuel Vadot	#size-cells = <1>;
81*c66ec88fSEmmanuel Vadot
82*c66ec88fSEmmanuel Vadot	iommu: iommu@a {
83*c66ec88fSEmmanuel Vadot		reg = <0xa 0x1>;
84*c66ec88fSEmmanuel Vadot		compatible = "vendor,some-iommu";
85*c66ec88fSEmmanuel Vadot		#iommu-cells = <1>;
86*c66ec88fSEmmanuel Vadot	};
87*c66ec88fSEmmanuel Vadot
88*c66ec88fSEmmanuel Vadot	pci: pci@f {
89*c66ec88fSEmmanuel Vadot		reg = <0xf 0x1>;
90*c66ec88fSEmmanuel Vadot		compatible = "vendor,pcie-root-complex";
91*c66ec88fSEmmanuel Vadot		device_type = "pci";
92*c66ec88fSEmmanuel Vadot
93*c66ec88fSEmmanuel Vadot		/*
94*c66ec88fSEmmanuel Vadot		 * The sideband data provided to the IOMMU is the RID with the
95*c66ec88fSEmmanuel Vadot		 * function bits masked out.
96*c66ec88fSEmmanuel Vadot		 */
97*c66ec88fSEmmanuel Vadot		iommu-map = <0x0 &iommu 0x0 0x10000>;
98*c66ec88fSEmmanuel Vadot		iommu-map-mask = <0xfff8>;
99*c66ec88fSEmmanuel Vadot	};
100*c66ec88fSEmmanuel Vadot};
101*c66ec88fSEmmanuel Vadot
102*c66ec88fSEmmanuel Vadot
103*c66ec88fSEmmanuel VadotExample (3)
104*c66ec88fSEmmanuel Vadot===========
105*c66ec88fSEmmanuel Vadot
106*c66ec88fSEmmanuel Vadot/ {
107*c66ec88fSEmmanuel Vadot	#address-cells = <1>;
108*c66ec88fSEmmanuel Vadot	#size-cells = <1>;
109*c66ec88fSEmmanuel Vadot
110*c66ec88fSEmmanuel Vadot	iommu: iommu@a {
111*c66ec88fSEmmanuel Vadot		reg = <0xa 0x1>;
112*c66ec88fSEmmanuel Vadot		compatible = "vendor,some-iommu";
113*c66ec88fSEmmanuel Vadot		#iommu-cells = <1>;
114*c66ec88fSEmmanuel Vadot	};
115*c66ec88fSEmmanuel Vadot
116*c66ec88fSEmmanuel Vadot	pci: pci@f {
117*c66ec88fSEmmanuel Vadot		reg = <0xf 0x1>;
118*c66ec88fSEmmanuel Vadot		compatible = "vendor,pcie-root-complex";
119*c66ec88fSEmmanuel Vadot		device_type = "pci";
120*c66ec88fSEmmanuel Vadot
121*c66ec88fSEmmanuel Vadot		/*
122*c66ec88fSEmmanuel Vadot		 * The sideband data provided to the IOMMU is the RID,
123*c66ec88fSEmmanuel Vadot		 * but the high bits of the bus number are flipped.
124*c66ec88fSEmmanuel Vadot		 */
125*c66ec88fSEmmanuel Vadot		iommu-map = <0x0000 &iommu 0x8000 0x8000>,
126*c66ec88fSEmmanuel Vadot			    <0x8000 &iommu 0x0000 0x8000>;
127*c66ec88fSEmmanuel Vadot	};
128*c66ec88fSEmmanuel Vadot};
129*c66ec88fSEmmanuel Vadot
130*c66ec88fSEmmanuel Vadot
131*c66ec88fSEmmanuel VadotExample (4)
132*c66ec88fSEmmanuel Vadot===========
133*c66ec88fSEmmanuel Vadot
134*c66ec88fSEmmanuel Vadot/ {
135*c66ec88fSEmmanuel Vadot	#address-cells = <1>;
136*c66ec88fSEmmanuel Vadot	#size-cells = <1>;
137*c66ec88fSEmmanuel Vadot
138*c66ec88fSEmmanuel Vadot	iommu_a: iommu@a {
139*c66ec88fSEmmanuel Vadot		reg = <0xa 0x1>;
140*c66ec88fSEmmanuel Vadot		compatible = "vendor,some-iommu";
141*c66ec88fSEmmanuel Vadot		#iommu-cells = <1>;
142*c66ec88fSEmmanuel Vadot	};
143*c66ec88fSEmmanuel Vadot
144*c66ec88fSEmmanuel Vadot	iommu_b: iommu@b {
145*c66ec88fSEmmanuel Vadot		reg = <0xb 0x1>;
146*c66ec88fSEmmanuel Vadot		compatible = "vendor,some-iommu";
147*c66ec88fSEmmanuel Vadot		#iommu-cells = <1>;
148*c66ec88fSEmmanuel Vadot	};
149*c66ec88fSEmmanuel Vadot
150*c66ec88fSEmmanuel Vadot	iommu_c: iommu@c {
151*c66ec88fSEmmanuel Vadot		reg = <0xc 0x1>;
152*c66ec88fSEmmanuel Vadot		compatible = "vendor,some-iommu";
153*c66ec88fSEmmanuel Vadot		#iommu-cells = <1>;
154*c66ec88fSEmmanuel Vadot	};
155*c66ec88fSEmmanuel Vadot
156*c66ec88fSEmmanuel Vadot	pci: pci@f {
157*c66ec88fSEmmanuel Vadot		reg = <0xf 0x1>;
158*c66ec88fSEmmanuel Vadot		compatible = "vendor,pcie-root-complex";
159*c66ec88fSEmmanuel Vadot		device_type = "pci";
160*c66ec88fSEmmanuel Vadot
161*c66ec88fSEmmanuel Vadot		/*
162*c66ec88fSEmmanuel Vadot		 * Devices with bus number 0-127 are mastered via IOMMU
163*c66ec88fSEmmanuel Vadot		 * a, with sideband data being RID[14:0].
164*c66ec88fSEmmanuel Vadot		 * Devices with bus number 128-255 are mastered via
165*c66ec88fSEmmanuel Vadot		 * IOMMU b, with sideband data being RID[14:0].
166*c66ec88fSEmmanuel Vadot		 * No devices master via IOMMU c.
167*c66ec88fSEmmanuel Vadot		 */
168*c66ec88fSEmmanuel Vadot		iommu-map = <0x0000 &iommu_a 0x0000 0x8000>,
169*c66ec88fSEmmanuel Vadot			    <0x8000 &iommu_b 0x0000 0x8000>;
170*c66ec88fSEmmanuel Vadot	};
171*c66ec88fSEmmanuel Vadot};
172