From: Liu Yi L <yi.l.liu@intel.com> To: alex.williamson@redhat.com, eric.auger@redhat.com, baolu.lu@linux.intel.com, joro@8bytes.org Cc: kevin.tian@intel.com, jacob.jun.pan@linux.intel.com, ashok.raj@intel.com, yi.l.liu@intel.com, jun.j.tian@intel.com, yi.y.sun@intel.com, jean-philippe@linaro.org, peterx@redhat.com, jasowang@redhat.com, hao.wu@intel.com, stefanha@gmail.com, iommu@lists.linux-foundation.org, kvm@vger.kernel.org, jgg@nvidia.com, Lingshan.Zhu@intel.com, vivek.gautam@arm.com Subject: [Patch v8 10/10] iommu/vt-d: Support reporting nesting capability info Date: Wed, 3 Mar 2021 04:35:45 +0800 [thread overview] Message-ID: <20210302203545.436623-11-yi.l.liu@intel.com> (raw) In-Reply-To: <20210302203545.436623-1-yi.l.liu@intel.com> This patch reports nesting info when iommu_domain_get_attr() is called with DOMAIN_ATTR_NESTING and one domain with nesting set. Cc: Kevin Tian <kevin.tian@intel.com> CC: Jacob Pan <jacob.jun.pan@linux.intel.com> Cc: Alex Williamson <alex.williamson@redhat.com> Cc: Eric Auger <eric.auger@redhat.com> Cc: Jean-Philippe Brucker <jean-philippe@linaro.org> Cc: Joerg Roedel <joro@8bytes.org> Cc: Lu Baolu <baolu.lu@linux.intel.com> Signed-off-by: Liu Yi L <yi.l.liu@intel.com> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> --- v7 -> v8: *) tweak per latest code base v6 -> v7: *) split the patch in v6 into two patches: [PATCH v7 15/16] iommu/vt-d: Only support nesting when nesting caps are consistent across iommu units [PATCH v7 16/16] iommu/vt-d: Support reporting nesting capability info v2 -> v3: *) remove cap/ecap_mask in iommu_nesting_info. --- drivers/iommu/intel/cap_audit.h | 7 ++++ drivers/iommu/intel/iommu.c | 68 ++++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/intel/cap_audit.h b/drivers/iommu/intel/cap_audit.h index 74cfccae0e81..787e98282a02 100644 --- a/drivers/iommu/intel/cap_audit.h +++ b/drivers/iommu/intel/cap_audit.h @@ -60,6 +60,13 @@ #define ECAP_QI_MASK BIT_ULL(1) #define ECAP_C_MASK BIT_ULL(0) +/* Capabilities related to nested translation */ +#define VTD_CAP_MASK (CAP_FL1GP_MASK | CAP_FL5LP_MASK) + +#define VTD_ECAP_MASK (ECAP_PRS_MASK | ECAP_ERS_MASK | \ + ECAP_SRS_MASK | ECAP_EAFS_MASK | \ + ECAP_PASID_MASK) + /* * u64 intel_iommu_cap_sanity, intel_iommu_ecap_sanity will be adjusted as each * IOMMU gets audited. diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index 4409d86b4e18..f7432fb1c6ea 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -5508,13 +5508,79 @@ static bool domain_use_flush_queue(void) return r; } +static int intel_iommu_get_nesting_info(struct iommu_domain *domain, + struct iommu_nesting_info *info) +{ + struct dmar_domain *dmar_domain = to_dmar_domain(domain); + u64 cap = VTD_CAP_MASK, ecap = VTD_ECAP_MASK; + struct device_domain_info *domain_info; + struct iommu_nesting_info_vtd vtd; + unsigned int size; + + if (!info) + return -EINVAL; + + if (!(dmar_domain->flags & DOMAIN_FLAG_NESTING_MODE)) + return -ENODEV; + + size = sizeof(struct iommu_nesting_info); + /* + * if provided buffer size is smaller than expected, should + * return 0 and also the expected buffer size to caller. + */ + if (info->argsz < size) { + info->argsz = size; + return 0; + } + + /* + * arbitrary select the first domain_info as all nesting + * related capabilities should be consistent across iommu + * units. + */ + domain_info = list_first_entry(&dmar_domain->devices, + struct device_domain_info, link); + cap &= domain_info->iommu->cap; + ecap &= domain_info->iommu->ecap; + + info->addr_width = dmar_domain->gaw; + info->format = IOMMU_PASID_FORMAT_INTEL_VTD; + info->features = IOMMU_NESTING_FEAT_BIND_PGTBL | + IOMMU_NESTING_FEAT_CACHE_INVLD; + info->pasid_bits = ilog2(intel_pasid_max_id); + memset(&info->padding, 0x0, 12); + + vtd.flags = 0; + memset(&vtd.padding, 0x0, 12); + vtd.cap_reg = cap & VTD_CAP_MASK; + vtd.ecap_reg = ecap & VTD_ECAP_MASK; + + memcpy(&info->vendor.vtd, &vtd, sizeof(vtd)); + return 0; +} + static int intel_iommu_domain_get_attr(struct iommu_domain *domain, enum iommu_attr attr, void *data) { switch (domain->type) { case IOMMU_DOMAIN_UNMANAGED: - return -ENODEV; + switch (attr) { + case DOMAIN_ATTR_NESTING: + { + struct iommu_nesting_info *info = + (struct iommu_nesting_info *)data; + unsigned long flags; + int ret; + + spin_lock_irqsave(&device_domain_lock, flags); + ret = intel_iommu_get_nesting_info(domain, info); + spin_unlock_irqrestore(&device_domain_lock, flags); + return ret; + } + default: + return -ENODEV; + } case IOMMU_DOMAIN_DMA: switch (attr) { case DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE: -- 2.25.1
WARNING: multiple messages have this Message-ID (diff)
From: Liu Yi L <yi.l.liu@intel.com> To: alex.williamson@redhat.com, eric.auger@redhat.com, baolu.lu@linux.intel.com, joro@8bytes.org Cc: jean-philippe@linaro.org, kevin.tian@intel.com, ashok.raj@intel.com, kvm@vger.kernel.org, stefanha@gmail.com, jun.j.tian@intel.com, iommu@lists.linux-foundation.org, vivek.gautam@arm.com, yi.y.sun@intel.com, jgg@nvidia.com, Lingshan.Zhu@intel.com, jasowang@redhat.com, hao.wu@intel.com Subject: [Patch v8 10/10] iommu/vt-d: Support reporting nesting capability info Date: Wed, 3 Mar 2021 04:35:45 +0800 [thread overview] Message-ID: <20210302203545.436623-11-yi.l.liu@intel.com> (raw) In-Reply-To: <20210302203545.436623-1-yi.l.liu@intel.com> This patch reports nesting info when iommu_domain_get_attr() is called with DOMAIN_ATTR_NESTING and one domain with nesting set. Cc: Kevin Tian <kevin.tian@intel.com> CC: Jacob Pan <jacob.jun.pan@linux.intel.com> Cc: Alex Williamson <alex.williamson@redhat.com> Cc: Eric Auger <eric.auger@redhat.com> Cc: Jean-Philippe Brucker <jean-philippe@linaro.org> Cc: Joerg Roedel <joro@8bytes.org> Cc: Lu Baolu <baolu.lu@linux.intel.com> Signed-off-by: Liu Yi L <yi.l.liu@intel.com> Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com> --- v7 -> v8: *) tweak per latest code base v6 -> v7: *) split the patch in v6 into two patches: [PATCH v7 15/16] iommu/vt-d: Only support nesting when nesting caps are consistent across iommu units [PATCH v7 16/16] iommu/vt-d: Support reporting nesting capability info v2 -> v3: *) remove cap/ecap_mask in iommu_nesting_info. --- drivers/iommu/intel/cap_audit.h | 7 ++++ drivers/iommu/intel/iommu.c | 68 ++++++++++++++++++++++++++++++++- 2 files changed, 74 insertions(+), 1 deletion(-) diff --git a/drivers/iommu/intel/cap_audit.h b/drivers/iommu/intel/cap_audit.h index 74cfccae0e81..787e98282a02 100644 --- a/drivers/iommu/intel/cap_audit.h +++ b/drivers/iommu/intel/cap_audit.h @@ -60,6 +60,13 @@ #define ECAP_QI_MASK BIT_ULL(1) #define ECAP_C_MASK BIT_ULL(0) +/* Capabilities related to nested translation */ +#define VTD_CAP_MASK (CAP_FL1GP_MASK | CAP_FL5LP_MASK) + +#define VTD_ECAP_MASK (ECAP_PRS_MASK | ECAP_ERS_MASK | \ + ECAP_SRS_MASK | ECAP_EAFS_MASK | \ + ECAP_PASID_MASK) + /* * u64 intel_iommu_cap_sanity, intel_iommu_ecap_sanity will be adjusted as each * IOMMU gets audited. diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c index 4409d86b4e18..f7432fb1c6ea 100644 --- a/drivers/iommu/intel/iommu.c +++ b/drivers/iommu/intel/iommu.c @@ -5508,13 +5508,79 @@ static bool domain_use_flush_queue(void) return r; } +static int intel_iommu_get_nesting_info(struct iommu_domain *domain, + struct iommu_nesting_info *info) +{ + struct dmar_domain *dmar_domain = to_dmar_domain(domain); + u64 cap = VTD_CAP_MASK, ecap = VTD_ECAP_MASK; + struct device_domain_info *domain_info; + struct iommu_nesting_info_vtd vtd; + unsigned int size; + + if (!info) + return -EINVAL; + + if (!(dmar_domain->flags & DOMAIN_FLAG_NESTING_MODE)) + return -ENODEV; + + size = sizeof(struct iommu_nesting_info); + /* + * if provided buffer size is smaller than expected, should + * return 0 and also the expected buffer size to caller. + */ + if (info->argsz < size) { + info->argsz = size; + return 0; + } + + /* + * arbitrary select the first domain_info as all nesting + * related capabilities should be consistent across iommu + * units. + */ + domain_info = list_first_entry(&dmar_domain->devices, + struct device_domain_info, link); + cap &= domain_info->iommu->cap; + ecap &= domain_info->iommu->ecap; + + info->addr_width = dmar_domain->gaw; + info->format = IOMMU_PASID_FORMAT_INTEL_VTD; + info->features = IOMMU_NESTING_FEAT_BIND_PGTBL | + IOMMU_NESTING_FEAT_CACHE_INVLD; + info->pasid_bits = ilog2(intel_pasid_max_id); + memset(&info->padding, 0x0, 12); + + vtd.flags = 0; + memset(&vtd.padding, 0x0, 12); + vtd.cap_reg = cap & VTD_CAP_MASK; + vtd.ecap_reg = ecap & VTD_ECAP_MASK; + + memcpy(&info->vendor.vtd, &vtd, sizeof(vtd)); + return 0; +} + static int intel_iommu_domain_get_attr(struct iommu_domain *domain, enum iommu_attr attr, void *data) { switch (domain->type) { case IOMMU_DOMAIN_UNMANAGED: - return -ENODEV; + switch (attr) { + case DOMAIN_ATTR_NESTING: + { + struct iommu_nesting_info *info = + (struct iommu_nesting_info *)data; + unsigned long flags; + int ret; + + spin_lock_irqsave(&device_domain_lock, flags); + ret = intel_iommu_get_nesting_info(domain, info); + spin_unlock_irqrestore(&device_domain_lock, flags); + return ret; + } + default: + return -ENODEV; + } case IOMMU_DOMAIN_DMA: switch (attr) { case DOMAIN_ATTR_DMA_USE_FLUSH_QUEUE: -- 2.25.1 _______________________________________________ iommu mailing list iommu@lists.linux-foundation.org https://lists.linuxfoundation.org/mailman/listinfo/iommu
next prev parent reply other threads:[~2021-03-02 16:07 UTC|newest] Thread overview: 40+ messages / expand[flat|nested] mbox.gz Atom feed top 2021-03-02 20:35 [Patch v8 00/10] vfio: expose virtual Shared Virtual Addressing to VMs Liu Yi L 2021-03-02 20:35 ` Liu Yi L 2021-03-02 20:35 ` [Patch v8 01/10] iommu: Report domain nesting info Liu Yi L 2021-03-02 20:35 ` Liu Yi L 2021-03-02 20:35 ` [Patch v8 02/10] iommu/smmu: Report empty " Liu Yi L 2021-03-02 20:35 ` Liu Yi L 2021-03-02 20:35 ` [Patch v8 03/10] vfio/type1: Report iommu nesting info to userspace Liu Yi L 2021-03-02 20:35 ` Liu Yi L 2021-03-02 12:52 ` Jason Gunthorpe 2021-03-02 12:52 ` Jason Gunthorpe 2021-03-03 9:53 ` Liu, Yi L 2021-03-03 9:53 ` Liu, Yi L 2021-03-02 20:35 ` [Patch v8 04/10] vfio/type1: Support binding guest page tables to PASID Liu Yi L 2021-03-02 20:35 ` Liu Yi L 2021-03-02 12:56 ` Jason Gunthorpe 2021-03-02 12:56 ` Jason Gunthorpe 2021-03-02 17:13 ` Jacob Pan 2021-03-02 17:13 ` Jacob Pan 2021-03-02 17:15 ` Jason Gunthorpe 2021-03-02 17:15 ` Jason Gunthorpe 2021-03-03 19:42 ` Jacob Pan 2021-03-03 19:42 ` Jacob Pan 2021-03-03 19:45 ` Jason Gunthorpe 2021-03-03 19:45 ` Jason Gunthorpe 2021-03-04 7:20 ` Liu, Yi L 2021-03-04 7:20 ` Liu, Yi L 2021-03-04 12:52 ` Jason Gunthorpe 2021-03-04 12:52 ` Jason Gunthorpe 2021-03-02 20:35 ` [Patch v8 05/10] vfio/type1: Allow invalidating first-level/stage IOMMU cache Liu Yi L 2021-03-02 20:35 ` Liu Yi L 2021-03-02 20:35 ` [Patch v8 06/10] iommu: Pass domain to sva_unbind_gpasid() Liu Yi L 2021-03-02 20:35 ` Liu Yi L 2021-03-02 20:35 ` [Patch v8 07/10] vfio/type1: Add vSVA support for IOMMU-backed mdevs Liu Yi L 2021-03-02 20:35 ` Liu Yi L 2021-03-02 20:35 ` [Patch v8 08/10] vfio/pci: Expose PCIe PASID capability to userspace Liu Yi L 2021-03-02 20:35 ` Liu Yi L 2021-03-02 20:35 ` [Patch v8 09/10] vfio: Document dual stage control Liu Yi L 2021-03-02 20:35 ` Liu Yi L 2021-03-02 20:35 ` Liu Yi L [this message] 2021-03-02 20:35 ` [Patch v8 10/10] iommu/vt-d: Support reporting nesting capability info 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=20210302203545.436623-11-yi.l.liu@intel.com \ --to=yi.l.liu@intel.com \ --cc=Lingshan.Zhu@intel.com \ --cc=alex.williamson@redhat.com \ --cc=ashok.raj@intel.com \ --cc=baolu.lu@linux.intel.com \ --cc=eric.auger@redhat.com \ --cc=hao.wu@intel.com \ --cc=iommu@lists.linux-foundation.org \ --cc=jacob.jun.pan@linux.intel.com \ --cc=jasowang@redhat.com \ --cc=jean-philippe@linaro.org \ --cc=jgg@nvidia.com \ --cc=joro@8bytes.org \ --cc=jun.j.tian@intel.com \ --cc=kevin.tian@intel.com \ --cc=kvm@vger.kernel.org \ --cc=peterx@redhat.com \ --cc=stefanha@gmail.com \ --cc=vivek.gautam@arm.com \ --cc=yi.y.sun@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: linkBe 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.