From patchwork Sun Aug 9 16:44:55 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Avi Kivity X-Patchwork-Id: 31027 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 25AB1B6F34 for ; Mon, 10 Aug 2009 02:41:19 +1000 (EST) Received: from localhost ([127.0.0.1]:38903 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MaBSO-0008Fk-0n for incoming@patchwork.ozlabs.org; Sun, 09 Aug 2009 12:41:16 -0400 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1MaBQN-0007fm-0o for qemu-devel@nongnu.org; Sun, 09 Aug 2009 12:39:11 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1MaBQI-0007dl-5A for qemu-devel@nongnu.org; Sun, 09 Aug 2009 12:39:10 -0400 Received: from [199.232.76.173] (port=60271 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1MaBQH-0007dU-Uc for qemu-devel@nongnu.org; Sun, 09 Aug 2009 12:39:06 -0400 Received: from mx2.redhat.com ([66.187.237.31]:32993) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1MaBQH-000789-7O 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 n79Gd2Xx023560; 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 n79Gd1cu031059; 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 n79Gcxmm021219; 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 9B1EE2501B6; Sun, 9 Aug 2009 19:38:59 +0300 (IDT) From: Avi Kivity To: Anthony Liguori Date: Sun, 9 Aug 2009 19:44:55 +0300 Message-Id: <1249836296-13288-2-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 1/2] Route PC irqs to ISA bus instead of i8259 directly 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 A PC has its motherboard IRQ lines connected to both the PIC and IOAPIC. Currently, qemu routes IRQs to the PIC which then calls the IOAPIC, an incestuous arrangement. In order to clean this up, create a new ISA IRQ abstraction, and have devices raise ISA IRQs (which in turn raise the i8259 IRQs as usual). Signed-off-by: Avi Kivity --- hw/pc.c | 44 ++++++++++++++++++++++++++++++-------------- 1 files changed, 30 insertions(+), 14 deletions(-) diff --git a/hw/pc.c b/hw/pc.c index bc9e646..a6be4a8 100644 --- a/hw/pc.c +++ b/hw/pc.c @@ -87,6 +87,17 @@ static void option_rom_setup_reset(target_phys_addr_t addr, unsigned size) qemu_register_reset(option_rom_reset, rrd); } +typedef struct isa_irq_state { + qemu_irq *i8259; +} IsaIrqState; + +static void isa_irq_handler(void *opaque, int n, int level) +{ + IsaIrqState *isa = (IsaIrqState *)opaque; + + qemu_set_irq(isa->i8259[n], level); +} + static void ioport80_write(void *opaque, uint32_t addr, uint32_t data) { } @@ -1119,7 +1130,9 @@ static void pc_init1(ram_addr_t ram_size, int piix3_devfn = -1; CPUState *env; qemu_irq *cpu_irq; + qemu_irq *isa_irq; qemu_irq *i8259; + IsaIrqState *isa_irq_state; DriveInfo *dinfo; BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS]; BlockDriverState *fd[MAX_FD]; @@ -1264,10 +1277,13 @@ static void pc_init1(ram_addr_t ram_size, cpu_irq = qemu_allocate_irqs(pic_irq_request, NULL, 1); i8259 = i8259_init(cpu_irq[0]); - ferr_irq = i8259[13]; + 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); + ferr_irq = isa_irq[13]; if (pci_enabled) { - pci_bus = i440fx_init(&i440fx_state, i8259); + pci_bus = i440fx_init(&i440fx_state, isa_irq); piix3_devfn = piix3_init(pci_bus, -1); } else { pci_bus = NULL; @@ -1297,7 +1313,7 @@ static void pc_init1(ram_addr_t ram_size, } } - rtc_state = rtc_init(0x70, i8259[8], 2000); + rtc_state = rtc_init(0x70, isa_irq[8], 2000); qemu_register_boot_set(pc_boot_set, rtc_state); @@ -1307,10 +1323,10 @@ static void pc_init1(ram_addr_t ram_size, if (pci_enabled) { ioapic = ioapic_init(); } - pit = pit_init(0x40, i8259[0]); + pit = pit_init(0x40, isa_irq[0]); pcspk_init(pit); if (!no_hpet) { - hpet_init(i8259); + hpet_init(isa_irq); } if (pci_enabled) { pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic); @@ -1318,14 +1334,14 @@ static void pc_init1(ram_addr_t ram_size, for(i = 0; i < MAX_SERIAL_PORTS; i++) { if (serial_hds[i]) { - serial_init(serial_io[i], i8259[serial_irq[i]], 115200, + serial_init(serial_io[i], isa_irq[serial_irq[i]], 115200, serial_hds[i]); } } for(i = 0; i < MAX_PARALLEL_PORTS; i++) { if (parallel_hds[i]) { - parallel_init(parallel_io[i], i8259[parallel_irq[i]], + parallel_init(parallel_io[i], isa_irq[parallel_irq[i]], parallel_hds[i]); } } @@ -1336,7 +1352,7 @@ static void pc_init1(ram_addr_t ram_size, NICInfo *nd = &nd_table[i]; if (!pci_enabled || (nd->model && strcmp(nd->model, "ne2k_isa") == 0)) - pc_init_ne2k_isa(nd, i8259); + pc_init_ne2k_isa(nd, isa_irq); else pci_nic_init(nd, "ne2k_pci", NULL); } @@ -1354,25 +1370,25 @@ static void pc_init1(ram_addr_t ram_size, } if (pci_enabled) { - pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1, i8259); + pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1, isa_irq); } else { for(i = 0; i < MAX_IDE_BUS; i++) { - isa_ide_init(ide_iobase[i], ide_iobase2[i], i8259[ide_irq[i]], + isa_ide_init(ide_iobase[i], ide_iobase2[i], isa_irq[ide_irq[i]], hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]); } } - i8042_init(i8259[1], i8259[12], 0x60); + i8042_init(isa_irq[1], isa_irq[12], 0x60); DMA_init(0); #ifdef HAS_AUDIO - audio_init(pci_enabled ? pci_bus : NULL, i8259); + audio_init(pci_enabled ? pci_bus : NULL, isa_irq); #endif for(i = 0; i < MAX_FD; i++) { dinfo = drive_get(IF_FLOPPY, 0, i); fd[i] = dinfo ? dinfo->bdrv : NULL; } - floppy_controller = fdctrl_init(i8259[6], 2, 0, 0x3f0, fd); + floppy_controller = fdctrl_init(isa_irq[6], 2, 0, 0x3f0, fd); cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, hd); @@ -1385,7 +1401,7 @@ static void pc_init1(ram_addr_t ram_size, i2c_bus *smbus; /* TODO: Populate SPD eeprom data. */ - smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100, i8259[9]); + smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100, isa_irq[9]); for (i = 0; i < 8; i++) { DeviceState *eeprom; eeprom = qdev_create((BusState *)smbus, "smbus-eeprom");