From: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
To: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org>
Cc: devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
thunder.leizhen-hv44wF8Li93QT0dZR+AlfA@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Subject: Re: [PATCH v3 5/9] iommu/of: Handle iommu-map property for PCI
Date: Fri, 1 Jul 2016 12:33:10 +0100 [thread overview]
Message-ID: <577654F6.4040209@arm.com> (raw)
In-Reply-To: <20160701103105.GE12735-5wv7dgnIgG8@public.gmane.org>
On 01/07/16 11:31, Will Deacon wrote:
> On Tue, Jun 28, 2016 at 04:48:24PM +0100, Robin Murphy wrote:
>> Now that we have a way to pick up the RID translation and target IOMMU,
>> hook up of_iommu_configure() to bring PCI devices into the of_xlate
>> mechanism and allow them IOMMU-backed DMA ops without the need for
>> driver-specific handling.
>>
>> Signed-off-by: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
>> ---
>>
>> v3: Use explicit "iommu-map-mask", drop of_device_is_available() check.
>>
>> drivers/iommu/of_iommu.c | 43 ++++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 36 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
>> index 7e6369cffc95..25406a8b9d4e 100644
>> --- a/drivers/iommu/of_iommu.c
>> +++ b/drivers/iommu/of_iommu.c
>> @@ -22,6 +22,7 @@
>> #include <linux/limits.h>
>> #include <linux/of.h>
>> #include <linux/of_iommu.h>
>> +#include <linux/of_pci.h>
>> #include <linux/of_platform.h>
>> #include <linux/slab.h>
>>
>> @@ -138,20 +139,48 @@ const struct iommu_ops *of_iommu_get_ops(struct device_node *np)
>> return ops;
>> }
>>
>> +static int __get_pci_rid(struct pci_dev *pdev, u16 alias, void *data)
>> +{
>> + struct of_phandle_args *iommu_spec = data;
>> +
>> + iommu_spec->args[0] = alias;
>> + return iommu_spec->np == pdev->bus->dev.of_node;
>> +}
>> +
>> const struct iommu_ops *of_iommu_configure(struct device *dev,
>> struct device_node *master_np)
>> {
>> struct of_phandle_args iommu_spec;
>> - struct device_node *np;
>> + struct device_node *np = NULL;
>
> This sets off some alarm bells...
>
>> const struct iommu_ops *ops = NULL;
>> int idx = 0;
>>
>> - /*
>> - * We can't do much for PCI devices without knowing how
>> - * device IDs are wired up from the PCI bus to the IOMMU.
>> - */
>> - if (dev_is_pci(dev))
>> - return NULL;
>> + if (dev_is_pci(dev)) {
>> + /*
>> + * Start by tracing the RID alias down the PCI topology as
>> + * far as the host bridge whose OF node we have...
>> + */
>> + iommu_spec.np = master_np;
>> + pci_for_each_dma_alias(to_pci_dev(dev), __get_pci_rid,
>> + &iommu_spec);
>> + /*
>> + * ...then find out what that becomes once it escapes the PCI
>> + * bus into the system beyond, and which IOMMU it ends up at.
>> + */
>> + if (of_pci_map_rid(master_np, iommu_spec.args[0], "iommu-map",
>> + "iommu-map-mask", &np, iommu_spec.args))
>> + return NULL;
>
> ... because you're assumedly initialising np to NULL in case of_pci_map_rid
> returns 0, but doesn't set np...
Not quite; we're passing &np as the optional "target" argument to
of_pci_map_rid - since that argument is provided, it will either find a
matching translation (and fill in np in the process) or return -EFAULT.
>> +
>> + /* We're not attempting to handle multi-alias devices yet */
>> + iommu_spec.np = np;
>> + iommu_spec.args_count = 1;
>> + ops = of_iommu_get_ops(np);
>
> ... and then we call of_iommu_get_ops(NULL). Does that make any sense?
It would actually work out, since nobody should have registered any ops
for a NULL node, but as above won't happen in practice anyway.
Robin.
>
> Will
>
WARNING: multiple messages have this Message-ID (diff)
From: robin.murphy@arm.com (Robin Murphy)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 5/9] iommu/of: Handle iommu-map property for PCI
Date: Fri, 1 Jul 2016 12:33:10 +0100 [thread overview]
Message-ID: <577654F6.4040209@arm.com> (raw)
In-Reply-To: <20160701103105.GE12735@arm.com>
On 01/07/16 11:31, Will Deacon wrote:
> On Tue, Jun 28, 2016 at 04:48:24PM +0100, Robin Murphy wrote:
>> Now that we have a way to pick up the RID translation and target IOMMU,
>> hook up of_iommu_configure() to bring PCI devices into the of_xlate
>> mechanism and allow them IOMMU-backed DMA ops without the need for
>> driver-specific handling.
>>
>> Signed-off-by: Robin Murphy <robin.murphy@arm.com>
>> ---
>>
>> v3: Use explicit "iommu-map-mask", drop of_device_is_available() check.
>>
>> drivers/iommu/of_iommu.c | 43 ++++++++++++++++++++++++++++++++++++-------
>> 1 file changed, 36 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
>> index 7e6369cffc95..25406a8b9d4e 100644
>> --- a/drivers/iommu/of_iommu.c
>> +++ b/drivers/iommu/of_iommu.c
>> @@ -22,6 +22,7 @@
>> #include <linux/limits.h>
>> #include <linux/of.h>
>> #include <linux/of_iommu.h>
>> +#include <linux/of_pci.h>
>> #include <linux/of_platform.h>
>> #include <linux/slab.h>
>>
>> @@ -138,20 +139,48 @@ const struct iommu_ops *of_iommu_get_ops(struct device_node *np)
>> return ops;
>> }
>>
>> +static int __get_pci_rid(struct pci_dev *pdev, u16 alias, void *data)
>> +{
>> + struct of_phandle_args *iommu_spec = data;
>> +
>> + iommu_spec->args[0] = alias;
>> + return iommu_spec->np == pdev->bus->dev.of_node;
>> +}
>> +
>> const struct iommu_ops *of_iommu_configure(struct device *dev,
>> struct device_node *master_np)
>> {
>> struct of_phandle_args iommu_spec;
>> - struct device_node *np;
>> + struct device_node *np = NULL;
>
> This sets off some alarm bells...
>
>> const struct iommu_ops *ops = NULL;
>> int idx = 0;
>>
>> - /*
>> - * We can't do much for PCI devices without knowing how
>> - * device IDs are wired up from the PCI bus to the IOMMU.
>> - */
>> - if (dev_is_pci(dev))
>> - return NULL;
>> + if (dev_is_pci(dev)) {
>> + /*
>> + * Start by tracing the RID alias down the PCI topology as
>> + * far as the host bridge whose OF node we have...
>> + */
>> + iommu_spec.np = master_np;
>> + pci_for_each_dma_alias(to_pci_dev(dev), __get_pci_rid,
>> + &iommu_spec);
>> + /*
>> + * ...then find out what that becomes once it escapes the PCI
>> + * bus into the system beyond, and which IOMMU it ends up at.
>> + */
>> + if (of_pci_map_rid(master_np, iommu_spec.args[0], "iommu-map",
>> + "iommu-map-mask", &np, iommu_spec.args))
>> + return NULL;
>
> ... because you're assumedly initialising np to NULL in case of_pci_map_rid
> returns 0, but doesn't set np...
Not quite; we're passing &np as the optional "target" argument to
of_pci_map_rid - since that argument is provided, it will either find a
matching translation (and fill in np in the process) or return -EFAULT.
>> +
>> + /* We're not attempting to handle multi-alias devices yet */
>> + iommu_spec.np = np;
>> + iommu_spec.args_count = 1;
>> + ops = of_iommu_get_ops(np);
>
> ... and then we call of_iommu_get_ops(NULL). Does that make any sense?
It would actually work out, since nobody should have registered any ops
for a NULL node, but as above won't happen in practice anyway.
Robin.
>
> Will
>
next prev parent reply other threads:[~2016-07-01 11:33 UTC|newest]
Thread overview: 60+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-06-28 15:48 [PATCH v3 0/9] Generic DT bindings for PCI IOMMUs and ARM SMMUv3 Robin Murphy
2016-06-28 15:48 ` Robin Murphy
[not found] ` <cover.1467123945.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-06-28 15:48 ` [PATCH v3 1/9] arm64: mm: change IOMMU notifier action to attach DMA ops Robin Murphy
2016-06-28 15:48 ` Robin Murphy
2016-06-28 15:48 ` [PATCH v3 2/9] iommu/of: Consolidate device creation workarounds Robin Murphy
2016-06-28 15:48 ` Robin Murphy
[not found] ` <dc8ac0f397ea5c90937fb5c9974e4ab02e264bd8.1467123945.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-07-01 10:22 ` Will Deacon
2016-07-01 10:22 ` Will Deacon
2016-07-01 10:32 ` Marek Szyprowski
2016-07-01 10:32 ` Marek Szyprowski
[not found] ` <611b2a77-e7e8-e1e2-85b5-4f469f3ebdf4-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2016-07-01 11:19 ` Robin Murphy
2016-07-01 11:19 ` Robin Murphy
[not found] ` <577651D7.4030309-5wv7dgnIgG8@public.gmane.org>
2016-07-01 12:02 ` Marek Szyprowski
2016-07-01 12:02 ` Marek Szyprowski
2016-07-01 12:29 ` Will Deacon
2016-07-01 12:29 ` Will Deacon
2016-06-28 15:48 ` [PATCH v3 3/9] Docs: dt: add PCI IOMMU map bindings Robin Murphy
2016-06-28 15:48 ` Robin Murphy
2016-06-28 15:48 ` [PATCH v3 4/9] of/irq: Break out msi-map lookup (again) Robin Murphy
2016-06-28 15:48 ` Robin Murphy
2016-06-28 15:48 ` [PATCH v3 5/9] iommu/of: Handle iommu-map property for PCI Robin Murphy
2016-06-28 15:48 ` Robin Murphy
[not found] ` <17617dff6e7998b91d53ed8a1d6283b1c7bc3470.1467123945.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-07-01 10:31 ` Will Deacon
2016-07-01 10:31 ` Will Deacon
[not found] ` <20160701103105.GE12735-5wv7dgnIgG8@public.gmane.org>
2016-07-01 11:33 ` Robin Murphy [this message]
2016-07-01 11:33 ` Robin Murphy
2016-06-28 15:48 ` [PATCH v3 6/9] iommu/of: Introduce iommu_fwspec Robin Murphy
2016-06-28 15:48 ` Robin Murphy
[not found] ` <227abd6fb43e4163d94673066b4b736d7efaa635.1467123945.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-07-01 10:55 ` Will Deacon
2016-07-01 10:55 ` Will Deacon
[not found] ` <20160701105505.GH12735-5wv7dgnIgG8@public.gmane.org>
2016-07-01 12:04 ` Robin Murphy
2016-07-01 12:04 ` Robin Murphy
[not found] ` <57765C5E.8010400-5wv7dgnIgG8@public.gmane.org>
2016-07-07 16:51 ` Lorenzo Pieralisi
2016-07-07 16:51 ` Lorenzo Pieralisi
2016-06-28 15:48 ` [PATCH v3 7/9] iommu/arm-smmu: Implement of_xlate() for SMMUv3 Robin Murphy
2016-06-28 15:48 ` Robin Murphy
[not found] ` <6de0ca7795e1b74627ceb55dcefcfd5537f245ce.1467123945.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-07-01 12:35 ` Will Deacon
2016-07-01 12:35 ` Will Deacon
[not found] ` <20160701123507.GJ12735-5wv7dgnIgG8@public.gmane.org>
2016-07-01 13:26 ` Robin Murphy
2016-07-01 13:26 ` Robin Murphy
2016-06-28 15:48 ` [PATCH v3 8/9] iommu/arm-smmu: Support non-PCI devices with SMMUv3 Robin Murphy
2016-06-28 15:48 ` Robin Murphy
[not found] ` <19b0d973e170bebfa57157047bf76499de2a6d33.1467123945.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-07-01 12:40 ` Will Deacon
2016-07-01 12:40 ` Will Deacon
[not found] ` <20160701124036.GK12735-5wv7dgnIgG8@public.gmane.org>
2016-07-01 13:05 ` Robin Murphy
2016-07-01 13:05 ` Robin Murphy
2016-06-28 15:48 ` [PATCH v3 9/9] iommu/arm-smmu: Set PRIVCFG in stage 1 STEs Robin Murphy
2016-06-28 15:48 ` Robin Murphy
2016-06-28 16:18 ` [RFC 1/2] iommu/dma: Restrict IOVAs to physical memory layout Robin Murphy
2016-06-28 16:18 ` Robin Murphy
[not found] ` <CALRxmdCuxLPogPTwpn2-B=PU=Ry0eNtgs2z+iZBPYtDc3NX-hQ@mail.gmail.com>
[not found] ` <CALRxmdCuxLPogPTwpn2-B=PU=Ry0eNtgs2z+iZBPYtDc3NX-hQ-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2016-07-01 16:03 ` Stuart Yoder
2016-07-01 16:03 ` Stuart Yoder
[not found] ` <HE1PR04MB1641583BE6AFF39AF1BFCEFB8D250-6LN7OEpIatU5tNmRkpaxD89NdZoXdze2vxpqHgZTriW3zl9H0oFU5g@public.gmane.org>
2016-07-01 16:15 ` Robin Murphy
2016-07-01 16:15 ` Robin Murphy
[not found] ` <57769724.4040801-5wv7dgnIgG8@public.gmane.org>
2016-07-01 17:39 ` Robin Murphy
2016-07-01 17:39 ` Robin Murphy
[not found] ` <5776AAD8.5030704-5wv7dgnIgG8@public.gmane.org>
2016-07-01 18:53 ` Stuart Yoder
2016-07-01 18:53 ` Stuart Yoder
2016-06-28 16:18 ` [RFC 2/2] iommu/dma: Identity-map non-RAM regions Robin Murphy
2016-06-28 16:18 ` Robin Murphy
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=577654F6.4040209@arm.com \
--to=robin.murphy-5wv7dgnigg8@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=thunder.leizhen-hv44wF8Li93QT0dZR+AlfA@public.gmane.org \
--cc=will.deacon-5wv7dgnIgG8@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.