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 <xiantao.zhang@xxxxxxxxx> 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 <anthony.xu@xxxxxxxxx> Signed-off-by: Xiantao Zhang <xiantao.zhang@xxxxxxxxx> --- 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: kvm-owner@xxxxxxxxxxxxxxx [mailto:kvm-owner@xxxxxxxxxxxxxxx] On Behalf Of Avi Kivity Sent: Sunday, August 24, 2008 5:51 PM To: Zhang, Xiantao Cc: kvm-ia64@xxxxxxxxxxxxxxx; kvm@xxxxxxxxxxxxxxx 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 majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
Attachment:
0001-KVM-Qemu-Enable-kvm-ia64-s-network.patch
Description: 0001-KVM-Qemu-Enable-kvm-ia64-s-network.patch