[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC v2 07/22] hw/pci: introduce pci_device_iommu_context()
From: |
Liu Yi L |
Subject: |
[RFC v2 07/22] hw/pci: introduce pci_device_iommu_context() |
Date: |
Thu, 24 Oct 2019 08:34:28 -0400 |
This patch adds pci_device_iommu_context() to get an iommu_context
for a given device. A new callback is added in PCIIOMMUOps. Users
who wants to listen to events issued by vIOMMU could use this new
interface to get an iommu_context and register their own notifiers,
then wait for notifications from vIOMMU. e.g. VFIO is the first user
of it to listen to the PASID_ALLOC/PASID_BIND/CACHE_INV events and
propagate the events to host.
Cc: Kevin Tian <address@hidden>
Cc: Jacob Pan <address@hidden>
Cc: Peter Xu <address@hidden>
Cc: Eric Auger <address@hidden>
Cc: Yi Sun <address@hidden>
Cc: David Gibson <address@hidden>
Signed-off-by: Liu Yi L <address@hidden>
---
hw/pci/pci.c | 16 ++++++++++++++++
include/hw/pci/pci.h | 5 +++++
2 files changed, 21 insertions(+)
diff --git a/hw/pci/pci.c b/hw/pci/pci.c
index b5ce9ca..4e6af06 100644
--- a/hw/pci/pci.c
+++ b/hw/pci/pci.c
@@ -2625,6 +2625,22 @@ AddressSpace *pci_device_iommu_address_space(PCIDevice
*dev)
return &address_space_memory;
}
+IOMMUContext *pci_device_iommu_context(PCIDevice *dev)
+{
+ PCIBus *bus = pci_get_bus(dev);
+ PCIBus *iommu_bus = bus;
+
+ while (iommu_bus && !iommu_bus->iommu_ops && iommu_bus->parent_dev) {
+ iommu_bus = pci_get_bus(iommu_bus->parent_dev);
+ }
+ if (iommu_bus && iommu_bus->iommu_ops &&
+ iommu_bus->iommu_ops->get_iommu_context) {
+ return iommu_bus->iommu_ops->get_iommu_context(bus,
+ iommu_bus->iommu_opaque, dev->devfn);
+ }
+ return NULL;
+}
+
void pci_setup_iommu(PCIBus *bus, const PCIIOMMUOps *ops, void *opaque)
{
bus->iommu_ops = ops;
diff --git a/include/hw/pci/pci.h b/include/hw/pci/pci.h
index d9fed8d..ccada47 100644
--- a/include/hw/pci/pci.h
+++ b/include/hw/pci/pci.h
@@ -9,6 +9,8 @@
#include "hw/pci/pcie.h"
+#include "hw/iommu/iommu.h"
+
extern bool pci_available;
/* PCI bus */
@@ -484,9 +486,12 @@ typedef struct PCIIOMMUOps PCIIOMMUOps;
struct PCIIOMMUOps {
AddressSpace * (*get_address_space)(PCIBus *bus,
void *opaque, int32_t devfn);
+ IOMMUContext * (*get_iommu_context)(PCIBus *bus,
+ void *opaque, int32_t devfn);
};
AddressSpace *pci_device_iommu_address_space(PCIDevice *dev);
+IOMMUContext *pci_device_iommu_context(PCIDevice *dev);
void pci_setup_iommu(PCIBus *bus, const PCIIOMMUOps *iommu_ops, void *opaque);
static inline void
--
2.7.4
- [RFC v2 01/22] update-linux-headers: Import iommu.h, (continued)
- [RFC v2 01/22] update-linux-headers: Import iommu.h, Liu Yi L, 2019/10/24
- [RFC v2 06/22] hw/pci: modify pci_setup_iommu() to set PCIIOMMUOps, Liu Yi L, 2019/10/24
- [RFC v2 09/22] vfio/pci: add iommu_context notifier for pasid alloc/free, Liu Yi L, 2019/10/24
- [RFC v2 10/22] intel_iommu: add virtual command capability support, Liu Yi L, 2019/10/24
- [RFC v2 05/22] vfio/common: add iommu_ctx_notifier in container, Liu Yi L, 2019/10/24
- [RFC v2 03/22] intel_iommu: modify x-scalable-mode to be string option, Liu Yi L, 2019/10/24
- [RFC v2 04/22] hw/iommu: introduce IOMMUContext, Liu Yi L, 2019/10/24
- [RFC v2 07/22] hw/pci: introduce pci_device_iommu_context(),
Liu Yi L <=
- [RFC v2 08/22] intel_iommu: provide get_iommu_context() callback, Liu Yi L, 2019/10/24
- [RFC v2 02/22] header update VFIO/IOMMU vSVA APIs against 5.4.0-rc3+, Liu Yi L, 2019/10/24
- [RFC v2 11/22] intel_iommu: process pasid cache invalidation, Liu Yi L, 2019/10/24
- [RFC v2 12/22] intel_iommu: add present bit check for pasid table entries, Liu Yi L, 2019/10/24
- [RFC v2 14/22] vfio/pci: add iommu_context notifier for pasid bind/unbind, Liu Yi L, 2019/10/24
- [RFC v2 13/22] intel_iommu: add PASID cache management infrastructure, Liu Yi L, 2019/10/24
- [RFC v2 15/22] intel_iommu: bind/unbind guest page table to host, Liu Yi L, 2019/10/24
- [RFC v2 17/22] intel_iommu: replay pasid binds after context cache invalidation, Liu Yi L, 2019/10/24
- [RFC v2 16/22] intel_iommu: replay guest pasid bindings to host, Liu Yi L, 2019/10/24