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
