[RFC PATCH v2 082/137] hw/isa: Give the isabus-bridge a QOM parent

Alexander Graf <[email protected]>
Newsgroups org.nongnu.qemu-riscv,org.nongnu.qemu-arm,org.nongnu.qemu-devel
Message-ID <[email protected]>
isa_bus_new(NULL, ...) implicitly created a sysbus "isabus-bridge"
and put the ISA bus on it.  That bridge ended up under
/machine/unattached, which this series is deleting.

Split out an explicit isa_bus_new_bridge(parent, ...) helper for
the five boards that don't already have a south-bridge device to
own the ISA bus, and make plain isa_bus_new() require a non-NULL
device.  Callers own the bridge in the composition tree:

  hw/i386/microvm.c   OBJECT(mms)
  hw/i386/isapc.c     OBJECT(machine)
  hw/mips/jazz.c      OBJECT(machine)
  hw/hppa/machine.c   parent (already threaded)
  hw/ppc/pnv_lpc.c    OBJECT(lpc)   -- the LPC controller

AI-used-for: code (refactoring)
Signed-off-by: Alexander Graf <[email protected]>
---
 hw/hppa/machine.c    |  2 +-
 hw/i386/isapc.c      |  2 +-
 hw/i386/microvm.c    |  2 +-
 hw/isa/isa-bus.c     | 21 +++++++++++----------
 hw/mips/jazz.c       |  2 +-
 hw/ppc/pnv_lpc.c     |  4 ++--
 include/hw/isa/isa.h |  2 ++
 7 files changed, 19 insertions(+), 16 deletions(-)

diff --git a/hw/hppa/machine.c b/hw/hppa/machine.c
index 002f4299cc..d52f27c51c 100644
--- a/hw/hppa/machine.c
+++ b/hw/hppa/machine.c
@@ -108,7 +108,7 @@ static ISABus *hppa_isa_bus(Object *parent, hwaddr addr)
                           NULL, "isa-io", 0x800);
     memory_region_add_subregion(get_system_memory(), addr, isa_region);
 
-    isa_bus = isa_bus_new(NULL, get_system_memory(), isa_region,
+    isa_bus = isa_bus_new_bridge(parent, get_system_memory(), isa_region,
                           &error_abort);
     isa_irqs = i8259_init(parent, isa_bus, NULL);
     isa_bus_register_input_irqs(isa_bus, isa_irqs);
diff --git a/hw/i386/isapc.c b/hw/i386/isapc.c
index 842ae94acb..e8d5767b80 100644
--- a/hw/i386/isapc.c
+++ b/hw/i386/isapc.c
@@ -108,7 +108,7 @@ static void pc_init_isa(MachineState *machine)
 
     gsi_state = pc_gsi_create(&x86ms->gsi, false);
 
-    isa_bus = isa_bus_new(NULL, system_memory, system_io,
+    isa_bus = isa_bus_new_bridge(OBJECT(machine), system_memory, system_io,
                           &error_abort);
     isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
 
diff --git a/hw/i386/microvm.c b/hw/i386/microvm.c
index 8c61106516..aa0e1ef155 100644
--- a/hw/i386/microvm.c
+++ b/hw/i386/microvm.c
@@ -171,7 +171,7 @@ static void microvm_devices_init(MicrovmMachineState *mms)
     x86ms->gsi = qemu_allocate_irqs(gsi_handler, gsi_state,
                                     IOAPIC_NUM_PINS * ioapics);
 
-    isa_bus = isa_bus_new(NULL, get_system_memory(), get_system_io(),
+    isa_bus = isa_bus_new_bridge(OBJECT(mms), get_system_memory(), get_system_io(),
                           &error_abort);
     isa_bus_register_input_irqs(isa_bus, x86ms->gsi);
 
diff --git a/hw/isa/isa-bus.c b/hw/isa/isa-bus.c
index fb20c43869..7a6a595ce7 100644
--- a/hw/isa/isa-bus.c
+++ b/hw/isa/isa-bus.c
@@ -52,28 +52,29 @@ static const TypeInfo isa_bus_info = {
 ISABus *isa_bus_new(DeviceState *dev, MemoryRegion* address_space,
                     MemoryRegion *address_space_io, Error **errp)
 {
-    DeviceState *bridge = NULL;
-
     if (isabus) {
         error_setg(errp, "Can't create a second ISA bus");
         return NULL;
     }
-    if (!dev) {
-        bridge = qdev_new_orphan("isabus-bridge");
-        dev = bridge;
-    }
+    g_assert(dev);
 
     isabus = ISA_BUS(qbus_new(TYPE_ISA_BUS, dev, NULL));
     isabus->address_space = address_space;
     isabus->address_space_io = address_space_io;
 
-    if (bridge) {
-        sysbus_realize_and_unref(SYS_BUS_DEVICE(bridge), &error_fatal);
-    }
-
     return isabus;
 }
 
+ISABus *isa_bus_new_bridge(Object *parent, MemoryRegion *address_space,
+                           MemoryRegion *address_space_io, Error **errp)
+{
+    DeviceState *bridge = qdev_new(parent, "isabus-bridge", "isabus-bridge");
+    ISABus *bus = isa_bus_new(bridge, address_space, address_space_io, errp);
+
+    sysbus_realize(SYS_BUS_DEVICE(bridge), &error_fatal);
+    return bus;
+}
+
 void isa_bus_register_input_irqs(ISABus *bus, qemu_irq *irqs_in)
 {
     bus->irqs_in = irqs_in;
diff --git a/hw/mips/jazz.c b/hw/mips/jazz.c
index 23d717d96a..8c52608913 100644
--- a/hw/mips/jazz.c
+++ b/hw/mips/jazz.c
@@ -283,7 +283,7 @@ static void mips_jazz_init(MachineState *machine,
     memory_region_init(isa_mem, NULL, "isa-mem", 0x01000000);
     memory_region_add_subregion(address_space, 0x90000000, isa_io);
     memory_region_add_subregion(address_space, 0x91000000, isa_mem);
-    isa_bus = isa_bus_new(NULL, isa_mem, isa_io, &error_abort);
+    isa_bus = isa_bus_new_bridge(OBJECT(machine), isa_mem, isa_io, &error_abort);
 
     /* ISA devices */
     i8259 = i8259_init(OBJECT(machine), isa_bus, env->irq[4]);
diff --git a/hw/ppc/pnv_lpc.c b/hw/ppc/pnv_lpc.c
index d1357dd359..6ae228088f 100644
--- a/hw/ppc/pnv_lpc.c
+++ b/hw/ppc/pnv_lpc.c
@@ -972,11 +972,11 @@ ISABus *pnv_lpc_isa_create(PnvLpcController *lpc, bool use_cpld, Error **errp)
     qemu_irq *irqs;
     qemu_irq_handler handler;
 
-    /* let isa_bus_new() create its own bridge on SysBus otherwise
+    /* let isa_bus_new_bridge() create the bridge as a child of the LPC;
      * devices specified on the command line won't find the bus and
      * will fail to create.
      */
-    isa_bus = isa_bus_new(NULL, &lpc->isa_mem, &lpc->isa_io, &local_err);
+    isa_bus = isa_bus_new_bridge(OBJECT(lpc), &lpc->isa_mem, &lpc->isa_io, &local_err);
     if (local_err) {
         error_propagate(errp, local_err);
         return NULL;
diff --git a/include/hw/isa/isa.h b/include/hw/isa/isa.h
index 9e35d88b1e..79bfe16361 100644
--- a/include/hw/isa/isa.h
+++ b/include/hw/isa/isa.h
@@ -69,6 +69,8 @@ struct ISADevice {
 
 ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space,
                     MemoryRegion *address_space_io, Error **errp);
+ISABus *isa_bus_new_bridge(Object *parent, MemoryRegion *address_space,
+                           MemoryRegion *address_space_io, Error **errp);
 void isa_bus_register_input_irqs(ISABus *bus, qemu_irq *irqs_in);
 void isa_bus_dma(ISABus *bus, IsaDma *dma8, IsaDma *dma16);
 IsaDma *isa_bus_get_dma(ISABus *bus, int nchan);
-- 
2.47.1
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.