From: "Sricharan" <sricharan-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
To: 'Robin Murphy' <robin.murphy-5wv7dgnIgG8@public.gmane.org>,
will.deacon-5wv7dgnIgG8@public.gmane.org,
joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org,
linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
laurent.pinchart-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org,
m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org,
tfiga-F7+t8E8rja9g9hUCZPvPmw@public.gmane.org,
srinivas.kandagatla-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org
Subject: RE: [PATCH V3 5/8] iommu: of: Handle IOMMU lookup failure with deferred probing or error
Date: Thu, 27 Oct 2016 08:25:43 +0530 [thread overview]
Message-ID: <004a01d22ffd$9fd937d0$df8ba770$@codeaurora.org> (raw)
In-Reply-To: <f08e65b4-f755-897c-f776-40f0d6788251-5wv7dgnIgG8@public.gmane.org>
Hi Robin,
>> From: Laurent Pinchart <laurent.pinchart+renesas-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org>
>>
>> Failures to look up an IOMMU when parsing the DT iommus property need to
>> be handled separately from the .of_xlate() failures to support deferred
>> probing.
>>
>> The lack of a registered IOMMU can be caused by the lack of a driver for
>> the IOMMU, the IOMMU device probe not having been performed yet, having
>> been deferred, or having failed.
>>
>> The first case occurs when the device tree describes the bus master and
>> IOMMU topology correctly but no device driver exists for the IOMMU yet
>> or the device driver has not been compiled in. Return NULL, the caller
>> will configure the device without an IOMMU.
>>
>> The second and third cases are handled by deferring the probe of the bus
>> master device which will eventually get reprobed after the IOMMU.
>>
>> The last case is currently handled by deferring the probe of the bus
>> master device as well. A mechanism to either configure the bus master
>> device without an IOMMU or to fail the bus master device probe depending
>> on whether the IOMMU is optional or mandatory would be a good
>> enhancement.
>>
>> The current iommu framework handles pci and non-pci devices separately,
>> so taken care of both the paths in this patch. The iommu's add_device
>> callback is invoked after the master's configuration data is added in
>> xlate. This is needed because the iommu core calls add_device callback
>> during the BUS_ADD_DEVICE notifier, which is of no use now. Eventually
>> that call has to be removed.
>
>Laurent's signoff seems to have gone missing here.
Ah, preserved his authorship, but missed this. Will add it back.
>
>> Signed-off-by: Sricharan R <sricharan-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
>> ---
>> drivers/iommu/of_iommu.c | 47 +++++++++++++++++++++++++++++++++++++++++++----
>> drivers/of/device.c | 7 ++++++-
>> include/linux/of_device.h | 6 ++++--
>> 3 files changed, 53 insertions(+), 7 deletions(-)
>>
>> diff --git a/drivers/iommu/of_iommu.c b/drivers/iommu/of_iommu.c
>> index 5b82862..1a5e28b 100644
>> --- a/drivers/iommu/of_iommu.c
>> +++ b/drivers/iommu/of_iommu.c
>> @@ -23,6 +23,7 @@
>> #include <linux/of.h>
>> #include <linux/of_iommu.h>
>> #include <linux/of_pci.h>
>> +#include <linux/pci.h>
>> #include <linux/slab.h>
>>
>> static const struct of_device_id __iommu_of_table_sentinel
>> @@ -167,12 +168,29 @@ static const struct iommu_ops
>> return NULL;
>>
>> ops = of_iommu_get_ops(iommu_spec.np);
>> +
>> + if (!ops) {
>> + const struct of_device_id *oid;
>> +
>> + oid = of_match_node(&__iommu_of_table, iommu_spec.np);
>> + ops = oid ? ERR_PTR(-EPROBE_DEFER) : NULL;
>
>It would seem even simpler and more convenient to roll this into the end
>of of_iommu_get_ops():
ok, understand. Will move this there.
>
> if (!ops && of_match_node(&__iommu_of_table, iommu_spec.np))
> ops = ERR_PTR(-EPROBE_DEFER);
>
>then just fix up the existing !ops checks to !IS_ERR(ops) appropriately.
ok.
>
>> + return ops;
>> + }
>> +
>> if (!ops || !ops->of_xlate ||
>> iommu_fwspec_init(&pdev->dev, &iommu_spec.np->fwnode, ops) ||
>> ops->of_xlate(&pdev->dev, &iommu_spec))
>> ops = NULL;
>>
>> + if (ops && ops->add_device) {
>> + ops = (ops->add_device(&pdev->dev) == 0) ? ops : NULL;
>
>This is a really obtuse way of writing
>
> if (ops->add_device(...))
> ops = NULL;
ok, will change it this way.
>
>However, given that we're now returning an ERR_PTR, it would be worth
>capturing the return value of add_device and propagating the error back
>up - if the IOMMU driver has refused one of its masters for some reason,
>it probably isn't safe to allow that device to do DMA either way, so we
>ought to prevent it probing at all.
>
ok, will return the err value instead of NULL here.
>> +
>> + if (!ops)
>> + dev_err(&pdev->dev, "Failed to setup iommu ops\n");
>
>Given the above, I think this should be more along the lines of "Device
>rejected by IOMMU: %d" with the actual error code as well. It's one of
>those "if you ever see it, you're going to have to debug it" cases, so
>the clearer the better.
>
ok, will reword the print.
>> + }
>> +
>> of_node_put(iommu_spec.np);
>> +
>> return ops;
>> }
>>
>> @@ -183,9 +201,15 @@ const struct iommu_ops *of_iommu_configure(struct device *dev,
>> struct device_node *np;
>> const struct iommu_ops *ops = NULL;
>> int idx = 0;
>> + struct device *bridge;
>> +
>> + if (dev_is_pci(dev)) {
>> + bridge = pci_get_host_bridge_device(to_pci_dev(dev));
>>
>> - if (dev_is_pci(dev))
>> - return of_pci_iommu_configure(to_pci_dev(dev), master_np);
>> + if (bridge && bridge->parent && bridge->parent->of_node)
>> + return of_pci_iommu_configure(to_pci_dev(dev),
>> + bridge->parent->of_node);
>
> else fall through to treating it as a platform device?
>
ha, surely wrong. Will correct this and move it to the of_pci_iommu_configure helper.
>...that's not right. Anyway, this is PCI-specific stuff so should be in
>the PCI-specific helper function.
>
>> + }
>>
>> /*
>> * We don't currently walk up the tree looking for a parent IOMMU.
>> @@ -198,6 +222,14 @@ const struct iommu_ops *of_iommu_configure(struct device *dev,
>> np = iommu_spec.np;
>> ops = of_iommu_get_ops(np);
>>
>> + if (!ops) {
>> + const struct of_device_id *oid;
>> +
>> + oid = of_match_node(&__iommu_of_table, np);
>> + ops = oid ? ERR_PTR(-EPROBE_DEFER) : NULL;
>> + goto err_put_node;
>> + }
>
>Same comment as above. Especially since moving it to of_iommu_get_ops()
>would obviate the duplication.
ok.
>
>> +
>> if (!ops || !ops->of_xlate ||
>> iommu_fwspec_init(dev, &np->fwnode, ops) ||
>> ops->of_xlate(dev, &iommu_spec))
>> @@ -207,11 +239,18 @@ const struct iommu_ops *of_iommu_configure(struct device *dev,
>> idx++;
>> }
>>
>> + if (ops && ops->add_device) {
>> + ops = (ops->add_device(dev) == 0) ? ops : NULL;
>> +
>> + if (!ops)
>> + dev_err(dev, "Failed to setup iommu_ops\n");
>> + }
>> +
>
>It would be nice to avoid duplicating this as well.
ok, sure, will correct.
Regards,
Sricharan
next prev parent reply other threads:[~2016-10-27 2:55 UTC|newest]
Thread overview: 59+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <CGME20161004170414eucas1p141bebe16e1bf241862833e7ad0270c72@eucas1p1.samsung.com>
2016-10-04 17:03 ` [PATCH V3 0/8] IOMMU probe deferral support Sricharan R
2016-10-04 17:03 ` [PATCH V3 2/8] of: dma: Move range size workaround to of_dma_get_range() Sricharan R
2016-10-04 17:03 ` [PATCH V3 3/8] of: dma: Make of_dma_deconfigure() public Sricharan R
2016-10-04 17:03 ` [PATCH V3 5/8] iommu: of: Handle IOMMU lookup failure with deferred probing or error Sricharan R
[not found] ` <1475600632-21289-6-git-send-email-sricharan-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2016-10-26 14:52 ` Robin Murphy
[not found] ` <f08e65b4-f755-897c-f776-40f0d6788251-5wv7dgnIgG8@public.gmane.org>
2016-10-27 2:55 ` Sricharan [this message]
2016-10-04 17:03 ` [PATCH V3 7/8] arm/arm64: dma-mapping: Call iommu's remove_device callback during device detach Sricharan R
[not found] ` <1475600632-21289-8-git-send-email-sricharan-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2016-10-26 15:16 ` Robin Murphy
2016-10-27 5:16 ` Sricharan
2016-10-04 17:03 ` [PATCH V3 8/8] arm64: dma-mapping: Remove the notifier trick to handle early setting of dma_ops Sricharan R
[not found] ` <1475600632-21289-9-git-send-email-sricharan-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2016-10-07 15:40 ` Sricharan
2016-10-26 15:34 ` Robin Murphy
2016-10-27 5:19 ` Sricharan
[not found] ` <1475600632-21289-1-git-send-email-sricharan-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2016-10-04 17:03 ` [PATCH V3 1/8] arm: dma-mapping: Don't override dma_ops in arch_setup_dma_ops() Sricharan R
2016-10-04 17:03 ` [PATCH V3 4/8] drivers: platform: Configure dma operations at probe time Sricharan R
2016-10-26 14:07 ` Robin Murphy
2016-10-26 15:04 ` Sricharan
2016-10-27 10:49 ` Lorenzo Pieralisi
2016-11-02 7:05 ` Sricharan
2016-10-04 17:03 ` [PATCH V3 6/8] arm: dma-mapping: Reset the device's dma_ops Sricharan R
2016-10-26 15:07 ` Robin Murphy
[not found] ` <a3d4533f-165d-f444-7681-141479617a18-5wv7dgnIgG8@public.gmane.org>
2016-10-27 3:37 ` Sricharan
2017-05-23 16:25 ` Russell King - ARM Linux
[not found] ` <20170523162507.GA1729-l+eeeJia6m9URfEZ8mYm6t73F7V6hmMc@public.gmane.org>
2017-05-23 16:55 ` Robin Murphy
2017-05-23 17:53 ` Russell King - ARM Linux
[not found] ` <20170523175319.GA22219-l+eeeJia6m9URfEZ8mYm6t73F7V6hmMc@public.gmane.org>
2017-05-23 21:46 ` Laurent Pinchart
2017-05-23 22:42 ` Russell King - ARM Linux
[not found] ` <20170523224216.GI22219-l+eeeJia6m9URfEZ8mYm6t73F7V6hmMc@public.gmane.org>
2017-05-24 10:31 ` Sricharan R
[not found] ` <c4ad7341-fa9f-81b7-a41c-417144c4f842-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>
2017-05-24 11:26 ` Laurent Pinchart
2017-05-24 11:38 ` Sricharan R
2017-05-25 15:05 ` Russell King - ARM Linux
[not found] ` <20170525150540.GJ22219-l+eeeJia6m9URfEZ8mYm6t73F7V6hmMc@public.gmane.org>
2017-05-26 5:18 ` Sricharan R
2017-05-26 14:04 ` Laurent Pinchart
2016-10-10 12:36 ` [PATCH V3 0/8] IOMMU probe deferral support Marek Szyprowski
[not found] ` <12cfb59f-f7ca-d4df-eb7f-42348e357979-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2016-10-12 6:24 ` Sricharan
2016-10-24 6:34 ` Marek Szyprowski
[not found] ` <b9e4e81f-3b3e-951f-df62-d640275aae71-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org>
2016-10-24 12:30 ` Sricharan
2016-10-17 7:02 ` Sricharan
2016-10-17 6:58 ` Sricharan
2016-10-25 6:25 ` Archit Taneja
2016-10-25 14:35 ` Robin Murphy
[not found] ` <60ee8066-f167-e9df-ae3e-4138f1133bad-5wv7dgnIgG8@public.gmane.org>
2016-10-26 14:44 ` Sricharan
2016-10-26 17:14 ` Robin Murphy
[not found] ` <421e2b14-0231-d376-02a0-097423120b3d-5wv7dgnIgG8@public.gmane.org>
2016-10-27 8:37 ` Sricharan
2016-11-03 22:25 ` Sricharan
2016-11-04 15:16 ` Sricharan
2016-11-07 19:13 ` Will Deacon
2016-11-07 19:22 ` Robin Murphy
2016-11-09 6:24 ` Sricharan
2016-11-09 16:59 ` Will Deacon
2016-11-14 3:41 ` Sricharan
2016-11-20 15:11 ` Sricharan
2016-11-23 19:54 ` Robin Murphy
[not found] ` <918128b9-cdb0-1454-000a-146cee7a05ea-5wv7dgnIgG8@public.gmane.org>
2016-11-24 16:10 ` Sricharan
2016-11-24 19:11 ` Robin Murphy
2016-11-28 17:42 ` Sricharan
2016-11-28 18:13 ` Lorenzo Pieralisi
2016-11-30 0:34 ` Sricharan
2016-11-30 12:07 ` Lorenzo Pieralisi
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='004a01d22ffd$9fd937d0$df8ba770$@codeaurora.org' \
--to=sricharan-sgv2jx0feol9jmxxk+q4oq@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org \
--cc=laurent.pinchart-ryLnwIuWjnjg/C1BVhZhaw@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=linux-arm-msm-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=m.szyprowski-Sze3O3UU22JBDgjK7y7TUQ@public.gmane.org \
--cc=robin.murphy-5wv7dgnIgG8@public.gmane.org \
--cc=srinivas.kandagatla-QSEj5FYQhm4dnm+yROfE0A@public.gmane.org \
--cc=tfiga-F7+t8E8rja9g9hUCZPvPmw@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 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).