From: "Michael S. Tsirkin" <mst@redhat.com>
To: Paul Brook <paul@codesourcery.com>, Avi Kivity <avi@redhat.com>,
qemu-devel@nongnu.org, Carsten Otte <cotte@de.ibm.com>,
kvm@vger.kernel.org, Rusty Russell <rusty@rustcorp.com.au>,
virtualization@lists.linux-foundation.org,
Christian Borntraeger <borntraeger@de.ibm.com>,
Blue Swirl <blauwirbel@gmail.com>,
Anthony Liguori <anthony@codemonkey.ws>
Subject: [Qemu-devel] [PATCHv3 07/13] qemu: minimal MSI/MSI-X implementation for PC
Date: Fri, 5 Jun 2009 13:23:47 +0300 [thread overview]
Message-ID: <20090605102347.GH26770@redhat.com> (raw)
In-Reply-To: <cover.1244192535.git.mst@redhat.com>
Implement MSI support in APIC. Note that MSI and MMIO APIC registers
are at the same memory location, but actually not on the global bus: MSI
is on PCI bus, APIC is connected directly to the CPU. We map them on the
global bus at the same address which happens to work because MSI
registers are reserved in APIC MMIO and vice versa.
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
hw/apic.c | 43 +++++++++++++++++++++++++++++++++++++++----
1 files changed, 39 insertions(+), 4 deletions(-)
diff --git a/hw/apic.c b/hw/apic.c
index 8c8b2de..ed03a36 100644
--- a/hw/apic.c
+++ b/hw/apic.c
@@ -19,6 +19,8 @@
*/
#include "hw.h"
#include "pc.h"
+#include "pci.h"
+#include "msix.h"
#include "qemu-timer.h"
#include "host-utils.h"
@@ -63,6 +65,19 @@
#define MAX_APICS 255
#define MAX_APIC_WORDS 8
+/* Intel APIC constants: from include/asm/msidef.h */
+#define MSI_DATA_VECTOR_SHIFT 0
+#define MSI_DATA_VECTOR_MASK 0x000000ff
+#define MSI_DATA_DELIVERY_MODE_SHIFT 8
+#define MSI_DATA_TRIGGER_SHIFT 15
+#define MSI_DATA_LEVEL_SHIFT 14
+#define MSI_ADDR_DEST_MODE_SHIFT 2
+#define MSI_ADDR_DEST_ID_SHIFT 12
+#define MSI_ADDR_DEST_ID_MASK 0x00ffff0
+
+#define MSI_ADDR_BASE 0xfee00000
+#define MSI_ADDR_SIZE 0x100000
+
typedef struct APICState {
CPUState *cpu_env;
uint32_t apicbase;
@@ -712,11 +727,31 @@ static uint32_t apic_mem_readl(void *opaque, target_phys_addr_t addr)
return val;
}
+static void apic_send_msi(target_phys_addr_t addr, uint32 data)
+{
+ uint8_t dest = (addr & MSI_ADDR_DEST_ID_MASK) >> MSI_ADDR_DEST_ID_SHIFT;
+ uint8_t vector = (data & MSI_DATA_VECTOR_MASK) >> MSI_DATA_VECTOR_SHIFT;
+ uint8_t dest_mode = (addr >> MSI_ADDR_DEST_MODE_SHIFT) & 0x1;
+ uint8_t trigger_mode = (data >> MSI_DATA_TRIGGER_SHIFT) & 0x1;
+ uint8_t delivery = (data >> MSI_DATA_DELIVERY_MODE_SHIFT) & 0x7;
+ /* XXX: Ignore redirection hint. */
+ apic_deliver_irq(dest, dest_mode, delivery, vector, 0, trigger_mode);
+}
+
static void apic_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
{
CPUState *env;
APICState *s;
- int index;
+ int index = (addr >> 4) & 0xff;
+ if (addr > 0xfff || !index) {
+ /* MSI and MMIO APIC are at the same memory location,
+ * but actually not on the global bus: MSI is on PCI bus
+ * APIC is connected directly to the CPU.
+ * Mapping them on the global bus happens to work because
+ * MSI registers are reserved in APIC MMIO and vice versa. */
+ apic_send_msi(addr, val);
+ return;
+ }
env = cpu_single_env;
if (!env)
@@ -727,7 +762,6 @@ static void apic_mem_writel(void *opaque, target_phys_addr_t addr, uint32_t val)
printf("APIC write: %08x = %08x\n", (uint32_t)addr, val);
#endif
- index = (addr >> 4) & 0xff;
switch(index) {
case 0x02:
s->id = (val >> 24);
@@ -911,6 +945,7 @@ int apic_init(CPUState *env)
s->cpu_env = env;
apic_reset(s);
+ msix_supported = 1;
/* XXX: mapping more APICs at the same memory location */
if (apic_io_memory == 0) {
@@ -918,7 +953,8 @@ int apic_init(CPUState *env)
on the global memory bus. */
apic_io_memory = cpu_register_io_memory(0, apic_mem_read,
apic_mem_write, NULL);
- cpu_register_physical_memory(s->apicbase & ~0xfff, 0x1000,
+ /* XXX: what if the base changes? */
+ cpu_register_physical_memory(MSI_ADDR_BASE, MSI_ADDR_SIZE,
apic_io_memory);
}
s->timer = qemu_new_timer(vm_clock, apic_timer, s);
@@ -929,4 +965,3 @@ int apic_init(CPUState *env)
local_apics[s->id] = s;
return 0;
}
-
--
1.6.3.1.56.g79e1.dirty
next prev parent reply other threads:[~2009-06-05 10:26 UTC|newest]
Thread overview: 184+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <cover.1244192535.git.mst@redhat.com>
2009-06-05 10:22 ` [Qemu-devel] [PATCHv3 01/13] qemu: make default_write_config use mask table Michael S. Tsirkin
2009-06-05 10:23 ` [Qemu-devel] [PATCHv3 02/13] qemu: capability bits in pci save/restore Michael S. Tsirkin
2009-06-05 10:23 ` [Qemu-devel] [PATCHv3 03/13] qemu: add routines to manage PCI capabilities Michael S. Tsirkin
2009-06-09 17:11 ` Glauber Costa
2009-06-10 9:54 ` Michael S. Tsirkin
2009-06-10 14:55 ` Glauber Costa
2009-06-10 15:01 ` Michael S. Tsirkin
2009-06-10 15:24 ` Paul Brook
2009-06-10 15:50 ` Michael S. Tsirkin
2009-06-10 17:43 ` Jamie Lokier
2009-06-10 18:22 ` Michael S. Tsirkin
2009-06-10 19:27 ` Jamie Lokier
2009-06-12 8:43 ` Configuration vs. compat hints [was Re: [Qemu-devel] [PATCHv3 03/13] qemu: add routines to manage PCI capabilities] Mark McLoughlin
2009-06-12 13:59 ` Michael S. Tsirkin
2009-06-12 14:48 ` Mark McLoughlin
2009-06-12 14:51 ` Anthony Liguori
2009-06-12 15:41 ` Mark McLoughlin
2009-06-12 16:11 ` Anthony Liguori
2009-06-12 16:48 ` Mark McLoughlin
2009-06-12 17:00 ` Anthony Liguori
2009-06-12 17:31 ` Mark McLoughlin
2009-06-12 17:44 ` Blue Swirl
2009-06-12 17:55 ` Mark McLoughlin
2009-06-16 18:38 ` Jamie Lokier
2009-06-14 9:50 ` Michael S. Tsirkin
2009-06-15 9:08 ` Mark McLoughlin
2009-06-15 9:27 ` Avi Kivity
2009-06-15 10:32 ` Michael S. Tsirkin
2009-06-15 10:44 ` Gleb Natapov
2009-06-15 10:46 ` Michael S. Tsirkin
2009-06-15 10:52 ` Gleb Natapov
2009-06-15 11:07 ` Michael S. Tsirkin
2009-06-15 11:14 ` Gleb Natapov
2009-06-15 11:34 ` Michael S. Tsirkin
2009-06-15 11:27 ` Avi Kivity
2009-06-15 11:48 ` Michael S. Tsirkin
2009-06-15 11:56 ` Avi Kivity
2009-06-15 12:41 ` Michael S. Tsirkin
2009-06-15 12:50 ` Avi Kivity
2009-06-15 12:52 ` Anthony Liguori
2009-06-15 13:09 ` Avi Kivity
2009-06-15 13:23 ` Anthony Liguori
2009-06-15 13:42 ` Avi Kivity
2009-06-15 13:51 ` Anthony Liguori
2009-06-15 14:06 ` Dor Laor
2009-06-15 14:24 ` Anthony Liguori
2009-06-15 14:37 ` Michael S. Tsirkin
2009-06-15 15:03 ` Anthony Liguori
2009-06-15 15:08 ` Daniel P. Berrange
2009-06-15 15:12 ` Dor Laor
2009-06-15 15:15 ` Avi Kivity
2009-06-16 18:32 ` Jamie Lokier
2009-06-17 6:38 ` Avi Kivity
2009-06-17 11:51 ` Jamie Lokier
2009-06-15 16:27 ` Mark McLoughlin
2009-06-15 17:13 ` Avi Kivity
2009-06-15 15:05 ` Avi Kivity
2009-06-15 15:11 ` Anthony Liguori
2009-06-15 16:27 ` Mark McLoughlin
2009-06-15 17:09 ` Avi Kivity
2009-06-15 18:12 ` Anthony Liguori
2009-06-15 18:21 ` Avi Kivity
2009-06-15 18:24 ` Anthony Liguori
2009-06-15 18:44 ` Blue Swirl
2009-06-16 8:56 ` Avi Kivity
2009-06-16 12:14 ` Mark McLoughlin
2009-06-16 12:28 ` Avi Kivity
2009-06-16 12:39 ` Mark McLoughlin
2009-06-16 12:51 ` Avi Kivity
2009-06-16 18:44 ` Jamie Lokier
2009-06-17 8:33 ` Mark McLoughlin
2009-06-17 9:03 ` Avi Kivity
2009-06-17 9:18 ` Mark McLoughlin
2009-06-17 9:26 ` Avi Kivity
2009-06-17 11:58 ` Jamie Lokier
2009-06-24 8:04 ` Dietmar Maurer
2009-07-07 11:08 ` [Qemu-devel] [PATCH 0/3] Change virtio blk/console PCI classes and introduce compat machine type [was Re: Configuration vs. compat hints] Mark McLoughlin
2009-07-07 11:09 ` [Qemu-devel] [PATCH 1/3] Change default PCI class of virtio-blk to PCI_CLASS_STORAGE_SCSI Mark McLoughlin
2009-07-07 11:09 ` [Qemu-devel] [PATCH 2/3] Change default PCI class of virtio-console to PCI_CLASS_SERIAL_OTHER Mark McLoughlin
2009-07-07 11:10 ` [Qemu-devel] [PATCH 3/3] Add a pc-0-10 machine type for compatibility with 0.10.x Mark McLoughlin
2009-07-07 12:01 ` Avi Kivity
2009-07-08 10:46 ` Mark McLoughlin
2009-07-08 10:48 ` [Qemu-devel] [PATCH 3/3 v2] " Mark McLoughlin
2009-07-08 13:00 ` Gerd Hoffmann
2009-07-08 13:44 ` Anthony Liguori
2009-07-08 14:09 ` Gerd Hoffmann
2009-07-08 15:08 ` Mark McLoughlin
2009-07-08 19:07 ` Gerd Hoffmann
2009-07-08 21:45 ` Anthony Liguori
2009-07-09 7:56 ` Gerd Hoffmann
2009-07-09 8:39 ` Mark McLoughlin
2009-07-09 8:50 ` Avi Kivity
2009-07-09 8:57 ` Mark McLoughlin
2009-07-09 9:04 ` Avi Kivity
2009-07-09 9:05 ` Gerd Hoffmann
2009-07-09 10:01 ` Gerd Hoffmann
2009-07-09 13:31 ` Mark McLoughlin
2009-07-09 13:47 ` Gerd Hoffmann
2009-07-09 13:35 ` Anthony Liguori
2009-07-09 13:55 ` Gerd Hoffmann
2009-07-09 16:09 ` Paul Brook
2009-07-09 11:51 ` Avi Kivity
2009-07-09 13:29 ` Anthony Liguori
2009-07-09 13:59 ` Avi Kivity
2009-07-09 15:00 ` Anthony Liguori
2009-07-21 14:21 ` [Qemu-devel] [PATCH 0/4] Add pc-0.11 machine type and make pc an alias to it Mark McLoughlin
2009-07-21 14:21 ` [Qemu-devel] [PATCH 1/4] Remove the pc-0-10 machine type Mark McLoughlin
2009-07-21 14:49 ` Mark McLoughlin
2009-07-22 2:14 ` Anthony Liguori
2009-07-22 8:56 ` Gerd Hoffmann
2009-07-22 9:05 ` Mark McLoughlin
2009-07-22 9:02 ` Mark McLoughlin
2009-07-22 9:02 ` [Qemu-devel] [PATCH 1/2] Add machine type aliases Mark McLoughlin
2009-07-22 9:02 ` [Qemu-devel] [PATCH 2/2] Add a pc-0.11 machine type and make the pc type an alias Mark McLoughlin
2009-07-23 13:34 ` Mark McLoughlin
2009-07-21 14:21 ` [Qemu-devel] [PATCH 2/4] Remove the virtio-{blk, console}-pci-0-10 device types Mark McLoughlin
2009-07-21 14:21 ` [Qemu-devel] [PATCH 3/4] Add machine type aliases Mark McLoughlin
2009-07-21 14:21 ` [Qemu-devel] [PATCH 4/4] Add a pc-0.11 machine type and make the pc type an alias Mark McLoughlin
2009-07-09 8:00 ` [Qemu-devel] [PATCH 3/3 v2] Add a pc-0-10 machine type for compatibility with 0.10.x Avi Kivity
2009-07-15 11:27 ` [Qemu-devel] [PATCH 2/3] Change default PCI class of virtio-console to PCI_CLASS_SERIAL_OTHER Amit Shah
2009-06-15 11:35 ` [Qemu-devel] Re: Configuration vs. compat hints Markus Armbruster
2009-06-15 11:43 ` Avi Kivity
2009-06-15 11:59 ` Stefano Stabellini
2009-06-15 12:41 ` Markus Armbruster
2009-06-15 12:50 ` Anthony Liguori
2009-06-15 14:23 ` Javier Guerra
2009-06-15 12:41 ` Configuration vs. compat hints [was Re: [Qemu-devel] [PATCHv3 03/13] qemu: add routines to manage PCI capabilities] Anthony Liguori
2009-06-15 12:55 ` Avi Kivity
2009-06-15 13:04 ` [Qemu-devel] Re: Configuration vs. compat hints Markus Armbruster
2009-06-15 9:43 ` Configuration vs. compat hints [was Re: [Qemu-devel] [PATCHv3 03/13] qemu: add routines to manage PCI capabilities] Avi Kivity
2009-06-15 10:29 ` Michael S. Tsirkin
2009-06-15 12:45 ` Anthony Liguori
2009-06-15 13:03 ` Avi Kivity
2009-06-15 13:20 ` Anthony Liguori
2009-06-15 13:35 ` Avi Kivity
2009-06-15 13:45 ` Anthony Liguori
2009-06-15 13:54 ` Avi Kivity
2009-06-15 15:07 ` Anthony Liguori
2009-06-15 15:11 ` Avi Kivity
2009-06-15 15:20 ` Anthony Liguori
2009-06-15 15:26 ` Avi Kivity
2009-06-15 13:17 ` Gerd Hoffmann
2009-06-14 7:55 ` Avi Kivity
2009-06-12 14:55 ` Anthony Liguori
2009-06-12 15:53 ` Mark McLoughlin
2009-06-12 16:12 ` Anthony Liguori
2009-06-12 16:48 ` Mark McLoughlin
2009-06-14 7:58 ` Avi Kivity
2009-06-15 5:32 ` [Qemu-devel] Re: Configuration vs. compat hints Markus Armbruster
2009-06-15 9:09 ` Configuration vs. compat hints [was Re: [Qemu-devel] [PATCHv3 03/13] qemu: add routines to manage PCI capabilities] Mark McLoughlin
2009-06-15 11:32 ` Avi Kivity
2009-06-15 12:48 ` Anthony Liguori
2009-06-15 13:12 ` Avi Kivity
2009-06-15 13:24 ` Anthony Liguori
2009-06-15 13:43 ` Avi Kivity
2009-06-15 14:00 ` Mark McLoughlin
2009-06-15 14:20 ` Anthony Liguori
2009-06-15 14:34 ` Michael S. Tsirkin
2009-06-15 15:11 ` Anthony Liguori
2009-06-14 9:34 ` Michael S. Tsirkin
2009-06-14 9:37 ` Avi Kivity
2009-06-14 9:47 ` Michael S. Tsirkin
2009-06-15 9:38 ` Avi Kivity
2009-06-15 9:02 ` Mark McLoughlin
2009-06-05 10:23 ` [Qemu-devel] [PATCHv3 04/13] qemu: helper routines for pci access Michael S. Tsirkin
2009-06-05 10:23 ` [Qemu-devel] [PATCHv3 05/13] qemu: MSI-X support functions Michael S. Tsirkin
2009-06-09 17:26 ` Glauber Costa
2009-06-10 9:58 ` Michael S. Tsirkin
2009-06-05 10:23 ` [Qemu-devel] [PATCHv3 06/13] qemu: add flag to disable MSI-X by default Michael S. Tsirkin
2009-06-05 10:23 ` Michael S. Tsirkin [this message]
2009-06-09 17:33 ` [Qemu-devel] [PATCHv3 07/13] qemu: minimal MSI/MSI-X implementation for PC Glauber Costa
2009-06-10 9:59 ` Michael S. Tsirkin
2009-06-05 10:23 ` [Qemu-devel] [PATCHv3 08/13] qemu: add support for resizing regions Michael S. Tsirkin
2009-06-09 17:36 ` Glauber Costa
2009-06-10 10:05 ` Michael S. Tsirkin
2009-06-10 10:46 ` Michael S. Tsirkin
2009-06-05 10:24 ` [Qemu-devel] [PATCHv3 09/13] qemu: virtio support for many interrupt vectors Michael S. Tsirkin
2009-06-05 10:24 ` [Qemu-devel] [PATCHv3 10/13] qemu: MSI-X support in virtio PCI Michael S. Tsirkin
2009-06-05 10:24 ` [Qemu-devel] [PATCHv3 11/13] qemu: request 3 vectors in virtio-net Michael S. Tsirkin
2009-06-05 10:24 ` [Qemu-devel] [PATCHv3 12/13] qemu: virtio save/load bindings Michael S. Tsirkin
2009-06-09 17:45 ` Glauber Costa
2009-06-10 10:11 ` Michael S. Tsirkin
2009-06-10 11:33 ` Michael S. Tsirkin
2009-06-05 10:24 ` [Qemu-devel] [PATCHv3 13/13] qemu: add pci_get/set_byte 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=20090605102347.GH26770@redhat.com \
--to=mst@redhat.com \
--cc=anthony@codemonkey.ws \
--cc=avi@redhat.com \
--cc=blauwirbel@gmail.com \
--cc=borntraeger@de.ibm.com \
--cc=cotte@de.ibm.com \
--cc=kvm@vger.kernel.org \
--cc=paul@codesourcery.com \
--cc=qemu-devel@nongnu.org \
--cc=rusty@rustcorp.com.au \
--cc=virtualization@lists.linux-foundation.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).