[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 30/49] hw/isa/piix4: QOM'ify PCI device creation and wiring
From: |
Philippe Mathieu-Daudé |
Subject: |
[PULL 30/49] hw/isa/piix4: QOM'ify PCI device creation and wiring |
Date: |
Sat, 11 Jun 2022 12:32:53 +0200 |
From: Bernhard Beschow <shentey@gmail.com>
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>
---
hw/isa/piix4.c | 30 ++++++++++++++++++++++--------
1 file changed, 22 insertions(+), 8 deletions(-)
diff --git a/hw/isa/piix4.c b/hw/isa/piix4.c
index 18aa24424f..058bebb5e2 100644
--- a/hw/isa/piix4.c
+++ b/hw/isa/piix4.c
@@ -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;
}
--
2.36.1
- [PULL 20/49] hw/acpi/piix4: alter piix4_pm_init() to return PIIX4PMState, (continued)
- [PULL 20/49] hw/acpi/piix4: alter piix4_pm_init() to return PIIX4PMState, Philippe Mathieu-Daudé, 2022/06/11
- [PULL 21/49] hw/acpi/piix4: rename piix4_pm_init() to piix4_pm_initfn(), Philippe Mathieu-Daudé, 2022/06/11
- [PULL 22/49] hw/acpi/piix4: use qdev gpio to wire up sci_irq, Philippe Mathieu-Daudé, 2022/06/11
- [PULL 24/49] hw/i386/pc_piix: create PIIX4_PM device directly instead of using piix4_pm_initfn(), Philippe Mathieu-Daudé, 2022/06/11
- [PULL 23/49] hw/acpi/piix4: use qdev gpio to wire up smi_irq, Philippe Mathieu-Daudé, 2022/06/11
- [PULL 25/49] hw/isa/piix4.c: create PIIX4_PM device directly instead of using piix4_pm_initfn(), Philippe Mathieu-Daudé, 2022/06/11
- [PULL 26/49] hw/acpi/piix4: remove unused piix4_pm_initfn() function, Philippe Mathieu-Daudé, 2022/06/11
- [PULL 27/49] hw/southbridge/piix: Aggregate all PIIX southbridge type names, Philippe Mathieu-Daudé, 2022/06/11
- [PULL 28/49] hw/isa/piix4: Use object_initialize_child() for embedded struct, Philippe Mathieu-Daudé, 2022/06/11
- [PULL 29/49] hw/isa/piix4: Move pci_map_irq_fn' near pci_set_irq_fn, Philippe Mathieu-Daudé, 2022/06/11
- [PULL 30/49] hw/isa/piix4: QOM'ify PCI device creation and wiring,
Philippe Mathieu-Daudé <=
- [PULL 31/49] hw/isa/piix4: Factor out ISABus retrieval from piix4_create(), Philippe Mathieu-Daudé, 2022/06/11
- [PULL 32/49] hw/isa/piix4: QOM'ify PIIX4 PM creation, Philippe Mathieu-Daudé, 2022/06/11
- [PULL 34/49] hw/isa/piix3: Move pci_map_irq_fn near pci_set_irq_fn, Philippe Mathieu-Daudé, 2022/06/11
- [PULL 36/49] hw/isa/piix3: Factor out ISABus retrieval from piix3_create(), Philippe Mathieu-Daudé, 2022/06/11
- [PULL 33/49] hw/isa/piix4: Inline and remove piix4_create(), Philippe Mathieu-Daudé, 2022/06/11
- [PULL 37/49] hw/isa/piix3: Inline and remove piix3_create(), Philippe Mathieu-Daudé, 2022/06/11
- [PULL 35/49] hw/isa/piix3: QOM'ify PCI device creation and wiring, Philippe Mathieu-Daudé, 2022/06/11
- [PULL 38/49] hw/i386/microvm-dt: Force explicit failure if retrieving QOM property fails, Philippe Mathieu-Daudé, 2022/06/11
- [PULL 39/49] hw/i386/microvm-dt: Determine mc146818rtc's IRQ number from QOM property, Philippe Mathieu-Daudé, 2022/06/11
- [PULL 40/49] hw/rtc/mc146818rtc: QOM'ify io_base offset, Philippe Mathieu-Daudé, 2022/06/11