From: "Liu, Yi L" <yi.l.liu@intel.com>
To: kvm@vger.kernel.org, iommu@lists.linux-foundation.org,
alex.williamson@redhat.com, peterx@redhat.com
Cc: jasowang@redhat.com, qemu-devel@nongnu.org, kevin.tian@intel.com,
ashok.raj@intel.com, jacob.jun.pan@intel.com,
tianyu.lan@intel.com, yi.l.liu@intel.com,
jean-philippe.brucker@arm.com,
Jacob Pan <jacob.jun.pan@linux.intel.com>,
"Liu, Yi L" <yi.l.liu@linux.intel.com>
Subject: [RFC PATCH 2/8] iommu/vt-d: add bind_pasid_table function
Date: Wed, 26 Apr 2017 18:11:59 +0800 [thread overview]
Message-ID: <1493201525-14418-3-git-send-email-yi.l.liu@intel.com> (raw)
In-Reply-To: <1493201525-14418-1-git-send-email-yi.l.liu@intel.com>
From: Jacob Pan <jacob.jun.pan@linux.intel.com>
Add Intel VT-d ops to the generic iommu_bind_pasid_table API
functions.
The primary use case is for direct assignment of SVM capable
device. Originated from emulated IOMMU in the guest, the request goes
through many layers (e.g. VFIO). Upon calling host IOMMU driver, caller
passes guest PASID table pointer (GPA) and size.
Device context table entry is modified by Intel IOMMU specific
bind_pasid_table function. This will turn on nesting mode and matching
translation type.
The unbind operation restores default context mapping.
Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
Signed-off-by: Liu, Yi L <yi.l.liu@linux.intel.com>
---
drivers/iommu/intel-iommu.c | 103 ++++++++++++++++++++++++++++++++++++++++++
include/linux/dma_remapping.h | 1 +
2 files changed, 104 insertions(+)
diff --git a/drivers/iommu/intel-iommu.c b/drivers/iommu/intel-iommu.c
index 646756c..6d5b939 100644
--- a/drivers/iommu/intel-iommu.c
+++ b/drivers/iommu/intel-iommu.c
@@ -5306,6 +5306,105 @@ struct intel_iommu *intel_svm_device_to_iommu(struct device *dev)
return iommu;
}
+
+static int intel_iommu_bind_pasid_table(struct iommu_domain *domain,
+ struct device *dev, struct pasid_table_info *pasidt_binfo)
+{
+ struct intel_iommu *iommu;
+ struct context_entry *context;
+ struct dmar_domain *dmar_domain = to_dmar_domain(domain);
+ struct device_domain_info *info;
+ u8 bus, devfn;
+ u16 did, *sid;
+ int ret = 0;
+ unsigned long flags;
+ u64 ctx_lo;
+
+ if (pasidt_binfo == NULL || pasidt_binfo->model != INTEL_IOMMU) {
+ pr_warn("%s: Invalid bind request!\n", __func__);
+ return -EINVAL;
+ }
+
+ iommu = device_to_iommu(dev, &bus, &devfn);
+ if (!iommu)
+ return -ENODEV;
+
+ sid = (u16 *)&pasidt_binfo->opaque;
+ /* check SID, if it is not correct, return */
+ if (PCI_DEVID(bus, devfn) != *sid)
+ return 0;
+
+ info = dev->archdata.iommu;
+ if (!info || !info->pasid_supported) {
+ pr_err("Device %d:%d.%d has no pasid support\n", bus,
+ PCI_SLOT(devfn), PCI_FUNC(devfn));
+ ret = -EINVAL;
+ goto out;
+ }
+
+ if (pasidt_binfo->size >= intel_iommu_get_pts(iommu)) {
+ pr_err("Invalid gPASID table size %llu, host size %lu\n",
+ pasidt_binfo->size,
+ intel_iommu_get_pts(iommu));
+ ret = -EINVAL;
+ goto out;
+ }
+ spin_lock_irqsave(&iommu->lock, flags);
+ context = iommu_context_addr(iommu, bus, devfn, 0);
+ if (!context || !context_present(context)) {
+ pr_warn("%s: ctx not present for bus devfn %x:%x\n",
+ __func__, bus, devfn);
+ spin_unlock_irqrestore(&iommu->lock, flags);
+ goto out;
+ }
+ /* Anticipate guest to use SVM and owns the first level */
+ ctx_lo = context[0].lo;
+ ctx_lo |= CONTEXT_NESTE;
+ ctx_lo |= CONTEXT_PRS;
+ ctx_lo |= CONTEXT_PASIDE;
+ ctx_lo &= ~CONTEXT_TT_MASK;
+ ctx_lo |= CONTEXT_TT_DEV_IOTLB << 2;
+ context[0].lo = ctx_lo;
+
+ /* Assign guest PASID table pointer and size */
+ ctx_lo = (pasidt_binfo->ptr & VTD_PAGE_MASK) | pasidt_binfo->size;
+ context[1].lo = ctx_lo;
+ /* make sure context entry is updated before flushing */
+ wmb();
+ did = dmar_domain->iommu_did[iommu->seq_id];
+ iommu->flush.flush_context(iommu, did,
+ (((u16)bus) << 8) | devfn,
+ DMA_CCMD_MASK_NOBIT,
+ DMA_CCMD_DEVICE_INVL);
+ iommu->flush.flush_iotlb(iommu, did, 0, 0, DMA_TLB_DSI_FLUSH);
+ spin_unlock_irqrestore(&iommu->lock, flags);
+
+
+out:
+ return ret;
+}
+
+static int intel_iommu_unbind_pasid_table(struct iommu_domain *domain,
+ struct device *dev)
+{
+ struct intel_iommu *iommu;
+ struct dmar_domain *dmar_domain = to_dmar_domain(domain);
+ u8 bus, devfn;
+
+ iommu = device_to_iommu(dev, &bus, &devfn);
+ if (!iommu)
+ return -ENODEV;
+ /*
+ * REVISIT: we might want to clear the PASID table pointer
+ * as part of context clear operation. Currently, it leaves
+ * stale data but should be ignored by hardware since PASIDE
+ * is clear.
+ */
+ /* ATS will be reenabled when remapping is restored */
+ pci_disable_ats(to_pci_dev(dev));
+ domain_context_clear(iommu, dev);
+ return domain_context_mapping_one(dmar_domain, iommu, bus, devfn);
+}
#endif /* CONFIG_INTEL_IOMMU_SVM */
static const struct iommu_ops intel_iommu_ops = {
@@ -5314,6 +5413,10 @@ struct intel_iommu *intel_svm_device_to_iommu(struct device *dev)
.domain_free = intel_iommu_domain_free,
.attach_dev = intel_iommu_attach_device,
.detach_dev = intel_iommu_detach_device,
+#ifdef CONFIG_INTEL_IOMMU_SVM
+ .bind_pasid_table = intel_iommu_bind_pasid_table,
+ .unbind_pasid_table = intel_iommu_unbind_pasid_table,
+#endif
.map = intel_iommu_map,
.unmap = intel_iommu_unmap,
.map_sg = default_iommu_map_sg,
diff --git a/include/linux/dma_remapping.h b/include/linux/dma_remapping.h
index 187c102..c03b62a 100644
--- a/include/linux/dma_remapping.h
+++ b/include/linux/dma_remapping.h
@@ -27,6 +27,7 @@
#define CONTEXT_DINVE (1ULL << 8)
#define CONTEXT_PRS (1ULL << 9)
+#define CONTEXT_NESTE (1ULL << 10)
#define CONTEXT_PASIDE (1ULL << 11)
struct intel_iommu;
--
1.9.1
next prev parent reply other threads:[~2017-04-26 10:11 UTC|newest]
Thread overview: 61+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-04-26 10:11 [RFC PATCH 0/8] Shared Virtual Memory virtualization for VT-d Liu, Yi L
2017-04-26 10:11 ` [RFC PATCH 1/8] iommu: Introduce bind_pasid_table API function Liu, Yi L
2017-04-26 16:56 ` Jean-Philippe Brucker
[not found] ` <c042bf90-d48b-4ebf-c01a-fca7c4875277-5wv7dgnIgG8@public.gmane.org>
2017-04-26 18:29 ` jacob pan
[not found] ` <20170426112948.00004520-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-04-26 18:59 ` Jean-Philippe Brucker
2017-04-28 9:04 ` [Qemu-devel] " Liu, Yi L
2017-04-28 12:51 ` Jean-Philippe Brucker
[not found] ` <3adb4e33-db96-4133-0510-412c3bfb24fe-5wv7dgnIgG8@public.gmane.org>
2017-05-23 7:50 ` Liu, Yi L
2017-05-25 12:33 ` Jean-Philippe Brucker
2017-04-27 6:36 ` Liu, Yi L
2017-04-27 10:12 ` Jean-Philippe Brucker
[not found] ` <772ca9de-50ba-a379-002d-5ff1f6a2e297-5wv7dgnIgG8@public.gmane.org>
2017-04-28 7:59 ` [Qemu-devel] " Liu, Yi L
[not found] ` <1493201525-14418-2-git-send-email-yi.l.liu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-05-12 21:59 ` Alex Williamson
[not found] ` <20170512155914.73bad777-1yVPhWWZRC1BDLzU/O5InQ@public.gmane.org>
2017-05-14 10:56 ` Liu, Yi L
2017-04-26 10:11 ` Liu, Yi L [this message]
[not found] ` <1493201525-14418-3-git-send-email-yi.l.liu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-05-12 21:59 ` [RFC PATCH 2/8] iommu/vt-d: add bind_pasid_table function Alex Williamson
[not found] ` <20170512155929.66809113-1yVPhWWZRC1BDLzU/O5InQ@public.gmane.org>
2017-05-15 13:14 ` jacob pan
2017-04-26 10:12 ` [RFC PATCH 3/8] iommu: Introduce iommu do invalidate API function Liu, Yi L
[not found] ` <1493201525-14418-4-git-send-email-yi.l.liu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-05-12 21:59 ` Alex Williamson
[not found] ` <20170512155924.755ee17f-1yVPhWWZRC1BDLzU/O5InQ@public.gmane.org>
2017-05-17 10:23 ` Liu, Yi L
2017-04-26 10:12 ` [RFC PATCH 4/8] iommu/vt-d: Add iommu do invalidate function Liu, Yi L
[not found] ` <1493201525-14418-5-git-send-email-yi.l.liu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-05-12 21:59 ` Alex Williamson
[not found] ` <20170512155918.5251fb94-1yVPhWWZRC1BDLzU/O5InQ@public.gmane.org>
2017-05-17 10:24 ` Liu, Yi L
2017-04-26 10:12 ` [RFC PATCH 5/8] VFIO: Add new IOTCL for PASID Table bind propagation Liu, Yi L
2017-04-26 16:56 ` Jean-Philippe Brucker
2017-04-27 5:43 ` [Qemu-devel] " Liu, Yi L
[not found] ` <1493201525-14418-6-git-send-email-yi.l.liu-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org>
2017-05-11 10:29 ` Liu, Yi L
2017-05-12 21:58 ` Alex Williamson
[not found] ` <20170512155851.627409ed-1yVPhWWZRC1BDLzU/O5InQ@public.gmane.org>
2017-05-17 10:27 ` [Qemu-devel] " Liu, Yi L
[not found] ` <20170517102759.GF22110-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-05-18 11:29 ` Jean-Philippe Brucker
2017-04-26 10:12 ` [RFC PATCH 6/8] VFIO: do pasid table binding Liu, Yi L
2017-05-09 7:55 ` Xiao Guangrong
2017-05-11 10:29 ` [Qemu-devel] " Liu, Yi L
2017-05-12 21:59 ` Alex Williamson
2017-04-26 10:12 ` [RFC PATCH 7/8] VFIO: Add new IOCTL for IOMMU TLB invalidate propagation Liu, Yi L
2017-05-12 12:11 ` Jean-Philippe Brucker
[not found] ` <cc330a8f-e087-9b6f-2a40-38b58688d300-5wv7dgnIgG8@public.gmane.org>
2017-05-14 10:12 ` Liu, Yi L
2017-05-15 12:14 ` Jean-Philippe Brucker
2017-07-02 10:06 ` [Qemu-devel] " Liu, Yi L
2017-07-03 11:52 ` Jean-Philippe Brucker
[not found] ` <0e4f2dd4-d553-b1b7-7bec-fe0ff5242c54-5wv7dgnIgG8@public.gmane.org>
2017-07-03 10:31 ` Liu, Yi L
[not found] ` <20170703103115.GB22053-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-07-05 6:45 ` Tian, Kevin
[not found] ` <AADFC41AFE54684AB9EE6CBC0274A5D190D25919-0J0gbvR4kThpB2pF5aRoyrfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2017-07-05 12:42 ` Jean-Philippe Brucker
[not found] ` <1d63c1ae-ca10-0f9d-91de-0d9c9823c104-5wv7dgnIgG8@public.gmane.org>
2017-07-05 17:28 ` Alex Williamson
[not found] ` <20170705112816.56554f65-DGNDKt5SQtizQB+pC5nmwQ@public.gmane.org>
2017-07-05 22:26 ` Tian, Kevin
2017-07-14 8:58 ` Liu, Yi L
[not found] ` <A2975661238FB949B60364EF0F2C2574390A7C4F-E2R4CRU6q/6iAffOGbnezLfspsVTdybXVpNB7YpNyf8@public.gmane.org>
2017-07-14 18:15 ` Alex Williamson
[not found] ` <20170714121555.7e64d849-DGNDKt5SQtizQB+pC5nmwQ@public.gmane.org>
2017-07-17 10:58 ` Liu, Yi L
2017-07-17 22:45 ` Alex Williamson
[not found] ` <20170717164515.2491b3bf-DGNDKt5SQtizQB+pC5nmwQ@public.gmane.org>
2017-07-18 9:38 ` Jean-Philippe Brucker
[not found] ` <d0abeefc-adcf-85c3-f5d9-8c90a18f8011-5wv7dgnIgG8@public.gmane.org>
2017-07-18 14:29 ` Alex Williamson
2017-07-18 15:03 ` Jean-Philippe Brucker
2017-07-19 10:45 ` Liu, Yi L
2017-07-19 21:50 ` Jacob Pan
2017-07-05 22:31 ` Tian, Kevin
2017-05-12 21:58 ` Alex Williamson
2017-05-14 10:55 ` Liu, Yi L
[not found] ` <20170514105507.GB22110-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2017-07-05 5:32 ` Tian, Kevin
2017-04-26 10:12 ` [RFC PATCH 8/8] VFIO: do IOMMU TLB invalidation from guest Liu, Yi L
2017-05-08 4:09 ` [RFC PATCH 0/8] Shared Virtual Memory virtualization for VT-d Xiao Guangrong
2017-05-07 7:33 ` [Qemu-devel] " Liu, Yi L
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=1493201525-14418-3-git-send-email-yi.l.liu@intel.com \
--to=yi.l.liu@intel.com \
--cc=alex.williamson@redhat.com \
--cc=ashok.raj@intel.com \
--cc=iommu@lists.linux-foundation.org \
--cc=jacob.jun.pan@intel.com \
--cc=jacob.jun.pan@linux.intel.com \
--cc=jasowang@redhat.com \
--cc=jean-philippe.brucker@arm.com \
--cc=kevin.tian@intel.com \
--cc=kvm@vger.kernel.org \
--cc=peterx@redhat.com \
--cc=qemu-devel@nongnu.org \
--cc=tianyu.lan@intel.com \
--cc=yi.l.liu@linux.intel.com \
/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).