69 lines
2.1 KiB
Diff
69 lines
2.1 KiB
Diff
|
|
From 494e0ace6c120af00b27a0cc1d4a478073654e35 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Yi Liu <yi.l.liu@intel.com>
|
||
|
|
Date: Thu, 12 Sep 2024 00:33:13 -0700
|
||
|
|
Subject: [PATCH] pci: Get pasid capability from vIOMMU
|
||
|
|
|
||
|
|
Signed-off-by: Yi Liu <yi.l.liu@intel.com>
|
||
|
|
---
|
||
|
|
hw/pci/pci.c | 13 +++++++++++++
|
||
|
|
include/hw/pci/pci.h | 13 +++++++++++++
|
||
|
|
2 files changed, 26 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
|
||
|
|
index d6f627aa51..447ef2b163 100644
|
||
|
|
--- a/hw/pci/pci.c
|
||
|
|
+++ b/hw/pci/pci.c
|
||
|
|
@@ -2802,6 +2802,19 @@ void pci_device_unset_iommu_device(PCIDevice *dev)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
+bool pci_device_get_pasid_cap(PCIDevice *dev)
|
||
|
|
+{
|
||
|
|
+ PCIBus *iommu_bus;
|
||
|
|
+
|
||
|
|
+ pci_device_get_iommu_bus_devfn(dev, &iommu_bus, NULL, NULL);
|
||
|
|
+ if (iommu_bus && iommu_bus->iommu_ops->get_pasid_cap) {
|
||
|
|
+ return iommu_bus->iommu_ops->get_pasid_cap(pci_get_bus(dev),
|
||
|
|
+ iommu_bus->iommu_opaque,
|
||
|
|
+ dev->devfn);
|
||
|
|
+ }
|
||
|
|
+ return false;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
void pci_setup_iommu(PCIBus *bus, const PCIIOMMUOps *ops, void *opaque)
|
||
|
|
{
|
||
|
|
/*
|
||
|
|
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
|
||
|
|
index 8d1af44249..0dfe274c33 100644
|
||
|
|
--- a/include/hw/pci/pci.h
|
||
|
|
+++ b/include/hw/pci/pci.h
|
||
|
|
@@ -418,12 +418,25 @@ typedef struct PCIIOMMUOps {
|
||
|
|
* @devfn: device and function number of the PCI device.
|
||
|
|
*/
|
||
|
|
void (*unset_iommu_device)(PCIBus *bus, void *opaque, int devfn);
|
||
|
|
+ /**
|
||
|
|
+ * @get_pasid_cap: get pasid capability from vIOMMU
|
||
|
|
+ *
|
||
|
|
+ * Optional callback.
|
||
|
|
+ *
|
||
|
|
+ * @bus: the #PCIBus of the PCI device.
|
||
|
|
+ *
|
||
|
|
+ * @opaque: the data passed to pci_setup_iommu().
|
||
|
|
+ *
|
||
|
|
+ * @devfn: device and function number of the PCI device.
|
||
|
|
+ */
|
||
|
|
+ bool (*get_pasid_cap)(PCIBus *bus, void *opaque, int devfn);
|
||
|
|
} PCIIOMMUOps;
|
||
|
|
|
||
|
|
AddressSpace *pci_device_iommu_address_space(PCIDevice *dev);
|
||
|
|
bool pci_device_set_iommu_device(PCIDevice *dev, HostIOMMUDevice *hiod,
|
||
|
|
Error **errp);
|
||
|
|
void pci_device_unset_iommu_device(PCIDevice *dev);
|
||
|
|
+bool pci_device_get_pasid_cap(PCIDevice *dev);
|
||
|
|
|
||
|
|
/**
|
||
|
|
* pci_setup_iommu: Initialize specific IOMMU handlers for a PCIBus
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|