public inbox for devicetree@vger.kernel.org
 help / color / mirror / Atom feed
From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: linux-arm-kernel@lists.infradead.org
Cc: Mark Rutland <mark.rutland@arm.com>,
	devicetree@vger.kernel.org, Arnd Bergmann <arnd@arndb.de>,
	Joerg Roedel <joro@8bytes.org>, Will Deacon <Will.Deacon@arm.com>,
	Rob Herring <robh+dt@kernel.org>, Olof Johansson <olof@lixom.net>,
	iommu@lists.linux-foundation.org,
	Thierry Reding <thierry.reding@gmail.com>,
	linux-tegra@vger.kernel.org
Subject: Re: [PATCH v5] devicetree: Add generic IOMMU device tree bindings
Date: Thu, 31 Jul 2014 20:09:42 +0200	[thread overview]
Message-ID: <5073694.BaMdO1z6rq@avalon> (raw)
In-Reply-To: <1406803383-11601-1-git-send-email-thierry.reding@gmail.com>

Hi Thierry,

On Thursday 31 July 2014 12:43:03 Thierry Reding wrote:
> 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
> 
> 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>

Thank you for the great work. This is nearly identical to my own IOMMU DT 
bindings experiment developed with the Renesas IPMMU-VMSA driver, so I can't 
disagree.

Acked-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>

> ---
> Changes in v5:
> - clarify comment about dma-ranges vs. IOMMU regarding a device's
>   disabled state
> - use proper DTS syntax reference absolute nodes for phandles
> - clarify the meaning of the #iommu-cells = <0> example
> - remove confusing (and unnecessary) #address-cells and #size-cells from
>   multi-master windowed IOMMU example and clarify the meaning of DMA
>   window
> 
> 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 | 182
> ++++++++++++++++++++++ 1 file changed, 182 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..5a8b4624defc
> --- /dev/null
> +++ b/Documentation/devicetree/bindings/iommu/iommu.txt
> @@ -0,0 +1,182 @@
> +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>;
> +		};
> +	};

-- 
Regards,

Laurent Pinchart

      parent reply	other threads:[~2014-07-31 18:09 UTC|newest]

Thread overview: 21+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-31 10:43 [PATCH v5] devicetree: Add generic IOMMU device tree bindings Thierry Reding
     [not found] ` <1406803383-11601-1-git-send-email-thierry.reding-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2014-07-31 10:54   ` Mark Rutland
2014-07-31 12:04   ` Joerg Roedel
     [not found]     ` <20140731120424.GK9809-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2014-07-31 15:38       ` Olof Johansson
     [not found]         ` <CAOesGMiS_MJNnkfPOsqxV27=rXPgT9UNbp-+VhpMRNf9u0+-eA-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-31 16:36           ` Joerg Roedel
     [not found]             ` <20140731163611.GM9809-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2014-07-31 17:14               ` Olof Johansson
     [not found]                 ` <CAOesGMjovbqn86Q97_SCgsC4jeZf1M_gTKk-Twjr_=6rvnXTCg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2014-07-31 17:23                   ` Joerg Roedel
2014-08-14  6:47   ` Hiroshi Doyu
     [not found]     ` <87a9774lf5.fsf-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2014-08-14 14:45       ` Varun Sethi
     [not found]         ` <cfb1d2ff66004685b7ead3f5e6321681-AZ66ij2kwaacCcN9WK45f+O6mTEJWrR4XA4E9RH9d+qIuWR1G4zioA@public.gmane.org>
2014-08-14 16:04           ` Hiroshi Doyu
     [not found]             ` <87y4ur2h23.fsf-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2014-08-19  9:52               ` Varun Sethi
     [not found]                 ` <d9fb045d54244f26a773ba45ad3caa2d-AZ66ij2kwaacCcN9WK45f+O6mTEJWrR4XA4E9RH9d+qIuWR1G4zioA@public.gmane.org>
2014-08-19 10:03                   ` Hiroshi Doyu
     [not found]                     ` <87zjf0hk3b.fsf-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2014-08-19 10:47                       ` Varun Sethi
     [not found]                         ` <a0244b6befa9407fb6c2c35cc29f92f7-AZ66ij2kwaacCcN9WK45f+O6mTEJWrR4XA4E9RH9d+qIuWR1G4zioA@public.gmane.org>
2014-08-19 11:03                           ` Hiroshi Doyu
     [not found]                             ` <87wqa4hhcr.fsf-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2014-08-19 12:01                               ` Varun Sethi
2014-08-15 11:51       ` Will Deacon
     [not found]         ` <20140815115110.GO27466-5wv7dgnIgG8@public.gmane.org>
2014-08-15 12:29           ` Hiroshi Doyu
     [not found]             ` <87tx5ehr62.fsf-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
2014-08-15 13:14               ` Will Deacon
2014-08-19 12:11           ` Varun Sethi
     [not found]             ` <6a3d4048ddb84bd19c847adf7f02fc52-AZ66ij2kwaacCcN9WK45f+O6mTEJWrR4XA4E9RH9d+qIuWR1G4zioA@public.gmane.org>
2014-08-22 15:33               ` Will Deacon
2014-07-31 18:09 ` Laurent Pinchart [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=5073694.BaMdO1z6rq@avalon \
    --to=laurent.pinchart@ideasonboard.com \
    --cc=Will.Deacon@arm.com \
    --cc=arnd@arndb.de \
    --cc=devicetree@vger.kernel.org \
    --cc=iommu@lists.linux-foundation.org \
    --cc=joro@8bytes.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-tegra@vger.kernel.org \
    --cc=mark.rutland@arm.com \
    --cc=olof@lixom.net \
    --cc=robh+dt@kernel.org \
    --cc=thierry.reding@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox