mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 15:23:53 -06:00
hw/isa/piix4: QOM'ify PCI device creation and wiring
PCI interrupt wiring and device creation were performed in create() functions which are obsolete. Move these tasks into QOM functions to modernize the code. Signed-off-by: Bernhard Beschow <shentey@gmail.com> Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Message-Id: <20220603185045.143789-5-shentey@gmail.com> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
This commit is contained in:
parent
87e010d6d6
commit
c397a2d3e4
1 changed files with 22 additions and 8 deletions
|
@ -35,6 +35,7 @@
|
|||
#include "hw/rtc/mc146818rtc.h"
|
||||
#include "hw/ide/pci.h"
|
||||
#include "hw/acpi/piix4.h"
|
||||
#include "hw/usb/hcd-uhci.h"
|
||||
#include "migration/vmstate.h"
|
||||
#include "sysemu/reset.h"
|
||||
#include "sysemu/runstate.h"
|
||||
|
@ -46,6 +47,8 @@ struct PIIX4State {
|
|||
qemu_irq *isa;
|
||||
|
||||
RTCState rtc;
|
||||
PCIIDEState ide;
|
||||
UHCIState uhci;
|
||||
/* Reset Control Register */
|
||||
MemoryRegion rcr_mem;
|
||||
uint8_t rcr;
|
||||
|
@ -205,6 +208,7 @@ static const MemoryRegionOps piix4_rcr_ops = {
|
|||
static void piix4_realize(PCIDevice *dev, Error **errp)
|
||||
{
|
||||
PIIX4State *s = PIIX4_PCI_DEVICE(dev);
|
||||
PCIBus *pci_bus = pci_get_bus(dev);
|
||||
ISABus *isa_bus;
|
||||
qemu_irq *i8259_out_irq;
|
||||
|
||||
|
@ -243,6 +247,21 @@ static void piix4_realize(PCIDevice *dev, Error **errp)
|
|||
return;
|
||||
}
|
||||
s->rtc.irq = isa_get_irq(ISA_DEVICE(&s->rtc), s->rtc.isairq);
|
||||
|
||||
/* IDE */
|
||||
qdev_prop_set_int32(DEVICE(&s->ide), "addr", dev->devfn + 1);
|
||||
if (!qdev_realize(DEVICE(&s->ide), BUS(pci_bus), errp)) {
|
||||
return;
|
||||
}
|
||||
pci_ide_create_devs(PCI_DEVICE(&s->ide));
|
||||
|
||||
/* USB */
|
||||
qdev_prop_set_int32(DEVICE(&s->uhci), "addr", dev->devfn + 2);
|
||||
if (!qdev_realize(DEVICE(&s->uhci), BUS(pci_bus), errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
pci_bus_irqs(pci_bus, piix4_set_irq, pci_slot_get_pirq, s, PIIX_NUM_PIRQS);
|
||||
}
|
||||
|
||||
static void piix4_init(Object *obj)
|
||||
|
@ -250,6 +269,8 @@ static void piix4_init(Object *obj)
|
|||
PIIX4State *s = PIIX4_PCI_DEVICE(obj);
|
||||
|
||||
object_initialize_child(obj, "rtc", &s->rtc, TYPE_MC146818_RTC);
|
||||
object_initialize_child(obj, "ide", &s->ide, "piix4-ide");
|
||||
object_initialize_child(obj, "uhci", &s->uhci, "piix4-usb-uhci");
|
||||
}
|
||||
|
||||
static void piix4_class_init(ObjectClass *klass, void *data)
|
||||
|
@ -293,7 +314,6 @@ type_init(piix4_register_types)
|
|||
|
||||
DeviceState *piix4_create(PCIBus *pci_bus, ISABus **isa_bus, I2CBus **smbus)
|
||||
{
|
||||
PIIX4State *s;
|
||||
PCIDevice *pci;
|
||||
DeviceState *dev;
|
||||
int devfn = PCI_DEVFN(10, 0);
|
||||
|
@ -301,15 +321,11 @@ DeviceState *piix4_create(PCIBus *pci_bus, ISABus **isa_bus, I2CBus **smbus)
|
|||
pci = pci_create_simple_multifunction(pci_bus, devfn, true,
|
||||
TYPE_PIIX4_PCI_DEVICE);
|
||||
dev = DEVICE(pci);
|
||||
s = PIIX4_PCI_DEVICE(pci);
|
||||
|
||||
if (isa_bus) {
|
||||
*isa_bus = ISA_BUS(qdev_get_child_bus(dev, "isa.0"));
|
||||
}
|
||||
|
||||
pci = pci_create_simple(pci_bus, devfn + 1, "piix4-ide");
|
||||
pci_ide_create_devs(pci);
|
||||
|
||||
pci_create_simple(pci_bus, devfn + 2, "piix4-usb-uhci");
|
||||
if (smbus) {
|
||||
pci = pci_new(devfn + 3, TYPE_PIIX4_PM);
|
||||
qdev_prop_set_uint32(DEVICE(pci), "smb_io_base", 0x1100);
|
||||
|
@ -320,7 +336,5 @@ DeviceState *piix4_create(PCIBus *pci_bus, ISABus **isa_bus, I2CBus **smbus)
|
|||
*smbus = I2C_BUS(qdev_get_child_bus(DEVICE(pci), "i2c"));
|
||||
}
|
||||
|
||||
pci_bus_irqs(pci_bus, piix4_set_irq, pci_slot_get_pirq, s, PIIX_NUM_PIRQS);
|
||||
|
||||
return dev;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue