mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 00:03:54 -06:00
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>
This commit is contained in:
parent
ee995ffbf7
commit
3f84865ade
5 changed files with 26 additions and 42 deletions
41
hw/acpi.c
41
hw/acpi.c
|
@ -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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue