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

Assisted-by: Kiro
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


Reply via email to