123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- This document describes the generic device tree binding for IOMMUs and their
- master(s).
- IOMMU device node:
- ==================
- An IOMMU can provide the following services:
- * Remap address space to allow devices to access physical memory ranges that
- they otherwise wouldn't be capable of accessing.
- Example: 32-bit DMA to 64-bit physical addresses
- * Implement scatter-gather at page level granularity so that the device does
- not have to.
- * Provide system protection against "rogue" DMA by forcing all accesses to go
- through the IOMMU and faulting when encountering accesses to unmapped
- address regions.
- * Provide address space isolation between multiple contexts.
- Example: Virtualization
- Device nodes compatible with this binding represent hardware with some of the
- above capabilities.
- IOMMUs can be single-master or multiple-master. Single-master IOMMU devices
- typically have a fixed association to the master device, whereas multiple-
- master IOMMU devices can translate accesses from more than one master.
- The device tree node of the IOMMU device's parent bus must contain a valid
- "dma-ranges" property that describes how the physical address space of the
- IOMMU maps to memory. An empty "dma-ranges" property means that there is a
- 1:1 mapping from IOMMU to memory.
- Required properties:
- --------------------
- - #iommu-cells: The number of cells in an IOMMU specifier needed to encode an
- address.
- The meaning of the IOMMU specifier is defined by the device tree binding of
- the specific IOMMU. Below are a few examples of typical use-cases:
- - #iommu-cells = <0>: Single master IOMMU devices are not configurable and
- therefore no additional information needs to be encoded in the specifier.
- This may also apply to multiple master IOMMU devices that do not allow the
- association of masters to be configured. Note that an IOMMU can by design
- be multi-master yet only expose a single master in a given configuration.
- In such cases the number of cells will usually be 1 as in the next case.
- - #iommu-cells = <1>: Multiple master IOMMU devices may need to be configured
- in order to enable translation for a given master. In such cases the single
- address cell corresponds to the master device's ID. In some cases more than
- one cell can be required to represent a single master ID.
- - #iommu-cells = <4>: Some IOMMU devices allow the DMA window for masters to
- be configured. The first cell of the address in this may contain the master
- device's ID for example, while the second cell could contain the start of
- the DMA window for the given device. The length of the DMA window is given
- by the third and fourth cells.
- Note that these are merely examples and real-world use-cases may use different
- definitions to represent their individual needs. Always refer to the specific
- IOMMU binding for the exact meaning of the cells that make up the specifier.
- IOMMU master node:
- ==================
- Devices that access memory through an IOMMU are called masters. A device can
- have multiple master interfaces (to one or more IOMMU devices).
- Required properties:
- --------------------
- - iommus: A list of phandle and IOMMU specifier pairs that describe the IOMMU
- master interfaces of the device. One entry in the list describes one master
- interface of the device.
- When an "iommus" property is specified in a device tree node, the IOMMU will
- be used for address translation. If a "dma-ranges" property exists in the
- device's parent node it will be ignored. An exception to this rule is if the
- referenced IOMMU is disabled, in which case the "dma-ranges" property of the
- parent shall take effect. Note that merely disabling a device tree node does
- not guarantee that the IOMMU is really disabled since the hardware may not
- have a means to turn off translation. But it is invalid in such cases to
- disable the IOMMU's device tree node in the first place because it would
- prevent any driver from properly setting up the translations.
- Notes:
- ======
- One possible extension to the above is to use an "iommus" property along with
- a "dma-ranges" property in a bus device node (such as PCI host bridges). This
- can be useful to describe how children on the bus relate to the IOMMU if they
- are not explicitly listed in the device tree (e.g. PCI devices). However, the
- requirements of that use-case haven't been fully determined yet. Implementing
- this is therefore not recommended without further discussion and extension of
- this binding.
- Examples:
- =========
- Single-master IOMMU:
- --------------------
- iommu {
- #iommu-cells = <0>;
- };
- master {
- iommus = <&{/iommu}>;
- };
- Multiple-master IOMMU with fixed associations:
- ----------------------------------------------
- /* multiple-master IOMMU */
- iommu {
- /*
- * Masters are statically associated with this IOMMU and share
- * the same address translations because the IOMMU does not
- * have sufficient information to distinguish between masters.
- *
- * Consequently address translation is always on or off for
- * all masters at any given point in time.
- */
- #iommu-cells = <0>;
- };
- /* static association with IOMMU */
- master@1 {
- reg = <1>;
- iommus = <&{/iommu}>;
- };
- /* static association with IOMMU */
- master@2 {
- reg = <2>;
- iommus = <&{/iommu}>;
- };
- Multiple-master IOMMU:
- ----------------------
- iommu {
- /* the specifier represents the ID of the master */
- #iommu-cells = <1>;
- };
- master@1 {
- /* device has master ID 42 in the IOMMU */
- iommus = <&{/iommu} 42>;
- };
- master@2 {
- /* device has master IDs 23 and 24 in the IOMMU */
- iommus = <&{/iommu} 23>, <&{/iommu} 24>;
- };
- Multiple-master IOMMU with configurable DMA window:
- ---------------------------------------------------
- / {
- iommu {
- /*
- * One cell for the master ID and one cell for the
- * address of the DMA window. The length of the DMA
- * window is encoded in two cells.
- *
- * The DMA window is the range addressable by the
- * master (i.e. the I/O virtual address space).
- */
- #iommu-cells = <4>;
- };
- master {
- /* master ID 42, 4 GiB DMA window starting at 0 */
- iommus = <&{/iommu} 42 0 0x1 0x0>;
- };
- };
|