From 8c19e00767c1d4dff85194668cdc9d49a295bcd3 Mon Sep 17 00:00:00 2001 From: Marcelo Tosatti Date: Mon, 24 Jan 2011 08:43:06 -0200 Subject: [PATCH 17/24] PATCH RHEL6.1 qemu-kvm acpi_piix4: qdevfy. RH-Author: Marcelo Tosatti Message-id: <20110124084448.907590873@amt.cnet> Patchwork-id: 16807 O-Subject: [patch 1/6] PATCH RHEL6.1 qemu-kvm acpi_piix4: qdevfy. Bugzilla: 498774 RH-Acked-by: Don Dutile RH-Acked-by: Gerd Hoffmann RH-Acked-by: Jes Sorensen From: Isaku Yamahata Signed-off-by: Isaku Yamahata Acked-by: Gerd Hoffmann Signed-off-by: Blue Swirl (upstream backport of commit e8ec0571e16115203f4d6cc7eb31f930167592f8) BZ: 498774 Signed-off-by: Luiz Capitulino --- hw/acpi.c | 58 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 files changed, 45 insertions(+), 13 deletions(-) diff --git a/hw/acpi.c b/hw/acpi.c index ab9f89b..42fad0f 100644 --- a/hw/acpi.c +++ b/hw/acpi.c @@ -69,6 +69,8 @@ typedef struct PIIX4PMState { uint8_t smb_index; qemu_irq irq; + uint32_t smb_io_base; + /* for pci hotplug */ struct gpe_regs gpe; struct pci_status pci0_status; @@ -547,15 +549,11 @@ static void piix4_powerdown(void *opaque, int irq, int power_failing) #endif } -i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base, - qemu_irq sci_irq) +static int piix4_pm_initfn(PCIDevice *dev) { - PIIX4PMState *s; + PIIX4PMState *s = DO_UPCAST(PIIX4PMState, dev, dev); uint8_t *pci_conf; - s = (PIIX4PMState *)pci_register_device(bus, - "PM", sizeof(PIIX4PMState), - devfn, NULL, pm_write_config); pm_state = s; pci_conf = s->dev.config; pci_config_set_vendor_id(pci_conf, PCI_VENDOR_ID_INTEL); @@ -595,25 +593,59 @@ i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base, pci_conf[0x67] = (serial_hds[0] != NULL ? 0x08 : 0) | (serial_hds[1] != NULL ? 0x90 : 0); - pci_conf[0x90] = smb_io_base | 1; - pci_conf[0x91] = smb_io_base >> 8; + pci_conf[0x90] = s->smb_io_base | 1; + pci_conf[0x91] = s->smb_io_base >> 8; pci_conf[0xd2] = 0x09; - register_ioport_write(smb_io_base, 64, 1, smb_ioport_writeb, s); - register_ioport_read(smb_io_base, 64, 1, smb_ioport_readb, s); + register_ioport_write(s->smb_io_base, 64, 1, smb_ioport_writeb, s); + register_ioport_read(s->smb_io_base, 64, 1, smb_ioport_readb, s); s->tmr_timer = qemu_new_timer(vm_clock, pm_tmr_timer, s); qemu_system_powerdown = *qemu_allocate_irqs(piix4_powerdown, s, 1); - vmstate_register(&s->dev.qdev, 0, &vmstate_acpi, s); - s->smbus = i2c_init_bus(NULL, "i2c"); - s->irq = sci_irq; qemu_register_reset(piix4_reset, s); + return 0; +} + +i2c_bus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base, + qemu_irq sci_irq) +{ + PCIDevice *dev; + PIIX4PMState *s; + + dev = pci_create(bus, devfn, "PIIX4_PM"); + qdev_prop_set_uint32(&dev->qdev, "smb_io_base", smb_io_base); + + s = DO_UPCAST(PIIX4PMState, dev, dev); + s->irq = sci_irq; + + qdev_init_nofail(&dev->qdev); + return s->smbus; } +static PCIDeviceInfo piix4_pm_info = { + .qdev.name = "PIIX4_PM", + .qdev.desc = "PM", + .qdev.size = sizeof(PIIX4PMState), + .qdev.vmsd = &vmstate_acpi, + .init = piix4_pm_initfn, + .config_write = pm_write_config, + .qdev.props = (Property[]) { + DEFINE_PROP_UINT32("smb_io_base", PIIX4PMState, smb_io_base, 0), + DEFINE_PROP_END_OF_LIST(), + } +}; + +static void piix4_pm_register(void) +{ + pci_qdev_register(&piix4_pm_info); +} + +device_init(piix4_pm_register); + static uint32_t gpe_read_val(uint16_t val, uint32_t addr) { if (addr & 1) -- 1.7.4.rc1.16.gd2f15e