[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v3 11/12] intel_iommu: add framework for PASID Addre
From: |
Liu, Yi L |
Subject: |
[Qemu-devel] [PATCH v3 11/12] intel_iommu: add framework for PASID AddressSpace management |
Date: |
Thu, 1 Mar 2018 18:32:01 +0800 |
This patch introduces a framework to manage PASID tagged AddressSpace
in Intel vIOMMU emulator. PASID tagged AddressSpace is an address sapce
which is an abstract of guest process address space in Qemu. The
management framework is as below:
s->pasid_as_list
/|\ \
/ | \ \
pasid_as_node ...
/|\ \
/ | \ \
device ...
There is a list to store all the PASID tagged AddressSpace, and each
PASID tagged AddressSpace has a device list behind it. This is due to
the fact that a PASID tagged AddressSpace can have multiple devices
binded.
Signed-off-by: Liu, Yi L <address@hidden>
---
hw/i386/intel_iommu.c | 1 +
include/hw/i386/intel_iommu.h | 24 ++++++++++++++++++++++++
2 files changed, 25 insertions(+)
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index d92a66d..b8e8dbb 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -3174,6 +3174,7 @@ static void vtd_realize(DeviceState *dev, Error **errp)
}
QLIST_INIT(&s->notifiers_list);
+ QLIST_INIT(&s->pasid_as_list);
memset(s->vtd_as_by_bus_num, 0, sizeof(s->vtd_as_by_bus_num));
memory_region_init_io(&s->csrmem, OBJECT(s), &vtd_mem_ops, s,
"intel_iommu", DMAR_REG_SIZE);
diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h
index 0b6dc32..c45dbfe 100644
--- a/include/hw/i386/intel_iommu.h
+++ b/include/hw/i386/intel_iommu.h
@@ -61,6 +61,7 @@ typedef struct VTDContextEntry VTDContextEntry;
typedef struct VTDContextCacheEntry VTDContextCacheEntry;
typedef struct IntelIOMMUState IntelIOMMUState;
typedef struct VTDAddressSpace VTDAddressSpace;
+typedef struct VTDPASIDAddressSpace VTDPASIDAddressSpace;
typedef struct VTDIOTLBEntry VTDIOTLBEntry;
typedef struct VTDBus VTDBus;
typedef union VTD_IR_TableEntry VTD_IR_TableEntry;
@@ -69,6 +70,8 @@ typedef struct VTDIrq VTDIrq;
typedef struct VTD_MSIMessage VTD_MSIMessage;
typedef struct IntelIOMMUMRNotifierNode IntelIOMMUMRNotifierNode;
typedef struct IntelIOMMUAssignedDeviceNode IntelIOMMUAssignedDeviceNode;
+typedef struct IntelPASIDNode IntelPASIDNode;
+typedef struct VTDDeviceNode VTDDeviceNode;
/* Context-Entry */
struct VTDContextEntry {
@@ -84,6 +87,20 @@ struct VTDContextCacheEntry {
struct VTDContextEntry context_entry;
};
+struct VTDDeviceNode {
+ PCIBus *bus;
+ uint8_t devfn;
+ QLIST_ENTRY(VTDDeviceNode) next;
+};
+
+struct VTDPASIDAddressSpace {
+ AddressSpace as;
+ IOMMUSVAContext sva_ctx;
+ IntelIOMMUState *iommu_state;
+ /* list of devices binded to a pasid tagged address space */
+ QLIST_HEAD(, VTDDeviceNode) device_list;
+};
+
struct VTDAddressSpace {
PCIBus *bus;
uint8_t devfn;
@@ -264,6 +281,11 @@ struct IntelIOMMUAssignedDeviceNode {
QLIST_ENTRY(IntelIOMMUAssignedDeviceNode) next;
};
+struct IntelPASIDNode {
+ VTDPASIDAddressSpace *pasid_as;
+ QLIST_ENTRY(IntelPASIDNode) next;
+};
+
/* The iommu (DMAR) device state struct */
struct IntelIOMMUState {
X86IOMMUState x86_iommu;
@@ -304,6 +326,8 @@ struct IntelIOMMUState {
QLIST_HEAD(, IntelIOMMUMRNotifierNode) notifiers_list;
/* list of assigned devices */
QLIST_HEAD(, IntelIOMMUAssignedDeviceNode) assigned_device_list;
+ /* list of pasid tagged address space */
+ QLIST_HEAD(, IntelPASIDNode) pasid_as_list;
/* interrupt remapping */
bool intr_enabled; /* Whether guest enabled IR */
--
1.9.1
- [Qemu-devel] [PATCH v3 04/12] vfio/pci: add notify framework based on IOMMUSVAContext, (continued)
- [Qemu-devel] [PATCH v3 04/12] vfio/pci: add notify framework based on IOMMUSVAContext, Liu, Yi L, 2018/03/01
- [Qemu-devel] [PATCH v3 05/12] hw/pci: introduce PCISVAOps to PCIDevice, Liu, Yi L, 2018/03/01
- [Qemu-devel] [PATCH v3 03/12] hw/core: introduce IOMMUSVAContext for virt-SVA, Liu, Yi L, 2018/03/01
- [Qemu-devel] [PATCH v3 01/12] memory: rename existing iommu notifier to be iommu mr notifier, Liu, Yi L, 2018/03/01
- [Qemu-devel] [PATCH v3 06/12] vfio/pci: provide vfio_pci_sva_ops instance, Liu, Yi L, 2018/03/01
- [Qemu-devel] [PATCH v3 07/12] vfio/pci: register sva notifier, Liu, Yi L, 2018/03/01
- [Qemu-devel] [PATCH v3 09/12] intel_iommu: record assigned devices in a list, Liu, Yi L, 2018/03/01
- [Qemu-devel] [PATCH v3 10/12] intel_iommu: bind guest pasid table to host, Liu, Yi L, 2018/03/01
- [Qemu-devel] [PATCH v3 11/12] intel_iommu: add framework for PASID AddressSpace management,
Liu, Yi L <=
- [Qemu-devel] [PATCH v3 08/12] hw/pci: introduce pci_device_notify_iommu(), Liu, Yi L, 2018/03/01
- [Qemu-devel] [PATCH v3 12/12] intel_iommu: bind device to PASID tagged AddressSpace, Liu, Yi L, 2018/03/01
- Re: [Qemu-devel] [PATCH v3 00/12] Introduce new iommu notifier framework for virt-SVA, Michael S. Tsirkin, 2018/03/01
- [Qemu-devel] [PATCH v3 00/12] Introduce new iommu notifier framework for virt-SVA, Liu, Yi L, 2018/03/01
- [Qemu-devel] [PATCH v3 03/12] hw/core: introduce IOMMUSVAContext for virt-SVA, Liu, Yi L, 2018/03/01