From: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
To: Joerg Roedel <joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
Cc: "laurent.pinchart+renesas-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org"
<laurent.pinchart+renesas-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>,
"arnd-r2nGTMty4D4@public.gmane.org"
<arnd-r2nGTMty4D4@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"
<iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org>,
"djkurtz-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org"
<djkurtz-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org>,
"linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org"
<linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org>,
"thunder.leizhen-hv44wF8Li93QT0dZR+AlfA@public.gmane.org"
<thunder.leizhen-hv44wF8Li93QT0dZR+AlfA@public.gmane.org>,
"yingjoe.chen-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org"
<yingjoe.chen-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>,
"treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org"
<treding-DDmLM1+adcrQT0dZR+AlfA@public.gmane.org>
Subject: Re: [PATCH v5 2/3] arm64: Add IOMMU dma_ops
Date: Fri, 07 Aug 2015 16:27:56 +0100 [thread overview]
Message-ID: <55C4CE7C.7050205@arm.com> (raw)
In-Reply-To: <20150807085233.GV14980-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
On 07/08/15 09:52, Joerg Roedel wrote:
> On Fri, Jul 31, 2015 at 06:18:28PM +0100, Robin Murphy wrote:
>> +/*
>> + * TODO: Right now __iommu_setup_dma_ops() gets called too early to do
>> + * everything it needs to - the device isn't yet fully created, and the
>> + * IOMMU driver hasn't seen it yet, so we need this delayed attachment
>> + * dance. Once IOMMU probe ordering is sorted to move the
>> + * arch_setup_dma_ops() call later, all the notifier bits below become
>> + * unnecessary, and will go away.
>> + */
>> +struct iommu_dma_notifier_data {
>> + struct list_head list;
>> + struct device *dev;
>> + struct iommu_domain *dma_domain;
>> +};
>> +static LIST_HEAD(iommu_dma_masters);
>> +static DEFINE_MUTEX(iommu_dma_notifier_lock);
>
> Ugh, thats incredibly ugly. Why can't you do the setup work then the
> iommu driver sees the device? Just call the dma-api setup functions
> there (like the x86 iommu drivers do it too) and be done without any
> notifiers.
As per the comments, the issue here lies in the order in which the
OF/driver core code currently calls things for platform devices: as it
stands we can't attach the device to a domain in arch_setup_dma_ops()
because it doesn't have a group, and we can't even add it to a group
ourselves because it isn't fully created and doesn't exist in sysfs yet.
The only reason arch/arm is currently getting away without this
workaround is that the few IOMMU drivers there hooked up to the generic
infrastructure don't actually mind that they get an attach_device from
arch_setup_dma_ops() before they've even seen an add_device (largely
because they don't care about groups).
Laurent's probe-deferral series largely solves these problems in the
right place - adding identical boilerplate code to every IOMMU driver to
do something they shouldn't have to know about (and don't necessarily
have all the right information for) is exactly what we don't want to do.
As discussed over on another thread, I'm planning to pick that series up
and polish it off after this, but my top priority is getting the basic
dma_ops functionality into arm64 that people need right now. I will be
only too happy when I can submit the patch removing this notifier
workaround ;)
>> +static void __iommu_setup_dma_ops(struct device *dev, u64 dma_base, u64 size,
>> + const struct iommu_ops *ops)
>> +{
>> + struct iommu_domain *domain;
>> + int err;
>> +
>> + if (!ops)
>> + return;
>> + /*
>> + * In a perfect world, everything happened in the right order up to
>> + * here, and the IOMMU core has already attached the device to an
>> + * appropriate default domain for us to set up...
>> + */
>> + domain = iommu_get_domain_for_dev(dev);
>> + if (!domain) {
>> + /*
>> + * Urgh. Reliable default domains for platform devices can't
>> + * happen anyway without some sensible way of handling
>> + * non-trivial groups. So until then, HORRIBLE HACKS!
>> + */
>
> I don't get this, what is preventing to rely on default domains here?
No driver other than the AMD IOMMU has any support yet. Support for
IOMMU_DOMAIN_DMA can easily be added to existing drivers based on patch
1 of this series, but more generally it's not entirely clear how default
domains are going to work beyond x86. On systems like Juno or Seattle
with different sets of masters behind different IOMMU instances (with
limited domain contexts each), the most sensible approach would be to
have a single default domain per IOMMU (spanning domains across
instances would need some hideous synchronisation logic for some
implementations), but the current domain_alloc interface gives us no way
to do that. On something like RK3288 with two different types of IOMMU
on the platform "bus", it breaks down even further as there's no way to
guarantee that iommu_domain_alloc() even gives you a domain from the
right *driver* (hence bypassing it by going through ops directly here).
>
>> + domain = ops->domain_alloc(IOMMU_DOMAIN_DMA);
>
> The IOMMU core should already tried to allocate an IOMMU_DOMAIN_DMA type
> domain. No need to try this again here.
Only for PCI devices, via iommu_group_get_for_pci_dev(). The code here,
however, only runs for platform devices - ops will be always null for a
PCI device since of_iommu_configure() will have bailed out (see the
silly warning removed by my patch you picked up the other day). Once
iommu_group_get_for_dev() supports platform devices, this too can go
away. In the meantime if someone adds PCI support to
of_iommu_configure() and IOMMU_DOMAIN_DMA support to their IOMMU driver,
then we'll get a domain back from iommu_get_domain_for_dev() and just
use that.
Robin.
next prev parent reply other threads:[~2015-08-07 15:27 UTC|newest]
Thread overview: 20+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-07-31 17:18 [PATCH v5 0/3] arm64: IOMMU-backed DMA mapping Robin Murphy
[not found] ` <cover.1438362603.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-07-31 17:18 ` [PATCH v5 1/3] iommu: Implement common IOMMU ops for " Robin Murphy
[not found] ` <6ce6b501501f611297ae0eae31e07b0d2060eaae.1438362603.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-08-03 17:40 ` Catalin Marinas
2015-08-06 15:23 ` Will Deacon
[not found] ` <20150806152327.GH25483-5wv7dgnIgG8@public.gmane.org>
2015-08-06 17:54 ` joro-zLv9SwRftAIdnm+yROfE0A
2015-08-07 8:42 ` Joerg Roedel
[not found] ` <20150807084228.GU14980-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2015-08-07 13:38 ` Robin Murphy
[not found] ` <55C4B4DF.4040608-5wv7dgnIgG8@public.gmane.org>
2015-08-11 9:37 ` Joerg Roedel
[not found] ` <20150811093742.GC14980-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2015-08-11 13:31 ` Robin Murphy
2015-07-31 17:18 ` [PATCH v5 2/3] arm64: Add IOMMU dma_ops Robin Murphy
[not found] ` <8a5abd0a9929aae160ccb74d7a8d9c3698f61910.1438362603.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-08-03 17:33 ` Catalin Marinas
2015-08-07 8:52 ` Joerg Roedel
[not found] ` <20150807085233.GV14980-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2015-08-07 15:27 ` Robin Murphy [this message]
[not found] ` <55C4CE7C.7050205-5wv7dgnIgG8@public.gmane.org>
2015-08-11 9:49 ` Joerg Roedel
[not found] ` <20150811094951.GD14980-zLv9SwRftAIdnm+yROfE0A@public.gmane.org>
2015-08-11 20:15 ` Robin Murphy
2015-09-22 17:12 ` Daniel Kurtz via iommu
[not found] ` <CAGS+omCDYrjpr--+sUzaKCxo12Eff6TC04RgroDgKvxHwK3t2Q-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2015-09-22 18:11 ` Robin Murphy
2015-07-31 17:18 ` [PATCH v5 3/3] arm64: Hook up " Robin Murphy
[not found] ` <caecbce93dd4870995a000bebc8f58d1ca7e551e.1438362603.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2015-08-07 8:55 ` Joerg Roedel
2015-08-26 6:19 ` [PATCH v5 0/3] arm64: IOMMU-backed DMA mapping Yong Wu
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=55C4CE7C.7050205@arm.com \
--to=robin.murphy-5wv7dgnigg8@public.gmane.org \
--cc=Catalin.Marinas-5wv7dgnIgG8@public.gmane.org \
--cc=Will.Deacon-5wv7dgnIgG8@public.gmane.org \
--cc=arnd-r2nGTMty4D4@public.gmane.org \
--cc=djkurtz-hpIqsD4AKlfQT0dZR+AlfA@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=joro-zLv9SwRftAIdnm+yROfE0A@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=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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox