All of lore.kernel.org
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: qemu-devel@nongnu.org
Cc: Peter Maydell <peter.maydell@linaro.org>,
	Jan Kiszka <jan.kiszka@siemens.com>, Peter Xu <peterx@redhat.com>,
	Paolo Bonzini <pbonzini@redhat.com>,
	Richard Henderson <rth@twiddle.net>,
	Eduardo Habkost <ehabkost@redhat.com>
Subject: [Qemu-devel] [PULL 27/55] intel_iommu: Add support for Extended Interrupt Mode
Date: Tue, 19 Jul 2016 01:45:25 +0300	[thread overview]
Message-ID: <20160719014525-mutt-send-email-mst@redhat.com> (raw)
In-Reply-To: <1468881010-27229-1-git-send-email-mst@redhat.com>

From: Jan Kiszka <jan.kiszka@siemens.com>

As neither QEMU nor KVM support more than 255 CPUs so far, this is
simple: we only need to switch the destination ID translation in
vtd_remap_irq_get if EIME is set.

Once CFI support is there, it will have to take EIM into account as
well. So far, nothing to do for this.

This patch allows to use x2APIC in split irqchip mode of KVM.

Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
[use le32_to_cpu() to retrieve dest_id]
Signed-off-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
Signed-off-by: Peter Xu <peterx@redhat.com>
---
 hw/i386/intel_iommu_internal.h |  2 ++
 include/hw/i386/intel_iommu.h  |  1 +
 hw/i386/intel_iommu.c          | 16 +++++++++-------
 3 files changed, 12 insertions(+), 7 deletions(-)

diff --git a/hw/i386/intel_iommu_internal.h b/hw/i386/intel_iommu_internal.h
index 10c20fe..72b0114 100644
--- a/hw/i386/intel_iommu_internal.h
+++ b/hw/i386/intel_iommu_internal.h
@@ -176,6 +176,7 @@
 
 /* IRTA_REG */
 #define VTD_IRTA_ADDR_MASK          (VTD_HAW_MASK ^ 0xfffULL)
+#define VTD_IRTA_EIME               (1ULL << 11)
 #define VTD_IRTA_SIZE_MASK          (0xfULL)
 
 /* ECAP_REG */
@@ -184,6 +185,7 @@
 #define VTD_ECAP_QI                 (1ULL << 1)
 /* Interrupt Remapping support */
 #define VTD_ECAP_IR                 (1ULL << 3)
+#define VTD_ECAP_EIM                (1ULL << 4)
 
 /* CAP_REG */
 /* (offset >> 4) << 24 */
diff --git a/include/hw/i386/intel_iommu.h b/include/hw/i386/intel_iommu.h
index e048ced..745b4e7 100644
--- a/include/hw/i386/intel_iommu.h
+++ b/include/hw/i386/intel_iommu.h
@@ -271,6 +271,7 @@ struct IntelIOMMUState {
     bool intr_enabled;              /* Whether guest enabled IR */
     dma_addr_t intr_root;           /* Interrupt remapping table pointer */
     uint32_t intr_size;             /* Number of IR table entries */
+    bool intr_eime;                 /* Extended interrupt mode enabled */
 };
 
 /* Find the VTD Address space associated with the given bus pointer,
diff --git a/hw/i386/intel_iommu.c b/hw/i386/intel_iommu.c
index abd39cb..e96be71 100644
--- a/hw/i386/intel_iommu.c
+++ b/hw/i386/intel_iommu.c
@@ -916,6 +916,7 @@ static void vtd_interrupt_remap_table_setup(IntelIOMMUState *s)
     value = vtd_get_quad_raw(s, DMAR_IRTA_REG);
     s->intr_size = 1UL << ((value & VTD_IRTA_SIZE_MASK) + 1);
     s->intr_root = value & VTD_IRTA_ADDR_MASK;
+    s->intr_eime = value & VTD_IRTA_EIME;
 
     /* Notify global invalidation */
     vtd_iec_notify_all(s, true, 0, 0);
@@ -2060,11 +2061,13 @@ static int vtd_remap_irq_get(IntelIOMMUState *iommu, uint16_t index, VTDIrq *irq
     irq->trigger_mode = irte.trigger_mode;
     irq->vector = irte.vector;
     irq->delivery_mode = irte.delivery_mode;
-    /* Not support EIM yet: please refer to vt-d 9.10 DST bits */
+    irq->dest = le32_to_cpu(irte.dest_id);
+    if (!iommu->intr_eime) {
 #define  VTD_IR_APIC_DEST_MASK         (0xff00ULL)
 #define  VTD_IR_APIC_DEST_SHIFT        (8)
-    irq->dest = (le32_to_cpu(irte.dest_id) & VTD_IR_APIC_DEST_MASK) >> \
-        VTD_IR_APIC_DEST_SHIFT;
+        irq->dest = (irq->dest & VTD_IR_APIC_DEST_MASK) >>
+            VTD_IR_APIC_DEST_SHIFT;
+    }
     irq->dest_mode = irte.dest_mode;
     irq->redir_hint = irte.redir_hint;
 
@@ -2314,7 +2317,7 @@ static void vtd_init(IntelIOMMUState *s)
     s->ecap = VTD_ECAP_QI | VTD_ECAP_IRO;
 
     if (x86_iommu->intr_supported) {
-        s->ecap |= VTD_ECAP_IR;
+        s->ecap |= VTD_ECAP_IR | VTD_ECAP_EIM;
     }
 
     vtd_reset_context_cache(s);
@@ -2368,10 +2371,9 @@ static void vtd_init(IntelIOMMUState *s)
     vtd_define_quad(s, DMAR_FRCD_REG_0_2, 0, 0, 0x8000000000000000ULL);
 
     /*
-     * Interrupt remapping registers, not support extended interrupt
-     * mode for now.
+     * Interrupt remapping registers.
      */
-    vtd_define_quad(s, DMAR_IRTA_REG, 0, 0xfffffffffffff00fULL, 0);
+    vtd_define_quad(s, DMAR_IRTA_REG, 0, 0xfffffffffffff80fULL, 0);
 }
 
 /* Should not reset address_spaces when reset because devices will still use
-- 
MST

  parent reply	other threads:[~2016-07-18 22:45 UTC|newest]

Thread overview: 66+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1468881010-27229-1-git-send-email-mst@redhat.com>
2016-07-18 22:42 ` [Qemu-devel] [PULL 01/55] nvdimm: fix memory leak in error code path Michael S. Tsirkin
2016-07-18 22:42 ` [Qemu-devel] [PULL 02/55] tests/prom-env-test: increase the test timeout Michael S. Tsirkin
2016-07-18 22:42 ` [Qemu-devel] [PULL 03/55] hw/alpha: fix PCI bus initialization Michael S. Tsirkin
2016-07-18 22:42 ` [Qemu-devel] [PULL 04/55] hw/mips: " Michael S. Tsirkin
2016-07-18 22:43 ` [Qemu-devel] [PULL 05/55] hw/apb: " Michael S. Tsirkin
2016-07-18 22:43 ` [Qemu-devel] [PULL 06/55] hw/grackle: " Michael S. Tsirkin
2016-07-18 22:43 ` [Qemu-devel] [PULL 07/55] hw/prep: realize the PCI root bus as part of the prep init Michael S. Tsirkin
2016-07-18 22:43 ` [Qemu-devel] [PULL 08/55] hw/versatile: realize the PCI root bus as part of the versatile init Michael S. Tsirkin
2016-07-18 22:43 ` [Qemu-devel] [PULL 09/55] x86-iommu: introduce parent class Michael S. Tsirkin
2016-07-18 22:43 ` [Qemu-devel] [PULL 10/55] intel_iommu: rename VTD_PCI_DEVFN_MAX to x86-iommu Michael S. Tsirkin
2016-07-18 22:43 ` [Qemu-devel] [PULL 11/55] x86-iommu: provide x86_iommu_get_default Michael S. Tsirkin
2016-07-18 22:43 ` [Qemu-devel] [PULL 12/55] x86-iommu: introduce "intremap" property Michael S. Tsirkin
2016-07-18 22:43 ` [Qemu-devel] [PULL 13/55] acpi: enable INTR for DMAR report structure Michael S. Tsirkin
2016-07-18 22:43 ` [Qemu-devel] [PULL 14/55] intel_iommu: allow queued invalidation for IR Michael S. Tsirkin
2016-07-18 22:43 ` [Qemu-devel] [PULL 15/55] intel_iommu: set IR bit for ECAP register Michael S. Tsirkin
2016-07-18 22:44 ` [Qemu-devel] [PULL 16/55] acpi: add DMAR scope definition for root IOAPIC Michael S. Tsirkin
2016-07-18 22:44 ` [Qemu-devel] [PULL 17/55] intel_iommu: define interrupt remap table addr register Michael S. Tsirkin
2016-07-18 22:44 ` [Qemu-devel] [PULL 18/55] intel_iommu: handle interrupt remap enable Michael S. Tsirkin
2016-07-18 22:44 ` [Qemu-devel] [PULL 19/55] intel_iommu: define several structs for IOMMU IR Michael S. Tsirkin
2016-07-18 22:44 ` [Qemu-devel] [PULL 20/55] intel_iommu: add IR translation faults defines Michael S. Tsirkin
2016-07-18 22:44 ` [Qemu-devel] [PULL 21/55] intel_iommu: Add support for PCI MSI remap Michael S. Tsirkin
2016-07-18 22:44 ` [Qemu-devel] [PULL 22/55] q35: ioapic: add support for emulated IOAPIC IR Michael S. Tsirkin
2016-11-11 17:18   ` Emilio G. Cota
2016-11-11 19:50     ` Emilio G. Cota
2016-11-11 23:17     ` Peter Xu
2016-11-12  2:04       ` Emilio G. Cota
2016-11-12 11:01         ` Alex Bennée
2016-07-18 22:44 ` [Qemu-devel] [PULL 23/55] ioapic: introduce ioapic_entry_parse() helper Michael S. Tsirkin
2016-07-18 22:45 ` [PULL 24/55] intel_iommu: add support for split irqchip Michael S. Tsirkin
2016-07-18 22:45   ` [Qemu-devel] " Michael S. Tsirkin
2016-07-18 22:45 ` [Qemu-devel] [PULL 25/55] x86-iommu: introduce IEC notifiers Michael S. Tsirkin
2016-07-18 22:45 ` [Qemu-devel] [PULL 26/55] ioapic: register IOMMU IEC notifier for ioapic Michael S. Tsirkin
2016-07-18 22:45 ` Michael S. Tsirkin [this message]
2016-07-18 22:45 ` [Qemu-devel] [PULL 28/55] intel_iommu: add SID validation for IR Michael S. Tsirkin
2016-07-18 22:45 ` [PULL 29/55] kvm-irqchip: simplify kvm_irqchip_add_msi_route Michael S. Tsirkin
2016-07-18 22:45   ` [Qemu-devel] " Michael S. Tsirkin
2016-07-18 22:45 ` [PULL 30/55] kvm-irqchip: i386: add hook for add/remove virq Michael S. Tsirkin
2016-07-18 22:45   ` [Qemu-devel] " Michael S. Tsirkin
2016-07-18 22:45 ` [PULL 31/55] kvm-irqchip: x86: add msi route notify fn Michael S. Tsirkin
2016-07-18 22:45   ` [Qemu-devel] " Michael S. Tsirkin
2016-07-18 22:46 ` [PULL 32/55] kvm-irqchip: do explicit commit when update irq Michael S. Tsirkin
2016-07-18 22:46   ` [Qemu-devel] " Michael S. Tsirkin
2016-07-18 22:46 ` [Qemu-devel] [PULL 33/55] intel_iommu: support all masks in interrupt entry cache invalidation Michael S. Tsirkin
2016-07-18 22:46 ` [PULL 34/55] kvm-all: add trace events for kvm irqchip ops Michael S. Tsirkin
2016-07-18 22:46   ` [Qemu-devel] " Michael S. Tsirkin
2016-07-18 22:46 ` [Qemu-devel] [PULL 35/55] intel_iommu: disallow kernel-irqchip=on with IR Michael S. Tsirkin
2016-07-18 22:46 ` [Qemu-devel] [PULL 36/55] virtio: Add typedef for handle_output Michael S. Tsirkin
2016-07-18 22:46 ` [Qemu-devel] [PULL 37/55] virtio: Introduce virtio_add_queue_aio Michael S. Tsirkin
2016-07-18 22:46 ` [Qemu-devel] [PULL 38/55] virtio-blk: Call virtio_add_queue_aio Michael S. Tsirkin
2016-07-18 22:46 ` [Qemu-devel] [PULL 39/55] virtio-scsi: " Michael S. Tsirkin
2016-07-18 22:46 ` [Qemu-devel] [PULL 40/55] Revert "mirror: Workaround for unexpected iohandler events during completion" Michael S. Tsirkin
2016-07-18 22:47 ` [Qemu-devel] [PULL 41/55] virtio-scsi: Replace HandleOutput typedef Michael S. Tsirkin
2016-07-18 22:47 ` [Qemu-devel] [PULL 42/55] virtio-net: Remove old migration version support Michael S. Tsirkin
2016-07-18 22:47 ` [Qemu-devel] [PULL 43/55] virtio-serial: " Michael S. Tsirkin
2016-07-18 22:47 ` [Qemu-devel] [PULL 44/55] virtio: Migration helper function and macro Michael S. Tsirkin
2016-07-18 22:47 ` [Qemu-devel] [PULL 45/55] virtio-scsi: Wrap in vmstate Michael S. Tsirkin
2016-07-18 22:47 ` [Qemu-devel] [PULL 46/55] virtio-blk: " Michael S. Tsirkin
2016-07-18 22:47 ` [Qemu-devel] [PULL 47/55] virtio-rng: " Michael S. Tsirkin
2016-07-18 22:47 ` [Qemu-devel] [PULL 48/55] virtio-balloon: " Michael S. Tsirkin
2016-07-18 22:47 ` [Qemu-devel] [PULL 49/55] virtio-net: " Michael S. Tsirkin
2016-07-18 22:47 ` [Qemu-devel] [PULL 50/55] virtio-serial: " Michael S. Tsirkin
2016-07-18 22:47 ` [Qemu-devel] [PULL 51/55] 9pfs: " Michael S. Tsirkin
2016-07-18 22:48 ` [Qemu-devel] [PULL 52/55] virtio-input: " Michael S. Tsirkin
2016-07-18 22:48 ` [Qemu-devel] [PULL 53/55] virtio-gpu: Use migrate_add_blocker for virgl migration blocking Michael S. Tsirkin
2016-07-18 22:48 ` [Qemu-devel] [PULL 54/55] virtio-gpu: Wrap in vmstate Michael S. Tsirkin
2016-07-18 22:48 ` [Qemu-devel] [PULL 55/55] virtio: Update migration docs Michael S. Tsirkin

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20160719014525-mutt-send-email-mst@redhat.com \
    --to=mst@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=jan.kiszka@siemens.com \
    --cc=pbonzini@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=peterx@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=rth@twiddle.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.