[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-arm] [RFC v5 7/8] target/arm/kvm: Translate the MSI doorbell in kv
From: |
Eric Auger |
Subject: |
[Qemu-arm] [RFC v5 7/8] target/arm/kvm: Translate the MSI doorbell in kvm_arch_fixup_msi_route |
Date: |
Sun, 9 Jul 2017 22:51:32 +0200 |
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>
---
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 | 28 ++++++++++++++++++++++++++++
target/arm/trace-events | 3 +++
2 files changed, 31 insertions(+)
diff --git a/target/arm/kvm.c b/target/arm/kvm.c
index 4555468..630754f 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"
@@ -611,6 +616,29 @@ 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);
+ IOMMUTLBEntry entry;
+ SMMUDevice *sdev;
+ SMMUV3State *s3;
+ SMMUState *s;
+
+ if (as == &address_space_memory) {
+ return 0;
+ }
+
+ /* MSI doorbell address is translated by an IOMMU */
+ sdev = container_of(as, SMMUDevice, as);
+ s3 = sdev->smmu;
+ s = &s3->smmu_state;
+
+ entry = s->iommu_ops.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.name,
+ entry.translated_addr);
+
return 0;
}
diff --git a/target/arm/trace-events b/target/arm/trace-events
index e21c84f..eff2822 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 %" P
arm_gt_ctl_write(int timer, uint64_t value) "gt_ctl_write: timer %d value %"
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 %" 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
- Re: [Qemu-arm] [RFC v5 1/8] hw/arm/smmu-common: smmu base class, (continued)
- [Qemu-arm] [RFC v5 3/8] hw/arm/virt: Add SMMUv3 to the virt board, Eric Auger, 2017/07/09
- [Qemu-arm] [RFC v5 2/8] hw/arm/smmuv3: smmuv3 emulation model, Eric Auger, 2017/07/09
- [Qemu-arm] [RFC v5 4/8] hw/arm/virt: Add 2.10 machine type, Eric Auger, 2017/07/09
- [Qemu-arm] [RFC v5 5/8] hw/arm/virt-acpi-build: Add smmuv3 node in IORT table, Eric Auger, 2017/07/09
- [Qemu-arm] [RFC v5 6/8] hw/arm/virt: Add tlbi-on-map property to the smmuv3 node, Eric Auger, 2017/07/09
- [Qemu-arm] [RFC v5 7/8] target/arm/kvm: Translate the MSI doorbell in kvm_arch_fixup_msi_route,
Eric Auger <=
- [Qemu-arm] [RFC v5 8/8] hw/arm/smmuv3: VFIO integration, Eric Auger, 2017/07/09
- Message not available
- Re: [Qemu-arm] [RFC v5 0/8] ARM SMMUv3 Emulation Support, Tomasz Nowicki, 2017/07/14