From: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
To: Will Deacon <will.deacon-5wv7dgnIgG8@public.gmane.org>
Cc: joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org,
iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org,
lorenzo.pieralisi-5wv7dgnIgG8@public.gmane.org,
thunder.leizhen-hv44wF8Li93QT0dZR+AlfA@public.gmane.org,
jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org
Subject: Re: [PATCH v3 7/9] iommu/arm-smmu: Implement of_xlate() for SMMUv3
Date: Fri, 1 Jul 2016 14:26:08 +0100 [thread overview]
Message-ID: <57766F70.6070704@arm.com> (raw)
In-Reply-To: <20160701123507.GJ12735-5wv7dgnIgG8@public.gmane.org>
On 01/07/16 13:35, Will Deacon wrote:
> On Tue, Jun 28, 2016 at 04:48:26PM +0100, Robin Murphy wrote:
>> Now that we can properly describe the mapping between PCI RIDs and
>> stream IDs via "iommu-map", and have it fed it to the driver
>> automatically via of_xlate(), rework the SMMUv3 driver to benefit from
>> that, and get rid of the current misuse of the "iommus" binding.
>>
>> Since having of_xlate wired up means that masters will now be given the
>> appropriate DMA ops, we also need to make sure that default domains work
>> properly. This necessitates dispensing with the "whole group at a time"
>> notion for attaching to a domain, as devices which share a group get
>> attached to the group's default domain one by one as they are initially
>> probed.
>>
>> Signed-off-by: Robin Murphy <robin.murphy-5wv7dgnIgG8@public.gmane.org>
>> ---
>
> [...]
>
>> static int arm_smmu_add_device(struct device *dev)
>> {
>> int i, ret;
>> - u32 sid, *sids;
>> - struct pci_dev *pdev;
>> - struct iommu_group *group;
>> - struct arm_smmu_group *smmu_group;
>> struct arm_smmu_device *smmu;
>> + struct arm_smmu_master_data *master;
>> + struct iommu_fwspec *fwspec = dev_iommu_fwspec(dev);
>> + struct iommu_group *group;
>>
>> - /* We only support PCI, for now */
>> - if (!dev_is_pci(dev))
>> + if (!fwspec || fwspec->iommu_ops != &arm_smmu_ops)
>> return -ENODEV;
>> -
>> - pdev = to_pci_dev(dev);
>> - group = iommu_group_get_for_dev(dev);
>> - if (IS_ERR(group))
>> - return PTR_ERR(group);
>> -
>> - smmu_group = iommu_group_get_iommudata(group);
>> - if (!smmu_group) {
>> - smmu = arm_smmu_get_for_pci_dev(pdev);
>> - if (!smmu) {
>> - ret = -ENOENT;
>> - goto out_remove_dev;
>> - }
>> -
>> - smmu_group = kzalloc(sizeof(*smmu_group), GFP_KERNEL);
>> - if (!smmu_group) {
>> - ret = -ENOMEM;
>> - goto out_remove_dev;
>> - }
>> -
>> - smmu_group->ste.valid = true;
>> - smmu_group->smmu = smmu;
>> - iommu_group_set_iommudata(group, smmu_group,
>> - __arm_smmu_release_pci_iommudata);
>> + /*
>> + * We _can_ actually withstand dodgy bus code re-calling add_device()
>> + * without an intervening remove_device()/of_xlate() sequence, but
>> + * we're not going to do so quietly...
>> + */
>> + if (WARN_ON_ONCE(fwspec->iommu_priv)) {
>> + master = fwspec->iommu_priv;
>> + smmu = master->smmu;
>> } else {
>> - smmu = smmu_group->smmu;
>> + smmu = arm_smmu_get_by_node(fwspec->iommu_np);
>> + if (!smmu)
>> + return -ENODEV;
>> + master = kzalloc(sizeof(*master), GFP_KERNEL);
>> + if (!master)
>> + return -ENOMEM;
>> +
>> + master->smmu = smmu;
>> + fwspec->iommu_priv = master;
>> }
>>
>> - /* Assume SID == RID until firmware tells us otherwise */
>> - pci_for_each_dma_alias(pdev, __arm_smmu_get_pci_sid, &sid);
>> - for (i = 0; i < smmu_group->num_sids; ++i) {
>> - /* If we already know about this SID, then we're done */
>> - if (smmu_group->sids[i] == sid)
>> - goto out_put_group;
>> + /* Check the SIDs are in range of the SMMU and our stream table */
>> + for (i = 0; i < fwspec->num_ids; i++) {
>> + u32 sid = fwspec->ids[i];
>> +
>> + if (!arm_smmu_sid_in_range(smmu, sid))
>> + return -ERANGE;
>> +
>> + /* Ensure l2 strtab is initialised */
>> + if (smmu->features & ARM_SMMU_FEAT_2_LVL_STRTAB) {
>> + ret = arm_smmu_init_l2_strtab(smmu, sid);
>> + if (ret)
>> + return ret;
>> + }
>> }
>
> Do you not need to do some cleanup here, rather than just returning (same
> for the -ERANGE above)? For example, freeing the master?
The master will be freed in arm_smmu_remove_device() if and when the
device is removed from the bus. By the time we get this add_device call,
we're already past the point of it being added to the bus and there's
nothing we can do (all the return value here actually does is terminate
the notifier chain). By bailing out before assigning the group, though,
we prevent the device from being valid for any VFIO/IOMMU API usage.
That does make me think, however, that it would be worth trying to
detect in arch_setup_dma_ops() if a device has been rejected by an IOMMU
it was supposed to be associated with, and in such cases prevent it from
doing DMA *at all* rather than just leaving it with the default SWIOTLB
ops. I'll have a think about how feasible that is (with any luck it
should slot fairly neatly into the probe ordering work touching those
areas).
Robin.
>
> Will
>
--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2016-07-01 13:26 UTC|newest]
Thread overview: 24+ 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
[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 ` [PATCH v3 2/9] iommu/of: Consolidate device creation workarounds Robin Murphy
[not found] ` <dc8ac0f397ea5c90937fb5c9974e4ab02e264bd8.1467123945.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-07-01 10:22 ` Will Deacon
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
[not found] ` <577651D7.4030309-5wv7dgnIgG8@public.gmane.org>
2016-07-01 12:02 ` Marek Szyprowski
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 ` [PATCH v3 4/9] of/irq: Break out msi-map lookup (again) Robin Murphy
2016-06-28 15:48 ` [PATCH v3 5/9] iommu/of: Handle iommu-map property for PCI Robin Murphy
[not found] ` <17617dff6e7998b91d53ed8a1d6283b1c7bc3470.1467123945.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-07-01 10:31 ` Will Deacon
[not found] ` <20160701103105.GE12735-5wv7dgnIgG8@public.gmane.org>
2016-07-01 11:33 ` Robin Murphy
2016-06-28 15:48 ` [PATCH v3 6/9] iommu/of: Introduce iommu_fwspec Robin Murphy
[not found] ` <227abd6fb43e4163d94673066b4b736d7efaa635.1467123945.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-07-01 10:55 ` Will Deacon
[not found] ` <20160701105505.GH12735-5wv7dgnIgG8@public.gmane.org>
2016-07-01 12:04 ` Robin Murphy
[not found] ` <57765C5E.8010400-5wv7dgnIgG8@public.gmane.org>
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
[not found] ` <6de0ca7795e1b74627ceb55dcefcfd5537f245ce.1467123945.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-07-01 12:35 ` Will Deacon
[not found] ` <20160701123507.GJ12735-5wv7dgnIgG8@public.gmane.org>
2016-07-01 13:26 ` Robin Murphy [this message]
2016-06-28 15:48 ` [PATCH v3 8/9] iommu/arm-smmu: Support non-PCI devices with SMMUv3 Robin Murphy
[not found] ` <19b0d973e170bebfa57157047bf76499de2a6d33.1467123945.git.robin.murphy-5wv7dgnIgG8@public.gmane.org>
2016-07-01 12:40 ` Will Deacon
[not found] ` <20160701124036.GK12735-5wv7dgnIgG8@public.gmane.org>
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
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=57766F70.6070704@arm.com \
--to=robin.murphy-5wv7dgnigg8@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=iommu-cunTk1MwBs9QetFLy7KEm3xJsTq8ys+cHZ5vskTnxNA@public.gmane.org \
--cc=jean-philippe.brucker-5wv7dgnIgG8@public.gmane.org \
--cc=joro-zLv9SwRftAIdnm+yROfE0A@public.gmane.org \
--cc=linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org \
--cc=lorenzo.pieralisi-5wv7dgnIgG8@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 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).