From: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
To: Anup Patel <anup-aa5cPYPs4nSSZfiimGR9Ow@public.gmane.org>
Cc: laurent.pinchart+renesas-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org,
Anup Patel <anup.patel-dY08KVG/lbpWk0Htik3J/w@public.gmane.org>,
Catalin Marinas <catalin.marinas-5wv7dgnIgG8@public.gmane.org>,
Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org>,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
djkurtz-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org,
thunder.leizhen-hv44wF8Li93QT0dZR+AlfA@public.gmane.org,
yingjoe.chen-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org,
treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org,
linux-arm-kernel
<linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>
Subject: Re: [PATCH v6 2/3] arm64: Add IOMMU dma_ops
Date: Wed, 7 Oct 2015 17:36:24 +0100 [thread overview]
Message-ID: <56154A08.6060207@arm.com> (raw)
In-Reply-To: <CAAhSdy2tpAfH+i=1axDkmRqZixsbVhd-_9VGvpyQ=5e06v=Kpg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
On 07/10/15 10:03, Anup Patel wrote:
[...]
>> +static bool do_iommu_attach(struct device *dev, const struct iommu_ops *ops,
>> + u64 dma_base, u64 size)
>> +{
>> + struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
>> +
>> + /*
>> + * Best case: The device is either part of a group which was
>> + * already attached to a domain in a previous call, or it's
>> + * been put in a default DMA domain by the IOMMU core.
>> + */
>> + if (!domain) {
>> + /*
>> + * Urgh. The IOMMU core isn't going to do default domains
>> + * for non-PCI devices anyway, until it has some means of
>> + * abstracting the entirely implementation-specific
>> + * sideband data/SoC topology/unicorn dust that may or
>> + * may not differentiate upstream masters.
>> + * So until then, HORRIBLE HACKS!
>> + */
>> + domain = ops->domain_alloc(IOMMU_DOMAIN_DMA);
>> + if (!domain)
>> + goto out_no_domain;
>> +
>> + domain->ops = ops;
>> + domain->type = IOMMU_DOMAIN_DMA | __IOMMU_DOMAIN_FAKE_DEFAULT;
>
> We require iommu_get_dma_cookie(domain) here. If we dont
> allocate iommu cookie then iommu_dma_init_domain() will fail.
The iova cookie is tightly coupled with the domain, so it really only
makes sense for the IOMMU driver to deal with it as part of its
domain_alloc/domain_free callbacks.
Doing that here was one of the nastier 'compatibility' hacks which I've
now taken out; trying to make things work without modifying existing
IOMMU drivers was just too impractical. Drivers which want to play are
now required to support the IOMMU_DOMAIN_DMA type appropriately, but
it's still only a minimal change, as per the example diff for the ARM
SMMU driver below (big pile of further patches necessary to make said
driver compatible in other respects notwithstanding).
Robin.
--->8---
@@ -29,6 +29,7 @@
#define pr_fmt(fmt) "arm-smmu: " fmt
#include <linux/delay.h>
+#include <linux/dma-iommu.h>
#include <linux/dma-mapping.h>
#include <linux/err.h>
#include <linux/interrupt.h>
@@ -973,7 +974,7 @@ static struct iommu_domain
*arm_smmu_domain_alloc(unsigned type)
{
struct arm_smmu_domain *smmu_domain;
- if (type != IOMMU_DOMAIN_UNMANAGED)
+ if (type != IOMMU_DOMAIN_UNMANAGED && type != IOMMU_DOMAIN_DMA)
return NULL;
/*
* Allocate the domain and initialise some of its data structures.
@@ -984,6 +985,12 @@ static struct iommu_domain
*arm_smmu_domain_alloc(unsigned type)
if (!smmu_domain)
return NULL;
+ if (type == IOMMU_DOMAIN_DMA &&
+ iommu_get_dma_cookie(&smmu_domain->domain)) {
+ kfree(smmu_domain);
+ return NULL;
+ }
+
mutex_init(&smmu_domain->init_mutex);
spin_lock_init(&smmu_domain->pgtbl_lock);
@@ -998,6 +1005,7 @@ static void arm_smmu_domain_free(struct
iommu_domain *domain)
* Free the domain resources. We assume that all devices have
* already been detached.
*/
+ iommu_put_dma_cookie(domain);
arm_smmu_destroy_domain_context(domain);
kfree(smmu_domain);
}
WARNING: multiple messages have this Message-ID (diff)
From: robin.murphy@arm.com (Robin Murphy)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v6 2/3] arm64: Add IOMMU dma_ops
Date: Wed, 7 Oct 2015 17:36:24 +0100 [thread overview]
Message-ID: <56154A08.6060207@arm.com> (raw)
In-Reply-To: <CAAhSdy2tpAfH+i=1axDkmRqZixsbVhd-_9VGvpyQ=5e06v=Kpg@mail.gmail.com>
On 07/10/15 10:03, Anup Patel wrote:
[...]
>> +static bool do_iommu_attach(struct device *dev, const struct iommu_ops *ops,
>> + u64 dma_base, u64 size)
>> +{
>> + struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
>> +
>> + /*
>> + * Best case: The device is either part of a group which was
>> + * already attached to a domain in a previous call, or it's
>> + * been put in a default DMA domain by the IOMMU core.
>> + */
>> + if (!domain) {
>> + /*
>> + * Urgh. The IOMMU core isn't going to do default domains
>> + * for non-PCI devices anyway, until it has some means of
>> + * abstracting the entirely implementation-specific
>> + * sideband data/SoC topology/unicorn dust that may or
>> + * may not differentiate upstream masters.
>> + * So until then, HORRIBLE HACKS!
>> + */
>> + domain = ops->domain_alloc(IOMMU_DOMAIN_DMA);
>> + if (!domain)
>> + goto out_no_domain;
>> +
>> + domain->ops = ops;
>> + domain->type = IOMMU_DOMAIN_DMA | __IOMMU_DOMAIN_FAKE_DEFAULT;
>
> We require iommu_get_dma_cookie(domain) here. If we dont
> allocate iommu cookie then iommu_dma_init_domain() will fail.
The iova cookie is tightly coupled with the domain, so it really only
makes sense for the IOMMU driver to deal with it as part of its
domain_alloc/domain_free callbacks.
Doing that here was one of the nastier 'compatibility' hacks which I've
now taken out; trying to make things work without modifying existing
IOMMU drivers was just too impractical. Drivers which want to play are
now required to support the IOMMU_DOMAIN_DMA type appropriately, but
it's still only a minimal change, as per the example diff for the ARM
SMMU driver below (big pile of further patches necessary to make said
driver compatible in other respects notwithstanding).
Robin.
--->8---
@@ -29,6 +29,7 @@
#define pr_fmt(fmt) "arm-smmu: " fmt
#include <linux/delay.h>
+#include <linux/dma-iommu.h>
#include <linux/dma-mapping.h>
#include <linux/err.h>
#include <linux/interrupt.h>
@@ -973,7 +974,7 @@ static struct iommu_domain
*arm_smmu_domain_alloc(unsigned type)
{
struct arm_smmu_domain *smmu_domain;
- if (type != IOMMU_DOMAIN_UNMANAGED)
+ if (type != IOMMU_DOMAIN_UNMANAGED && type != IOMMU_DOMAIN_DMA)
return NULL;
/*
* Allocate the domain and initialise some of its data structures.
@@ -984,6 +985,12 @@ static struct iommu_domain
*arm_smmu_domain_alloc(unsigned type)
if (!smmu_domain)
return NULL;
+ if (type == IOMMU_DOMAIN_DMA &&
+ iommu_get_dma_cookie(&smmu_domain->domain)) {
+ kfree(smmu_domain);
+ return NULL;
+ }
+
mutex_init(&smmu_domain->init_mutex);
spin_lock_init(&smmu_domain->pgtbl_lock);
@@ -998,6 +1005,7 @@ static void arm_smmu_domain_free(struct
iommu_domain *domain)
* Free the domain resources. We assume that all devices have
* already been detached.
*/
+ iommu_put_dma_cookie(domain);
arm_smmu_destroy_domain_context(domain);
kfree(smmu_domain);
}
next prev parent reply other threads:[~2015-10-07 16:36 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-10-01 19:13 [PATCH v6 0/3] arm64: IOMMU-backed DMA mapping Robin Murphy
2015-10-01 19:13 ` Robin Murphy
[not found] ` <cover.1443718557.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-10-01 19:13 ` [PATCH v6 1/3] iommu: Implement common IOMMU ops for " Robin Murphy
2015-10-01 19:13 ` Robin Murphy
[not found] ` <ab8e1caa40d6da1afa4a49f30242ef4e6e1f17df.1443718557.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-10-26 13:44 ` Yong Wu
2015-10-26 13:44 ` Yong Wu
2015-10-26 16:55 ` Robin Murphy
2015-10-26 16:55 ` Robin Murphy
2015-10-30 1:17 ` Daniel Kurtz
2015-10-30 1:17 ` Daniel Kurtz
2015-10-30 14:09 ` Joerg Roedel
2015-10-30 14:09 ` Joerg Roedel
[not found] ` <20151030140923.GJ27420-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2015-10-30 18:18 ` Mark Hounschell
2015-10-30 14:27 ` Robin Murphy
2015-10-30 14:27 ` Robin Murphy
2015-11-02 13:11 ` Daniel Kurtz
2015-11-02 13:11 ` Daniel Kurtz
2015-11-02 13:43 ` Tomasz Figa
2015-11-02 13:43 ` Tomasz Figa
2015-11-03 17:41 ` Robin Murphy
2015-11-03 17:41 ` Robin Murphy
2015-11-03 18:40 ` Russell King - ARM Linux
2015-11-03 18:40 ` Russell King - ARM Linux
2015-11-04 5:15 ` Tomasz Figa
2015-11-04 5:15 ` Tomasz Figa
[not found] ` <CAAFQd5COY-dvBE73R=sUWoGfXR9CvgurGchYgXB6y9eqQ=BBUQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-11-04 9:10 ` Russell King - ARM Linux
2015-11-04 9:10 ` Russell King - ARM Linux
2015-11-04 9:10 ` Russell King - ARM Linux
2015-11-04 5:12 ` Tomasz Figa
2015-11-04 5:12 ` Tomasz Figa
[not found] ` <CAAFQd5A4TcvkDMFezqEpkfWL+7yO2v=Hm=twk=p-NpADPpvqEQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-11-04 9:27 ` Russell King - ARM Linux
2015-11-04 9:27 ` Russell King - ARM Linux
2015-11-04 9:27 ` Russell King - ARM Linux
2015-11-04 9:48 ` Tomasz Figa
2015-11-04 9:48 ` Tomasz Figa
[not found] ` <CAAFQd5ApSFC6Pm4tDhZbJOVZ7szCx=diKUtGXq=M9a5Y_4qzOQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-11-04 10:50 ` Russell King - ARM Linux
2015-11-04 10:50 ` Russell King - ARM Linux
2015-11-04 10:50 ` Russell King - ARM Linux
2015-11-09 13:11 ` Robin Murphy
2015-11-09 13:11 ` Robin Murphy
2015-11-17 12:02 ` Marek Szyprowski
2015-11-17 12:02 ` Marek Szyprowski
2015-10-01 19:13 ` [PATCH v6 2/3] arm64: Add IOMMU dma_ops Robin Murphy
2015-10-01 19:13 ` Robin Murphy
2015-10-07 9:03 ` Anup Patel
2015-10-07 9:03 ` Anup Patel
[not found] ` <CAAhSdy2tpAfH+i=1axDkmRqZixsbVhd-_9VGvpyQ=5e06v=Kpg-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-10-07 16:36 ` Robin Murphy [this message]
2015-10-07 16:36 ` Robin Murphy
2015-10-07 17:40 ` Anup Patel
2015-10-07 17:40 ` Anup Patel
[not found] ` <80cb035144a2648a5d94eb1fec3336f17ad249f1.1443718557.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-10-06 11:00 ` Yong Wu
2015-10-06 11:00 ` Yong Wu
2015-10-07 16:07 ` Robin Murphy
2015-10-07 16:07 ` Robin Murphy
[not found] ` <56154349.8040101-5wv7dgnIgG8@public.gmane.org>
2015-10-09 5:44 ` Yong Wu
2015-10-09 5:44 ` Yong Wu
2015-10-14 11:47 ` Joerg Roedel
2015-10-14 11:47 ` Joerg Roedel
2015-10-14 13:35 ` Catalin Marinas
2015-10-14 13:35 ` Catalin Marinas
[not found] ` <20151014133538.GG4239-M2fw3Uu6cmfZROr8t4l/smS4ubULX0JqMm0uRHvK7Nw@public.gmane.org>
2015-10-14 16:34 ` Robin Murphy
2015-10-14 16:34 ` Robin Murphy
2015-11-04 8:39 ` Yong Wu
2015-11-04 8:39 ` Yong Wu
2015-11-04 13:11 ` Robin Murphy
2015-11-04 13:11 ` Robin Murphy
[not found] ` <563A0419.9070100-5wv7dgnIgG8@public.gmane.org>
2015-11-04 17:35 ` Laura Abbott
2015-11-04 17:35 ` Laura Abbott
2015-10-01 19:14 ` [PATCH v6 3/3] arm64: Hook up " Robin Murphy
2015-10-01 19:14 ` Robin Murphy
2015-10-13 12:12 ` [PATCH v6 0/3] arm64: IOMMU-backed DMA mapping Robin Murphy
2015-10-13 12:12 ` Robin Murphy
[not found] ` <561CF53E.7000809-5wv7dgnIgG8@public.gmane.org>
2015-10-14 11:50 ` joro-zLv9SwRftAIdnm+yROfE0A
2015-10-14 11:50 ` joro at 8bytes.org
[not found] ` <20151014115013.GM27420-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2015-10-14 18:19 ` Robin Murphy
2015-10-14 18:19 ` Robin Murphy
2015-10-15 15:04 ` Joerg Roedel
2015-10-15 15:04 ` Joerg Roedel
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=56154A08.6060207@arm.com \
--to=robin.murphy-5wv7dgnigg8@public.gmane.org \
--cc=anup-aa5cPYPs4nSSZfiimGR9Ow@public.gmane.org \
--cc=anup.patel-dY08KVG/lbpWk0Htik3J/w@public.gmane.org \
--cc=catalin.marinas-5wv7dgnIgG8@public.gmane.org \
--cc=djkurtz-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=laurent.pinchart+renesas-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=thunder.leizhen-hv44wF8Li93QT0dZR+AlfA@public.gmane.org \
--cc=treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org \
--cc=will.deacon-5wv7dgnIgG8@public.gmane.org \
--cc=yingjoe.chen-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.