[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-arm] [PATCH v9 11/14] target/arm/kvm: Translate the MSI doorbell i
From: |
Eric Auger |
Subject: |
[Qemu-arm] [PATCH v9 11/14] target/arm/kvm: Translate the MSI doorbell in kvm_arch_fixup_msi_route |
Date: |
Sat, 17 Feb 2018 19:46:53 +0100 |
In case the MSI is translated by an IOMMU we need to fixup the
MSI route with the translated address.
Signed-off-by: Eric Auger <address@hidden>
---
v5 -> v6:
- use IOMMUMemoryRegionClass API
It is still unclear to me if we need to register an IOMMUNotifier
to handle any change in the MSI doorbell which would occur behind
the scene and would not lead to any call to kvm_arch_fixup_msi_route().
---
target/arm/kvm.c | 27 +++++++++++++++++++++++++++
target/arm/trace-events | 3 +++
2 files changed, 30 insertions(+)
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index 1219d00..9f5976a 100644
--- a/target/arm/kvm.c
+++ b/target/arm/kvm.c
@@ -20,8 +20,13 @@
#include "sysemu/kvm.h"
#include "kvm_arm.h"
#include "cpu.h"
+#include "trace.h"
#include "internals.h"
#include "hw/arm/arm.h"
+#include "hw/pci/pci.h"
+#include "hw/pci/msi.h"
+#include "hw/arm/smmu-common.h"
+#include "hw/arm/smmuv3.h"
#include "exec/memattrs.h"
#include "exec/address-spaces.h"
#include "hw/boards.h"
@@ -666,6 +671,28 @@ int kvm_arm_vgic_probe(void)
int kvm_arch_fixup_msi_route(struct kvm_irq_routing_entry *route,
uint64_t address, uint32_t data, PCIDevice *dev)
{
+ AddressSpace *as = pci_device_iommu_address_space(dev);
+ IOMMUMemoryRegionClass *imrc;
+ IOMMUTLBEntry entry;
+ SMMUDevice *sdev;
+
+ if (as == &address_space_memory) {
+ return 0;
+ }
+
+ /* MSI doorbell address is translated by an IOMMU */
+ sdev = container_of(as, SMMUDevice, as);
+ imrc = IOMMU_MEMORY_REGION_GET_CLASS(&sdev->iommu);
+
+ entry = imrc->translate(&sdev->iommu, address, IOMMU_WO);
+
+ route->u.msi.address_lo = entry.translated_addr;
+ route->u.msi.address_hi = entry.translated_addr >> 32;
+
+ trace_kvm_arm_fixup_msi_route(address, sdev->devfn,
+ sdev->iommu.parent_obj.name,
+ entry.translated_addr);
+
return 0;
}
diff --git a/target/arm/trace-events b/target/arm/trace-events
index 9e37131..8b3c220 100644
--- a/target/arm/trace-events
+++ b/target/arm/trace-events
@@ -8,3 +8,6 @@ arm_gt_tval_write(int timer, uint64_t value) "gt_tval_write:
timer %d value 0x%"
arm_gt_ctl_write(int timer, uint64_t value) "gt_ctl_write: timer %d value 0x%"
PRIx64
arm_gt_imask_toggle(int timer, int irqstate) "gt_ctl_write: timer %d IMASK
toggle, new irqstate %d"
arm_gt_cntvoff_write(uint64_t value) "gt_cntvoff_write: value 0x%" PRIx64
+
+# target/arm/kvm.c
+kvm_arm_fixup_msi_route(uint64_t iova, uint32_t devid, const char *name,
uint64_t gpa) "MSI addr = 0x%"PRIx64" is translated for devfn=%d through %s
into 0x%"PRIx64
--
2.5.5
- [Qemu-arm] [PATCH v9 00/14] ARM SMMUv3 Emulation Support, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 01/14] hw/arm/smmu-common: smmu base device and datatypes, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 02/14] hw/arm/smmu-common: IOMMU memory region and address space setup, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 03/14] hw/arm/smmu-common: VMSAv8-64 page table walk, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 05/14] hw/arm/smmuv3: Wired IRQ and GERROR helpers, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 04/14] hw/arm/smmuv3: Skeleton, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 06/14] hw/arm/smmuv3: Queue helpers, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 07/14] hw/arm/smmuv3: Implement MMIO write operations, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 08/14] hw/arm/smmuv3: Event queue recording helper, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 10/14] hw/arm/smmuv3: Abort on vfio or vhost case, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 11/14] target/arm/kvm: Translate the MSI doorbell in kvm_arch_fixup_msi_route,
Eric Auger <=
- [Qemu-arm] [PATCH v9 09/14] hw/arm/smmuv3: Implement translate callback, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 13/14] hw/arm/virt-acpi-build: Add smmuv3 node in IORT table, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 14/14] hw/arm/virt: Handle iommu in 2.12 machine type, Eric Auger, 2018/02/17
- [Qemu-arm] [PATCH v9 12/14] hw/arm/virt: Add SMMUv3 to the virt board, Eric Auger, 2018/02/17
- Re: [Qemu-arm] [PATCH v9 00/14] ARM SMMUv3 Emulation Support, Peter Maydell, 2018/02/27