diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2009-09-25 21:42:45 +0200 |
---|---|---|
committer | Anthony Liguori <aliguori@us.ibm.com> | 2009-10-05 09:32:49 -0500 |
commit | 3f84865ade594a2ec1ef613ab5fd11949f3d49de (patch) | |
tree | 0e0080e944f87ca8590e7027a6b5e663f1954d12 /hw/acpi.c | |
parent | ee995ffbf7b2b190b17d65bbd8f85218679156ad (diff) |
pci: windup acpi-based hotplug
Switch over acpi-based PCI hotplug for pc over to the new
qdev-based pci hotplugging.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Signed-off-by: Anthony Liguori <aliguori@us.ibm.com>
Diffstat (limited to 'hw/acpi.c')
-rw-r--r-- | hw/acpi.c | 41 |
1 files changed, 21 insertions, 20 deletions
@@ -694,20 +694,30 @@ static uint32_t pciej_read(void *opaque, uint32_t addr) static void pciej_write(void *opaque, uint32_t addr, uint32_t val) { -#if defined (TARGET_I386) + BusState *bus = opaque; + DeviceState *qdev; + PCIDevice *dev; int slot = ffs(val) - 1; - pci_device_hot_remove_success(0, slot); + QLIST_FOREACH(qdev, &bus->children, sibling) { + dev = DO_UPCAST(PCIDevice, qdev, qdev); + if (PCI_SLOT(dev->devfn) == slot) { +#if defined (TARGET_I386) + pci_device_hot_remove_success(dev); #endif + qdev_free(qdev); + } + } + #if defined(DEBUG) printf("pciej write %x <== %d\n", addr, val); #endif } -static void piix4_device_hot_add(int bus, int slot, int state); +static int piix4_device_hotplug(PCIDevice *dev, int state); -void piix4_acpi_system_hot_add_init(void) +void piix4_acpi_system_hot_add_init(PCIBus *bus) { register_ioport_write(GPE_BASE, 4, 1, gpe_writeb, &gpe); register_ioport_read(GPE_BASE, 4, 1, gpe_readb, &gpe); @@ -715,10 +725,10 @@ void piix4_acpi_system_hot_add_init(void) register_ioport_write(PCI_BASE, 8, 4, pcihotplug_write, &pci0_status); register_ioport_read(PCI_BASE, 8, 4, pcihotplug_read, &pci0_status); - register_ioport_write(PCI_EJ_BASE, 4, 4, pciej_write, NULL); - register_ioport_read(PCI_EJ_BASE, 4, 4, pciej_read, NULL); + register_ioport_write(PCI_EJ_BASE, 4, 4, pciej_write, bus); + register_ioport_read(PCI_EJ_BASE, 4, 4, pciej_read, bus); - qemu_system_device_hot_add_register(piix4_device_hot_add); + pci_bus_hotplug(bus, piix4_device_hotplug); } static void enable_device(struct pci_status *p, struct gpe_regs *g, int slot) @@ -733,8 +743,10 @@ static void disable_device(struct pci_status *p, struct gpe_regs *g, int slot) p->down |= (1 << slot); } -static void piix4_device_hot_add(int bus, int slot, int state) +static int piix4_device_hotplug(PCIDevice *dev, int state) { + int slot = PCI_SLOT(dev->devfn); + pci0_status.up = 0; pci0_status.down = 0; if (state) @@ -745,18 +757,7 @@ static void piix4_device_hot_add(int bus, int slot, int state) qemu_set_irq(pm_state->irq, 1); qemu_set_irq(pm_state->irq, 0); } -} - -static qemu_system_device_hot_add_t device_hot_add_callback; -void qemu_system_device_hot_add_register(qemu_system_device_hot_add_t callback) -{ - device_hot_add_callback = callback; -} - -void qemu_system_device_hot_add(int pcibus, int slot, int state) -{ - if (device_hot_add_callback) - device_hot_add_callback(pcibus, slot, state); + return 0; } struct acpi_table_header |