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