[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v6 19/19] intel_iommu: Check compatibility with host IOMMU capabi
From: |
Zhenzhong Duan |
Subject: |
[PATCH v6 19/19] intel_iommu: Check compatibility with host IOMMU capabilities |
Date: |
Mon, 3 Jun 2024 14:10:23 +0800 |
If check fails, host device (either VFIO or VDPA device) is not
compatible with current vIOMMU config and should not be passed to
guest.
Only aw_bits is checked for now, we don't care other capabilities
before scalable modern mode is introduced.
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
Signed-off-by: Zhenzhong Duan <zhenzhong.duan@intel.com>
---
hw/i386/intel_iommu.c | 29 +++++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index 747c988bc4..d8202a77dd 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -3819,6 +3819,30 @@ VTDAddressSpace *vtd_find_add_as(IntelIOMMUState *s,
PCIBus *bus,
return vtd_dev_as;
}
+static bool vtd_check_hdev(IntelIOMMUState *s, HostIOMMUDevice *hiod,
+ Error **errp)
+{
+ HostIOMMUDeviceClass *hiodc = HOST_IOMMU_DEVICE_GET_CLASS(hiod);
+ int ret;
+
+ if (!hiodc->get_cap) {
+ error_setg(errp, ".get_cap() not implemented");
+ return false;
+ }
+
+ /* Common checks */
+ ret = hiodc->get_cap(hiod, HOST_IOMMU_DEVICE_CAP_AW_BITS, errp);
+ if (ret < 0) {
+ return false;
+ }
+ if (s->aw_bits > ret) {
+ error_setg(errp, "aw-bits %d > host aw-bits %d", s->aw_bits, ret);
+ return false;
+ }
+
+ return true;
+}
+
static bool vtd_dev_set_iommu_device(PCIBus *bus, void *opaque, int devfn,
HostIOMMUDevice *hiod, Error **errp)
{
@@ -3842,6 +3866,11 @@ static bool vtd_dev_set_iommu_device(PCIBus *bus, void
*opaque, int devfn,
return false;
}
+ if (!vtd_check_hdev(s, hiod, errp)) {
+ vtd_iommu_unlock(s);
+ return false;
+ }
+
vtd_hdev = g_malloc0(sizeof(VTDHostIOMMUDevice));
vtd_hdev->bus = bus;
vtd_hdev->devfn = (uint8_t)devfn;
--
2.34.1
- Re: [PATCH v6 18/19] intel_iommu: Implement [set|unset]_iommu_device() callbacks, (continued)
- Re: [PATCH v6 18/19] intel_iommu: Implement [set|unset]_iommu_device() callbacks, Eric Auger, 2024/06/03
- RE: [PATCH v6 18/19] intel_iommu: Implement [set|unset]_iommu_device() callbacks, Duan, Zhenzhong, 2024/06/04
- Re: [PATCH v6 18/19] intel_iommu: Implement [set|unset]_iommu_device() callbacks, Eric Auger, 2024/06/04
- RE: [PATCH v6 18/19] intel_iommu: Implement [set|unset]_iommu_device() callbacks, Duan, Zhenzhong, 2024/06/04
- Re: [PATCH v6 18/19] intel_iommu: Implement [set|unset]_iommu_device() callbacks, Eric Auger, 2024/06/04
Re: [PATCH v6 18/19] intel_iommu: Implement [set|unset]_iommu_device() callbacks, Eric Auger, 2024/06/03
[PATCH v6 17/19] intel_iommu: Extract out vtd_cap_init() to initialize cap/ecap, Zhenzhong Duan, 2024/06/03
[PATCH v6 19/19] intel_iommu: Check compatibility with host IOMMU capabilities,
Zhenzhong Duan <=
Re: [PATCH v6 00/19] Add a host IOMMU device abstraction to check with vIOMMU, Eric Auger, 2024/06/03