From patchwork Sun Aug 9 16:44:56 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avi Kivity X-Patchwork-Id: 31026 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by bilbo.ozlabs.org (Postfix) with ESMTPS id 6B286B7B75 for ; Mon, 10 Aug 2009 02:39:50 +1000 (EST) Received: from localhost ([127.0.0.1]:38372 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MaBQt-0007iD-Cz for incoming@patchwork.ozlabs.org; Sun, 09 Aug 2009 12:39:43 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MaBQM-0007fM-Mf for qemu-devel@nongnu.org; Sun, 09 Aug 2009 12:39:10 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MaBQH-0007dX-V4 for qemu-devel@nongnu.org; Sun, 09 Aug 2009 12:39:10 -0400 Received: from [199.232.76.173] (port=60270 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MaBQH-0007dT-SZ for qemu-devel@nongnu.org; Sun, 09 Aug 2009 12:39:05 -0400 Received: from mx2.redhat.com ([66.187.237.31]:32994) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MaBQH-00078R-7Q for qemu-devel@nongnu.org; Sun, 09 Aug 2009 12:39:05 -0400 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n79Gd2RT023558; Sun, 9 Aug 2009 12:39:02 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n79Gd1SN031061; Sun, 9 Aug 2009 12:39:01 -0400 Received: from cleopatra.tlv.redhat.com (cleopatra.tlv.redhat.com [10.35.255.11]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n79Gcx0d021220; Sun, 9 Aug 2009 12:39:00 -0400 Received: from localhost.localdomain (dhcp-1-27.tlv.redhat.com [10.35.1.27]) by cleopatra.tlv.redhat.com (Postfix) with ESMTP id 9E9132501B8; Sun, 9 Aug 2009 19:38:59 +0300 (IDT) From: Avi Kivity To: Anthony Liguori Date: Sun, 9 Aug 2009 19:44:56 +0300 Message-Id: <1249836296-13288-3-git-send-email-avi@redhat.com> In-Reply-To: <1249836296-13288-1-git-send-email-avi@redhat.com> References: <1249836296-13288-1-git-send-email-avi@redhat.com> X-Scanned-By: MIMEDefang 2.58 on 172.16.27.26 X-detected-operating-system: by monty-python.gnu.org: GNU/Linux 2.6 (newer, 3) Cc: qemu-devel@nongnu.org Subject: [Qemu-devel] [PATCH 2/2] Route IOAPIC interrupts via ISA bus X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Instead of calling the IOAPIC from the PIC, raise IOAPIC irqs via the ISA bus. As a side effect, IOAPIC lines 16-23 are enabled. Signed-off-by: Avi Kivity --- hw/i8259.c | 13 ------------- hw/ioapic.c | 6 ++++-- hw/pc.c | 16 ++++++++-------- hw/pc.h | 4 +--- 4 files changed, 13 insertions(+), 26 deletions(-) diff --git a/hw/i8259.c b/hw/i8259.c index 0b9fab5..74acc39 100644 --- a/hw/i8259.c +++ b/hw/i8259.c @@ -60,9 +60,6 @@ struct PicState2 { PicState pics[2]; qemu_irq parent_irq; void *irq_request_opaque; - /* IOAPIC callback support */ - SetIRQFunc *alt_irq_func; - void *alt_irq_opaque; }; #if defined(DEBUG_PIC) || defined (DEBUG_IRQ_COUNT) @@ -203,9 +200,6 @@ static void i8259_set_irq(void *opaque, int irq, int level) } #endif pic_set_irq1(&s->pics[irq >> 3], irq & 7, level); - /* used for IOAPIC irqs */ - if (s->alt_irq_func) - s->alt_irq_func(s->alt_irq_opaque, irq, level); pic_update_irq(s); } @@ -562,10 +556,3 @@ qemu_irq *i8259_init(qemu_irq parent_irq) isa_pic = s; return qemu_allocate_irqs(i8259_set_irq, s, 16); } - -void pic_set_alt_irq_func(PicState2 *s, SetIRQFunc *alt_irq_func, - void *alt_irq_opaque) -{ - s->alt_irq_func = alt_irq_func; - s->alt_irq_opaque = alt_irq_opaque; -} diff --git a/hw/ioapic.c b/hw/ioapic.c index a5cdd5d..998894d 100644 --- a/hw/ioapic.c +++ b/hw/ioapic.c @@ -241,9 +241,10 @@ static CPUWriteMemoryFunc *ioapic_mem_write[3] = { ioapic_mem_writel, }; -IOAPICState *ioapic_init(void) +qemu_irq *ioapic_init(void) { IOAPICState *s; + qemu_irq *irq; int io_memory; s = qemu_mallocz(sizeof(IOAPICState)); @@ -255,6 +256,7 @@ IOAPICState *ioapic_init(void) register_savevm("ioapic", 0, 1, ioapic_save, ioapic_load, s); qemu_register_reset(ioapic_reset, s); + irq = qemu_allocate_irqs(ioapic_set_irq, s, IOAPIC_NUM_PINS); - return s; + return irq; } diff --git a/hw/pc.c b/hw/pc.c index a6be4a8..5182a57 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -60,7 +60,6 @@ static fdctrl_t *floppy_controller; static RTCState *rtc_state; static PITState *pit; -static IOAPICState *ioapic; static PCIDevice *i440fx_state; typedef struct rom_reset_data { @@ -89,14 +88,18 @@ static void option_rom_setup_reset(target_phys_addr_t addr, unsigned size) typedef struct isa_irq_state { qemu_irq *i8259; + qemu_irq *ioapic; } IsaIrqState; static void isa_irq_handler(void *opaque, int n, int level) { IsaIrqState *isa = (IsaIrqState *)opaque; - qemu_set_irq(isa->i8259[n], level); -} + if (n < 16) { + qemu_set_irq(isa->i8259[n], level); + } + qemu_set_irq(isa->ioapic[n], level); +}; static void ioport80_write(void *opaque, uint32_t addr, uint32_t data) { @@ -1279,7 +1282,7 @@ static void pc_init1(ram_addr_t ram_size, i8259 = i8259_init(cpu_irq[0]); isa_irq_state = qemu_mallocz(sizeof(*isa_irq_state)); isa_irq_state->i8259 = i8259; - isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 16); + isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 24); ferr_irq = isa_irq[13]; if (pci_enabled) { @@ -1321,16 +1324,13 @@ static void pc_init1(ram_addr_t ram_size, register_ioport_write(0x92, 1, 1, ioport92_write, NULL); if (pci_enabled) { - ioapic = ioapic_init(); + isa_irq_state->ioapic = ioapic_init(); } pit = pit_init(0x40, isa_irq[0]); pcspk_init(pit); if (!no_hpet) { hpet_init(isa_irq); } - if (pci_enabled) { - pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic); - } for(i = 0; i < MAX_SERIAL_PORTS; i++) { if (serial_hds[i]) { diff --git a/hw/pc.h b/hw/pc.h index 9fbae20..043c216 100644 --- a/hw/pc.h +++ b/hw/pc.h @@ -32,8 +32,6 @@ extern PicState2 *isa_pic; void pic_set_irq(int irq, int level); void pic_set_irq_new(void *opaque, int irq, int level); qemu_irq *i8259_init(qemu_irq parent_irq); -void pic_set_alt_irq_func(PicState2 *s, SetIRQFunc *alt_irq_func, - void *alt_irq_opaque); int pic_read_irq(PicState2 *s); void pic_update_irq(PicState2 *s); uint32_t pic_intack_read(PicState2 *s); @@ -50,7 +48,7 @@ int apic_init(CPUState *env); int apic_accept_pic_intr(CPUState *env); void apic_deliver_pic_intr(CPUState *env, int level); int apic_get_interrupt(CPUState *env); -IOAPICState *ioapic_init(void); +qemu_irq *ioapic_init(void); void ioapic_set_irq(void *opaque, int vector, int level); void apic_reset_irq_delivered(void); int apic_get_irq_delivered(void);