[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 3/5] intel_iommu: pass whole remapped addresses
From: |
Igor Mammedov |
Subject: |
Re: [Qemu-devel] [PATCH 3/5] intel_iommu: pass whole remapped addresses to apic |
Date: |
Tue, 27 Sep 2016 15:57:21 +0200 |
On Thu, 22 Sep 2016 23:04:30 +0200
Radim Krčmář <address@hidden> wrote:
> The MMIO interface to APIC only allowed 8 bit addresses, which is not
> enough for 32 bit addresses from EIM remapping.
> Intel stored upper 24 bits in the high MSI address, so use the same
> technique. The technique is also used in KVM MSI interface.
> Other APICs are unlikely to handle those upper bits.
this series applied upto here fixes:
KVM: injection failed, MSI lost (Operation not permitted)
KVM: injection failed, MSI lost (Operation not permitted)
KVM: injection failed, MSI lost (Operation not permitted)
with EMI enabled by default that I've reported
https://lists.gnu.org/archive/html/qemu-devel/2016-09/msg05459.html
>
> Signed-off-by: Radim Krčmář <address@hidden>
> ---
> hw/i386/intel_iommu.c | 18 +++++++-----------
> 1 file changed, 7 insertions(+), 11 deletions(-)
>
> diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
> index 28c31a2cdfa3..1a0961e5cf6a 100644
> --- a/hw/i386/intel_iommu.c
> +++ b/hw/i386/intel_iommu.c
> @@ -31,6 +31,7 @@
> #include "hw/i386/x86-iommu.h"
> #include "hw/pci-host/q35.h"
> #include "sysemu/kvm.h"
> +#include "hw/i386/apic_internal.h"
>
> /*#define DEBUG_INTEL_IOMMU*/
> #ifdef DEBUG_INTEL_IOMMU
> @@ -279,18 +280,16 @@ static void vtd_update_iotlb(IntelIOMMUState *s,
> uint16_t source_id,
> static void vtd_generate_interrupt(IntelIOMMUState *s, hwaddr mesg_addr_reg,
> hwaddr mesg_data_reg)
> {
> - hwaddr addr;
> - uint32_t data;
> + MSIMessage msi;
>
> assert(mesg_data_reg < DMAR_REG_SIZE);
> assert(mesg_addr_reg < DMAR_REG_SIZE);
>
> - addr = vtd_get_long_raw(s, mesg_addr_reg);
> - data = vtd_get_long_raw(s, mesg_data_reg);
> + msi.address = vtd_get_long_raw(s, mesg_addr_reg);
> + msi.data = vtd_get_long_raw(s, mesg_data_reg);
>
> VTD_DPRINTF(FLOG, "msi: addr 0x%"PRIx64 " data 0x%"PRIx32, addr, data);
> - address_space_stl_le(&address_space_memory, addr, data,
> - MEMTXATTRS_UNSPECIFIED, NULL);
> + apic_get_class()->send_msi(&msi);
> }
>
> /* Generate a fault event to software via MSI if conditions are met.
> @@ -2127,6 +2126,7 @@ static void vtd_generate_msi_message(VTDIrq *irq,
> MSIMessage *msg_out)
> msg.dest_mode = irq->dest_mode;
> msg.redir_hint = irq->redir_hint;
> msg.dest = irq->dest;
> + msg.__addr_hi = irq->dest & 0xffffff00;
> msg.__addr_head = cpu_to_le32(0xfee);
> /* Keep this from original MSI address bits */
> msg.__not_used = irq->msi_addr_last_bits;
> @@ -2275,11 +2275,7 @@ static MemTxResult vtd_mem_ir_write(void *opaque,
> hwaddr addr,
> " for device sid 0x%04x",
> to.address, to.data, sid);
>
> - if (dma_memory_write(&address_space_memory, to.address,
> - &to.data, size)) {
> - VTD_DPRINTF(GENERAL, "error: fail to write 0x%"PRIx64
> - " value 0x%"PRIx32, to.address, to.data);
> - }
> + apic_get_class()->send_msi(&to);
>
> return MEMTX_OK;
> }
- [Qemu-devel] [PATCH 0/5] intel_iommu: fix EIM, Radim Krčmář, 2016/09/22
- [Qemu-devel] [PATCH 1/5] apic: add global apic_get_class(), Radim Krčmář, 2016/09/22
- [Qemu-devel] [PATCH 3/5] intel_iommu: pass whole remapped addresses to apic, Radim Krčmář, 2016/09/22
- [Qemu-devel] [PATCH 4/5] intel_iommu: add "eim" property, Radim Krčmář, 2016/09/22
- [Qemu-devel] [PATCH 2/5] apic: add send_msi() to APICCommonClass, Radim Krčmář, 2016/09/22
- [Qemu-devel] [PATCH 5/5] intel_iommu: do not allow EIM without KVM support, Radim Krčmář, 2016/09/22