From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1JKi51-00049N-ED for qemu-devel@nongnu.org; Thu, 31 Jan 2008 17:40:23 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1JKi50-00048z-Uk for qemu-devel@nongnu.org; Thu, 31 Jan 2008 17:40:23 -0500 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1JKi50-00048s-H7 for qemu-devel@nongnu.org; Thu, 31 Jan 2008 17:40:22 -0500 Received: from e6.ny.us.ibm.com ([32.97.182.146]) by monty-python.gnu.org with esmtps (TLS-1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1JKi50-0001uz-2P for qemu-devel@nongnu.org; Thu, 31 Jan 2008 17:40:22 -0500 Received: from d01relay02.pok.ibm.com (d01relay02.pok.ibm.com [9.56.227.234]) by e6.ny.us.ibm.com (8.13.8/8.13.8) with ESMTP id m0VMcfnt003474 for ; Thu, 31 Jan 2008 17:38:41 -0500 Received: from d01av01.pok.ibm.com (d01av01.pok.ibm.com [9.56.224.215]) by d01relay02.pok.ibm.com (8.13.8/8.13.8/NCO v8.7) with ESMTP id m0VMam7m247532 for ; Thu, 31 Jan 2008 17:36:48 -0500 Received: from d01av01.pok.ibm.com (loopback [127.0.0.1]) by d01av01.pok.ibm.com (8.12.11.20060308/8.13.3) with ESMTP id m0VMalec029362 for ; Thu, 31 Jan 2008 17:36:48 -0500 From: Anthony Liguori Date: Thu, 31 Jan 2008 16:36:16 -0600 Message-Id: <1201818980-27534-3-git-send-email-aliguori@us.ibm.com> In-Reply-To: <1201818980-27534-1-git-send-email-aliguori@us.ibm.com> References: <1201818980-27534-1-git-send-email-aliguori@us.ibm.com> Subject: [Qemu-devel] [PATCH 2/6] SCI fixes Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Cc: kvm-devel@lists.sourceforge.net, Paul Brook KVM supports the ability to use ACPI to shutdown guests. In order to enable this requires some fixes to be able to generate the SCI interrupt and the appropriate plumbing. Index: qemu/hw/acpi.c =================================================================== --- qemu.orig/hw/acpi.c 2008-01-30 13:47:00.000000000 -0600 +++ qemu/hw/acpi.c 2008-01-30 13:47:37.000000000 -0600 @@ -49,6 +49,7 @@ uint8_t smb_data1; uint8_t smb_data[32]; uint8_t smb_index; + qemu_irq irq; } PIIX4PMState; #define RTC_EN (1 << 10) @@ -71,6 +72,8 @@ #define SMBHSTDAT1 0x06 #define SMBBLKDAT 0x07 +PIIX4PMState *pm_state; + static uint32_t get_pmtmr(PIIX4PMState *s) { uint32_t d; @@ -97,11 +100,12 @@ pmsts = get_pmsts(s); sci_level = (((pmsts & s->pmen) & (RTC_EN | PWRBTN_EN | GBL_EN | TMROF_EN)) != 0); - qemu_set_irq(s->dev.irq[0], sci_level); + qemu_set_irq(s->irq, sci_level); /* schedule a timer interruption if needed */ if ((s->pmen & TMROF_EN) && !(pmsts & TMROF_EN)) { expire_time = muldiv64(s->tmr_overflow_time, ticks_per_sec, PM_FREQ); qemu_mod_timer(s->tmr_timer, expire_time); + s->tmr_overflow_time += 0x800000; } else { qemu_del_timer(s->tmr_timer); } @@ -467,7 +471,8 @@ return 0; } -i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base) +i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base, + qemu_irq sci_irq) { PIIX4PMState *s; uint8_t *pci_conf; @@ -475,6 +480,7 @@ s = (PIIX4PMState *)pci_register_device(bus, "PM", sizeof(PIIX4PMState), devfn, NULL, pm_write_config); + pm_state = s; pci_conf = s->dev.config; pci_conf[0x00] = 0x86; pci_conf[0x01] = 0x80; @@ -514,5 +520,16 @@ register_savevm("piix4_pm", 0, 1, pm_save, pm_load, s); s->smbus = i2c_init_bus(); + s->irq = sci_irq; return s->smbus; } + +#if defined(TARGET_I386) +void qemu_system_powerdown(void) +{ + if(pm_state->pmen & PWRBTN_EN) { + pm_state->pmsts |= PWRBTN_EN; + pm_update_sci(pm_state); + } +} +#endif Index: qemu/hw/mips_malta.c =================================================================== --- qemu.orig/hw/mips_malta.c 2008-01-30 13:47:00.000000000 -0600 +++ qemu/hw/mips_malta.c 2008-01-30 13:47:37.000000000 -0600 @@ -905,7 +905,7 @@ piix4_devfn = piix4_init(pci_bus, 80); pci_piix4_ide_init(pci_bus, hd, piix4_devfn + 1, i8259); usb_uhci_piix4_init(pci_bus, piix4_devfn + 2); - smbus = piix4_pm_init(pci_bus, piix4_devfn + 3, 0x1100); + smbus = piix4_pm_init(pci_bus, piix4_devfn + 3, 0x1100, i8259[9]); eeprom_buf = qemu_mallocz(8 * 256); /* XXX: make this persistent */ for (i = 0; i < 8; i++) { /* TODO: Populate SPD eeprom data. */ Index: qemu/hw/pc.c =================================================================== --- qemu.orig/hw/pc.c 2008-01-30 13:47:31.000000000 -0600 +++ qemu/hw/pc.c 2008-01-30 13:47:37.000000000 -0600 @@ -1000,7 +1000,7 @@ i2c_bus *smbus; /* TODO: Populate SPD eeprom data. */ - smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100); + smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100, i8259[9]); for (i = 0; i < 8; i++) { smbus_eeprom_device_init(smbus, 0x50 + i, eeprom_buf + (i * 256)); } Index: qemu/hw/pc.h =================================================================== --- qemu.orig/hw/pc.h 2008-01-30 13:47:00.000000000 -0600 +++ qemu/hw/pc.h 2008-01-30 13:47:37.000000000 -0600 @@ -88,7 +88,8 @@ /* acpi.c */ extern int acpi_enabled; -i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base); +i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base, + qemu_irq sci_irq); void piix4_smbus_register_device(SMBusDevice *dev, uint8_t addr); void acpi_bios_init(void); Index: qemu/hw/piix_pci.c =================================================================== --- qemu.orig/hw/piix_pci.c 2008-01-30 13:47:00.000000000 -0600 +++ qemu/hw/piix_pci.c 2008-01-30 13:47:37.000000000 -0600 @@ -220,7 +220,6 @@ { int i, pic_irq, pic_level; - piix3_dev->config[0x60 + irq_num] &= ~0x80; // enable bit pci_irq_levels[irq_num] = level; /* now we change the pic irq level according to the piix irq mappings */ Index: qemu/sysemu.h =================================================================== --- qemu.orig/sysemu.h 2008-01-30 13:47:31.000000000 -0600 +++ qemu/sysemu.h 2008-01-30 13:47:37.000000000 -0600 @@ -30,12 +30,16 @@ void qemu_system_reset_request(void); void qemu_system_shutdown_request(void); void qemu_system_powerdown_request(void); -#if !defined(TARGET_SPARC) +int qemu_shutdown_requested(void); +int qemu_reset_requested(void); +int qemu_powerdown_requested(void); +#if !defined(TARGET_SPARC) && !defined(TARGET_I386) // Please implement a power failure function to signal the OS #define qemu_system_powerdown() do{}while(0) #else void qemu_system_powerdown(void); #endif +void qemu_system_reset(void); void cpu_save(QEMUFile *f, void *opaque); int cpu_load(QEMUFile *f, void *opaque, int version_id); Index: qemu/vl.c =================================================================== --- qemu.orig/vl.c 2008-01-30 13:47:31.000000000 -0600 +++ qemu/vl.c 2008-01-30 13:47:37.000000000 -0600 @@ -7267,6 +7267,27 @@ static int shutdown_requested; static int powerdown_requested; +int qemu_shutdown_requested(void) +{ + int r = shutdown_requested; + shutdown_requested = 0; + return r; +} + +int qemu_reset_requested(void) +{ + int r = reset_requested; + reset_requested = 0; + return r; +} + +int qemu_powerdown_requested(void) +{ + int r = powerdown_requested; + powerdown_requested = 0; + return r; +} + void qemu_register_reset(QEMUResetHandler *func, void *opaque) { QEMUResetEntry **pre, *re; @@ -7281,7 +7302,7 @@ *pre = re; } -static void qemu_system_reset(void) +void qemu_system_reset(void) { QEMUResetEntry *re;