linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
[parent not found: <20140606224542.GA22188@mithrandir>]
* [PATCH v2] devicetree: Add generic IOMMU device tree bindings
@ 2014-05-23 20:36 Thierry Reding
  2014-05-29 15:52 ` Stephen Warren
  2014-05-30 11:22 ` Dave Martin
  0 siblings, 2 replies; 71+ messages in thread
From: Thierry Reding @ 2014-05-23 20:36 UTC (permalink / raw)
  To: linux-arm-kernel

From: Thierry Reding <treding@nvidia.com>

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

Signed-off-by: Thierry Reding <treding@nvidia.com>
---
Apologies for the noise, but apparently I mistyped one of the email
addresses, should be fixed now.

Changes in v2:
- add notes about "dma-ranges" property (drop note from commit message)
- document priorities of "iommus" property vs. "dma-ranges" property
- drop #iommu-cells in favour of #address-cells and #size-cells
- remove multiple-master device example

 Documentation/devicetree/bindings/iommu/iommu.txt | 167 ++++++++++++++++++++++
 1 file changed, 167 insertions(+)
 create mode 100644 Documentation/devicetree/bindings/iommu/iommu.txt

diff --git a/Documentation/devicetree/bindings/iommu/iommu.txt b/Documentation/devicetree/bindings/iommu/iommu.txt
new file mode 100644
index 000000000000..6ce759afcc94
--- /dev/null
+++ b/Documentation/devicetree/bindings/iommu/iommu.txt
@@ -0,0 +1,167 @@
+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:
+--------------------
+- #address-cells: The number of cells in an IOMMU specifier needed to encode
+  an address.
+- #size-cells: The number of cells in an IOMMU specifier needed to represent
+  the length of an address range.
+
+Typical values for the above include:
+- #address-cells = <0>, size-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.
+- #address-cells = <1>, size-cells = <0>: 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.
+- #address-cells = <2>, size-cells = <2>: 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 specified by two additional cells.
+
+
+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.
+
+Optional properties:
+--------------------
+- iommu-names: A list of names identifying each entry in the "iommus"
+  property.
+
+
+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 {
+		#address-cells = <0>;
+		#size-cells = <0>;
+	};
+
+	master {
+		iommus = <&/iommu>;
+	};
+
+Multiple-master IOMMU with fixed associations:
+----------------------------------------------
+
+	/* multiple-master IOMMU */
+	iommu {
+		/*
+		 * Masters are statically associated with this IOMMU and
+		 * address translation is always enabled.
+		 */
+		#address-cells = <0>;
+		#size-cells = <0>;
+	};
+
+	/* static association with IOMMU */
+	master at 1 {
+		reg = <1>;
+		iommus = <&/iommu>;
+	};
+
+	/* static association with IOMMU */
+	master at 2 {
+		reg = <2>;
+		iommus = <&/iommu>;
+	};
+
+Multiple-master IOMMU:
+----------------------
+
+	iommu {
+		/* the specifier represents the ID of the master */
+		#address-cells = <1>;
+		#size-cells = <0>;
+	};
+
+	master {
+		/* device has master ID 42 in the IOMMU */
+		iommus = <&/iommu 42>;
+	};
+
+Multiple-master IOMMU with configurable DMA window:
+---------------------------------------------------
+
+	/ {
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		iommu {
+			/* master ID, address of DMA window */
+			#address-cells = <2>;
+			#size-cells = <2>;
+		};
+
+		master {
+			/* master ID 42, 4 GiB DMA window starting at 0 */
+			iommus = <&/iommu  42 0  0x1 0x0>;
+		};
+	};
-- 
1.9.2

^ permalink raw reply related	[flat|nested] 71+ messages in thread

end of thread, other threads:[~2014-07-11 12:24 UTC | newest]

Thread overview: 71+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <1400877218-4113-1-git-send-email-thierry.reding@gmail.com>
2014-05-30 13:16 ` [PATCH v2] devicetree: Add generic IOMMU device tree bindings Rob Herring
2014-05-30 19:06   ` Arnd Bergmann
2014-05-30 19:29     ` Hiroshi Doyu
2014-05-30 19:54       ` Arnd Bergmann
2014-06-01  9:55         ` Will Deacon
2014-06-04 13:39           ` Thierry Reding
2014-06-04 13:44         ` Thierry Reding
2014-06-04 13:53           ` Arnd Bergmann
2014-06-04 13:56           ` Will Deacon
2014-06-04 14:01             ` Arnd Bergmann
2014-06-04 16:39               ` Will Deacon
2014-05-30 19:31     ` Rob Herring
2014-05-30 19:49       ` Arnd Bergmann
2014-06-02 10:41         ` Dave Martin
2014-06-04 14:35           ` Thierry Reding
2014-06-04 16:41             ` Will Deacon
2014-06-04 21:00               ` Thierry Reding
2014-06-05 19:10               ` Varun Sethi
2014-06-16 15:27                 ` Will Deacon
2014-06-16 16:56                   ` Stuart Yoder
2014-06-16 17:04                     ` Will Deacon
2014-06-16 17:30                       ` Arnd Bergmann
2014-06-16 18:53                       ` Stuart Yoder
2014-06-17 10:26                         ` Varun Sethi
2014-06-17 10:43                           ` Will Deacon
2014-06-17 11:21                             ` Varun Sethi
2014-06-17 14:50                               ` Stuart Yoder
2014-06-18  9:29                                 ` Will Deacon
2014-06-17 14:39                           ` Stuart Yoder
2014-06-20 23:16     ` Olav Haugan
2014-06-24  9:18       ` Will Deacon
2014-06-24 17:57         ` Olav Haugan
2014-06-24 18:11           ` Will Deacon
2014-06-24 18:20             ` Arnd Bergmann
2014-06-25  9:17               ` Will Deacon
2014-06-25  9:27                 ` Arnd Bergmann
2014-06-25  9:38                   ` Will Deacon
2014-06-25  9:48                     ` Arnd Bergmann
2014-06-25  9:57                       ` Will Deacon
2014-06-25 10:12                         ` Arnd Bergmann
2014-06-25 10:14                           ` Will Deacon
2014-06-24 21:35             ` Olav Haugan
2014-06-25  9:18               ` Will Deacon
2014-06-27 22:23                 ` Olav Haugan
2014-06-30  9:52                   ` Will Deacon
2014-07-09  1:07                     ` Olav Haugan
2014-07-09 10:54                       ` Will Deacon
2014-07-10 22:32                         ` Olav Haugan
2014-07-11 12:24                           ` Will Deacon
     [not found] <20140606224542.GA22188@mithrandir>
2014-06-07 13:22 ` Arnd Bergmann
2014-06-09 10:49   ` Thierry Reding
2014-05-23 20:36 Thierry Reding
2014-05-29 15:52 ` Stephen Warren
2014-05-30  7:30   ` Thierry Reding
2014-05-30 11:27     ` Dave Martin
2014-05-30 19:11       ` Arnd Bergmann
2014-06-02 10:56         ` Dave Martin
2014-06-04 21:12       ` Thierry Reding
2014-06-16 12:57         ` Will Deacon
2014-06-17 11:58           ` Thierry Reding
2014-06-17 12:18             ` Will Deacon
2014-06-17 23:37               ` Thierry Reding
2014-06-18 10:14                 ` Will Deacon
2014-06-20 15:53                   ` Arnd Bergmann
2014-06-20 17:50                     ` Will Deacon
2014-06-20 18:55                       ` Arnd Bergmann
2014-05-30 11:22 ` Dave Martin
2014-05-30 19:01   ` Arnd Bergmann
2014-06-02 11:44     ` Dave Martin
2014-06-04 21:32     ` Thierry Reding
2014-06-05  9:42       ` Arnd Bergmann

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).