Hi, Avi
Since x86 and IA-64's ioapic don't have same number of PINs. They
have to use different map functions. Besides, we also need to modify
x86's dsdt to meet the map, so in this patch, I just changed it for
ia64 side, and didn't touch x86. Maybe x86 needs another patch. Please
help to apply.
Thanks
Xiantao
>From d2bc9284cb659d120beb7dd224567f7a859d80ce Mon Sep 17 00:00:00 2001
From: Xiantao Zhang <[EMAIL PROTECTED]>
Date: Mon, 25 Aug 2008 09:28:29 +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 <[EMAIL PROTECTED]>
Signed-off-by: Xiantao Zhang <[EMAIL PROTECTED]>
---
qemu/hw/ipf.c | 29 +++++++++++++++++++++++++++++
qemu/hw/pci.c | 5 +++++
2 files changed, 34 insertions(+), 0 deletions(-)
diff --git a/qemu/hw/ipf.c b/qemu/hw/ipf.c
index b11e328..134076a 100644
--- a/qemu/hw/ipf.c
+++ b/qemu/hw/ipf.c
@@ -672,3 +672,32 @@ 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];
+
+static 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 irq_num, int level)
+{
+ int vector;
+
+ PCIDevice *pci_dev = (PCIDevice *)opaque;
+ vector = ioapic_map_irq(pci_dev->devfn, irq_num);
+
+ 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..07d37a8 100644
--- a/qemu/hw/pci.c
+++ b/qemu/hw/pci.c
@@ -544,6 +544,11 @@ static void pci_set_irq(void *opaque, int irq_num,
int level)
return;
pci_dev->irq_state[irq_num] = level;
+
+#if defined(TARGET_IA64)
+ ioapic_set_irq(pci_dev, irq_num, level);
+#endif
+
for (;;) {
bus = pci_dev->bus;
irq_num = bus->map_irq(pci_dev, irq_num);
--
1.5.1
-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] On
Behalf Of Avi Kivity
Sent: Sunday, August 24, 2008 5:51 PM
To: Zhang, Xiantao
Cc: [EMAIL PROTECTED]; [email protected]
Subject: Re: [PATCH] KVM: Qemu: Enable kvm/ia64's network.
Zhang, Xiantao wrote:
>>
>> Please move this to pci.c. This can be made to work for x86 too.
>>
>
> So, we should change X86 bios's dsdt also ?
>
If you like. But I would also accept a patch that makes it conditional
on ia64.
--
error compiling committee.c: too many arguments to function
--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html
0001-KVM-Qemu-Enable-kvm-ia64-s-network.patch
Description: 0001-KVM-Qemu-Enable-kvm-ia64-s-network.patch
