[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-arm] [RFC PATCH 1/2] target/arm/kvm: Translate the MSI doorbel
From: |
Michael S. Tsirkin |
Subject: |
Re: [Qemu-arm] [RFC PATCH 1/2] target/arm/kvm: Translate the MSI doorbell in kvm_arch_fixup_msi_route |
Date: |
Thu, 13 Jul 2017 19:10:38 +0300 |
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 <address@hidden>
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