* [Qemu-devel] [PATCH v3 01/16] isa: rename isa_bus_new to isa_bus_bridge_init
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 02/16] isa: rework ISA bus internals, and add ISA bus ops structure Hervé Poussineau
` (14 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/isa-bus.c | 2 +-
hw/isa.h | 2 +-
hw/mips_jazz.c | 2 +-
hw/mips_r4k.c | 2 +-
hw/pc_piix.c | 2 +-
hw/piix4.c | 2 +-
hw/piix_pci.c | 2 +-
hw/ppc_prep.c | 2 +-
hw/sun4u.c | 2 +-
hw/vt82c686.c | 2 +-
10 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index 6c15a31..ad225c6 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -40,7 +40,7 @@ static struct BusInfo isa_bus_info = {
.get_fw_dev_path = isabus_get_fw_dev_path,
};
-ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space_io)
+ISABus *isa_bus_bridge_init(DeviceState *dev, MemoryRegion *address_space_io)
{
if (isabus) {
fprintf(stderr, "Can't create a second ISA bus\n");
diff --git a/hw/isa.h b/hw/isa.h
index 432d17a..d2b3cba 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -27,7 +27,7 @@ struct ISADeviceInfo {
isa_qdev_initfn init;
};
-ISABus *isa_bus_new(DeviceState *dev, MemoryRegion *address_space_io);
+ISABus *isa_bus_bridge_init(DeviceState *dev, MemoryRegion *address_space_io);
void isa_bus_irqs(qemu_irq *irqs);
qemu_irq isa_get_irq(int isairq);
void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq);
diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c
index ea07d32..d6444c6 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -182,7 +182,7 @@ static void mips_jazz_init(MemoryRegion *address_space,
memory_region_add_subregion(address_space, 0x8000d000, dma_dummy);
/* ISA devices */
- isa_bus_new(NULL, address_space_io);
+ isa_bus_bridge_init(NULL, address_space_io);
i8259 = i8259_init(env->irq[4]);
isa_bus_irqs(i8259);
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
index d0564d4..6562fb3 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -256,7 +256,7 @@ void mips_r4k_init (ram_addr_t ram_size,
cpu_mips_clock_init(env);
/* The PIC is attached to the MIPS CPU INT0 pin */
- isa_bus_new(NULL, get_system_io());
+ isa_bus_bridge_init(NULL, get_system_io());
i8259 = i8259_init(env->irq[2]);
isa_bus_irqs(i8259);
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index ce1c87f..8209346 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -146,7 +146,7 @@ static void pc_init1(MemoryRegion *system_memory,
} else {
pci_bus = NULL;
i440fx_state = NULL;
- isa_bus_new(NULL, system_io);
+ isa_bus_bridge_init(NULL, system_io);
no_hpet = 1;
}
isa_bus_irqs(isa_irq);
diff --git a/hw/piix4.c b/hw/piix4.c
index 2fd1171..9addaae 100644
--- a/hw/piix4.c
+++ b/hw/piix4.c
@@ -87,7 +87,7 @@ static int piix4_initfn(PCIDevice *dev)
{
PIIX4State *d = DO_UPCAST(PIIX4State, dev, dev);
- isa_bus_new(&d->dev.qdev, pci_address_space_io(dev));
+ isa_bus_bridge_init(&d->dev.qdev, pci_address_space_io(dev));
piix4_dev = &d->dev;
qemu_register_reset(piix4_reset, d);
return 0;
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index d183443..287bd19 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -504,7 +504,7 @@ static int piix3_initfn(PCIDevice *dev)
{
PIIX3State *d = DO_UPCAST(PIIX3State, dev, dev);
- isa_bus_new(&d->dev.qdev, pci_address_space_io(dev));
+ isa_bus_bridge_init(&d->dev.qdev, pci_address_space_io(dev));
qemu_register_reset(piix3_reset, d);
return 0;
}
diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c
index d26049b..808c83e 100644
--- a/hw/ppc_prep.c
+++ b/hw/ppc_prep.c
@@ -649,7 +649,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
hw_error("Only 6xx bus is supported on PREP machine\n");
}
/* Hmm, prep has no pci-isa bridge ??? */
- isa_bus_new(NULL, get_system_io());
+ isa_bus_bridge_init(NULL, get_system_io());
i8259 = i8259_init(first_cpu->irq_inputs[PPC6xx_INPUT_INT]);
pci_bus = pci_prep_init(i8259, get_system_memory(), get_system_io());
isa_bus_irqs(i8259);
diff --git a/hw/sun4u.c b/hw/sun4u.c
index fbef350..cdf15ff 100644
--- a/hw/sun4u.c
+++ b/hw/sun4u.c
@@ -548,7 +548,7 @@ pci_ebus_init1(PCIDevice *pci_dev)
{
EbusState *s = DO_UPCAST(EbusState, pci_dev, pci_dev);
- isa_bus_new(&pci_dev->qdev, pci_address_space_io(pci_dev));
+ isa_bus_bridge_init(&pci_dev->qdev, pci_address_space_io(pci_dev));
pci_dev->config[0x04] = 0x06; // command = bus master, pci mem
pci_dev->config[0x05] = 0x00;
diff --git a/hw/vt82c686.c b/hw/vt82c686.c
index 2845959..46e85dd 100644
--- a/hw/vt82c686.c
+++ b/hw/vt82c686.c
@@ -490,7 +490,7 @@ static int vt82c686b_initfn(PCIDevice *d)
uint8_t *wmask;
int i;
- isa_bus_new(&d->qdev, pci_address_space_io(d));
+ isa_bus_bridge_init(&d->qdev, pci_address_space_io(d));
pci_conf = d->config;
pci_config_set_prog_interface(pci_conf, 0x0);
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 02/16] isa: rework ISA bus internals, and add ISA bus ops structure
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 01/16] isa: rename isa_bus_new to isa_bus_bridge_init Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 03/16] isa: correctly implement isa_address_space(), by calling a bus-specific function Hervé Poussineau
` (13 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
This allows future implementations of real pci-isa bridges
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
Makefile.objs | 2 +-
hw/isa-bridge.c | 85 ++++++++++++++++++++++++++++++++++++++++++++++++++
hw/isa-bus.c | 93 ++++++++++++++++++++++++++++++++++++-------------------
hw/isa.h | 18 ++++++++++-
qemu-common.h | 1 +
5 files changed, 165 insertions(+), 34 deletions(-)
create mode 100644 hw/isa-bridge.c
diff --git a/Makefile.objs b/Makefile.objs
index 8d23fbb..bab4b3f 100644
--- a/Makefile.objs
+++ b/Makefile.objs
@@ -276,7 +276,7 @@ hw-obj-$(CONFIG_AHCI) += ide/ich.o
hw-obj-$(CONFIG_LSI_SCSI_PCI) += lsi53c895a.o
hw-obj-$(CONFIG_ESP) += esp.o
-hw-obj-y += dma-helpers.o sysbus.o isa-bus.o
+hw-obj-y += dma-helpers.o sysbus.o isa-bus.o isa-bridge.o
hw-obj-y += qdev-addr.o
# VGA
diff --git a/hw/isa-bridge.c b/hw/isa-bridge.c
new file mode 100644
index 0000000..6f51701
--- /dev/null
+++ b/hw/isa-bridge.c
@@ -0,0 +1,85 @@
+/*
+ * Simple ISA bus bridge
+ *
+ * Copyright (c) 2011 Herve Poussineau
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "isa.h"
+#include "sysbus.h"
+
+typedef struct {
+ SysBusDevice busdev;
+ ISABus bus;
+ qemu_irq *irqs;
+ MemoryRegion *io_space;
+} ISABridgeSysBusState;
+
+static void isabus_bridge_set_irqs(ISABus *bus, qemu_irq *irqs)
+{
+ ISABridgeSysBusState *s = container_of(bus, ISABridgeSysBusState, bus);
+ s->irqs = irqs;
+}
+
+static qemu_irq isabus_bridge_get_irq(ISABus *bus, int isairq)
+{
+ ISABridgeSysBusState *s = container_of(bus, ISABridgeSysBusState, bus);
+ if (!s->irqs || isairq < 0 || isairq > 15) {
+ hw_error("isa irq %d invalid", isairq);
+ }
+ return s->irqs[isairq];
+}
+
+static void isa_bridge_set_io_space(ISABus *bus, MemoryRegion* io_space)
+{
+ ISABridgeSysBusState *s = container_of(bus, ISABridgeSysBusState, bus);
+ s->io_space = io_space;
+}
+
+static MemoryRegion *isa_bridge_get_io_space(ISABus *bus)
+{
+ ISABridgeSysBusState *s = container_of(bus, ISABridgeSysBusState, bus);
+ return s->io_space;
+}
+
+static ISABusOps isabus_bridge_ops = {
+ .set_irqs = isabus_bridge_set_irqs,
+ .get_irq = isabus_bridge_get_irq,
+ .set_io_space = isa_bridge_set_io_space,
+ .get_io_space = isa_bridge_get_io_space,
+};
+
+static int isabus_bridge_init(SysBusDevice *dev)
+{
+ ISABridgeSysBusState *isa = FROM_SYSBUS(ISABridgeSysBusState, dev);
+ isa_bus_new(&isa->bus, &isabus_bridge_ops, &dev->qdev);
+ return 0;
+}
+
+static SysBusDeviceInfo isabus_bridge_info = {
+ .init = isabus_bridge_init,
+ .qdev.name = "isabus-bridge",
+ .qdev.fw_name = "isa",
+ .qdev.size = sizeof(ISABridgeSysBusState),
+ .qdev.no_user = 1,
+};
+
+static void isabus_bridge_register_devices(void)
+{
+ sysbus_register_withprop(&isabus_bridge_info);
+}
+
+device_init(isabus_bridge_register_devices)
+
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index ad225c6..f8b5dcb 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -22,13 +22,10 @@
#include "isa.h"
#include "exec-memory.h"
-struct ISABus {
- BusState qbus;
- MemoryRegion *address_space_io;
- qemu_irq *irqs;
-};
static ISABus *isabus;
target_phys_addr_t isa_mem_base = 0;
+static qemu_irq *isa_bus_default_irqs;
+static MemoryRegion *isa_bus_io_space;
static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent);
static char *isabus_get_fw_dev_path(DeviceState *dev);
@@ -40,6 +37,36 @@ static struct BusInfo isa_bus_info = {
.get_fw_dev_path = isabus_get_fw_dev_path,
};
+static void isa_bus_default_set_irqs(ISABus *bus, qemu_irq *irqs)
+{
+ isa_bus_default_irqs = irqs;
+}
+
+static qemu_irq isa_bus_default_get_irq(ISABus *bus, int isairq)
+{
+ if (isairq < 0 || isairq > 15) {
+ hw_error("isa irq %d invalid", isairq);
+ }
+ return isa_bus_default_irqs[isairq];
+}
+
+static void isa_bus_default_set_io_space(ISABus *bus, MemoryRegion *io_space)
+{
+ isa_bus_io_space = io_space;
+}
+
+static MemoryRegion *isa_bus_default_get_io_space(ISABus *bus)
+{
+ return isa_bus_io_space;
+}
+
+static ISABusOps isa_bus_default_ops = {
+ .set_irqs = isa_bus_default_set_irqs,
+ .get_irq = isa_bus_default_get_irq,
+ .set_io_space = isa_bus_default_set_io_space,
+ .get_io_space = isa_bus_default_get_io_space,
+};
+
ISABus *isa_bus_bridge_init(DeviceState *dev, MemoryRegion *address_space_io)
{
if (isabus) {
@@ -49,16 +76,32 @@ ISABus *isa_bus_bridge_init(DeviceState *dev, MemoryRegion *address_space_io)
if (NULL == dev) {
dev = qdev_create(NULL, "isabus-bridge");
qdev_init_nofail(dev);
+ } else {
+ isabus = FROM_QBUS(ISABus, qbus_create(&isa_bus_info, dev, NULL));
+ isabus->ops = &isa_bus_default_ops;
}
- isabus = FROM_QBUS(ISABus, qbus_create(&isa_bus_info, dev, NULL));
- isabus->address_space_io = address_space_io;
+ isabus->ops->set_io_space(isabus, address_space_io);
+
return isabus;
}
+void isa_bus_new(ISABus *bus, ISABusOps *ops, DeviceState *host)
+{
+ if (isabus) {
+ hw_error("Can't create a second ISA bus");
+ }
+ qbus_create_inplace(&bus->qbus, &isa_bus_info, host, NULL);
+ bus->ops = ops;
+ isabus = bus;
+}
+
void isa_bus_irqs(qemu_irq *irqs)
{
- isabus->irqs = irqs;
+ if (!isabus || !isabus->ops->set_irqs) {
+ hw_error("Tried to set isa irqs with no isa bus present.");
+ }
+ isabus->ops->set_irqs(isabus, irqs);
}
/*
@@ -69,10 +112,10 @@ void isa_bus_irqs(qemu_irq *irqs)
*/
qemu_irq isa_get_irq(int isairq)
{
- if (isairq < 0 || isairq > 15) {
- hw_error("isa irq %d invalid", isairq);
+ if (!isabus || !isabus->ops->get_irq) {
+ hw_error("ISA bus invalid");
}
- return isabus->irqs[isairq];
+ return isabus->ops->get_irq(isabus, isairq);
}
void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq)
@@ -110,7 +153,13 @@ void isa_init_ioport(ISADevice *dev, uint16_t ioport)
void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t start)
{
- memory_region_add_subregion(isabus->address_space_io, start, io);
+ ISABus *bus = isabus;
+
+ if (!bus || !bus->ops->get_io_space) {
+ hw_error("Tried to register I/O port with no isa bus present.");
+ }
+
+ memory_region_add_subregion(bus->ops->get_io_space(bus), start, io);
if (dev != NULL) {
assert(dev->nio < ARRAY_SIZE(dev->io));
dev->io[dev->nio++] = io;
@@ -182,25 +231,6 @@ static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent)
}
}
-static int isabus_bridge_init(SysBusDevice *dev)
-{
- /* nothing */
- return 0;
-}
-
-static SysBusDeviceInfo isabus_bridge_info = {
- .init = isabus_bridge_init,
- .qdev.name = "isabus-bridge",
- .qdev.fw_name = "isa",
- .qdev.size = sizeof(SysBusDevice),
- .qdev.no_user = 1,
-};
-
-static void isabus_register_devices(void)
-{
- sysbus_register_withprop(&isabus_bridge_info);
-}
-
static char *isabus_get_fw_dev_path(DeviceState *dev)
{
ISADevice *d = (ISADevice*)dev;
@@ -220,4 +250,3 @@ MemoryRegion *isa_address_space(ISADevice *dev)
return get_system_memory();
}
-device_init(isabus_register_devices)
diff --git a/hw/isa.h b/hw/isa.h
index d2b3cba..3437199 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -7,7 +7,7 @@
#include "memory.h"
#include "qdev.h"
-typedef struct ISABus ISABus;
+typedef struct ISABusOps ISABusOps;
typedef struct ISADevice ISADevice;
typedef struct ISADeviceInfo ISADeviceInfo;
@@ -27,7 +27,23 @@ struct ISADeviceInfo {
isa_qdev_initfn init;
};
+/* isa-bus.c */
+
+struct ISABus {
+ BusState qbus;
+ ISABusOps *ops;
+};
+
+struct ISABusOps {
+ void (*set_irqs)(ISABus *bus, qemu_irq *irqs);
+ qemu_irq (*get_irq)(ISABus *bus, int isairq);
+ void (*set_io_space)(ISABus *bus, MemoryRegion *address_space);
+ MemoryRegion *(*get_io_space)(ISABus *bus);
+};
+
ISABus *isa_bus_bridge_init(DeviceState *dev, MemoryRegion *address_space_io);
+
+void isa_bus_new(ISABus *bus, ISABusOps *ops, DeviceState *host);
void isa_bus_irqs(qemu_irq *irqs);
qemu_irq isa_get_irq(int isairq);
void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq);
diff --git a/qemu-common.h b/qemu-common.h
index 5e87bdf..e3a470d 100644
--- a/qemu-common.h
+++ b/qemu-common.h
@@ -243,6 +243,7 @@ typedef struct VLANClientState VLANClientState;
typedef struct i2c_bus i2c_bus;
typedef struct i2c_slave i2c_slave;
typedef struct SMBusDevice SMBusDevice;
+typedef struct ISABus ISABus;
typedef struct PCIHostState PCIHostState;
typedef struct PCIExpressHost PCIExpressHost;
typedef struct PCIBus PCIBus;
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 03/16] isa: correctly implement isa_address_space(), by calling a bus-specific function
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 01/16] isa: rename isa_bus_new to isa_bus_bridge_init Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 02/16] isa: rework ISA bus internals, and add ISA bus ops structure Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 04/16] audio: give ISA bus to sound cards, instead of PIC Hervé Poussineau
` (12 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
This method can be used later to remove the isa_mem_base variable.
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/isa-bridge.c | 7 +++++++
hw/isa-bus.c | 13 ++++++++++++-
hw/isa.h | 6 ++++++
3 files changed, 25 insertions(+), 1 deletions(-)
diff --git a/hw/isa-bridge.c b/hw/isa-bridge.c
index 6f51701..de7c46b 100644
--- a/hw/isa-bridge.c
+++ b/hw/isa-bridge.c
@@ -19,6 +19,7 @@
#include "isa.h"
#include "sysbus.h"
+#include "exec-memory.h"
typedef struct {
SysBusDevice busdev;
@@ -54,11 +55,17 @@ static MemoryRegion *isa_bridge_get_io_space(ISABus *bus)
return s->io_space;
}
+static MemoryRegion *isa_bridge_get_memory_space(ISABus *bus)
+{
+ return get_system_memory();
+}
+
static ISABusOps isabus_bridge_ops = {
.set_irqs = isabus_bridge_set_irqs,
.get_irq = isabus_bridge_get_irq,
.set_io_space = isa_bridge_set_io_space,
.get_io_space = isa_bridge_get_io_space,
+ .get_memory_space = isa_bridge_get_memory_space,
};
static int isabus_bridge_init(SysBusDevice *dev)
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index f8b5dcb..dd539e5 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -60,11 +60,17 @@ static MemoryRegion *isa_bus_default_get_io_space(ISABus *bus)
return isa_bus_io_space;
}
+static MemoryRegion *isa_bus_default_get_memory_space(ISABus *bus)
+{
+ return get_system_memory();
+}
+
static ISABusOps isa_bus_default_ops = {
.set_irqs = isa_bus_default_set_irqs,
.get_irq = isa_bus_default_get_irq,
.set_io_space = isa_bus_default_set_io_space,
.get_io_space = isa_bus_default_get_io_space,
+ .get_memory_space = isa_bus_default_get_memory_space,
};
ISABus *isa_bus_bridge_init(DeviceState *dev, MemoryRegion *address_space_io)
@@ -247,6 +253,11 @@ static char *isabus_get_fw_dev_path(DeviceState *dev)
MemoryRegion *isa_address_space(ISADevice *dev)
{
- return get_system_memory();
+ ISABus *bus = isa_bus_from_device(dev);
+
+ if (!bus->ops->get_memory_space) {
+ hw_error("Tried to get isa address space on invalid isa bus.");
+ }
+ return bus->ops->get_memory_space(bus);
}
diff --git a/hw/isa.h b/hw/isa.h
index 3437199..8d439b5 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -39,6 +39,7 @@ struct ISABusOps {
qemu_irq (*get_irq)(ISABus *bus, int isairq);
void (*set_io_space)(ISABus *bus, MemoryRegion *address_space);
MemoryRegion *(*get_io_space)(ISABus *bus);
+ MemoryRegion *(*get_memory_space)(ISABus *bus);
};
ISABus *isa_bus_bridge_init(DeviceState *dev, MemoryRegion *address_space_io);
@@ -56,6 +57,11 @@ ISADevice *isa_create(const char *name);
ISADevice *isa_try_create(const char *name);
ISADevice *isa_create_simple(const char *name);
+static inline ISABus *isa_bus_from_device(ISADevice *d)
+{
+ return FROM_QBUS(ISABus, qdev_get_parent_bus(&d->qdev));
+}
+
extern target_phys_addr_t isa_mem_base;
void isa_mmio_setup(MemoryRegion *mr, target_phys_addr_t size);
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 04/16] audio: give ISA bus to sound cards, instead of PIC
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (2 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 03/16] isa: correctly implement isa_address_space(), by calling a bus-specific function Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 05/16] pc: improve bus implementation of PIIX3 bridge Hervé Poussineau
` (11 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
arch_init.c | 10 +++++-----
arch_init.h | 2 +-
hw/adlib.c | 2 +-
hw/audiodev.h | 8 ++++----
hw/cs4231a.c | 2 +-
hw/gus.c | 2 +-
hw/mips_jazz.c | 5 +++--
hw/pc.h | 2 +-
hw/pc_piix.c | 4 ++--
hw/pcspk.c | 2 +-
hw/sb16.c | 2 +-
11 files changed, 21 insertions(+), 20 deletions(-)
diff --git a/arch_init.c b/arch_init.c
index a6c69c7..dd76493 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -466,7 +466,7 @@ struct soundhw {
int enabled;
int isa;
union {
- int (*init_isa) (qemu_irq *pic);
+ int (*init_isa) (ISABus *bus);
int (*init_pci) (PCIBus *bus);
} init;
};
@@ -621,15 +621,15 @@ void select_soundhw(const char *optarg)
}
}
-void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus)
+void audio_init(ISABus *isa_bus, PCIBus *pci_bus)
{
struct soundhw *c;
for (c = soundhw; c->name; ++c) {
if (c->enabled) {
if (c->isa) {
- if (isa_pic) {
- c->init.init_isa(isa_pic);
+ if (isa_bus) {
+ c->init.init_isa(isa_bus);
}
} else {
if (pci_bus) {
@@ -643,7 +643,7 @@ void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus)
void select_soundhw(const char *optarg)
{
}
-void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus)
+void audio_init(ISABus *isa_bus, PCIBus *pci_bus)
{
}
#endif
diff --git a/arch_init.h b/arch_init.h
index a74187a..828256c 100644
--- a/arch_init.h
+++ b/arch_init.h
@@ -27,7 +27,7 @@ void do_acpitable_option(const char *optarg);
void do_smbios_option(const char *optarg);
void cpudef_init(void);
int audio_available(void);
-void audio_init(qemu_irq *isa_pic, PCIBus *pci_bus);
+void audio_init(ISABus *isa_bus, PCIBus *pci_bus);
int tcg_available(void);
int kvm_available(void);
int xen_available(void);
diff --git a/hw/adlib.c b/hw/adlib.c
index e4bfcc6..dd8b188 100644
--- a/hw/adlib.c
+++ b/hw/adlib.c
@@ -275,7 +275,7 @@ static void Adlib_fini (AdlibState *s)
AUD_remove_card (&s->card);
}
-int Adlib_init (qemu_irq *pic)
+int Adlib_init (ISABus *bus)
{
AdlibState *s = &glob_adlib;
struct audsettings as;
diff --git a/hw/audiodev.h b/hw/audiodev.h
index 8e930b2..1d34a4b 100644
--- a/hw/audiodev.h
+++ b/hw/audiodev.h
@@ -2,19 +2,19 @@
int es1370_init(PCIBus *bus);
/* sb16.c */
-int SB16_init(qemu_irq *pic);
+int SB16_init(ISABus *bus);
/* adlib.c */
-int Adlib_init(qemu_irq *pic);
+int Adlib_init(ISABus *bus);
/* gus.c */
-int GUS_init(qemu_irq *pic);
+int GUS_init(ISABus *bus);
/* ac97.c */
int ac97_init(PCIBus *buf);
/* cs4231a.c */
-int cs4231a_init(qemu_irq *pic);
+int cs4231a_init(ISABus *bus);
/* intel-hda.c + hda-audio.c */
int intel_hda_and_codec_init(PCIBus *bus);
diff --git a/hw/cs4231a.c b/hw/cs4231a.c
index e16665e..e697634 100644
--- a/hw/cs4231a.c
+++ b/hw/cs4231a.c
@@ -659,7 +659,7 @@ static int cs4231a_initfn (ISADevice *dev)
return 0;
}
-int cs4231a_init (qemu_irq *pic)
+int cs4231a_init (ISABus *bus)
{
isa_create_simple ("cs4231a");
return 0;
diff --git a/hw/gus.c b/hw/gus.c
index 37e543a..2f40fcd 100644
--- a/hw/gus.c
+++ b/hw/gus.c
@@ -294,7 +294,7 @@ static int gus_initfn (ISADevice *dev)
return 0;
}
-int GUS_init (qemu_irq *pic)
+int GUS_init (ISABus *bus)
{
isa_create_simple ("gus");
return 0;
diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c
index d6444c6..d06eacd 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -112,6 +112,7 @@ static void mips_jazz_init(MemoryRegion *address_space,
int bios_size, n;
CPUState *env;
qemu_irq *rc4030, *i8259;
+ ISABus *isa_bus;
rc4030_dma *dmas;
void* rc4030_opaque;
MemoryRegion *rtc = g_new(MemoryRegion, 1);
@@ -182,7 +183,7 @@ static void mips_jazz_init(MemoryRegion *address_space,
memory_region_add_subregion(address_space, 0x8000d000, dma_dummy);
/* ISA devices */
- isa_bus_bridge_init(NULL, address_space_io);
+ isa_bus = isa_bus_bridge_init(NULL, address_space_io);
i8259 = i8259_init(env->irq[4]);
isa_bus_irqs(i8259);
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
@@ -284,7 +285,7 @@ static void mips_jazz_init(MemoryRegion *address_space,
/* Sound card */
/* FIXME: missing Jazz sound at 0x8000c000, rc4030[2] */
- audio_init(i8259, NULL);
+ audio_init(isa_bus, NULL);
/* NVRAM */
dev = qdev_create(NULL, "ds1225y");
diff --git a/hw/pc.h b/hw/pc.h
index 7e6ddba..c546037 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -174,7 +174,7 @@ extern int no_hpet;
/* pcspk.c */
void pcspk_init(ISADevice *pit);
-int pcspk_audio_init(qemu_irq *pic);
+int pcspk_audio_init(ISABus *bus);
/* piix_pci.c */
struct PCII440FXState;
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index 8209346..f971d52 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -146,7 +146,7 @@ static void pc_init1(MemoryRegion *system_memory,
} else {
pci_bus = NULL;
i440fx_state = NULL;
- isa_bus_bridge_init(NULL, system_io);
+ isa_bus = isa_bus_bridge_init(NULL, system_io);
no_hpet = 1;
}
isa_bus_irqs(isa_irq);
@@ -202,7 +202,7 @@ static void pc_init1(MemoryRegion *system_memory,
}
}
- audio_init(isa_irq, pci_enabled ? pci_bus : NULL);
+ audio_init(isa_bus, pci_enabled ? pci_bus : NULL);
pc_cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device,
idebus[0], idebus[1], rtc_state);
diff --git a/hw/pcspk.c b/hw/pcspk.c
index 7fa2d36..acb0167 100644
--- a/hw/pcspk.c
+++ b/hw/pcspk.c
@@ -96,7 +96,7 @@ static void pcspk_callback(void *opaque, int free)
}
}
-int pcspk_audio_init(qemu_irq *pic)
+int pcspk_audio_init(ISABus *bus)
{
PCSpkState *s = &pcspk_state;
struct audsettings as = {PCSPK_SAMPLE_RATE, 1, AUD_FMT_U8, 0};
diff --git a/hw/sb16.c b/hw/sb16.c
index a76df1b..15a1e61 100644
--- a/hw/sb16.c
+++ b/hw/sb16.c
@@ -1391,7 +1391,7 @@ static int sb16_initfn (ISADevice *dev)
return 0;
}
-int SB16_init (qemu_irq *pic)
+int SB16_init (ISABus *bus)
{
isa_create_simple ("sb16");
return 0;
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 05/16] pc: improve bus implementation of PIIX3 bridge
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (3 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 04/16] audio: give ISA bus to sound cards, instead of PIC Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 06/16] fulong2e: improve bus implementation of vt82c bridge Hervé Poussineau
` (10 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/pc.h | 2 +-
hw/pc_piix.c | 3 ++-
hw/piix_pci.c | 45 ++++++++++++++++++++++++++++++++++++++++-----
3 files changed, 43 insertions(+), 7 deletions(-)
diff --git a/hw/pc.h b/hw/pc.h
index c546037..746973f 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -181,7 +181,7 @@ struct PCII440FXState;
typedef struct PCII440FXState PCII440FXState;
PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn,
- qemu_irq *pic,
+ ISABus **isa_bus,
MemoryRegion *address_space_mem,
MemoryRegion *address_space_io,
ram_addr_t ram_size,
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index f971d52..7ccbfca 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -84,6 +84,7 @@ static void pc_init1(MemoryRegion *system_memory,
int i;
ram_addr_t below_4g_mem_size, above_4g_mem_size;
PCIBus *pci_bus;
+ ISABus *isa_bus;
PCII440FXState *i440fx_state;
int piix3_devfn = -1;
qemu_irq *cpu_irq;
@@ -134,7 +135,7 @@ static void pc_init1(MemoryRegion *system_memory,
isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 24);
if (pci_enabled) {
- pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, isa_irq,
+ pci_bus = i440fx_init(&i440fx_state, &piix3_devfn, &isa_bus,
system_memory, system_io, ram_size,
below_4g_mem_size,
0x100000000ULL - below_4g_mem_size,
diff --git a/hw/piix_pci.c b/hw/piix_pci.c
index 287bd19..76464f6 100644
--- a/hw/piix_pci.c
+++ b/hw/piix_pci.c
@@ -30,6 +30,7 @@
#include "sysbus.h"
#include "range.h"
#include "xen.h"
+#include "exec-memory.h"
/*
* I440FX chipset data sheet.
@@ -45,6 +46,7 @@ typedef PCIHostState I440FXState;
typedef struct PIIX3State {
PCIDevice dev;
+ ISABus bus;
/*
* bitmap to track pic levels.
@@ -263,7 +265,7 @@ static int i440fx_initfn(PCIDevice *dev)
static PCIBus *i440fx_common_init(const char *device_name,
PCII440FXState **pi440fx_state,
int *piix3_devfn,
- qemu_irq *pic,
+ ISABus **isa_bus,
MemoryRegion *address_space_mem,
MemoryRegion *address_space_io,
ram_addr_t ram_size,
@@ -324,7 +326,7 @@ static PCIBus *i440fx_common_init(const char *device_name,
pci_bus_irqs(b, piix3_set_irq, pci_slot_get_pirq, piix3,
PIIX_NUM_PIRQS);
}
- piix3->pic = pic;
+ *isa_bus = &piix3->bus;
(*pi440fx_state)->piix3 = piix3;
@@ -341,7 +343,7 @@ static PCIBus *i440fx_common_init(const char *device_name,
}
PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix3_devfn,
- qemu_irq *pic,
+ ISABus **isa_bus,
MemoryRegion *address_space_mem,
MemoryRegion *address_space_io,
ram_addr_t ram_size,
@@ -354,7 +356,7 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix3_devfn,
{
PCIBus *b;
- b = i440fx_common_init("i440FX", pi440fx_state, piix3_devfn, pic,
+ b = i440fx_common_init("i440FX", pi440fx_state, piix3_devfn, isa_bus,
address_space_mem, address_space_io, ram_size,
pci_hole_start, pci_hole_size,
pci_hole64_size, pci_hole64_size,
@@ -500,11 +502,44 @@ static const VMStateDescription vmstate_piix3 = {
}
};
+static void piix3_bus_set_irqs(ISABus *bus, qemu_irq *irqs)
+{
+ PIIX3State *d = container_of(bus, PIIX3State, bus);
+ d->pic = irqs;
+}
+
+static qemu_irq piix3_bus_get_irq(ISABus *bus, int isairq)
+{
+ PIIX3State *d = container_of(bus, PIIX3State, bus);
+ if (isairq < 0 || isairq >= PIIX_NUM_PIC_IRQS) {
+ hw_error("isa irq %d invalid", isairq);
+ }
+ return d->pic[isairq];
+}
+
+static MemoryRegion *piix3_bus_get_io_space(ISABus *bus)
+{
+ PIIX3State *d = container_of(bus, PIIX3State, bus);
+ return pci_address_space_io(&d->dev);
+}
+
+static MemoryRegion *piix3_bus_get_memory_space(ISABus *bus)
+{
+ return get_system_memory();
+}
+
+static ISABusOps piix3_bus_ops = {
+ .set_irqs = piix3_bus_set_irqs,
+ .get_irq = piix3_bus_get_irq,
+ .get_io_space = piix3_bus_get_io_space,
+ .get_memory_space = piix3_bus_get_memory_space,
+};
+
static int piix3_initfn(PCIDevice *dev)
{
PIIX3State *d = DO_UPCAST(PIIX3State, dev, dev);
- isa_bus_bridge_init(&d->dev.qdev, pci_address_space_io(dev));
+ isa_bus_new(&d->bus, &piix3_bus_ops, &dev->qdev);
qemu_register_reset(piix3_reset, d);
return 0;
}
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 06/16] fulong2e: improve bus implementation of vt82c bridge
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (4 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 05/16] pc: improve bus implementation of PIIX3 bridge Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 07/16] sun4u: improve bus implementation of EBus bridge Hervé Poussineau
` (9 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/mips_fulong2e.c | 9 ++-------
hw/vt82c686.c | 31 +++++++++++++++++++++++++++++--
hw/vt82c686.h | 2 +-
3 files changed, 32 insertions(+), 10 deletions(-)
diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c
index 04921c1..3034a9c 100644
--- a/hw/mips_fulong2e.c
+++ b/hw/mips_fulong2e.c
@@ -262,7 +262,6 @@ static void mips_fulong2e_init(ram_addr_t ram_size, const char *boot_device,
MemoryRegion *bios = g_new(MemoryRegion, 1);
long bios_size;
int64_t kernel_entry;
- qemu_irq *i8259;
qemu_irq *cpu_exit_irq;
int via_devfn;
PCIBus *pci_bus;
@@ -337,17 +336,13 @@ static void mips_fulong2e_init(ram_addr_t ram_size, const char *boot_device,
/* South bridge */
ide_drive_get(hd, MAX_IDE_BUS);
- via_devfn = vt82c686b_init(pci_bus, PCI_DEVFN(FULONG2E_VIA_SLOT, 0));
+ via_devfn = vt82c686b_init(pci_bus, PCI_DEVFN(FULONG2E_VIA_SLOT, 0),
+ env->irq[5]);
if (via_devfn < 0) {
fprintf(stderr, "vt82c686b_init error\n");
exit(1);
}
- /* Interrupt controller */
- /* The 8259 -> IP5 */
- i8259 = i8259_init(env->irq[5]);
- isa_bus_irqs(i8259);
-
vt82c686b_ide_init(pci_bus, hd, PCI_DEVFN(FULONG2E_VIA_SLOT, 1));
usb_uhci_vt82c686b_init(pci_bus, PCI_DEVFN(FULONG2E_VIA_SLOT, 2));
usb_uhci_vt82c686b_init(pci_bus, PCI_DEVFN(FULONG2E_VIA_SLOT, 3));
diff --git a/hw/vt82c686.c b/hw/vt82c686.c
index 46e85dd..05a70da 100644
--- a/hw/vt82c686.c
+++ b/hw/vt82c686.c
@@ -41,6 +41,8 @@ typedef struct SuperIOConfig
typedef struct VT82C686BState {
PCIDevice dev;
+ ISABus bus;
+ qemu_irq *pic;
SuperIOConfig superio_conf;
} VT82C686BState;
@@ -483,14 +485,35 @@ static const VMStateDescription vmstate_via = {
}
};
+static qemu_irq vt82c_bus_get_irq(ISABus *bus, int isairq)
+{
+ VT82C686BState *vt82c = container_of(bus, VT82C686BState, bus);
+ if (isairq < 0 || isairq >= 16) {
+ hw_error("isa irq %d invalid", isairq);
+ }
+ return vt82c->pic[isairq];
+}
+
+static MemoryRegion *vt82c_bus_get_io_space(ISABus *bus)
+{
+ VT82C686BState *vt82c = container_of(bus, VT82C686BState, bus);
+ return pci_address_space_io(&vt82c->dev);
+}
+
+static ISABusOps vt82c_bus_ops = {
+ .get_irq = vt82c_bus_get_irq,
+ .get_io_space = vt82c_bus_get_io_space,
+};
+
/* init the PCI-to-ISA bridge */
static int vt82c686b_initfn(PCIDevice *d)
{
+ VT82C686BState *vt82c = DO_UPCAST(VT82C686BState, dev, d);
uint8_t *pci_conf;
uint8_t *wmask;
int i;
- isa_bus_bridge_init(&d->qdev, pci_address_space_io(d));
+ isa_bus_new(&vt82c->bus, &vt82c_bus_ops, &d->qdev);
pci_conf = d->config;
pci_config_set_prog_interface(pci_conf, 0x0);
@@ -507,12 +530,16 @@ static int vt82c686b_initfn(PCIDevice *d)
return 0;
}
-int vt82c686b_init(PCIBus *bus, int devfn)
+int vt82c686b_init(PCIBus *bus, int devfn, qemu_irq parent_irq)
{
PCIDevice *d;
+ VT82C686BState *vt82c;
d = pci_create_simple_multifunction(bus, devfn, true, "VT82C686B");
+ vt82c = DO_UPCAST(VT82C686BState, dev, d);
+ vt82c->pic = i8259_init(parent_irq);
+
return d->devfn;
}
diff --git a/hw/vt82c686.h b/hw/vt82c686.h
index e3270ca..1a026c2 100644
--- a/hw/vt82c686.h
+++ b/hw/vt82c686.h
@@ -2,7 +2,7 @@
#define HW_VT82C686_H
/* vt82c686.c */
-int vt82c686b_init(PCIBus * bus, int devfn);
+int vt82c686b_init(PCIBus *bus, int devfn, qemu_irq parent_irq);
void vt82c686b_ac97_init(PCIBus *bus, int devfn);
void vt82c686b_mc97_init(PCIBus *bus, int devfn);
i2c_bus *vt82c686b_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 07/16] sun4u: improve bus implementation of EBus bridge
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (5 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 06/16] fulong2e: improve bus implementation of vt82c bridge Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 08/16] malta: improve bus implementation of PIIX4 bridge Hervé Poussineau
` (8 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/sun4u.c | 37 +++++++++++++++++++++++++++++++------
1 files changed, 31 insertions(+), 6 deletions(-)
diff --git a/hw/sun4u.c b/hw/sun4u.c
index cdf15ff..d8b8054 100644
--- a/hw/sun4u.c
+++ b/hw/sun4u.c
@@ -38,6 +38,7 @@
#include "loader.h"
#include "elf.h"
#include "blockdev.h"
+#include "exec-memory.h"
//#define DEBUG_IRQ
//#define DEBUG_EBUS
@@ -93,6 +94,8 @@ struct hwdef {
typedef struct EbusState {
PCIDevice pci_dev;
+ ISABus bus;
+ qemu_irq *isa_irq;
MemoryRegion bar0;
MemoryRegion bar1;
} EbusState;
@@ -536,20 +539,42 @@ static void dummy_isa_irq_handler(void *opaque, int n, int level)
static void
pci_ebus_init(PCIBus *bus, int devfn)
{
- qemu_irq *isa_irq;
-
pci_create_simple(bus, devfn, "ebus");
- isa_irq = qemu_allocate_irqs(dummy_isa_irq_handler, NULL, 16);
- isa_bus_irqs(isa_irq);
}
+static qemu_irq pci_ebus_get_irq(ISABus *bus, int isairq)
+{
+ EbusState *s = container_of(bus, EbusState, bus);
+ if (isairq < 0 || isairq >= 16) {
+ hw_error("isa irq %d invalid", isairq);
+ }
+ return s->isa_irq[isairq];
+}
+
+static MemoryRegion *pci_ebus_get_io_space(ISABus *bus)
+{
+ EbusState *s = container_of(bus, EbusState, bus);
+ return pci_address_space_io(&s->pci_dev);
+}
+
+static MemoryRegion *pci_ebus_get_memory_space(ISABus *bus)
+{
+ return get_system_memory();
+}
+
+static ISABusOps pci_ebus_ops = {
+ .get_irq = pci_ebus_get_irq,
+ .get_io_space = pci_ebus_get_io_space,
+ .get_memory_space = pci_ebus_get_memory_space,
+};
+
static int
pci_ebus_init1(PCIDevice *pci_dev)
{
EbusState *s = DO_UPCAST(EbusState, pci_dev, pci_dev);
- isa_bus_bridge_init(&pci_dev->qdev, pci_address_space_io(pci_dev));
-
+ isa_bus_new(&s->bus, &pci_ebus_ops, &pci_dev->qdev);
+ s->isa_irq = qemu_allocate_irqs(dummy_isa_irq_handler, NULL, 16);
pci_dev->config[0x04] = 0x06; // command = bus master, pci mem
pci_dev->config[0x05] = 0x00;
pci_dev->config[0x06] = 0xa0; // status = fast back-to-back, 66MHz, no error
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 08/16] malta: improve bus implementation of PIIX4 bridge
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (6 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 07/16] sun4u: improve bus implementation of EBus bridge Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 09/16] isa: remove unused parameter to isa_bus_bridge_init() Hervé Poussineau
` (7 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/mips_malta.c | 4 +---
hw/pc.h | 2 +-
hw/piix4.c | 37 +++++++++++++++++++++++++++++++++++--
3 files changed, 37 insertions(+), 6 deletions(-)
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index 1ec1228..67e666d 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -943,13 +943,11 @@ void mips_malta_init (ram_addr_t ram_size,
/* Southbridge */
ide_drive_get(hd, MAX_IDE_BUS);
- piix4_devfn = piix4_init(pci_bus, 80);
-
/* Interrupt controller */
/* The 8259 is attached to the MIPS CPU INT0 pin, ie interrupt 2 */
i8259 = i8259_init(env->irq[2]);
+ piix4_devfn = piix4_init(pci_bus, 80, i8259);
- isa_bus_irqs(i8259);
pci_piix4_ide_init(pci_bus, hd, piix4_devfn + 1);
usb_uhci_piix4_init(pci_bus, piix4_devfn + 2);
smbus = piix4_pm_init(pci_bus, piix4_devfn + 3, 0x1100, isa_get_irq(9),
diff --git a/hw/pc.h b/hw/pc.h
index 746973f..df7d86a 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -194,7 +194,7 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn,
/* piix4.c */
extern PCIDevice *piix4_dev;
-int piix4_init(PCIBus *bus, int devfn);
+int piix4_init(PCIBus *bus, int devfn, qemu_irq *isa_irqs);
/* vga.c */
enum vga_retrace_method {
diff --git a/hw/piix4.c b/hw/piix4.c
index 9addaae..ce11ef4 100644
--- a/hw/piix4.c
+++ b/hw/piix4.c
@@ -27,11 +27,14 @@
#include "pci.h"
#include "isa.h"
#include "sysbus.h"
+#include "exec-memory.h"
PCIDevice *piix4_dev;
typedef struct PIIX4State {
PCIDevice dev;
+ ISABus bus;
+ qemu_irq *isa_irq;
} PIIX4State;
static void piix4_reset(void *opaque)
@@ -83,21 +86,51 @@ static const VMStateDescription vmstate_piix4 = {
}
};
+static qemu_irq pci_piix4_get_irq(ISABus *bus, int isairq)
+{
+ PIIX4State *s = container_of(bus, PIIX4State, bus);
+ if (isairq < 0 || isairq >= 16) {
+ hw_error("isa irq %d invalid", isairq);
+ }
+ return s->isa_irq[isairq];
+}
+
+static MemoryRegion *pci_piix4_get_io_space(ISABus *bus)
+{
+ PIIX4State *s = container_of(bus, PIIX4State, bus);
+ return pci_address_space_io(&s->dev);
+}
+
+static MemoryRegion *pci_piix4_get_memory_space(ISABus *bus)
+{
+ return get_system_memory();
+}
+
+static ISABusOps pci_piix4_ops = {
+ .get_irq = pci_piix4_get_irq,
+ .get_io_space = pci_piix4_get_io_space,
+ .get_memory_space = pci_piix4_get_memory_space,
+};
+
static int piix4_initfn(PCIDevice *dev)
{
PIIX4State *d = DO_UPCAST(PIIX4State, dev, dev);
- isa_bus_bridge_init(&d->dev.qdev, pci_address_space_io(dev));
+ isa_bus_new(&d->bus, &pci_piix4_ops, &d->dev.qdev);
piix4_dev = &d->dev;
qemu_register_reset(piix4_reset, d);
return 0;
}
-int piix4_init(PCIBus *bus, int devfn)
+int piix4_init(PCIBus *bus, int devfn, qemu_irq *isa_irqs)
{
PCIDevice *d;
+ PIIX4State *s;
d = pci_create_simple_multifunction(bus, devfn, true, "PIIX4");
+ s = DO_UPCAST(PIIX4State, dev, d);
+ s->isa_irq = isa_irqs;
+
return d->devfn;
}
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 09/16] isa: remove unused parameter to isa_bus_bridge_init()
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (7 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 08/16] malta: improve bus implementation of PIIX4 bridge Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 10/16] isa: give bus to isa_create() and isa_try_create() methods Hervé Poussineau
` (6 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Remove code which is now dead
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/isa-bus.c | 60 +++++++------------------------------------------------
hw/isa.h | 2 +-
hw/mips_jazz.c | 2 +-
hw/mips_r4k.c | 2 +-
hw/pc_piix.c | 2 +-
hw/ppc_prep.c | 2 +-
6 files changed, 13 insertions(+), 57 deletions(-)
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index dd539e5..e783a7f 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -24,8 +24,6 @@
static ISABus *isabus;
target_phys_addr_t isa_mem_base = 0;
-static qemu_irq *isa_bus_default_irqs;
-static MemoryRegion *isa_bus_io_space;
static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent);
static char *isabus_get_fw_dev_path(DeviceState *dev);
@@ -37,59 +35,17 @@ static struct BusInfo isa_bus_info = {
.get_fw_dev_path = isabus_get_fw_dev_path,
};
-static void isa_bus_default_set_irqs(ISABus *bus, qemu_irq *irqs)
+ISABus *isa_bus_bridge_init(MemoryRegion *address_space_io)
{
- isa_bus_default_irqs = irqs;
-}
-
-static qemu_irq isa_bus_default_get_irq(ISABus *bus, int isairq)
-{
- if (isairq < 0 || isairq > 15) {
- hw_error("isa irq %d invalid", isairq);
- }
- return isa_bus_default_irqs[isairq];
-}
-
-static void isa_bus_default_set_io_space(ISABus *bus, MemoryRegion *io_space)
-{
- isa_bus_io_space = io_space;
-}
-
-static MemoryRegion *isa_bus_default_get_io_space(ISABus *bus)
-{
- return isa_bus_io_space;
-}
-
-static MemoryRegion *isa_bus_default_get_memory_space(ISABus *bus)
-{
- return get_system_memory();
-}
-
-static ISABusOps isa_bus_default_ops = {
- .set_irqs = isa_bus_default_set_irqs,
- .get_irq = isa_bus_default_get_irq,
- .set_io_space = isa_bus_default_set_io_space,
- .get_io_space = isa_bus_default_get_io_space,
- .get_memory_space = isa_bus_default_get_memory_space,
-};
-
-ISABus *isa_bus_bridge_init(DeviceState *dev, MemoryRegion *address_space_io)
-{
- if (isabus) {
- fprintf(stderr, "Can't create a second ISA bus\n");
- return NULL;
- }
- if (NULL == dev) {
- dev = qdev_create(NULL, "isabus-bridge");
- qdev_init_nofail(dev);
- } else {
- isabus = FROM_QBUS(ISABus, qbus_create(&isa_bus_info, dev, NULL));
- isabus->ops = &isa_bus_default_ops;
- }
+ DeviceState *dev;
+ ISABus *bus;
- isabus->ops->set_io_space(isabus, address_space_io);
+ dev = qdev_create(NULL, "isabus-bridge");
+ qdev_init_nofail(dev);
+ bus = FROM_QBUS(ISABus, QLIST_FIRST(&dev->child_bus));
+ bus->ops->set_io_space(bus, address_space_io);
- return isabus;
+ return bus;
}
void isa_bus_new(ISABus *bus, ISABusOps *ops, DeviceState *host)
diff --git a/hw/isa.h b/hw/isa.h
index 8d439b5..551f3c4 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -42,7 +42,7 @@ struct ISABusOps {
MemoryRegion *(*get_memory_space)(ISABus *bus);
};
-ISABus *isa_bus_bridge_init(DeviceState *dev, MemoryRegion *address_space_io);
+ISABus *isa_bus_bridge_init(MemoryRegion *address_space_io);
void isa_bus_new(ISABus *bus, ISABusOps *ops, DeviceState *host);
void isa_bus_irqs(qemu_irq *irqs);
diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c
index d06eacd..3be9136 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -183,7 +183,7 @@ static void mips_jazz_init(MemoryRegion *address_space,
memory_region_add_subregion(address_space, 0x8000d000, dma_dummy);
/* ISA devices */
- isa_bus = isa_bus_bridge_init(NULL, address_space_io);
+ isa_bus = isa_bus_bridge_init(address_space_io);
i8259 = i8259_init(env->irq[4]);
isa_bus_irqs(i8259);
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
index 6562fb3..3fdde27 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -256,7 +256,7 @@ void mips_r4k_init (ram_addr_t ram_size,
cpu_mips_clock_init(env);
/* The PIC is attached to the MIPS CPU INT0 pin */
- isa_bus_bridge_init(NULL, get_system_io());
+ isa_bus_bridge_init(get_system_io());
i8259 = i8259_init(env->irq[2]);
isa_bus_irqs(i8259);
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index 7ccbfca..85b4d34 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -147,7 +147,7 @@ static void pc_init1(MemoryRegion *system_memory,
} else {
pci_bus = NULL;
i440fx_state = NULL;
- isa_bus = isa_bus_bridge_init(NULL, system_io);
+ isa_bus = isa_bus_bridge_init(system_io);
no_hpet = 1;
}
isa_bus_irqs(isa_irq);
diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c
index 808c83e..d1e73d1 100644
--- a/hw/ppc_prep.c
+++ b/hw/ppc_prep.c
@@ -649,7 +649,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
hw_error("Only 6xx bus is supported on PREP machine\n");
}
/* Hmm, prep has no pci-isa bridge ??? */
- isa_bus_bridge_init(NULL, get_system_io());
+ isa_bus_bridge_init(get_system_io());
i8259 = i8259_init(first_cpu->irq_inputs[PPC6xx_INPUT_INT]);
pci_bus = pci_prep_init(i8259, get_system_memory(), get_system_io());
isa_bus_irqs(i8259);
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 10/16] isa: give bus to isa_create() and isa_try_create() methods
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (8 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 09/16] isa: remove unused parameter to isa_bus_bridge_init() Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 11/16] isa: use bus given in parameter to create device on specified ISA bus Hervé Poussineau
` (5 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/cs4231a.c | 2 +-
hw/fdc.h | 4 ++--
hw/gus.c | 2 +-
hw/ide.h | 2 +-
hw/ide/isa.c | 4 ++--
hw/isa-bus.c | 8 ++++----
hw/isa.h | 6 +++---
hw/m48t59.c | 5 +++--
hw/mc146818rtc.c | 4 ++--
hw/mc146818rtc.h | 2 +-
hw/mips_fulong2e.c | 18 +++++++++---------
hw/mips_jazz.c | 4 ++--
hw/mips_malta.c | 19 ++++++++++---------
hw/mips_r4k.c | 17 +++++++++--------
hw/nvram.h | 3 ++-
hw/pc.c | 34 +++++++++++++++++-----------------
hw/pc.h | 34 ++++++++++++++++++----------------
hw/pc_piix.c | 9 +++++----
hw/piix4.c | 6 ++++--
hw/ppc_prep.c | 16 +++++++++-------
hw/sb16.c | 2 +-
hw/sun4u.c | 19 +++++++++++--------
hw/vt82c686.c | 4 ++--
hw/vt82c686.h | 2 +-
24 files changed, 120 insertions(+), 106 deletions(-)
diff --git a/hw/cs4231a.c b/hw/cs4231a.c
index e697634..4f5e21c 100644
--- a/hw/cs4231a.c
+++ b/hw/cs4231a.c
@@ -661,7 +661,7 @@ static int cs4231a_initfn (ISADevice *dev)
int cs4231a_init (ISABus *bus)
{
- isa_create_simple ("cs4231a");
+ isa_create_simple (bus, "cs4231a");
return 0;
}
diff --git a/hw/fdc.h b/hw/fdc.h
index 09f73c6..30bd56e 100644
--- a/hw/fdc.h
+++ b/hw/fdc.h
@@ -7,11 +7,11 @@
/* fdc.c */
#define MAX_FD 2
-static inline void fdctrl_init_isa(DriveInfo **fds)
+static inline void fdctrl_init_isa(ISABus *bus, DriveInfo **fds)
{
ISADevice *dev;
- dev = isa_try_create("isa-fdc");
+ dev = isa_try_create(bus, "isa-fdc");
if (!dev) {
return;
}
diff --git a/hw/gus.c b/hw/gus.c
index 2f40fcd..dc8a757 100644
--- a/hw/gus.c
+++ b/hw/gus.c
@@ -296,7 +296,7 @@ static int gus_initfn (ISADevice *dev)
int GUS_init (ISABus *bus)
{
- isa_create_simple ("gus");
+ isa_create_simple (bus, "gus");
return 0;
}
diff --git a/hw/ide.h b/hw/ide.h
index 9059aae..7075170 100644
--- a/hw/ide.h
+++ b/hw/ide.h
@@ -7,7 +7,7 @@
#define MAX_IDE_DEVS 2
/* ide-isa.c */
-ISADevice *isa_ide_init(int iobase, int iobase2, int isairq,
+ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
DriveInfo *hd0, DriveInfo *hd1);
/* ide-pci.c */
diff --git a/hw/ide/isa.c b/hw/ide/isa.c
index 28b69d2..fb51b84 100644
--- a/hw/ide/isa.c
+++ b/hw/ide/isa.c
@@ -75,13 +75,13 @@ static int isa_ide_initfn(ISADevice *dev)
return 0;
};
-ISADevice *isa_ide_init(int iobase, int iobase2, int isairq,
+ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
DriveInfo *hd0, DriveInfo *hd1)
{
ISADevice *dev;
ISAIDEState *s;
- dev = isa_create("isa-ide");
+ dev = isa_create(bus, "isa-ide");
qdev_prop_set_uint32(&dev->qdev, "iobase", iobase);
qdev_prop_set_uint32(&dev->qdev, "iobase2", iobase2);
qdev_prop_set_uint32(&dev->qdev, "irq", isairq);
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index e783a7f..ecc5375 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -147,7 +147,7 @@ void isa_qdev_register(ISADeviceInfo *info)
qdev_register(&info->qdev);
}
-ISADevice *isa_create(const char *name)
+ISADevice *isa_create(ISABus *bus, const char *name)
{
DeviceState *dev;
@@ -159,7 +159,7 @@ ISADevice *isa_create(const char *name)
return DO_UPCAST(ISADevice, qdev, dev);
}
-ISADevice *isa_try_create(const char *name)
+ISADevice *isa_try_create(ISABus *bus, const char *name)
{
DeviceState *dev;
@@ -171,11 +171,11 @@ ISADevice *isa_try_create(const char *name)
return DO_UPCAST(ISADevice, qdev, dev);
}
-ISADevice *isa_create_simple(const char *name)
+ISADevice *isa_create_simple(ISABus *bus, const char *name)
{
ISADevice *dev;
- dev = isa_create(name);
+ dev = isa_create(bus, name);
qdev_init_nofail(&dev->qdev);
return dev;
}
diff --git a/hw/isa.h b/hw/isa.h
index 551f3c4..484180c 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -53,9 +53,9 @@ void isa_init_ioport(ISADevice *dev, uint16_t ioport);
void isa_init_ioport_range(ISADevice *dev, uint16_t start, uint16_t length);
void isa_qdev_register(ISADeviceInfo *info);
MemoryRegion *isa_address_space(ISADevice *dev);
-ISADevice *isa_create(const char *name);
-ISADevice *isa_try_create(const char *name);
-ISADevice *isa_create_simple(const char *name);
+ISADevice *isa_create(ISABus *bus, const char *name);
+ISADevice *isa_try_create(ISABus *bus, const char *name);
+ISADevice *isa_create_simple(ISABus *bus, const char *name);
static inline ISABus *isa_bus_from_device(ISADevice *d)
{
diff --git a/hw/m48t59.c b/hw/m48t59.c
index 0cc361e..582b0d7 100644
--- a/hw/m48t59.c
+++ b/hw/m48t59.c
@@ -655,13 +655,14 @@ M48t59State *m48t59_init(qemu_irq IRQ, target_phys_addr_t mem_base,
return state;
}
-M48t59State *m48t59_init_isa(uint32_t io_base, uint16_t size, int type)
+M48t59State *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size,
+ int type)
{
M48t59ISAState *d;
ISADevice *dev;
M48t59State *s;
- dev = isa_create("m48t59_isa");
+ dev = isa_create(bus, "m48t59_isa");
qdev_prop_set_uint32(&dev->qdev, "type", type);
qdev_prop_set_uint32(&dev->qdev, "size", size);
qdev_prop_set_uint32(&dev->qdev, "io_base", io_base);
diff --git a/hw/mc146818rtc.c b/hw/mc146818rtc.c
index feb3b25..c0e6853 100644
--- a/hw/mc146818rtc.c
+++ b/hw/mc146818rtc.c
@@ -641,12 +641,12 @@ static int rtc_initfn(ISADevice *dev)
return 0;
}
-ISADevice *rtc_init(int base_year, qemu_irq intercept_irq)
+ISADevice *rtc_init(ISABus *bus, int base_year, qemu_irq intercept_irq)
{
ISADevice *dev;
RTCState *s;
- dev = isa_create("mc146818rtc");
+ dev = isa_create(bus, "mc146818rtc");
s = DO_UPCAST(RTCState, dev, dev);
qdev_prop_set_int32(&dev->qdev, "base_year", base_year);
qdev_init_nofail(&dev->qdev);
diff --git a/hw/mc146818rtc.h b/hw/mc146818rtc.h
index 575968c..f119930 100644
--- a/hw/mc146818rtc.h
+++ b/hw/mc146818rtc.h
@@ -5,7 +5,7 @@
#define RTC_ISA_IRQ 8
-ISADevice *rtc_init(int base_year, qemu_irq intercept_irq);
+ISADevice *rtc_init(ISABus *bus, int base_year, qemu_irq intercept_irq);
void rtc_set_memory(ISADevice *dev, int addr, int val);
void rtc_set_date(ISADevice *dev, const struct tm *tm);
diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c
index 3034a9c..f509b67 100644
--- a/hw/mips_fulong2e.c
+++ b/hw/mips_fulong2e.c
@@ -263,8 +263,8 @@ static void mips_fulong2e_init(ram_addr_t ram_size, const char *boot_device,
long bios_size;
int64_t kernel_entry;
qemu_irq *cpu_exit_irq;
- int via_devfn;
PCIBus *pci_bus;
+ ISABus *isa_bus;
i2c_bus *smbus;
int i;
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
@@ -336,9 +336,9 @@ static void mips_fulong2e_init(ram_addr_t ram_size, const char *boot_device,
/* South bridge */
ide_drive_get(hd, MAX_IDE_BUS);
- via_devfn = vt82c686b_init(pci_bus, PCI_DEVFN(FULONG2E_VIA_SLOT, 0),
- env->irq[5]);
- if (via_devfn < 0) {
+ isa_bus = vt82c686b_init(pci_bus, PCI_DEVFN(FULONG2E_VIA_SLOT, 0),
+ env->irq[5]);
+ if (!isa_bus) {
fprintf(stderr, "vt82c686b_init error\n");
exit(1);
}
@@ -353,23 +353,23 @@ static void mips_fulong2e_init(ram_addr_t ram_size, const char *boot_device,
smbus_eeprom_init(smbus, 1, eeprom_spd, sizeof(eeprom_spd));
/* init other devices */
- pit = pit_init(0x40, 0);
+ pit = pit_init(isa_bus, 0x40, 0);
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
DMA_init(0, cpu_exit_irq);
/* Super I/O */
- isa_create_simple("i8042");
+ isa_create_simple(isa_bus, "i8042");
- rtc_init(2000, NULL);
+ rtc_init(isa_bus, 2000, NULL);
for(i = 0; i < MAX_SERIAL_PORTS; i++) {
if (serial_hds[i]) {
- serial_isa_init(i, serial_hds[i]);
+ serial_isa_init(isa_bus, i, serial_hds[i]);
}
}
if (parallel_hds[0]) {
- parallel_init(0, parallel_hds[0]);
+ parallel_init(isa_bus, 0, parallel_hds[0]);
}
/* Sound card */
diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c
index 3be9136..172df66 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -188,7 +188,7 @@ static void mips_jazz_init(MemoryRegion *address_space,
isa_bus_irqs(i8259);
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
DMA_init(0, cpu_exit_irq);
- pit = pit_init(0x40, 0);
+ pit = pit_init(isa_bus, 0x40, 0);
pcspk_init(pit);
/* ISA IO space at 0x90000000 */
@@ -255,7 +255,7 @@ static void mips_jazz_init(MemoryRegion *address_space,
fdctrl_init_sysbus(rc4030[1], 0, 0x80003000, fds);
/* Real time clock */
- rtc_init(1980, NULL);
+ rtc_init(isa_bus, 1980, NULL);
memory_region_init_io(rtc, &rtc_ops, NULL, "rtc", 0x1000);
memory_region_add_subregion(address_space, 0x80004000, rtc);
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index 67e666d..8126ca7 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -777,6 +777,7 @@ void mips_malta_init (ram_addr_t ram_size,
target_long bios_size;
int64_t kernel_entry;
PCIBus *pci_bus;
+ ISABus *isa_bus;
CPUState *env;
qemu_irq *i8259 = NULL, *isa_irq;
qemu_irq *cpu_exit_irq;
@@ -946,7 +947,7 @@ void mips_malta_init (ram_addr_t ram_size,
/* Interrupt controller */
/* The 8259 is attached to the MIPS CPU INT0 pin, ie interrupt 2 */
i8259 = i8259_init(env->irq[2]);
- piix4_devfn = piix4_init(pci_bus, 80, i8259);
+ isa_bus = piix4_init(pci_bus, 80, i8259, &piix4_devfn);
pci_piix4_ide_init(pci_bus, hd, piix4_devfn + 1);
usb_uhci_piix4_init(pci_bus, piix4_devfn + 2);
@@ -954,25 +955,25 @@ void mips_malta_init (ram_addr_t ram_size,
NULL, NULL, 0);
/* TODO: Populate SPD eeprom data. */
smbus_eeprom_init(smbus, 8, NULL, 0);
- pit = pit_init(0x40, 0);
+ pit = pit_init(isa_bus, 0x40, 0);
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
DMA_init(0, cpu_exit_irq);
/* Super I/O */
- isa_create_simple("i8042");
+ isa_create_simple(isa_bus, "i8042");
- rtc_init(2000, NULL);
- serial_isa_init(0, serial_hds[0]);
- serial_isa_init(1, serial_hds[1]);
+ rtc_init(isa_bus, 2000, NULL);
+ serial_isa_init(isa_bus, 0, serial_hds[0]);
+ serial_isa_init(isa_bus, 1, serial_hds[1]);
if (parallel_hds[0])
- parallel_init(0, parallel_hds[0]);
+ parallel_init(isa_bus, 0, parallel_hds[0]);
for(i = 0; i < MAX_FD; i++) {
fd[i] = drive_get(IF_FLOPPY, 0, i);
}
- fdctrl_init_isa(fd);
+ fdctrl_init_isa(isa_bus, fd);
/* Sound card */
- audio_init(NULL, pci_bus);
+ audio_init(isa_bus, pci_bus);
/* Network card */
network_init();
diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
index 3fdde27..cb099ab 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -164,6 +164,7 @@ void mips_r4k_init (ram_addr_t ram_size,
CPUState *env;
ResetData *reset_info;
int i;
+ ISABus *isa_bus;
qemu_irq *i8259;
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
DriveInfo *dinfo;
@@ -256,36 +257,36 @@ void mips_r4k_init (ram_addr_t ram_size,
cpu_mips_clock_init(env);
/* The PIC is attached to the MIPS CPU INT0 pin */
- isa_bus_bridge_init(get_system_io());
+ isa_bus = isa_bus_bridge_init(get_system_io());
i8259 = i8259_init(env->irq[2]);
isa_bus_irqs(i8259);
- rtc_init(2000, NULL);
+ rtc_init(isa_bus, 2000, NULL);
/* Register 64 KB of ISA IO space at 0x14000000 */
isa_mmio_init(0x14000000, 0x00010000);
isa_mem_base = 0x10000000;
- pit = pit_init(0x40, 0);
+ pit = pit_init(isa_bus, 0x40, 0);
for(i = 0; i < MAX_SERIAL_PORTS; i++) {
if (serial_hds[i]) {
- serial_isa_init(i, serial_hds[i]);
+ serial_isa_init(isa_bus, i, serial_hds[i]);
}
}
- isa_vga_init();
+ isa_vga_init(isa_bus);
if (nd_table[0].vlan)
- isa_ne2000_init(0x300, 9, &nd_table[0]);
+ isa_ne2000_init(isa_bus, 0x300, 9, &nd_table[0]);
ide_drive_get(hd, MAX_IDE_BUS);
for(i = 0; i < MAX_IDE_BUS; i++)
- isa_ide_init(ide_iobase[i], ide_iobase2[i], ide_irq[i],
+ isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i], ide_irq[i],
hd[MAX_IDE_DEVS * i],
hd[MAX_IDE_DEVS * i + 1]);
- isa_create_simple("i8042");
+ isa_create_simple(isa_bus, "i8042");
}
static QEMUMachine mips_machine = {
diff --git a/hw/nvram.h b/hw/nvram.h
index 0f55b24..8924da4 100644
--- a/hw/nvram.h
+++ b/hw/nvram.h
@@ -34,7 +34,8 @@ typedef struct M48t59State M48t59State;
void m48t59_write (void *private, uint32_t addr, uint32_t val);
uint32_t m48t59_read (void *private, uint32_t addr);
void m48t59_toggle_lock (void *private, int lock);
-M48t59State *m48t59_init_isa(uint32_t io_base, uint16_t size, int type);
+M48t59State *m48t59_init_isa(ISABus *bus, uint32_t io_base, uint16_t size,
+ int type);
M48t59State *m48t59_init(qemu_irq IRQ, target_phys_addr_t mem_base,
uint32_t io_base, uint16_t size, int type);
void m48t59_set_addr (void *opaque, uint32_t addr);
diff --git a/hw/pc.c b/hw/pc.c
index 203627d..c17218b 100644
--- a/hw/pc.c
+++ b/hw/pc.c
@@ -843,13 +843,13 @@ static const int ne2000_irq[NE2000_NB_MAX] = { 9, 10, 11, 3, 4, 5 };
static const int parallel_io[MAX_PARALLEL_PORTS] = { 0x378, 0x278, 0x3bc };
static const int parallel_irq[MAX_PARALLEL_PORTS] = { 7, 7, 7 };
-void pc_init_ne2k_isa(NICInfo *nd)
+void pc_init_ne2k_isa(ISABus *isa_bus, NICInfo *nd)
{
static int nb_ne2k = 0;
if (nb_ne2k == NE2000_NB_MAX)
return;
- isa_ne2000_init(ne2000_io[nb_ne2k],
+ isa_ne2000_init(isa_bus, ne2000_io[nb_ne2k],
ne2000_irq[nb_ne2k], nd);
nb_ne2k++;
}
@@ -1064,12 +1064,12 @@ qemu_irq *pc_allocate_cpu_irq(void)
return qemu_allocate_irqs(pic_irq_request, NULL, 1);
}
-void pc_vga_init(PCIBus *pci_bus)
+void pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus)
{
if (cirrus_vga_enabled) {
if (pci_bus) {
pci_cirrus_vga_init(pci_bus);
- } else {
+ } else if (isa_bus) {
isa_cirrus_vga_init(get_system_memory());
}
} else if (vmsvga_enabled) {
@@ -1092,8 +1092,8 @@ void pc_vga_init(PCIBus *pci_bus)
} else if (std_vga_enabled) {
if (pci_bus) {
pci_vga_init(pci_bus);
- } else {
- isa_vga_init();
+ } else if (isa_bus) {
+ isa_vga_init(isa_bus);
}
}
@@ -1103,7 +1103,7 @@ void pc_vga_init(PCIBus *pci_bus)
* For nographic case, sga is enabled at all times
*/
if (display_type == DT_NOGRAPHIC) {
- isa_create_simple("sga");
+ isa_create_simple(isa_bus, "sga");
}
}
@@ -1116,7 +1116,7 @@ static void cpu_request_exit(void *opaque, int irq, int level)
}
}
-void pc_basic_device_init(qemu_irq *isa_irq,
+void pc_basic_device_init(ISABus *isa_bus, qemu_irq *isa_irq,
ISADevice **rtc_state,
bool no_vmport)
{
@@ -1141,31 +1141,31 @@ void pc_basic_device_init(qemu_irq *isa_irq,
rtc_irq = qdev_get_gpio_in(hpet, 0);
}
}
- *rtc_state = rtc_init(2000, rtc_irq);
+ *rtc_state = rtc_init(isa_bus, 2000, rtc_irq);
qemu_register_boot_set(pc_boot_set, *rtc_state);
- pit = pit_init(0x40, 0);
+ pit = pit_init(isa_bus, 0x40, 0);
pcspk_init(pit);
for(i = 0; i < MAX_SERIAL_PORTS; i++) {
if (serial_hds[i]) {
- serial_isa_init(i, serial_hds[i]);
+ serial_isa_init(isa_bus, i, serial_hds[i]);
}
}
for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
if (parallel_hds[i]) {
- parallel_init(i, parallel_hds[i]);
+ parallel_init(isa_bus, i, parallel_hds[i]);
}
}
a20_line = qemu_allocate_irqs(handle_a20_line_change, first_cpu, 2);
- i8042 = isa_create_simple("i8042");
+ i8042 = isa_create_simple(isa_bus, "i8042");
i8042_setup_a20_line(i8042, &a20_line[0]);
if (!no_vmport) {
- vmport_init();
- vmmouse = isa_try_create("vmmouse");
+ vmport_init(isa_bus);
+ vmmouse = isa_try_create(isa_bus, "vmmouse");
} else {
vmmouse = NULL;
}
@@ -1173,7 +1173,7 @@ void pc_basic_device_init(qemu_irq *isa_irq,
qdev_prop_set_ptr(&vmmouse->qdev, "ps2_mouse", i8042);
qdev_init_nofail(&vmmouse->qdev);
}
- port92 = isa_create_simple("port92");
+ port92 = isa_create_simple(isa_bus, "port92");
port92_init(port92, &a20_line[1]);
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
@@ -1182,7 +1182,7 @@ void pc_basic_device_init(qemu_irq *isa_irq,
for(i = 0; i < MAX_FD; i++) {
fd[i] = drive_get(IF_FLOPPY, 0, i);
}
- fdctrl_init_isa(fd);
+ fdctrl_init_isa(isa_bus, fd);
}
void pc_pci_device_init(PCIBus *pci_bus)
diff --git a/hw/pc.h b/hw/pc.h
index df7d86a..46b2320 100644
--- a/hw/pc.h
+++ b/hw/pc.h
@@ -19,11 +19,12 @@ SerialState *serial_mm_init (target_phys_addr_t base, int it_shift,
qemu_irq irq, int baudbase,
CharDriverState *chr, int ioregister,
int be);
-static inline bool serial_isa_init(int index, CharDriverState *chr)
+static inline bool serial_isa_init(ISABus *bus, int index,
+ CharDriverState *chr)
{
ISADevice *dev;
- dev = isa_try_create("isa-serial");
+ dev = isa_try_create(bus, "isa-serial");
if (!dev) {
return false;
}
@@ -38,11 +39,11 @@ static inline bool serial_isa_init(int index, CharDriverState *chr)
void serial_set_frequency(SerialState *s, uint32_t frequency);
/* parallel.c */
-static inline bool parallel_init(int index, CharDriverState *chr)
+static inline bool parallel_init(ISABus *bus, int index, CharDriverState *chr)
{
ISADevice *dev;
- dev = isa_try_create("isa-parallel");
+ dev = isa_try_create(bus, "isa-parallel");
if (!dev) {
return false;
}
@@ -84,11 +85,11 @@ void isa_irq_handler(void *opaque, int n, int level);
#define PIT_FREQ 1193182
-static inline ISADevice *pit_init(int base, int irq)
+static inline ISADevice *pit_init(ISABus *bus, int base, int irq)
{
ISADevice *dev;
- dev = isa_create("isa-pit");
+ dev = isa_create(bus, "isa-pit");
qdev_prop_set_uint32(&dev->qdev, "iobase", base);
qdev_prop_set_uint32(&dev->qdev, "irq", irq);
qdev_init_nofail(&dev->qdev);
@@ -106,9 +107,9 @@ void hpet_pit_disable(void);
void hpet_pit_enable(void);
/* vmport.c */
-static inline void vmport_init(void)
+static inline void vmport_init(ISABus *bus)
{
- isa_create_simple("vmport");
+ isa_create_simple(bus, "vmport");
}
void vmport_register(unsigned char command, IOPortReadFunc *func, void *opaque);
void vmmouse_get_data(uint32_t *data);
@@ -140,11 +141,11 @@ void pc_memory_init(MemoryRegion *system_memory,
MemoryRegion *rom_memory,
MemoryRegion **ram_memory);
qemu_irq *pc_allocate_cpu_irq(void);
-void pc_vga_init(PCIBus *pci_bus);
-void pc_basic_device_init(qemu_irq *isa_irq,
+void pc_vga_init(ISABus *isa_bus, PCIBus *pci_bus);
+void pc_basic_device_init(ISABus *isa_bus, qemu_irq *isa_irq,
ISADevice **rtc_state,
bool no_vmport);
-void pc_init_ne2k_isa(NICInfo *nd);
+void pc_init_ne2k_isa(ISABus *isa_bus, NICInfo *nd);
void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
const char *boot_device,
BusState *ide0, BusState *ide1,
@@ -194,7 +195,8 @@ PCIBus *i440fx_init(PCII440FXState **pi440fx_state, int *piix_devfn,
/* piix4.c */
extern PCIDevice *piix4_dev;
-int piix4_init(PCIBus *bus, int devfn, qemu_irq *isa_irqs);
+ISABus *piix4_init(PCIBus *bus, int devfn, qemu_irq *isa_irqs,
+ int *piix4_devfn);
/* vga.c */
enum vga_retrace_method {
@@ -204,11 +206,11 @@ enum vga_retrace_method {
extern enum vga_retrace_method vga_retrace_method;
-static inline int isa_vga_init(void)
+static inline int isa_vga_init(ISABus *bus)
{
ISADevice *dev;
- dev = isa_try_create("isa-vga");
+ dev = isa_try_create(bus, "isa-vga");
if (!dev) {
fprintf(stderr, "Warning: isa-vga not available\n");
return 0;
@@ -227,13 +229,13 @@ void pci_cirrus_vga_init(PCIBus *bus);
void isa_cirrus_vga_init(MemoryRegion *address_space);
/* ne2000.c */
-static inline bool isa_ne2000_init(int base, int irq, NICInfo *nd)
+static inline bool isa_ne2000_init(ISABus *bus, int base, int irq, NICInfo *nd)
{
ISADevice *dev;
qemu_check_nic_model(nd, "ne2k_isa");
- dev = isa_try_create("ne2k_isa");
+ dev = isa_try_create(bus, "ne2k_isa");
if (!dev) {
return false;
}
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index 85b4d34..a5f8b7a 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -166,20 +166,20 @@ static void pc_init1(MemoryRegion *system_memory,
pc_register_ferr_irq(isa_get_irq(13));
- pc_vga_init(pci_enabled? pci_bus: NULL);
+ pc_vga_init(isa_bus, pci_enabled ? pci_bus : NULL);
if (xen_enabled()) {
pci_create_simple(pci_bus, -1, "xen-platform");
}
/* init basic PC hardware */
- pc_basic_device_init(isa_irq, &rtc_state, xen_enabled());
+ pc_basic_device_init(isa_bus, isa_irq, &rtc_state, xen_enabled());
for(i = 0; i < nb_nics; i++) {
NICInfo *nd = &nd_table[i];
if (!pci_enabled || (nd->model && strcmp(nd->model, "ne2k_isa") == 0))
- pc_init_ne2k_isa(nd);
+ pc_init_ne2k_isa(isa_bus, nd);
else
pci_nic_init_nofail(nd, "e1000", NULL);
}
@@ -197,7 +197,8 @@ static void pc_init1(MemoryRegion *system_memory,
} else {
for(i = 0; i < MAX_IDE_BUS; i++) {
ISADevice *dev;
- dev = isa_ide_init(ide_iobase[i], ide_iobase2[i], ide_irq[i],
+ dev = isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i],
+ ide_irq[i],
hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
idebus[i] = qdev_get_child_bus(&dev->qdev, "ide.0");
}
diff --git a/hw/piix4.c b/hw/piix4.c
index ce11ef4..caada0b 100644
--- a/hw/piix4.c
+++ b/hw/piix4.c
@@ -122,7 +122,8 @@ static int piix4_initfn(PCIDevice *dev)
return 0;
}
-int piix4_init(PCIBus *bus, int devfn, qemu_irq *isa_irqs)
+ISABus *piix4_init(PCIBus *bus, int devfn, qemu_irq *isa_irqs,
+ int *piix4_devfn)
{
PCIDevice *d;
PIIX4State *s;
@@ -131,7 +132,8 @@ int piix4_init(PCIBus *bus, int devfn, qemu_irq *isa_irqs)
s = DO_UPCAST(PIIX4State, dev, d);
s->isa_irq = isa_irqs;
- return d->devfn;
+ *piix4_devfn = d->devfn;
+ return &s->bus;
}
static PCIDeviceInfo piix4_info[] = {
diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c
index d1e73d1..499e63f 100644
--- a/hw/ppc_prep.c
+++ b/hw/ppc_prep.c
@@ -544,6 +544,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
uint32_t kernel_base, initrd_base;
long kernel_size, initrd_size;
PCIBus *pci_bus;
+ ISABus *isa_bus;
qemu_irq *i8259;
qemu_irq *cpu_exit_irq;
int ppc_boot_device;
@@ -649,7 +650,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
hw_error("Only 6xx bus is supported on PREP machine\n");
}
/* Hmm, prep has no pci-isa bridge ??? */
- isa_bus_bridge_init(get_system_io());
+ isa_bus = isa_bus_bridge_init(get_system_io());
i8259 = i8259_init(first_cpu->irq_inputs[PPC6xx_INPUT_INT]);
pci_bus = pci_prep_init(i8259, get_system_memory(), get_system_io());
isa_bus_irqs(i8259);
@@ -664,10 +665,10 @@ static void ppc_prep_init (ram_addr_t ram_size,
pci_vga_init(pci_bus);
// openpic = openpic_init(0x00000000, 0xF0000000, 1);
// pit = pit_init(0x40, 0);
- rtc_init(2000, NULL);
+ rtc_init(isa_bus, 2000, NULL);
if (serial_hds[0])
- serial_isa_init(0, serial_hds[0]);
+ serial_isa_init(isa_bus, 0, serial_hds[0]);
nb_nics1 = nb_nics;
if (nb_nics1 > NE2000_NB_MAX)
nb_nics1 = NE2000_NB_MAX;
@@ -676,7 +677,8 @@ static void ppc_prep_init (ram_addr_t ram_size,
nd_table[i].model = g_strdup("ne2k_isa");
}
if (strcmp(nd_table[i].model, "ne2k_isa") == 0) {
- isa_ne2000_init(ne2000_io[i], ne2000_irq[i], &nd_table[i]);
+ isa_ne2000_init(isa_bus, ne2000_io[i], ne2000_irq[i],
+ &nd_table[i]);
} else {
pci_nic_init_nofail(&nd_table[i], "ne2k_pci", NULL);
}
@@ -684,11 +686,11 @@ static void ppc_prep_init (ram_addr_t ram_size,
ide_drive_get(hd, MAX_IDE_BUS);
for(i = 0; i < MAX_IDE_BUS; i++) {
- isa_ide_init(ide_iobase[i], ide_iobase2[i], ide_irq[i],
+ isa_ide_init(isa_bus, ide_iobase[i], ide_iobase2[i], ide_irq[i],
hd[2 * i],
hd[2 * i + 1]);
}
- isa_create_simple("i8042");
+ isa_create_simple(isa_bus, "i8042");
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
DMA_init(1, cpu_exit_irq);
@@ -698,7 +700,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
for(i = 0; i < MAX_FD; i++) {
fd[i] = drive_get(IF_FLOPPY, 0, i);
}
- fdctrl_init_isa(fd);
+ fdctrl_init_isa(isa_bus, fd);
/* Register speaker port */
register_ioport_read(0x61, 1, 1, speaker_ioport_read, NULL);
diff --git a/hw/sb16.c b/hw/sb16.c
index 15a1e61..fad664b 100644
--- a/hw/sb16.c
+++ b/hw/sb16.c
@@ -1393,7 +1393,7 @@ static int sb16_initfn (ISADevice *dev)
int SB16_init (ISABus *bus)
{
- isa_create_simple ("sb16");
+ isa_create_simple (bus, "sb16");
return 0;
}
diff --git a/hw/sun4u.c b/hw/sun4u.c
index d8b8054..43d27db 100644
--- a/hw/sun4u.c
+++ b/hw/sun4u.c
@@ -536,10 +536,12 @@ static void dummy_isa_irq_handler(void *opaque, int n, int level)
}
/* EBUS (Eight bit bus) bridge */
-static void
+static ISABus *
pci_ebus_init(PCIBus *bus, int devfn)
{
- pci_create_simple(bus, devfn, "ebus");
+ PCIDevice *pci = pci_create_simple(bus, devfn, "ebus");
+ BusState *isa = qdev_get_child_bus(&pci->qdev, "isa.0");
+ return DO_UPCAST(ISABus, qbus, isa);
}
static qemu_irq pci_ebus_get_irq(ISABus *bus, int isairq)
@@ -771,6 +773,7 @@ static void sun4uv_init(ram_addr_t RAM_size,
unsigned int i;
long initrd_size, kernel_size;
PCIBus *pci_bus, *pci_bus2, *pci_bus3;
+ ISABus *isa_bus;
qemu_irq *irq;
DriveInfo *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
DriveInfo *fd[MAX_FD];
@@ -791,7 +794,7 @@ static void sun4uv_init(ram_addr_t RAM_size,
pci_vga_init(pci_bus);
// XXX Should be pci_bus3
- pci_ebus_init(pci_bus, -1);
+ isa_bus = pci_ebus_init(pci_bus, -1);
i = 0;
if (hwdef->console_serial_base) {
@@ -801,13 +804,13 @@ static void sun4uv_init(ram_addr_t RAM_size,
}
for(; i < MAX_SERIAL_PORTS; i++) {
if (serial_hds[i]) {
- serial_isa_init(i, serial_hds[i]);
+ serial_isa_init(isa_bus, i, serial_hds[i]);
}
}
for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
if (parallel_hds[i]) {
- parallel_init(i, parallel_hds[i]);
+ parallel_init(isa_bus, i, parallel_hds[i]);
}
}
@@ -818,12 +821,12 @@ static void sun4uv_init(ram_addr_t RAM_size,
pci_cmd646_ide_init(pci_bus, hd, 1);
- isa_create_simple("i8042");
+ isa_create_simple(isa_bus, "i8042");
for(i = 0; i < MAX_FD; i++) {
fd[i] = drive_get(IF_FLOPPY, 0, i);
}
- fdctrl_init_isa(fd);
- nvram = m48t59_init_isa(0x0074, NVRAM_SIZE, 59);
+ fdctrl_init_isa(isa_bus, fd);
+ nvram = m48t59_init_isa(isa_bus, 0x0074, NVRAM_SIZE, 59);
initrd_size = 0;
kernel_size = sun4u_load_kernel(kernel_filename, initrd_filename,
diff --git a/hw/vt82c686.c b/hw/vt82c686.c
index 05a70da..c40423d 100644
--- a/hw/vt82c686.c
+++ b/hw/vt82c686.c
@@ -530,7 +530,7 @@ static int vt82c686b_initfn(PCIDevice *d)
return 0;
}
-int vt82c686b_init(PCIBus *bus, int devfn, qemu_irq parent_irq)
+ISABus *vt82c686b_init(PCIBus *bus, int devfn, qemu_irq parent_irq)
{
PCIDevice *d;
VT82C686BState *vt82c;
@@ -540,7 +540,7 @@ int vt82c686b_init(PCIBus *bus, int devfn, qemu_irq parent_irq)
vt82c = DO_UPCAST(VT82C686BState, dev, d);
vt82c->pic = i8259_init(parent_irq);
- return d->devfn;
+ return &vt82c->bus;
}
static PCIDeviceInfo via_info = {
diff --git a/hw/vt82c686.h b/hw/vt82c686.h
index 1a026c2..601d992 100644
--- a/hw/vt82c686.h
+++ b/hw/vt82c686.h
@@ -2,7 +2,7 @@
#define HW_VT82C686_H
/* vt82c686.c */
-int vt82c686b_init(PCIBus *bus, int devfn, qemu_irq parent_irq);
+ISABus *vt82c686b_init(PCIBus *bus, int devfn, qemu_irq parent_irq);
void vt82c686b_ac97_init(PCIBus *bus, int devfn);
void vt82c686b_mc97_init(PCIBus *bus, int devfn);
i2c_bus *vt82c686b_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 11/16] isa: use bus given in parameter to create device on specified ISA bus
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (9 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 10/16] isa: give bus to isa_create() and isa_try_create() methods Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 12/16] isa: give bus to isa_get_irq() and isa_bus_irqs() Hervé Poussineau
` (4 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/isa-bus.c | 10 ++++++----
1 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index ecc5375..cdfed29 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -151,11 +151,12 @@ ISADevice *isa_create(ISABus *bus, const char *name)
{
DeviceState *dev;
- if (!isabus) {
+ if (!bus) {
hw_error("Tried to create isa device %s with no isa bus present.",
name);
}
- dev = qdev_create(&isabus->qbus, name);
+ assert(bus == isabus);
+ dev = qdev_create(&bus->qbus, name);
return DO_UPCAST(ISADevice, qdev, dev);
}
@@ -163,11 +164,12 @@ ISADevice *isa_try_create(ISABus *bus, const char *name)
{
DeviceState *dev;
- if (!isabus) {
+ if (!bus) {
hw_error("Tried to create isa device %s with no isa bus present.",
name);
}
- dev = qdev_try_create(&isabus->qbus, name);
+ assert(bus == isabus);
+ dev = qdev_try_create(&bus->qbus, name);
return DO_UPCAST(ISADevice, qdev, dev);
}
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 12/16] isa: give bus to isa_get_irq() and isa_bus_irqs()
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (10 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 11/16] isa: use bus given in parameter to create device on specified ISA bus Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 13/16] isa: use bus given in parameter to get/set irqs on specified ISA bus Hervé Poussineau
` (3 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/i8254.c | 2 +-
hw/ide.h | 12 ++++++++----
hw/ide/piix.c | 30 ++++++++++++++++++++++--------
hw/ide/via.c | 18 ++++++++++++++----
hw/isa-bus.c | 6 +++---
hw/isa.h | 4 ++--
hw/mips_fulong2e.c | 2 +-
hw/mips_jazz.c | 2 +-
hw/mips_malta.c | 6 +++---
hw/mips_r4k.c | 2 +-
hw/pc_piix.c | 11 ++++++-----
hw/ppc_prep.c | 2 +-
12 files changed, 63 insertions(+), 34 deletions(-)
diff --git a/hw/i8254.c b/hw/i8254.c
index 12571ef..cb391de 100644
--- a/hw/i8254.c
+++ b/hw/i8254.c
@@ -525,7 +525,7 @@ static int pit_initfn(ISADevice *dev)
s = &pit->channels[0];
/* the timer 0 is connected to an IRQ */
s->irq_timer = qemu_new_timer_ns(vm_clock, pit_irq_timer, s);
- s->irq = isa_get_irq(pit->irq);
+ s->irq = isa_get_irq(isa_bus_from_device(dev), pit->irq);
memory_region_init_io(&pit->ioports, &pit_ioport_ops, pit, "pit", 4);
isa_register_ioport(dev, &pit->ioports, pit->iobase);
diff --git a/hw/ide.h b/hw/ide.h
index 7075170..f1cfeb1 100644
--- a/hw/ide.h
+++ b/hw/ide.h
@@ -13,10 +13,14 @@ ISADevice *isa_ide_init(ISABus *bus, int iobase, int iobase2, int isairq,
/* ide-pci.c */
void pci_cmd646_ide_init(PCIBus *bus, DriveInfo **hd_table,
int secondary_ide_enabled);
-PCIDevice *pci_piix3_xen_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
-PCIDevice *pci_piix3_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
-PCIDevice *pci_piix4_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
-void vt82c686b_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn);
+PCIDevice *pci_piix3_xen_ide_init(PCIBus *pci_bus, ISABus *isa_bus,
+ DriveInfo **hd_table, int devfn);
+PCIDevice *pci_piix3_ide_init(PCIBus *bus, ISABus *isa_bus,
+ DriveInfo **hd_table, int devfn);
+PCIDevice *pci_piix4_ide_init(PCIBus *bus, ISABus *isa_bus,
+ DriveInfo **hd_table, int devfn);
+void vt82c686b_ide_init(PCIBus *pci_bus, ISABus *isa_bus, DriveInfo **hd_table,
+ int devfn);
/* ide-macio.c */
MemoryRegion *pmac_ide_init (DriveInfo **hd_table, qemu_irq irq,
diff --git a/hw/ide/piix.c b/hw/ide/piix.c
index 88d3181..70b7835 100644
--- a/hw/ide/piix.c
+++ b/hw/ide/piix.c
@@ -121,7 +121,8 @@ static void piix3_reset(void *opaque)
pci_conf[0x20] = 0x01; /* BMIBA: 20-23h */
}
-static void pci_piix_init_ports(PCIIDEState *d) {
+static void pci_piix_init_legacy_ports(ISABus *isa_bus, PCIIDEState *d)
+{
int i;
struct {
int iobase;
@@ -135,8 +136,15 @@ static void pci_piix_init_ports(PCIIDEState *d) {
for (i = 0; i < 2; i++) {
ide_bus_new(&d->bus[i], &d->dev.qdev, i);
ide_init_ioport(&d->bus[i], port_info[i].iobase, port_info[i].iobase2);
- ide_init2(&d->bus[i], isa_get_irq(port_info[i].isairq));
+ ide_init2(&d->bus[i], isa_get_irq(isa_bus, port_info[i].isairq));
+ }
+}
+static void pci_piix_init_ports(PCIIDEState *d)
+{
+ int i;
+
+ for (i = 0; i < 2; i++) {
bmdma_init(&d->bus[i], &d->bmdma[i], d);
d->bmdma[i].bus = &d->bus[i];
qemu_add_vm_change_state_handler(d->bus[i].dma->ops->restart_cb,
@@ -189,11 +197,13 @@ static int pci_piix3_xen_ide_unplug(DeviceState *dev)
return 0;
}
-PCIDevice *pci_piix3_xen_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn)
+PCIDevice *pci_piix3_xen_ide_init(PCIBus *pci_bus, ISABus *isa_bus,
+ DriveInfo **hd_table, int devfn)
{
PCIDevice *dev;
- dev = pci_create_simple(bus, devfn, "piix3-ide-xen");
+ dev = pci_create_simple(pci_bus, devfn, "piix3-ide-xen");
+ pci_piix_init_legacy_ports(isa_bus, DO_UPCAST(PCIIDEState, dev, dev));
dev->qdev.info->unplug = pci_piix3_xen_ide_unplug;
pci_ide_create_devs(dev, hd_table);
return dev;
@@ -217,22 +227,26 @@ static int pci_piix_ide_exitfn(PCIDevice *dev)
/* hd_table must contain 4 block drivers */
/* NOTE: for the PIIX3, the IRQs and IOports are hardcoded */
-PCIDevice *pci_piix3_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn)
+PCIDevice *pci_piix3_ide_init(PCIBus *pci_bus, ISABus *isa_bus,
+ DriveInfo **hd_table, int devfn)
{
PCIDevice *dev;
- dev = pci_create_simple(bus, devfn, "piix3-ide");
+ dev = pci_create_simple(pci_bus, devfn, "piix3-ide");
+ pci_piix_init_legacy_ports(isa_bus, DO_UPCAST(PCIIDEState, dev, dev));
pci_ide_create_devs(dev, hd_table);
return dev;
}
/* hd_table must contain 4 block drivers */
/* NOTE: for the PIIX4, the IRQs and IOports are hardcoded */
-PCIDevice *pci_piix4_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn)
+PCIDevice *pci_piix4_ide_init(PCIBus *pci_bus, ISABus *isa_bus,
+ DriveInfo **hd_table, int devfn)
{
PCIDevice *dev;
- dev = pci_create_simple(bus, devfn, "piix4-ide");
+ dev = pci_create_simple(pci_bus, devfn, "piix4-ide");
+ pci_piix_init_legacy_ports(isa_bus, DO_UPCAST(PCIIDEState, dev, dev));
pci_ide_create_devs(dev, hd_table);
return dev;
}
diff --git a/hw/ide/via.c b/hw/ide/via.c
index dab8a39..6af4e79 100644
--- a/hw/ide/via.c
+++ b/hw/ide/via.c
@@ -145,7 +145,8 @@ static void via_reset(void *opaque)
pci_set_long(pci_conf + 0xc0, 0x00020001);
}
-static void vt82c686b_init_ports(PCIIDEState *d) {
+static void vt82c686b_init_legacy_ports(ISABus *isa_bus, PCIIDEState *d)
+{
int i;
struct {
int iobase;
@@ -159,8 +160,15 @@ static void vt82c686b_init_ports(PCIIDEState *d) {
for (i = 0; i < 2; i++) {
ide_bus_new(&d->bus[i], &d->dev.qdev, i);
ide_init_ioport(&d->bus[i], port_info[i].iobase, port_info[i].iobase2);
- ide_init2(&d->bus[i], isa_get_irq(port_info[i].isairq));
+ ide_init2(&d->bus[i], isa_get_irq(isa_bus, port_info[i].isairq));
+ }
+}
+static void vt82c686b_init_ports(PCIIDEState *d)
+{
+ int i;
+
+ for (i = 0; i < 2; i++) {
bmdma_init(&d->bus[i], &d->bmdma[i], d);
d->bmdma[i].bus = &d->bus[i];
qemu_add_vm_change_state_handler(d->bus[i].dma->ops->restart_cb,
@@ -204,11 +212,13 @@ static int vt82c686b_ide_exitfn(PCIDevice *dev)
return 0;
}
-void vt82c686b_ide_init(PCIBus *bus, DriveInfo **hd_table, int devfn)
+void vt82c686b_ide_init(PCIBus *pci_bus, ISABus *isa_bus,
+ DriveInfo **hd_table, int devfn)
{
PCIDevice *dev;
- dev = pci_create_simple(bus, devfn, "via-ide");
+ dev = pci_create_simple(pci_bus, devfn, "via-ide");
+ vt82c686b_init_legacy_ports(isa_bus, DO_UPCAST(PCIIDEState, dev, dev));
pci_ide_create_devs(dev, hd_table);
}
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index cdfed29..4a95834 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -58,7 +58,7 @@ void isa_bus_new(ISABus *bus, ISABusOps *ops, DeviceState *host)
isabus = bus;
}
-void isa_bus_irqs(qemu_irq *irqs)
+void isa_bus_irqs(ISABus *bus, qemu_irq *irqs)
{
if (!isabus || !isabus->ops->set_irqs) {
hw_error("Tried to set isa irqs with no isa bus present.");
@@ -72,7 +72,7 @@ void isa_bus_irqs(qemu_irq *irqs)
* This function is only for special cases such as the 'ferr', and
* temporary use for normal devices until they are converted to qdev.
*/
-qemu_irq isa_get_irq(int isairq)
+qemu_irq isa_get_irq(ISABus *bus, int isairq)
{
if (!isabus || !isabus->ops->get_irq) {
hw_error("ISA bus invalid");
@@ -84,7 +84,7 @@ void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq)
{
assert(dev->nirqs < ARRAY_SIZE(dev->isairq));
dev->isairq[dev->nirqs] = isairq;
- *p = isa_get_irq(isairq);
+ *p = isa_get_irq(isa_bus_from_device(dev), isairq);
dev->nirqs++;
}
diff --git a/hw/isa.h b/hw/isa.h
index 484180c..5ac3631 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -45,8 +45,8 @@ struct ISABusOps {
ISABus *isa_bus_bridge_init(MemoryRegion *address_space_io);
void isa_bus_new(ISABus *bus, ISABusOps *ops, DeviceState *host);
-void isa_bus_irqs(qemu_irq *irqs);
-qemu_irq isa_get_irq(int isairq);
+void isa_bus_irqs(ISABus *bus, qemu_irq *irqs);
+qemu_irq isa_get_irq(ISABus *bus, int isairq);
void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq);
void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t start);
void isa_init_ioport(ISADevice *dev, uint16_t ioport);
diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c
index f509b67..0b98402 100644
--- a/hw/mips_fulong2e.c
+++ b/hw/mips_fulong2e.c
@@ -343,7 +343,7 @@ static void mips_fulong2e_init(ram_addr_t ram_size, const char *boot_device,
exit(1);
}
- vt82c686b_ide_init(pci_bus, hd, PCI_DEVFN(FULONG2E_VIA_SLOT, 1));
+ vt82c686b_ide_init(pci_bus, isa_bus, hd, PCI_DEVFN(FULONG2E_VIA_SLOT, 1));
usb_uhci_vt82c686b_init(pci_bus, PCI_DEVFN(FULONG2E_VIA_SLOT, 2));
usb_uhci_vt82c686b_init(pci_bus, PCI_DEVFN(FULONG2E_VIA_SLOT, 3));
diff --git a/hw/mips_jazz.c b/hw/mips_jazz.c
index 172df66..b887038 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -185,7 +185,7 @@ static void mips_jazz_init(MemoryRegion *address_space,
/* ISA devices */
isa_bus = isa_bus_bridge_init(address_space_io);
i8259 = i8259_init(env->irq[4]);
- isa_bus_irqs(i8259);
+ isa_bus_irqs(isa_bus, i8259);
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
DMA_init(0, cpu_exit_irq);
pit = pit_init(isa_bus, 0x40, 0);
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index 8126ca7..542c1ff 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -949,10 +949,10 @@ void mips_malta_init (ram_addr_t ram_size,
i8259 = i8259_init(env->irq[2]);
isa_bus = piix4_init(pci_bus, 80, i8259, &piix4_devfn);
- pci_piix4_ide_init(pci_bus, hd, piix4_devfn + 1);
+ pci_piix4_ide_init(pci_bus, isa_bus, hd, piix4_devfn + 1);
usb_uhci_piix4_init(pci_bus, piix4_devfn + 2);
- smbus = piix4_pm_init(pci_bus, piix4_devfn + 3, 0x1100, isa_get_irq(9),
- NULL, NULL, 0);
+ smbus = piix4_pm_init(pci_bus, piix4_devfn + 3, 0x1100,
+ isa_get_irq(isa_bus, 9), NULL, NULL, 0);
/* TODO: Populate SPD eeprom data. */
smbus_eeprom_init(smbus, 8, NULL, 0);
pit = pit_init(isa_bus, 0x40, 0);
diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
index cb099ab..abc9a80 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -259,7 +259,7 @@ void mips_r4k_init (ram_addr_t ram_size,
/* The PIC is attached to the MIPS CPU INT0 pin */
isa_bus = isa_bus_bridge_init(get_system_io());
i8259 = i8259_init(env->irq[2]);
- isa_bus_irqs(i8259);
+ isa_bus_irqs(isa_bus, i8259);
rtc_init(isa_bus, 2000, NULL);
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index a5f8b7a..d5c5ae5 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -150,7 +150,7 @@ static void pc_init1(MemoryRegion *system_memory,
isa_bus = isa_bus_bridge_init(system_io);
no_hpet = 1;
}
- isa_bus_irqs(isa_irq);
+ isa_bus_irqs(isa_bus, isa_irq);
if (!xen_enabled()) {
cpu_irq = pc_allocate_cpu_irq();
@@ -164,7 +164,7 @@ static void pc_init1(MemoryRegion *system_memory,
ioapic_init(isa_irq_state);
}
- pc_register_ferr_irq(isa_get_irq(13));
+ pc_register_ferr_irq(isa_get_irq(isa_bus, 13));
pc_vga_init(isa_bus, pci_enabled ? pci_bus : NULL);
@@ -188,9 +188,10 @@ static void pc_init1(MemoryRegion *system_memory,
if (pci_enabled) {
PCIDevice *dev;
if (xen_enabled()) {
- dev = pci_piix3_xen_ide_init(pci_bus, hd, piix3_devfn + 1);
+ dev = pci_piix3_xen_ide_init(pci_bus, isa_bus, hd,
+ piix3_devfn + 1);
} else {
- dev = pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1);
+ dev = pci_piix3_ide_init(pci_bus, isa_bus, hd, piix3_devfn + 1);
}
idebus[0] = qdev_get_child_bus(&dev->qdev, "ide.0");
idebus[1] = qdev_get_child_bus(&dev->qdev, "ide.1");
@@ -224,7 +225,7 @@ static void pc_init1(MemoryRegion *system_memory,
smi_irq = qemu_allocate_irqs(pc_acpi_smi_interrupt, first_cpu, 1);
/* TODO: Populate SPD eeprom data. */
smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100,
- isa_get_irq(9), *cmos_s3, *smi_irq,
+ isa_get_irq(isa_bus, 9), *cmos_s3, *smi_irq,
kvm_enabled());
smbus_eeprom_init(smbus, 8, NULL, 0);
}
diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c
index 499e63f..5e39982 100644
--- a/hw/ppc_prep.c
+++ b/hw/ppc_prep.c
@@ -653,7 +653,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
isa_bus = isa_bus_bridge_init(get_system_io());
i8259 = i8259_init(first_cpu->irq_inputs[PPC6xx_INPUT_INT]);
pci_bus = pci_prep_init(i8259, get_system_memory(), get_system_io());
- isa_bus_irqs(i8259);
+ isa_bus_irqs(isa_bus, i8259);
// pci_bus = i440fx_init();
/* Register 8 MB of ISA IO space (needed for non-contiguous map) */
PPC_io_memory = cpu_register_io_memory(PPC_prep_io_read,
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 13/16] isa: use bus given in parameter to get/set irqs on specified ISA bus
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (11 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 12/16] isa: give bus to isa_get_irq() and isa_bus_irqs() Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 14/16] i8259: add ad-hock variables to please future changes in isa_register_ioport() Hervé Poussineau
` (2 subsequent siblings)
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/isa-bus.c | 10 ++++++----
1 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index 4a95834..2f9ad24 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -60,10 +60,11 @@ void isa_bus_new(ISABus *bus, ISABusOps *ops, DeviceState *host)
void isa_bus_irqs(ISABus *bus, qemu_irq *irqs)
{
- if (!isabus || !isabus->ops->set_irqs) {
+ if (!bus || !bus->ops->set_irqs) {
hw_error("Tried to set isa irqs with no isa bus present.");
}
- isabus->ops->set_irqs(isabus, irqs);
+ assert(bus == isabus);
+ bus->ops->set_irqs(bus, irqs);
}
/*
@@ -74,10 +75,11 @@ void isa_bus_irqs(ISABus *bus, qemu_irq *irqs)
*/
qemu_irq isa_get_irq(ISABus *bus, int isairq)
{
- if (!isabus || !isabus->ops->get_irq) {
+ if (!bus || !bus->ops->get_irq) {
hw_error("ISA bus invalid");
}
- return isabus->ops->get_irq(isabus, isairq);
+ assert(bus == isabus);
+ return bus->ops->get_irq(bus, isairq);
}
void isa_init_irq(ISADevice *dev, qemu_irq *p, int isairq)
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 14/16] i8259: add ad-hock variables to please future changes in isa_register_ioport()
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (12 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 13/16] isa: use bus given in parameter to get/set irqs on specified ISA bus Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 15/16] isa: remove useless test " Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 16/16] isa: remove limitation of only one ISA bus Hervé Poussineau
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
This patch should be reverted once i8259 is qdevified
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/i8259.c | 29 +++++++++++++++++++++++++++--
1 files changed, 27 insertions(+), 2 deletions(-)
diff --git a/hw/i8259.c b/hw/i8259.c
index e5323ff..9af2bbb 100644
--- a/hw/i8259.c
+++ b/hw/i8259.c
@@ -499,15 +499,40 @@ static const MemoryRegionOps pic_elcr_ioport_ops = {
},
};
+static BusState *qbus_find_recursive(BusState *bus, const char *name)
+{
+ DeviceState *dev;
+ BusState *child, *ret;
+
+ if (strcmp(bus->name, name) == 0) {
+ return bus;
+ }
+
+ QLIST_FOREACH(dev, &bus->children, sibling) {
+ QLIST_FOREACH(child, &dev->child_bus, sibling) {
+ ret = qbus_find_recursive(child, name);
+ if (ret) {
+ return ret;
+ }
+ }
+ }
+ return NULL;
+}
+
/* XXX: add generic master/slave system */
static void pic_init1(int io_addr, int elcr_addr, PicState *s)
{
+ ISADevice dev;
+
+ memset(&dev, 0, sizeof(dev));
+ dev.qdev.parent_bus = qbus_find_recursive(sysbus_get_default(), "isa.0");
+
memory_region_init_io(&s->base_io, &pic_base_ioport_ops, s, "pic", 2);
memory_region_init_io(&s->elcr_io, &pic_elcr_ioport_ops, s, "elcr", 1);
- isa_register_ioport(NULL, &s->base_io, io_addr);
+ isa_register_ioport(&dev, &s->base_io, io_addr);
if (elcr_addr >= 0) {
- isa_register_ioport(NULL, &s->elcr_io, elcr_addr);
+ isa_register_ioport(&dev, &s->elcr_io, elcr_addr);
}
vmstate_register(NULL, io_addr, &vmstate_pic, s);
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 15/16] isa: remove useless test in isa_register_ioport()
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (13 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 14/16] i8259: add ad-hock variables to please future changes in isa_register_ioport() Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 16/16] isa: remove limitation of only one ISA bus Hervé Poussineau
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Use ISA bus from given device instead of global ISA bus
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/isa-bus.c | 12 ++++++------
1 files changed, 6 insertions(+), 6 deletions(-)
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index 2f9ad24..ab8dbe9 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -117,18 +117,18 @@ void isa_init_ioport(ISADevice *dev, uint16_t ioport)
void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t start)
{
- ISABus *bus = isabus;
+ ISABus *bus = isa_bus_from_device(dev);
+ assert(bus == isabus);
if (!bus || !bus->ops->get_io_space) {
hw_error("Tried to register I/O port with no isa bus present.");
}
memory_region_add_subregion(bus->ops->get_io_space(bus), start, io);
- if (dev != NULL) {
- assert(dev->nio < ARRAY_SIZE(dev->io));
- dev->io[dev->nio++] = io;
- isa_init_ioport_range(dev, start, memory_region_size(io));
- }
+
+ assert(dev->nio < ARRAY_SIZE(dev->io));
+ dev->io[dev->nio++] = io;
+ isa_init_ioport_range(dev, start, memory_region_size(io));
}
static int isa_qdev_init(DeviceState *qdev, DeviceInfo *base)
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread
* [Qemu-devel] [PATCH v3 16/16] isa: remove limitation of only one ISA bus
2011-10-02 16:10 [Qemu-devel] [PATCH v3 00/16] ISA bus improvements Hervé Poussineau
` (14 preceding siblings ...)
2011-10-02 16:10 ` [Qemu-devel] [PATCH v3 15/16] isa: remove useless test " Hervé Poussineau
@ 2011-10-02 16:10 ` Hervé Poussineau
15 siblings, 0 replies; 17+ messages in thread
From: Hervé Poussineau @ 2011-10-02 16:10 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/isa-bus.c | 10 ----------
1 files changed, 0 insertions(+), 10 deletions(-)
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index ab8dbe9..f01dfb2 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -22,7 +22,6 @@
#include "isa.h"
#include "exec-memory.h"
-static ISABus *isabus;
target_phys_addr_t isa_mem_base = 0;
static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent);
@@ -50,12 +49,8 @@ ISABus *isa_bus_bridge_init(MemoryRegion *address_space_io)
void isa_bus_new(ISABus *bus, ISABusOps *ops, DeviceState *host)
{
- if (isabus) {
- hw_error("Can't create a second ISA bus");
- }
qbus_create_inplace(&bus->qbus, &isa_bus_info, host, NULL);
bus->ops = ops;
- isabus = bus;
}
void isa_bus_irqs(ISABus *bus, qemu_irq *irqs)
@@ -63,7 +58,6 @@ void isa_bus_irqs(ISABus *bus, qemu_irq *irqs)
if (!bus || !bus->ops->set_irqs) {
hw_error("Tried to set isa irqs with no isa bus present.");
}
- assert(bus == isabus);
bus->ops->set_irqs(bus, irqs);
}
@@ -78,7 +72,6 @@ qemu_irq isa_get_irq(ISABus *bus, int isairq)
if (!bus || !bus->ops->get_irq) {
hw_error("ISA bus invalid");
}
- assert(bus == isabus);
return bus->ops->get_irq(bus, isairq);
}
@@ -119,7 +112,6 @@ void isa_register_ioport(ISADevice *dev, MemoryRegion *io, uint16_t start)
{
ISABus *bus = isa_bus_from_device(dev);
- assert(bus == isabus);
if (!bus || !bus->ops->get_io_space) {
hw_error("Tried to register I/O port with no isa bus present.");
}
@@ -157,7 +149,6 @@ ISADevice *isa_create(ISABus *bus, const char *name)
hw_error("Tried to create isa device %s with no isa bus present.",
name);
}
- assert(bus == isabus);
dev = qdev_create(&bus->qbus, name);
return DO_UPCAST(ISADevice, qdev, dev);
}
@@ -170,7 +161,6 @@ ISADevice *isa_try_create(ISABus *bus, const char *name)
hw_error("Tried to create isa device %s with no isa bus present.",
name);
}
- assert(bus == isabus);
dev = qdev_try_create(&bus->qbus, name);
return DO_UPCAST(ISADevice, qdev, dev);
}
--
1.7.6.3
^ permalink raw reply related [flat|nested] 17+ messages in thread