devicetree.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4] devicetree: Add generic IOMMU device tree bindings
@ 2014-07-04 15:29 Thierry Reding
       [not found] ` <1404487757-18829-1-git-send-email-thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
  0 siblings, 1 reply; 42+ messages in thread
From: Thierry Reding @ 2014-07-04 15:29 UTC (permalink / raw)
  To: Rob Herring, Pawel Moll, Mark Rutland, Ian Campbell, Kumar Gala,
	Stephen Warren, Arnd Bergmann, Will Deacon, Joerg Roedel
  Cc: Cho KyongHo, Grant Grundler, Dave Martin, Marc Zyngier,
	Hiroshi Doyu, Olav Haugan, Varun Sethi,
	devicetree-u79uwXL29TY76Z2rM5mHXA,
	iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA,
	linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r,
	linux-tegra-u79uwXL29TY76Z2rM5mHXA,
	linux-kernel-u79uwXL29TY76Z2rM5mHXA

From: Thierry Reding <treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>

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-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
---
Changes in v4:
- clarify that disabling an IOMMU DT node may not disable translation
- be more explicit that examples are only examples
- add multi-ID master example

Changes in v3:
- use #iommu-cells instead of #address-cells/#size-cells
- drop optional iommu-names property

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 | 172 ++++++++++++++++++++++
 1 file changed, 172 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..464a81eaaf61
--- /dev/null
+++ b/Documentation/devicetree/bindings/iommu/iommu.txt
@@ -0,0 +1,172 @@
+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.
+
+
+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
+		 * address translation is always enabled.
+		 */
+		#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:
+---------------------------------------------------
+
+	/ {
+		#address-cells = <1>;
+		#size-cells = <1>;
+
+		iommu {
+			/* master ID, address and length of DMA window */
+			#iommu-cells = <4>;
+		};
+
+		master {
+			/* master ID 42, 4 GiB DMA window starting at 0 */
+			iommus = <&/iommu  42  0  0x1 0x0>;
+		};
+	};
-- 
2.0.1

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

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

Thread overview: 42+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2014-07-04 15:29 [PATCH v4] devicetree: Add generic IOMMU device tree bindings Thierry Reding
     [not found] ` <1404487757-18829-1-git-send-email-thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-07-09 13:40   ` Will Deacon
     [not found]     ` <20140709134050.GN9485-5wv7dgnIgG8@public.gmane.org>
2014-07-09 14:21       ` Thierry Reding
2014-07-09 18:10         ` Will Deacon
     [not found]           ` <20140709181048.GX9485-5wv7dgnIgG8@public.gmane.org>
2014-07-10  9:49             ` Thierry Reding
2014-07-10 10:23               ` Will Deacon
     [not found]                 ` <20140710102334.GG2449-5wv7dgnIgG8@public.gmane.org>
2014-07-10 10:57                   ` Thierry Reding
2014-07-10 12:38                     ` Will Deacon
2014-07-11 20:55   ` Rob Clark
     [not found]     ` <CAF6AEGv2P_Uq8CHgm1YdaUeMSNdH62ZwjLnT83Fr5GnxEAhTMw-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-12  9:39       ` Will Deacon
     [not found]         ` <20140712093917.GD18601-5wv7dgnIgG8@public.gmane.org>
2014-07-12 11:26           ` Rob Clark
     [not found]             ` <CAF6AEGutHp+3f3iPA+jjaRkqq=5T_vytZ_ESoSqsQ4RHZ8F8yQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-12 12:22               ` Arnd Bergmann
     [not found]                 ` <201407121422.02078.arnd-r2nGTMty4D4@public.gmane.org>
2014-07-12 12:57                   ` Rob Clark
     [not found]                     ` <CAF6AEGs7=3UByP2DLm-uwU03wr7M14x2t-0hLX-VPJ6_eZbU3g-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-13  9:43                       ` Will Deacon
     [not found]                         ` <20140713094341.GB23235-5wv7dgnIgG8@public.gmane.org>
2014-07-13 11:43                           ` Rob Clark
2014-07-16  1:25                             ` Olav Haugan
     [not found]                               ` <53C5D480.3030409-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2014-07-16 10:10                                 ` Will Deacon
2014-07-16 20:24                                 ` Rob Clark
2014-07-14  6:44                         ` Thierry Reding
2014-07-14 10:08                           ` Will Deacon
2014-07-14  6:24                       ` Thierry Reding
2014-07-14 10:13                         ` Rob Clark
2014-07-14  6:15                   ` Thierry Reding
2014-07-30 11:04   ` Will Deacon
     [not found]     ` <20140730110425.GI12239-5wv7dgnIgG8@public.gmane.org>
2014-07-30 13:23       ` Thierry Reding
2014-07-30 13:33         ` Joerg Roedel
     [not found]           ` <20140730133309.GF9809-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2014-07-30 17:37             ` Olof Johansson
2014-07-30 14:30         ` Will Deacon
     [not found]           ` <20140730143037.GD8989-5wv7dgnIgG8@public.gmane.org>
2014-07-30 18:08             ` Rob Herring
2014-07-30 20:11         ` Arnd Bergmann
2014-07-30 15:26   ` Mark Rutland
2014-07-30 17:35     ` Olof Johansson
     [not found]       ` <CAOesGMi3zM1-cqmeGddJ69RNXx0ktFm_zXO_yq7N0EeA3HNrUQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-30 18:18         ` Mark Rutland
2014-07-31 10:09           ` Thierry Reding
2014-07-31 10:50             ` Mark Rutland
2014-07-31 11:14               ` Thierry Reding
2014-07-31  9:51         ` Thierry Reding
2014-07-31  8:39     ` Thierry Reding
2014-07-31  9:22       ` Mark Rutland
2014-07-31 10:18         ` Thierry Reding
2014-07-31 10:23           ` Joerg Roedel
     [not found]             ` <20140731102351.GJ9809-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2014-07-31 10:46               ` Thierry Reding

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).