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