Message ID | 1499927922-32303-2-git-send-email-Bharat.Bhushan@nxp.com |
---|---|
State | New |
Headers | show |
On Thu, Jul 13, 2017 at 12:08:41PM +0530, Bharat Bhushan wrote: > Fix-up MSI address if it translate via virtual iommu. > This code is based on http://patchwork.ozlabs.org/patch/785951/ > > Signed-off-by: Bharat Bhushan <Bharat.Bhushan@nxp.com> Links go dead with time. And following links is hard on reviewers. Please copy the full description tweaking as appropriate and attribute in commit log. > --- > target/arm/kvm.c | 21 +++++++++++++++++++++ > 1 file changed, 21 insertions(+) > > diff --git a/target/arm/kvm.c b/target/arm/kvm.c > index 4555468..eff7e8f 100644 > --- a/target/arm/kvm.c > +++ b/target/arm/kvm.c > @@ -22,6 +22,9 @@ > #include "cpu.h" > #include "internals.h" > #include "hw/arm/arm.h" > +#include "hw/pci/pci.h" > +#include "hw/pci/msi.h" > +#include "hw/virtio/virtio-iommu.h" > #include "exec/memattrs.h" > #include "exec/address-spaces.h" > #include "hw/boards.h" > @@ -611,6 +614,24 @@ 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; > + IOMMUDevice *sdev; > + VirtIOIOMMU *s; > + > + if (as == &address_space_memory) { > + return 0; > + } > + > + /* MSI doorbell address is translated by an IOMMU */ > + sdev = container_of(as, IOMMUDevice, as); > + s = sdev->viommu; > + > + entry = s->iommu_ops.translate(&sdev->iommu_mr, address, IOMMU_WO); > + > + route->u.msi.address_lo = entry.translated_addr; > + route->u.msi.address_hi = entry.translated_addr >> 32; > + > return 0; > } > > -- > 1.9.3
diff --git a/target/arm/kvm.c b/target/arm/kvm.c index 4555468..eff7e8f 100644 --- a/target/arm/kvm.c +++ b/target/arm/kvm.c @@ -22,6 +22,9 @@ #include "cpu.h" #include "internals.h" #include "hw/arm/arm.h" +#include "hw/pci/pci.h" +#include "hw/pci/msi.h" +#include "hw/virtio/virtio-iommu.h" #include "exec/memattrs.h" #include "exec/address-spaces.h" #include "hw/boards.h" @@ -611,6 +614,24 @@ 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; + IOMMUDevice *sdev; + VirtIOIOMMU *s; + + if (as == &address_space_memory) { + return 0; + } + + /* MSI doorbell address is translated by an IOMMU */ + sdev = container_of(as, IOMMUDevice, as); + s = sdev->viommu; + + entry = s->iommu_ops.translate(&sdev->iommu_mr, address, IOMMU_WO); + + route->u.msi.address_lo = entry.translated_addr; + route->u.msi.address_hi = entry.translated_addr >> 32; + return 0; }
Fix-up MSI address if it translate via virtual iommu. This code is based on http://patchwork.ozlabs.org/patch/785951/ Signed-off-by: Bharat Bhushan <Bharat.Bhushan@nxp.com> --- target/arm/kvm.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)