diff options
| author | Thierry Reding <treding@nvidia.com> | 2014-07-31 06:43:03 -0400 |
|---|---|---|
| committer | Joerg Roedel <jroedel@suse.de> | 2014-07-31 14:28:43 -0400 |
| commit | 1a5b5376442bd6c23b5722ecdc7242fcc61ce338 (patch) | |
| tree | 32d0e38a32b0a5b10ba03d89a58f887ec28ac5c8 | |
| parent | e09f8ea560490e941139d23b4c278d3e6e2c871a (diff) | |
devicetree: Add generic IOMMU device tree bindings
This commit introduces a generic device tree binding for
IOMMU devices. Only a very minimal subset is described
here, but it is enough to cover the requirements of both the
Exynos System MMU and Tegra SMMU as discussed here:
https://lkml.org/lkml/2014/4/27/346
Acked-by: Will Deacon <will.deacon@arm.com>
Reviewed-by: Arnd Bergmann <arnd@arndb.de>
Acked-by: Rob Herring <robh@kernel.org>
Signed-off-by: Thierry Reding <treding@nvidia.com>
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Reviewed-by: Olof Johansson <olof@lixom.net>
Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Joerg Roedel <jroedel@suse.de>
| -rw-r--r-- | Documentation/devicetree/bindings/iommu/iommu.txt | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/Documentation/devicetree/bindings/iommu/iommu.txt b/Documentation/devicetree/bindings/iommu/iommu.txt new file mode 100644 index 000000000000..5a8b4624defc --- /dev/null +++ b/Documentation/devicetree/bindings/iommu/iommu.txt | |||
| @@ -0,0 +1,182 @@ | |||
| 1 | This document describes the generic device tree binding for IOMMUs and their | ||
| 2 | master(s). | ||
| 3 | |||
| 4 | |||
| 5 | IOMMU device node: | ||
| 6 | ================== | ||
| 7 | |||
| 8 | An IOMMU can provide the following services: | ||
| 9 | |||
| 10 | * Remap address space to allow devices to access physical memory ranges that | ||
| 11 | they otherwise wouldn't be capable of accessing. | ||
| 12 | |||
| 13 | Example: 32-bit DMA to 64-bit physical addresses | ||
| 14 | |||
| 15 | * Implement scatter-gather at page level granularity so that the device does | ||
| 16 | not have to. | ||
| 17 | |||
| 18 | * Provide system protection against "rogue" DMA by forcing all accesses to go | ||
| 19 | through the IOMMU and faulting when encountering accesses to unmapped | ||
| 20 | address regions. | ||
| 21 | |||
| 22 | * Provide address space isolation between multiple contexts. | ||
| 23 | |||
| 24 | Example: Virtualization | ||
| 25 | |||
| 26 | Device nodes compatible with this binding represent hardware with some of the | ||
| 27 | above capabilities. | ||
| 28 | |||
| 29 | IOMMUs can be single-master or multiple-master. Single-master IOMMU devices | ||
| 30 | typically have a fixed association to the master device, whereas multiple- | ||
| 31 | master IOMMU devices can translate accesses from more than one master. | ||
| 32 | |||
| 33 | The device tree node of the IOMMU device's parent bus must contain a valid | ||
| 34 | "dma-ranges" property that describes how the physical address space of the | ||
| 35 | IOMMU maps to memory. An empty "dma-ranges" property means that there is a | ||
| 36 | 1:1 mapping from IOMMU to memory. | ||
| 37 | |||
| 38 | Required properties: | ||
| 39 | -------------------- | ||
| 40 | - #iommu-cells: The number of cells in an IOMMU specifier needed to encode an | ||
| 41 | address. | ||
| 42 | |||
| 43 | The meaning of the IOMMU specifier is defined by the device tree binding of | ||
| 44 | the specific IOMMU. Below are a few examples of typical use-cases: | ||
| 45 | |||
| 46 | - #iommu-cells = <0>: Single master IOMMU devices are not configurable and | ||
| 47 | therefore no additional information needs to be encoded in the specifier. | ||
| 48 | This may also apply to multiple master IOMMU devices that do not allow the | ||
| 49 | association of masters to be configured. Note that an IOMMU can by design | ||
| 50 | be multi-master yet only expose a single master in a given configuration. | ||
| 51 | In such cases the number of cells will usually be 1 as in the next case. | ||
| 52 | - #iommu-cells = <1>: Multiple master IOMMU devices may need to be configured | ||
| 53 | in order to enable translation for a given master. In such cases the single | ||
| 54 | address cell corresponds to the master device's ID. In some cases more than | ||
| 55 | one cell can be required to represent a single master ID. | ||
| 56 | - #iommu-cells = <4>: Some IOMMU devices allow the DMA window for masters to | ||
| 57 | be configured. The first cell of the address in this may contain the master | ||
| 58 | device's ID for example, while the second cell could contain the start of | ||
| 59 | the DMA window for the given device. The length of the DMA window is given | ||
| 60 | by the third and fourth cells. | ||
| 61 | |||
| 62 | Note that these are merely examples and real-world use-cases may use different | ||
| 63 | definitions to represent their individual needs. Always refer to the specific | ||
| 64 | IOMMU binding for the exact meaning of the cells that make up the specifier. | ||
| 65 | |||
| 66 | |||
| 67 | IOMMU master node: | ||
| 68 | ================== | ||
| 69 | |||
| 70 | Devices that access memory through an IOMMU are called masters. A device can | ||
| 71 | have multiple master interfaces (to one or more IOMMU devices). | ||
| 72 | |||
| 73 | Required properties: | ||
| 74 | -------------------- | ||
| 75 | - iommus: A list of phandle and IOMMU specifier pairs that describe the IOMMU | ||
| 76 | master interfaces of the device. One entry in the list describes one master | ||
| 77 | interface of the device. | ||
| 78 | |||
| 79 | When an "iommus" property is specified in a device tree node, the IOMMU will | ||
| 80 | be used for address translation. If a "dma-ranges" property exists in the | ||
| 81 | device's parent node it will be ignored. An exception to this rule is if the | ||
| 82 | referenced IOMMU is disabled, in which case the "dma-ranges" property of the | ||
| 83 | parent shall take effect. Note that merely disabling a device tree node does | ||
| 84 | not guarantee that the IOMMU is really disabled since the hardware may not | ||
| 85 | have a means to turn off translation. But it is invalid in such cases to | ||
| 86 | disable the IOMMU's device tree node in the first place because it would | ||
| 87 | prevent any driver from properly setting up the translations. | ||
| 88 | |||
| 89 | |||
| 90 | Notes: | ||
| 91 | ====== | ||
| 92 | |||
| 93 | One possible extension to the above is to use an "iommus" property along with | ||
| 94 | a "dma-ranges" property in a bus device node (such as PCI host bridges). This | ||
| 95 | can be useful to describe how children on the bus relate to the IOMMU if they | ||
| 96 | are not explicitly listed in the device tree (e.g. PCI devices). However, the | ||
| 97 | requirements of that use-case haven't been fully determined yet. Implementing | ||
| 98 | this is therefore not recommended without further discussion and extension of | ||
| 99 | this binding. | ||
| 100 | |||
| 101 | |||
| 102 | Examples: | ||
| 103 | ========= | ||
| 104 | |||
| 105 | Single-master IOMMU: | ||
| 106 | -------------------- | ||
| 107 | |||
| 108 | iommu { | ||
| 109 | #iommu-cells = <0>; | ||
| 110 | }; | ||
| 111 | |||
| 112 | master { | ||
| 113 | iommus = <&{/iommu}>; | ||
| 114 | }; | ||
| 115 | |||
| 116 | Multiple-master IOMMU with fixed associations: | ||
| 117 | ---------------------------------------------- | ||
| 118 | |||
| 119 | /* multiple-master IOMMU */ | ||
| 120 | iommu { | ||
| 121 | /* | ||
| 122 | * Masters are statically associated with this IOMMU and share | ||
| 123 | * the same address translations because the IOMMU does not | ||
| 124 | * have sufficient information to distinguish between masters. | ||
| 125 | * | ||
| 126 | * Consequently address translation is always on or off for | ||
| 127 | * all masters at any given point in time. | ||
| 128 | */ | ||
| 129 | #iommu-cells = <0>; | ||
| 130 | }; | ||
| 131 | |||
| 132 | /* static association with IOMMU */ | ||
| 133 | master@1 { | ||
| 134 | reg = <1>; | ||
| 135 | iommus = <&{/iommu}>; | ||
| 136 | }; | ||
| 137 | |||
| 138 | /* static association with IOMMU */ | ||
| 139 | master@2 { | ||
| 140 | reg = <2>; | ||
| 141 | iommus = <&{/iommu}>; | ||
| 142 | }; | ||
| 143 | |||
| 144 | Multiple-master IOMMU: | ||
| 145 | ---------------------- | ||
| 146 | |||
| 147 | iommu { | ||
| 148 | /* the specifier represents the ID of the master */ | ||
| 149 | #iommu-cells = <1>; | ||
| 150 | }; | ||
| 151 | |||
| 152 | master@1 { | ||
| 153 | /* device has master ID 42 in the IOMMU */ | ||
| 154 | iommus = <&{/iommu} 42>; | ||
| 155 | }; | ||
| 156 | |||
| 157 | master@2 { | ||
| 158 | /* device has master IDs 23 and 24 in the IOMMU */ | ||
| 159 | iommus = <&{/iommu} 23>, <&{/iommu} 24>; | ||
| 160 | }; | ||
| 161 | |||
| 162 | Multiple-master IOMMU with configurable DMA window: | ||
| 163 | --------------------------------------------------- | ||
| 164 | |||
| 165 | / { | ||
| 166 | iommu { | ||
| 167 | /* | ||
| 168 | * One cell for the master ID and one cell for the | ||
| 169 | * address of the DMA window. The length of the DMA | ||
| 170 | * window is encoded in two cells. | ||
| 171 | * | ||
| 172 | * The DMA window is the range addressable by the | ||
| 173 | * master (i.e. the I/O virtual address space). | ||
| 174 | */ | ||
| 175 | #iommu-cells = <4>; | ||
| 176 | }; | ||
| 177 | |||
| 178 | master { | ||
| 179 | /* master ID 42, 4 GiB DMA window starting at 0 */ | ||
| 180 | iommus = <&{/iommu} 42 0 0x1 0x0>; | ||
| 181 | }; | ||
| 182 | }; | ||
