[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-Id: <20210919063848.1476776-20-yi.l.liu@intel.com>
Date: Sun, 19 Sep 2021 14:38:47 +0800
From: Liu Yi L <yi.l.liu@...el.com>
To: alex.williamson@...hat.com, jgg@...dia.com, hch@....de,
jasowang@...hat.com, joro@...tes.org
Cc: jean-philippe@...aro.org, kevin.tian@...el.com, parav@...lanox.com,
lkml@...ux.net, pbonzini@...hat.com, lushenming@...wei.com,
eric.auger@...hat.com, corbet@....net, ashok.raj@...el.com,
yi.l.liu@...el.com, yi.l.liu@...ux.intel.com, jun.j.tian@...el.com,
hao.wu@...el.com, dave.jiang@...el.com,
jacob.jun.pan@...ux.intel.com, kwankhede@...dia.com,
robin.murphy@....com, kvm@...r.kernel.org,
iommu@...ts.linux-foundation.org, dwmw2@...radead.org,
linux-kernel@...r.kernel.org, baolu.lu@...ux.intel.com,
david@...son.dropbear.id.au, nicolinc@...dia.com
Subject: [RFC 19/20] iommu/vt-d: Implement device_info iommu_ops callback
From: Lu Baolu <baolu.lu@...ux.intel.com>
Expose per-device IOMMU attributes to the upper layers.
Signed-off-by: Lu Baolu <baolu.lu@...ux.intel.com>
---
drivers/iommu/intel/iommu.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/drivers/iommu/intel/iommu.c b/drivers/iommu/intel/iommu.c
index dd22fc7d5176..d531ea44f418 100644
--- a/drivers/iommu/intel/iommu.c
+++ b/drivers/iommu/intel/iommu.c
@@ -5583,6 +5583,40 @@ static void intel_iommu_iotlb_sync_map(struct iommu_domain *domain,
}
}
+static int
+intel_iommu_device_info(struct device *dev, enum iommu_devattr type, void *data)
+{
+ struct intel_iommu *iommu = device_to_iommu(dev, NULL, NULL);
+ int ret = 0;
+
+ if (!iommu)
+ return -ENODEV;
+
+ switch (type) {
+ case IOMMU_DEV_INFO_PAGE_SIZE:
+ *(u64 *)data = SZ_4K |
+ (cap_super_page_val(iommu->cap) & BIT(0) ? SZ_2M : 0) |
+ (cap_super_page_val(iommu->cap) & BIT(1) ? SZ_1G : 0);
+ break;
+ case IOMMU_DEV_INFO_FORCE_SNOOP:
+ /*
+ * Force snoop is always supported in the scalable mode. For the legacy
+ * mode, check the capability register.
+ */
+ *(bool *)data = sm_supported(iommu) || ecap_sc_support(iommu->ecap);
+ break;
+ case IOMMU_DEV_INFO_ADDR_WIDTH:
+ *(u32 *)data = min_t(u32, agaw_to_width(iommu->agaw),
+ cap_mgaw(iommu->cap));
+ break;
+ default:
+ ret = -EINVAL;
+ break;
+ }
+
+ return ret;
+}
+
const struct iommu_ops intel_iommu_ops = {
.capable = intel_iommu_capable,
.domain_alloc = intel_iommu_domain_alloc,
@@ -5621,6 +5655,7 @@ const struct iommu_ops intel_iommu_ops = {
.sva_get_pasid = intel_svm_get_pasid,
.page_response = intel_svm_page_response,
#endif
+ .device_info = intel_iommu_device_info,
};
static void quirk_iommu_igfx(struct pci_dev *dev)
--
2.25.1
Powered by blists - more mailing lists