public inbox for kvm@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] KVM: Qemu: Enable kvm/ia64's network.
@ 2008-08-22  9:36 Zhang, Xiantao
  2008-08-24  9:22 ` Avi Kivity
  0 siblings, 1 reply; 6+ messages in thread
From: Zhang, Xiantao @ 2008-08-22  9:36 UTC (permalink / raw)
  To: kvm-ia64, kvm; +Cc: Avi Kivity

[-- Attachment #1: Type: text/plain, Size: 2149 bytes --]

Hi, Avi
   Please help to apply this patch. It will fix kvm/ia64's networking
issue. 
Thanks
Xiantao
>From fe6e28ce9295acba107438979fe6ead0d24f7e20 Mon Sep 17 00:00:00 2001
From: Xiantao Zhang <xiantao.zhang@intel.com>
Date: Fri, 22 Aug 2008 17:14:15 +0800
Subject: [PATCH] KVM: Qemu: Enable kvm/ia64's network.

kvm/ia64's IRQ may >16, but current Qemu can't support it.
Here we implment a IRQ map function to solve this issue to
enable its networking.

Signed-off-by: Anthony Xu <anthony.xu@intel.com>
Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
---
 qemu/hw/ipf.c |   24 ++++++++++++++++++++++++
 qemu/hw/pci.c |    9 +++++++++
 2 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/qemu/hw/ipf.c b/qemu/hw/ipf.c
index b11e328..ffa7843 100644
--- a/qemu/hw/ipf.c
+++ b/qemu/hw/ipf.c
@@ -672,3 +672,27 @@ QEMUMachine ipf_machine = {
     ipf_init_pci,
     VGA_RAM_SIZE + VGA_RAM_SIZE,
 };
+
+#define IOAPIC_NUM_PINS 48
+
+static int ioapic_irq_count[IOAPIC_NUM_PINS];
+
+int ioapic_map_irq(int devfn, int irq_num)
+{
+    int irq, dev;
+    dev = devfn >> 3;
+    irq = ((((dev << 2) + (dev >> 3) + irq_num) & 31) + 16);
+    return irq;
+}
+
+void ioapic_set_irq(void *opaque, int vector, int level)
+{
+    if( level )
+        ioapic_irq_count[vector] += 1;
+    else
+        ioapic_irq_count[vector] -= 1;
+
+    if (kvm_enabled())
+	if (kvm_set_irq(vector, ioapic_irq_count[vector] == 0))
+	    return;
+}
diff --git a/qemu/hw/pci.c b/qemu/hw/pci.c
index 92683d1..fac58c5 100644
--- a/qemu/hw/pci.c
+++ b/qemu/hw/pci.c
@@ -544,6 +544,15 @@ static void pci_set_irq(void *opaque, int irq_num,
int level)
         return;
 
     pci_dev->irq_state[irq_num] = level;
+#if defined(TARGET_IA64)
+{   int irq;
+    extern int ioapic_map_irq(int devfn, int irq_num);
+    extern void ioapic_set_irq(void *opaque, int vector, int level);
+    
+    irq = ioapic_map_irq(pci_dev->devfn, irq_num);
+    ioapic_set_irq(NULL, irq, level);
+}
+#endif
     for (;;) {
         bus = pci_dev->bus;
         irq_num = bus->map_irq(pci_dev, irq_num);
-- 
1.5.1

[-- Attachment #2: 0001-KVM-Qemu-Enable-kvm-ia64-s-network.patch --]
[-- Type: application/octet-stream, Size: 1972 bytes --]

From fe6e28ce9295acba107438979fe6ead0d24f7e20 Mon Sep 17 00:00:00 2001
From: Xiantao Zhang <xiantao.zhang@intel.com>
Date: Fri, 22 Aug 2008 17:14:15 +0800
Subject: [PATCH] KVM: Qemu: Enable kvm/ia64's network.

kvm/ia64's IRQ may >16, but current Qemu can't support it.
Here we implment a IRQ map function to solve this issue to
enable its networking.

Signed-off-by: Anthony Xu <anthony.xu@intel.com>
Signed-off-by: Xiantao Zhang <xiantao.zhang@intel.com>
---
 qemu/hw/ipf.c |   24 ++++++++++++++++++++++++
 qemu/hw/pci.c |    9 +++++++++
 2 files changed, 33 insertions(+), 0 deletions(-)

diff --git a/qemu/hw/ipf.c b/qemu/hw/ipf.c
index b11e328..ffa7843 100644
--- a/qemu/hw/ipf.c
+++ b/qemu/hw/ipf.c
@@ -672,3 +672,27 @@ QEMUMachine ipf_machine = {
     ipf_init_pci,
     VGA_RAM_SIZE + VGA_RAM_SIZE,
 };
+
+#define IOAPIC_NUM_PINS 48
+
+static int ioapic_irq_count[IOAPIC_NUM_PINS];
+
+int ioapic_map_irq(int devfn, int irq_num)
+{
+    int irq, dev;
+    dev = devfn >> 3;
+    irq = ((((dev << 2) + (dev >> 3) + irq_num) & 31) + 16);
+    return irq;
+}
+
+void ioapic_set_irq(void *opaque, int vector, int level)
+{
+    if( level )
+        ioapic_irq_count[vector] += 1;
+    else
+        ioapic_irq_count[vector] -= 1;
+
+    if (kvm_enabled())
+	if (kvm_set_irq(vector, ioapic_irq_count[vector] == 0))
+	    return;
+}
diff --git a/qemu/hw/pci.c b/qemu/hw/pci.c
index 92683d1..fac58c5 100644
--- a/qemu/hw/pci.c
+++ b/qemu/hw/pci.c
@@ -544,6 +544,15 @@ static void pci_set_irq(void *opaque, int irq_num, int level)
         return;
 
     pci_dev->irq_state[irq_num] = level;
+#if defined(TARGET_IA64)
+{   int irq;
+    extern int ioapic_map_irq(int devfn, int irq_num);
+    extern void ioapic_set_irq(void *opaque, int vector, int level);
+    
+    irq = ioapic_map_irq(pci_dev->devfn, irq_num);
+    ioapic_set_irq(NULL, irq, level);
+}
+#endif
     for (;;) {
         bus = pci_dev->bus;
         irq_num = bus->map_irq(pci_dev, irq_num);
-- 
1.5.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2008-08-25 11:35 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-22  9:36 [PATCH] KVM: Qemu: Enable kvm/ia64's network Zhang, Xiantao
2008-08-24  9:22 ` Avi Kivity
2008-08-24  9:35   ` Zhang, Xiantao
2008-08-24  9:50     ` Avi Kivity
2008-08-25  1:53       ` Zhang, Xiantao
2008-08-25 11:35         ` Avi Kivity

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox