* [Qemu-devel] [PATCH v2 00/12] ISA bus improvements
@ 2011-09-20 5:23 Hervé Poussineau
2011-09-20 5:23 ` [Qemu-devel] [PATCH v2 01/12] isa: rename isa_bus_new to isa_bus_bridge_init Hervé Poussineau
` (11 more replies)
0 siblings, 12 replies; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:23 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Following patches aim to change ISA bus to a first-citizen class in Qemu.
They add ISA bus ops, like for scsi and usb buses.
Current ISA bridges (PIIX3, PIIX4, EBUS and VT82C686) are converted
to this new API, and a simple 'isabus-bridge' device is added.
isa_address_space() operation can probably be used to remove the
infamous isa_mem_base variable. However, some work is already done
in this direction on the ML, so I didn't change anything.
Finally, add bus argument to all ISA functions, so architectures
with multiple ISA buses (like some Alpha systems) can be emulated.
Changes since v1:
- add ISA bus argument to all ISA functions
- remove default ISA bus concept as per Jan request
Hervé Poussineau (12):
isa: rename isa_bus_new to isa_bus_bridge_init
isa: rework ISA bus internals, and add ISA bus ops structure
isa: implement isa_address_space() as a method of ISA bus
audio: give ISA bus to sound cards, instead of PIC
pc: improve bus implementation of PIIX3 bridge
fulong2e: move pic initialization + ISA bus creation to south bridge
sun4u: improve bus implementation of EBus bridge
malta: improve bus implementation of PIIX4 bridge
isa: remove unused parameter to isa_bus_bridge_init()
isa: give bus to isa_create() methods
isa: give bus to isa_get_irq() and isa_bus_irqs()
isa: remove limitation of only one ISA bus
Makefile.objs | 2 +-
arch_init.c | 10 +++---
arch_init.h | 2 +-
hw/adlib.c | 2 +-
hw/audiodev.h | 8 ++--
hw/cs4231a.c | 4 +-
hw/fdc.h | 4 +-
hw/gus.c | 4 +-
hw/i8254.c | 2 +-
hw/ide.h | 14 +++++---
hw/ide/isa.c | 4 +-
hw/ide/piix.c | 30 +++++++++++++-----
hw/ide/via.c | 18 ++++++++--
hw/isa-bridge.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++
hw/isa-bus.c | 86 ++++++++++++++++++++-------------------------------
hw/isa.h | 34 ++++++++++++++++----
hw/m48t59.c | 5 ++-
hw/mc146818rtc.c | 4 +-
hw/mc146818rtc.h | 2 +-
hw/mips_fulong2e.c | 25 ++++++---------
hw/mips_jazz.c | 11 ++++---
hw/mips_malta.c | 26 ++++++++--------
hw/mips_r4k.c | 19 ++++++-----
hw/nvram.h | 3 +-
hw/pc.c | 34 ++++++++++----------
hw/pc.h | 38 ++++++++++++-----------
hw/pc_piix.c | 27 +++++++++-------
hw/pcspk.c | 2 +-
hw/piix4.c | 27 ++++++++++++++--
hw/piix_pci.c | 38 ++++++++++++++++++++---
hw/ppc_prep.c | 18 ++++++-----
hw/sb16.c | 4 +-
hw/sun4u.c | 40 ++++++++++++++++--------
hw/vt82c686.c | 26 ++++++++++++++--
hw/vt82c686.h | 2 +-
qemu-common.h | 1 +
36 files changed, 425 insertions(+), 228 deletions(-)
create mode 100644 hw/isa-bridge.c
--
1.7.5.4
^ permalink raw reply [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH v2 01/12] isa: rename isa_bus_new to isa_bus_bridge_init
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
@ 2011-09-20 5:23 ` Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 02/12] isa: rework ISA bus internals, and add ISA bus ops structure Hervé Poussineau
` (10 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:23 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 1cb497f..0f8b682 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -39,7 +39,7 @@ static struct BusInfo isa_bus_info = {
.get_fw_dev_path = isabus_get_fw_dev_path,
};
-ISABus *isa_bus_new(DeviceState *dev)
+ISABus *isa_bus_bridge_init(DeviceState *dev)
{
if (isabus) {
fprintf(stderr, "Can't create a second ISA bus\n");
diff --git a/hw/isa.h b/hw/isa.h
index f344699..210b3fe 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -25,7 +25,7 @@ struct ISADeviceInfo {
isa_qdev_initfn init;
};
-ISABus *isa_bus_new(DeviceState *dev);
+ISABus *isa_bus_bridge_init(DeviceState *dev);
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 f3c9f93..f9581f7 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -181,7 +181,7 @@ void mips_jazz_init (ram_addr_t ram_size,
/* ISA devices */
i8259 = i8259_init(env->irq[4]);
- isa_bus_new(NULL);
+ isa_bus_bridge_init(NULL);
isa_bus_irqs(i8259);
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
DMA_init(0, cpu_exit_irq);
diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
index 5d002c5..d1a841b 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -266,7 +266,7 @@ void mips_r4k_init (ram_addr_t ram_size,
/* The PIC is attached to the MIPS CPU INT0 pin */
i8259 = i8259_init(env->irq[2]);
- isa_bus_new(NULL);
+ isa_bus_bridge_init(NULL);
isa_bus_irqs(i8259);
rtc_init(2000, NULL);
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index 20fa69b..565e1d1 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -149,7 +149,7 @@ static void pc_init1(MemoryRegion *system_memory,
} else {
pci_bus = NULL;
i440fx_state = NULL;
- isa_bus_new(NULL);
+ isa_bus_bridge_init(NULL);
}
isa_bus_irqs(isa_irq);
diff --git a/hw/piix4.c b/hw/piix4.c
index 9590e7b..984de8b 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);
+ isa_bus_bridge_init(&d->dev.qdev);
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 8f6ea42..7a5a44c 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);
+ isa_bus_bridge_init(&d->dev.qdev);
qemu_register_reset(piix3_reset, d);
return 0;
}
diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c
index 515de42..ebcc6fe 100644
--- a/hw/ppc_prep.c
+++ b/hw/ppc_prep.c
@@ -651,7 +651,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
i8259 = i8259_init(first_cpu->irq_inputs[PPC6xx_INPUT_INT]);
pci_bus = pci_prep_init(i8259, get_system_memory(), get_system_io());
/* Hmm, prep has no pci-isa bridge ??? */
- isa_bus_new(NULL);
+ isa_bus_bridge_init(NULL);
isa_bus_irqs(i8259);
// pci_bus = i440fx_init();
/* Register 8 MB of ISA IO space (needed for non-contiguous map) */
diff --git a/hw/sun4u.c b/hw/sun4u.c
index 6afb0e7..facfae0 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);
+ isa_bus_bridge_init(&pci_dev->qdev);
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 b9fcc0e..37c64d4 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);
+ isa_bus_bridge_init(&d->qdev);
pci_conf = d->config;
pci_config_set_prog_interface(pci_conf, 0x0);
--
1.7.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH v2 02/12] isa: rework ISA bus internals, and add ISA bus ops structure
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
2011-09-20 5:23 ` [Qemu-devel] [PATCH v2 01/12] isa: rename isa_bus_new to isa_bus_bridge_init Hervé Poussineau
@ 2011-09-20 5:24 ` Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 03/12] isa: implement isa_address_space() as a method of ISA bus Hervé Poussineau
` (9 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:24 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 | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
hw/isa-bus.c | 69 ++++++++++++++++++++++++++++++-----------------------
hw/isa.h | 16 +++++++++++-
qemu-common.h | 1 +
5 files changed, 127 insertions(+), 32 deletions(-)
create mode 100644 hw/isa-bridge.c
diff --git a/Makefile.objs b/Makefile.objs
index 1c65087..fa0746e 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..49fa033
--- /dev/null
+++ b/hw/isa-bridge.c
@@ -0,0 +1,71 @@
+/*
+ * 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"
+#include "exec-memory.h"
+
+typedef struct {
+ SysBusDevice busdev;
+ ISABus bus;
+ qemu_irq *irqs;
+} 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 ISABusOps isabus_bridge_ops = {
+ .set_irqs = isabus_bridge_set_irqs,
+ .get_irq = isabus_bridge_get_irq,
+};
+
+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 0f8b682..27cffb3 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -22,12 +22,9 @@
#include "isa.h"
#include "exec-memory.h"
-struct ISABus {
- BusState qbus;
- qemu_irq *irqs;
-};
static ISABus *isabus;
target_phys_addr_t isa_mem_base = 0;
+static qemu_irq *isa_bus_default_irqs;
static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent);
static char *isabus_get_fw_dev_path(DeviceState *dev);
@@ -39,6 +36,24 @@ 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 ISABusOps isa_bus_default_ops = {
+ .set_irqs = isa_bus_default_set_irqs,
+ .get_irq = isa_bus_default_get_irq,
+};
+
ISABus *isa_bus_bridge_init(DeviceState *dev)
{
if (isabus) {
@@ -48,15 +63,29 @@ ISABus *isa_bus_bridge_init(DeviceState *dev)
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));
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);
}
/*
@@ -67,10 +96,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)
@@ -170,25 +199,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;
@@ -208,4 +218,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 210b3fe..129f129 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;
@@ -25,7 +25,21 @@ 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);
+};
+
ISABus *isa_bus_bridge_init(DeviceState *dev);
+
+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 404c421..dbba401 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.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH v2 03/12] isa: implement isa_address_space() as a method of ISA bus
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
2011-09-20 5:23 ` [Qemu-devel] [PATCH v2 01/12] isa: rename isa_bus_new to isa_bus_bridge_init Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 02/12] isa: rework ISA bus internals, and add ISA bus ops structure Hervé Poussineau
@ 2011-09-20 5:24 ` Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 04/12] audio: give ISA bus to sound cards, instead of PIC Hervé Poussineau
` (8 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/isa-bridge.c | 6 ++++++
hw/isa-bus.c | 13 ++++++++++++-
hw/isa.h | 1 +
3 files changed, 19 insertions(+), 1 deletions(-)
diff --git a/hw/isa-bridge.c b/hw/isa-bridge.c
index 49fa033..bb2d8b0 100644
--- a/hw/isa-bridge.c
+++ b/hw/isa-bridge.c
@@ -42,9 +42,15 @@ static qemu_irq isabus_bridge_get_irq(ISABus *bus, int isairq)
return s->irqs[isairq];
}
+static MemoryRegion *isabus_bridge_get_address_space(ISABus *bus)
+{
+ return get_system_memory();
+}
+
static ISABusOps isabus_bridge_ops = {
.set_irqs = isabus_bridge_set_irqs,
.get_irq = isabus_bridge_get_irq,
+ .get_address_space = isabus_bridge_get_address_space,
};
static int isabus_bridge_init(SysBusDevice *dev)
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index 27cffb3..b492486 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -49,9 +49,15 @@ static qemu_irq isa_bus_default_get_irq(ISABus *bus, int isairq)
return isa_bus_default_irqs[isairq];
}
+static MemoryRegion *isa_bus_default_get_address_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,
+ .get_address_space = isa_bus_default_get_address_space,
};
ISABus *isa_bus_bridge_init(DeviceState *dev)
@@ -215,6 +221,11 @@ static char *isabus_get_fw_dev_path(DeviceState *dev)
MemoryRegion *isa_address_space(ISADevice *dev)
{
- return get_system_memory();
+ ISABus *bus = FROM_QBUS(ISABus, qdev_get_parent_bus(&dev->qdev));
+
+ if (!bus->ops->get_address_space) {
+ hw_error("Tried to get isa address space on invalid isa bus.");
+ }
+ return bus->ops->get_address_space(bus);
}
diff --git a/hw/isa.h b/hw/isa.h
index 129f129..22a2783 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -35,6 +35,7 @@ struct ISABus {
struct ISABusOps {
void (*set_irqs)(ISABus *bus, qemu_irq *irqs);
qemu_irq (*get_irq)(ISABus *bus, int isairq);
+ MemoryRegion *(*get_address_space)(ISABus *bus);
};
ISABus *isa_bus_bridge_init(DeviceState *dev);
--
1.7.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH v2 04/12] audio: give ISA bus to sound cards, instead of PIC
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
` (2 preceding siblings ...)
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 03/12] isa: implement isa_address_space() as a method of ISA bus Hervé Poussineau
@ 2011-09-20 5:24 ` Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 05/12] pc: improve bus implementation of PIIX3 bridge Hervé Poussineau
` (7 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:24 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 9a5a0e3..465a260 100644
--- a/arch_init.c
+++ b/arch_init.c
@@ -471,7 +471,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;
};
@@ -626,15 +626,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) {
@@ -648,7 +648,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..66db797 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 598f032..e16f9a3 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..e4dbc8a 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 f9581f7..3990c0d 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -113,6 +113,7 @@ void mips_jazz_init (ram_addr_t ram_size,
int bios_size, n;
CPUState *env;
qemu_irq *rc4030, *i8259;
+ ISABus *isa_bus;
rc4030_dma *dmas;
void* rc4030_opaque;
int s_rtc, s_dma_dummy;
@@ -181,7 +182,7 @@ void mips_jazz_init (ram_addr_t ram_size,
/* ISA devices */
i8259 = i8259_init(env->irq[4]);
- isa_bus_bridge_init(NULL);
+ isa_bus = isa_bus_bridge_init(NULL);
isa_bus_irqs(i8259);
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
DMA_init(0, cpu_exit_irq);
@@ -281,7 +282,7 @@ void mips_jazz_init (ram_addr_t ram_size,
/* 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 dae736e..c3e85e9 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 565e1d1..56f62cd 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -149,7 +149,7 @@ static void pc_init1(MemoryRegion *system_memory,
} else {
pci_bus = NULL;
i440fx_state = NULL;
- isa_bus_bridge_init(NULL);
+ isa_bus = isa_bus_bridge_init(NULL);
}
isa_bus_irqs(isa_irq);
@@ -192,7 +192,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..6af2f59 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.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH v2 05/12] pc: improve bus implementation of PIIX3 bridge
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
` (3 preceding siblings ...)
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 04/12] audio: give ISA bus to sound cards, instead of PIC Hervé Poussineau
@ 2011-09-20 5:24 ` Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 06/12] fulong2e: move pic initialization + ISA bus creation to south bridge Hervé Poussineau
` (6 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:24 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 | 38 +++++++++++++++++++++++++++++++++-----
3 files changed, 36 insertions(+), 7 deletions(-)
diff --git a/hw/pc.h b/hw/pc.h
index c3e85e9..5489039 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 56f62cd..20dddff 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;
@@ -137,7 +138,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 7a5a44c..6000141 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,37 @@ 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_address_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_address_space = piix3_bus_get_address_space,
+};
+
static int piix3_initfn(PCIDevice *dev)
{
PIIX3State *d = DO_UPCAST(PIIX3State, dev, dev);
- isa_bus_bridge_init(&d->dev.qdev);
+ isa_bus_new(&d->bus, &piix3_bus_ops, &dev->qdev);
qemu_register_reset(piix3_reset, d);
return 0;
}
--
1.7.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH v2 06/12] fulong2e: move pic initialization + ISA bus creation to south bridge
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
` (4 preceding siblings ...)
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 05/12] pc: improve bus implementation of PIIX3 bridge Hervé Poussineau
@ 2011-09-20 5:24 ` Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 07/12] sun4u: improve bus implementation of EBus bridge Hervé Poussineau
` (5 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:24 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 | 24 ++++++++++++++++++++++--
hw/vt82c686.h | 2 +-
3 files changed, 25 insertions(+), 10 deletions(-)
diff --git a/hw/mips_fulong2e.c b/hw/mips_fulong2e.c
index f52b8c5..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;
@@ -331,23 +330,19 @@ static void mips_fulong2e_init(ram_addr_t ram_size, const char *boot_device,
cpu_mips_irq_init_cpu(env);
cpu_mips_clock_init(env);
- /* Interrupt controller */
- /* The 8259 -> IP5 */
- i8259 = i8259_init(env->irq[5]);
-
/* North bridge, Bonito --> IP2 */
pci_bus = bonito_init((qemu_irq *)&(env->irq[2]));
/* 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);
}
- 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 37c64d4..59941fc 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,28 @@ 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 ISABusOps vt82c_bus_ops = {
+ .get_irq = vt82c_bus_get_irq,
+};
+
/* 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);
+ isa_bus_new(&vt82c->bus, &vt82c_bus_ops, &d->qdev);
pci_conf = d->config;
pci_config_set_prog_interface(pci_conf, 0x0);
@@ -507,12 +523,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.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH v2 07/12] sun4u: improve bus implementation of EBus bridge
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
` (5 preceding siblings ...)
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 06/12] fulong2e: move pic initialization + ISA bus creation to south bridge Hervé Poussineau
@ 2011-09-20 5:24 ` Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 08/12] malta: improve bus implementation of PIIX4 bridge Hervé Poussineau
` (4 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/sun4u.c | 23 +++++++++++++++++------
1 files changed, 17 insertions(+), 6 deletions(-)
diff --git a/hw/sun4u.c b/hw/sun4u.c
index facfae0..410d52b 100644
--- a/hw/sun4u.c
+++ b/hw/sun4u.c
@@ -93,6 +93,8 @@ struct hwdef {
typedef struct EbusState {
PCIDevice pci_dev;
+ ISABus bus;
+ qemu_irq *isa_irq;
MemoryRegion bar0;
MemoryRegion bar1;
} EbusState;
@@ -536,20 +538,29 @@ 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 ISABusOps pci_ebus_ops = {
+ .get_irq = pci_ebus_get_irq,
+};
+
static int
pci_ebus_init1(PCIDevice *pci_dev)
{
EbusState *s = DO_UPCAST(EbusState, pci_dev, pci_dev);
- isa_bus_bridge_init(&pci_dev->qdev);
-
+ 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.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH v2 08/12] malta: improve bus implementation of PIIX4 bridge
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
` (6 preceding siblings ...)
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 07/12] sun4u: improve bus implementation of EBus bridge Hervé Poussineau
@ 2011-09-20 5:24 ` Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 09/12] isa: remove unused parameter to isa_bus_bridge_init() Hervé Poussineau
` (3 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/mips_malta.c | 3 +--
hw/pc.h | 2 +-
hw/piix4.c | 23 +++++++++++++++++++++--
3 files changed, 23 insertions(+), 5 deletions(-)
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index e7cdf20..65e5915 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -939,8 +939,7 @@ void mips_malta_init (ram_addr_t ram_size,
/* Southbridge */
ide_drive_get(hd, MAX_IDE_BUS);
- piix4_devfn = piix4_init(pci_bus, 80);
- isa_bus_irqs(i8259);
+ piix4_devfn = piix4_init(pci_bus, 80, 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 5489039..8d1573f 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 984de8b..f6437ce 100644
--- a/hw/piix4.c
+++ b/hw/piix4.c
@@ -32,6 +32,8 @@ PCIDevice *piix4_dev;
typedef struct PIIX4State {
PCIDevice dev;
+ ISABus bus;
+ qemu_irq *isa_irq;
} PIIX4State;
static void piix4_reset(void *opaque)
@@ -83,21 +85,38 @@ 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 ISABusOps pci_piix4_ops = {
+ .get_irq = pci_piix4_get_irq,
+};
+
static int piix4_initfn(PCIDevice *dev)
{
PIIX4State *d = DO_UPCAST(PIIX4State, dev, dev);
- isa_bus_bridge_init(&d->dev.qdev);
+ 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.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH v2 09/12] isa: remove unused parameter to isa_bus_bridge_init()
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
` (7 preceding siblings ...)
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 08/12] malta: improve bus implementation of PIIX4 bridge Hervé Poussineau
@ 2011-09-20 5:24 ` Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 10/12] isa: give bus to isa_create() methods Hervé Poussineau
` (2 subsequent siblings)
11 siblings, 0 replies; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:24 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 | 43 +++++--------------------------------------
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, 10 insertions(+), 43 deletions(-)
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index b492486..e8c7497 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -24,7 +24,6 @@
static ISABus *isabus;
target_phys_addr_t isa_mem_base = 0;
-static qemu_irq *isa_bus_default_irqs;
static void isabus_dev_print(Monitor *mon, DeviceState *dev, int indent);
static char *isabus_get_fw_dev_path(DeviceState *dev);
@@ -36,44 +35,12 @@ 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(void)
{
- 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 MemoryRegion *isa_bus_default_get_address_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,
- .get_address_space = isa_bus_default_get_address_space,
-};
-
-ISABus *isa_bus_bridge_init(DeviceState *dev)
-{
- 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;
- }
- return isabus;
+ DeviceState *dev;
+ dev = qdev_create(NULL, "isabus-bridge");
+ qdev_init_nofail(dev);
+ return FROM_QBUS(ISABus, QLIST_FIRST(&dev->child_bus));
}
void isa_bus_new(ISABus *bus, ISABusOps *ops, DeviceState *host)
diff --git a/hw/isa.h b/hw/isa.h
index 22a2783..5219b98 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -38,7 +38,7 @@ struct ISABusOps {
MemoryRegion *(*get_address_space)(ISABus *bus);
};
-ISABus *isa_bus_bridge_init(DeviceState *dev);
+ISABus *isa_bus_bridge_init(void);
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 3990c0d..98f8d82 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -182,7 +182,7 @@ void mips_jazz_init (ram_addr_t ram_size,
/* ISA devices */
i8259 = i8259_init(env->irq[4]);
- isa_bus = isa_bus_bridge_init(NULL);
+ isa_bus = isa_bus_bridge_init();
isa_bus_irqs(i8259);
cpu_exit_irq = qemu_allocate_irqs(cpu_request_exit, NULL, 1);
DMA_init(0, cpu_exit_irq);
diff --git a/hw/mips_r4k.c b/hw/mips_r4k.c
index d1a841b..aaa38b0 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -266,7 +266,7 @@ void mips_r4k_init (ram_addr_t ram_size,
/* The PIC is attached to the MIPS CPU INT0 pin */
i8259 = i8259_init(env->irq[2]);
- isa_bus_bridge_init(NULL);
+ isa_bus_bridge_init();
isa_bus_irqs(i8259);
rtc_init(2000, NULL);
diff --git a/hw/pc_piix.c b/hw/pc_piix.c
index 20dddff..c0b8a3a 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -150,7 +150,7 @@ static void pc_init1(MemoryRegion *system_memory,
} else {
pci_bus = NULL;
i440fx_state = NULL;
- isa_bus = isa_bus_bridge_init(NULL);
+ isa_bus = isa_bus_bridge_init();
}
isa_bus_irqs(isa_irq);
diff --git a/hw/ppc_prep.c b/hw/ppc_prep.c
index ebcc6fe..5b313c8 100644
--- a/hw/ppc_prep.c
+++ b/hw/ppc_prep.c
@@ -651,7 +651,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
i8259 = i8259_init(first_cpu->irq_inputs[PPC6xx_INPUT_INT]);
pci_bus = pci_prep_init(i8259, get_system_memory(), get_system_io());
/* Hmm, prep has no pci-isa bridge ??? */
- isa_bus_bridge_init(NULL);
+ isa_bus_bridge_init();
isa_bus_irqs(i8259);
// pci_bus = i440fx_init();
/* Register 8 MB of ISA IO space (needed for non-contiguous map) */
--
1.7.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH v2 10/12] isa: give bus to isa_create() methods
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
` (8 preceding siblings ...)
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 09/12] isa: remove unused parameter to isa_bus_bridge_init() Hervé Poussineau
@ 2011-09-20 5:24 ` Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 11/12] isa: give bus to isa_get_irq() and isa_bus_irqs() Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 12/12] isa: remove limitation of only one ISA bus Hervé Poussineau
11 siblings, 0 replies; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Bus argument is mandatory, and allows to create a device on specified ISA bus.
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 | 16 ++++++++--------
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, 124 insertions(+), 110 deletions(-)
diff --git a/hw/cs4231a.c b/hw/cs4231a.c
index e16f9a3..9e6fbaa 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 e4dbc8a..fa56f8f 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 e8c7497..773a424 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -126,35 +126,35 @@ 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;
- if (!isabus) {
+ if (!bus) {
hw_error("Tried to create isa device %s with no isa bus present.",
name);
}
- dev = qdev_create(&isabus->qbus, name);
+ dev = qdev_create(&bus->qbus, 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;
- 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);
+ dev = qdev_try_create(&bus->qbus, 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 5219b98..03ecd55 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -48,9 +48,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);
extern target_phys_addr_t isa_mem_base;
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 98f8d82..24a8198 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -186,7 +186,7 @@ void mips_jazz_init (ram_addr_t ram_size,
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 */
@@ -252,7 +252,7 @@ void mips_jazz_init (ram_addr_t ram_size,
fdctrl_init_sysbus(rc4030[1], 0, 0x80003000, fds);
/* Real time clock */
- rtc_init(1980, NULL);
+ rtc_init(isa_bus, 1980, NULL);
s_rtc = cpu_register_io_memory(rtc_read, rtc_write, NULL,
DEVICE_NATIVE_ENDIAN);
cpu_register_physical_memory(0x80004000, 0x00001000, s_rtc);
diff --git a/hw/mips_malta.c b/hw/mips_malta.c
index 65e5915..7690822 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;
qemu_irq *cpu_exit_irq;
@@ -939,32 +940,32 @@ void mips_malta_init (ram_addr_t ram_size,
/* Southbridge */
ide_drive_get(hd, MAX_IDE_BUS);
- 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);
smbus = piix4_pm_init(pci_bus, piix4_devfn + 3, 0x1100, isa_get_irq(9),
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 aaa38b0..78eef37 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -169,6 +169,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;
@@ -266,35 +267,35 @@ void mips_r4k_init (ram_addr_t ram_size,
/* The PIC is attached to the MIPS CPU INT0 pin */
i8259 = i8259_init(env->irq[2]);
- isa_bus_bridge_init();
+ isa_bus = isa_bus_bridge_init();
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 5bc845a..4df60a4 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(NULL, "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 8d1573f..7753244 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 *pci_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 c0b8a3a..ed8fc0d 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -156,20 +156,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);
}
@@ -187,7 +187,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 f6437ce..df036d2 100644
--- a/hw/piix4.c
+++ b/hw/piix4.c
@@ -108,7 +108,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;
@@ -117,7 +118,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 5b313c8..d8d3fae 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;
@@ -651,7 +652,7 @@ static void ppc_prep_init (ram_addr_t ram_size,
i8259 = i8259_init(first_cpu->irq_inputs[PPC6xx_INPUT_INT]);
pci_bus = pci_prep_init(i8259, get_system_memory(), get_system_io());
/* Hmm, prep has no pci-isa bridge ??? */
- isa_bus_bridge_init();
+ isa_bus = isa_bus_bridge_init();
isa_bus_irqs(i8259);
// pci_bus = i440fx_init();
/* Register 8 MB of ISA IO space (needed for non-contiguous map) */
@@ -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 6af2f59..b851fcb 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 410d52b..f2eb728 100644
--- a/hw/sun4u.c
+++ b/hw/sun4u.c
@@ -535,10 +535,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)
@@ -757,6 +759,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];
@@ -777,7 +780,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) {
@@ -787,13 +790,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]);
}
}
@@ -804,12 +807,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 59941fc..c9d4305 100644
--- a/hw/vt82c686.c
+++ b/hw/vt82c686.c
@@ -523,7 +523,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;
@@ -533,7 +533,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.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH v2 11/12] isa: give bus to isa_get_irq() and isa_bus_irqs()
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
` (9 preceding siblings ...)
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 10/12] isa: give bus to isa_create() methods Hervé Poussineau
@ 2011-09-20 5:24 ` Hervé Poussineau
2011-09-23 18:41 ` Anthony Liguori
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 12/12] isa: remove limitation of only one ISA bus Hervé Poussineau
11 siblings, 1 reply; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:24 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 | 14 +++++++-------
hw/isa.h | 9 +++++++--
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, 72 insertions(+), 38 deletions(-)
diff --git a/hw/i8254.c b/hw/i8254.c
index a9ca9f6..35a0d01 100644
--- a/hw/i8254.c
+++ b/hw/i8254.c
@@ -514,7 +514,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);
register_ioport_write(pit->iobase, 4, 1, pit_ioport_write, pit);
register_ioport_read(pit->iobase, 3, 1, pit_ioport_read, pit);
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 773a424..25c7191 100644
--- a/hw/isa-bus.c
+++ b/hw/isa-bus.c
@@ -53,12 +53,12 @@ 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) {
+ if (!bus || !bus->ops->set_irqs) {
hw_error("Tried to set isa irqs with no isa bus present.");
}
- isabus->ops->set_irqs(isabus, irqs);
+ bus->ops->set_irqs(bus, irqs);
}
/*
@@ -67,19 +67,19 @@ 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) {
+ if (!bus || !bus->ops->get_irq) {
hw_error("ISA bus invalid");
}
- return isabus->ops->get_irq(isabus, isairq);
+ return bus->ops->get_irq(bus, isairq);
}
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 03ecd55..300c8c8 100644
--- a/hw/isa.h
+++ b/hw/isa.h
@@ -41,8 +41,8 @@ struct ISABusOps {
ISABus *isa_bus_bridge_init(void);
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_init_ioport(ISADevice *dev, uint16_t ioport);
void isa_init_ioport_range(ISADevice *dev, uint16_t start, uint16_t length);
@@ -52,6 +52,11 @@ 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)
+{
+ return DO_UPCAST(ISABus, qbus, d->qdev.parent_bus);
+}
+
extern target_phys_addr_t isa_mem_base;
void isa_mmio_setup(MemoryRegion *mr, target_phys_addr_t size);
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 24a8198..d3f97bb 100644
--- a/hw/mips_jazz.c
+++ b/hw/mips_jazz.c
@@ -183,7 +183,7 @@ void mips_jazz_init (ram_addr_t ram_size,
/* ISA devices */
i8259 = i8259_init(env->irq[4]);
isa_bus = isa_bus_bridge_init();
- 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 7690822..829b602 100644
--- a/hw/mips_malta.c
+++ b/hw/mips_malta.c
@@ -941,10 +941,10 @@ void mips_malta_init (ram_addr_t ram_size,
ide_drive_get(hd, MAX_IDE_BUS);
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 78eef37..c8f9877 100644
--- a/hw/mips_r4k.c
+++ b/hw/mips_r4k.c
@@ -268,7 +268,7 @@ void mips_r4k_init (ram_addr_t ram_size,
/* The PIC is attached to the MIPS CPU INT0 pin */
i8259 = i8259_init(env->irq[2]);
isa_bus = isa_bus_bridge_init();
- 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 ed8fc0d..47475a0 100644
--- a/hw/pc_piix.c
+++ b/hw/pc_piix.c
@@ -152,9 +152,9 @@ static void pc_init1(MemoryRegion *system_memory,
i440fx_state = NULL;
isa_bus = isa_bus_bridge_init();
}
- isa_bus_irqs(isa_irq);
+ isa_bus_irqs(isa_bus, isa_irq);
- 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);
@@ -178,9 +178,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");
@@ -214,7 +215,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 d8d3fae..053254d 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,
pci_bus = pci_prep_init(i8259, get_system_memory(), get_system_io());
/* Hmm, prep has no pci-isa bridge ??? */
isa_bus = isa_bus_bridge_init();
- 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.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* [Qemu-devel] [PATCH v2 12/12] isa: remove limitation of only one ISA bus
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
` (10 preceding siblings ...)
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 11/12] isa: give bus to isa_get_irq() and isa_bus_irqs() Hervé Poussineau
@ 2011-09-20 5:24 ` Hervé Poussineau
11 siblings, 0 replies; 14+ messages in thread
From: Hervé Poussineau @ 2011-09-20 5:24 UTC (permalink / raw)
To: qemu-devel; +Cc: Hervé Poussineau
Signed-off-by: Hervé Poussineau <hpoussin@reactos.org>
---
hw/isa-bus.c | 5 -----
1 files changed, 0 insertions(+), 5 deletions(-)
diff --git a/hw/isa-bus.c b/hw/isa-bus.c
index 25c7191..5d32999 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);
@@ -45,12 +44,8 @@ ISABus *isa_bus_bridge_init(void)
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)
--
1.7.5.4
^ permalink raw reply related [flat|nested] 14+ messages in thread
* Re: [Qemu-devel] [PATCH v2 11/12] isa: give bus to isa_get_irq() and isa_bus_irqs()
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 11/12] isa: give bus to isa_get_irq() and isa_bus_irqs() Hervé Poussineau
@ 2011-09-23 18:41 ` Anthony Liguori
0 siblings, 0 replies; 14+ messages in thread
From: Anthony Liguori @ 2011-09-23 18:41 UTC (permalink / raw)
To: Hervé Poussineau; +Cc: qemu-devel
On 09/20/2011 12:24 AM, Hervé Poussineau wrote:
>
> Signed-off-by: Hervé Poussineau<hpoussin@reactos.org>
This patch breaks booting a 64-bit Ubuntu guest under KVM (probably under TCG too).
It hangs during startup.
Regards,
Anthony Liguori
> ---
> hw/i8254.c | 2 +-
> hw/ide.h | 12 ++++++++----
> hw/ide/piix.c | 30 ++++++++++++++++++++++--------
> hw/ide/via.c | 18 ++++++++++++++----
> hw/isa-bus.c | 14 +++++++-------
> hw/isa.h | 9 +++++++--
> 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, 72 insertions(+), 38 deletions(-)
>
> diff --git a/hw/i8254.c b/hw/i8254.c
> index a9ca9f6..35a0d01 100644
> --- a/hw/i8254.c
> +++ b/hw/i8254.c
> @@ -514,7 +514,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);
>
> register_ioport_write(pit->iobase, 4, 1, pit_ioport_write, pit);
> register_ioport_read(pit->iobase, 3, 1, pit_ioport_read, pit);
> 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 773a424..25c7191 100644
> --- a/hw/isa-bus.c
> +++ b/hw/isa-bus.c
> @@ -53,12 +53,12 @@ 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) {
> + if (!bus || !bus->ops->set_irqs) {
> hw_error("Tried to set isa irqs with no isa bus present.");
> }
> - isabus->ops->set_irqs(isabus, irqs);
> + bus->ops->set_irqs(bus, irqs);
> }
>
> /*
> @@ -67,19 +67,19 @@ 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) {
> + if (!bus || !bus->ops->get_irq) {
> hw_error("ISA bus invalid");
> }
> - return isabus->ops->get_irq(isabus, isairq);
> + return bus->ops->get_irq(bus, isairq);
> }
>
> 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 03ecd55..300c8c8 100644
> --- a/hw/isa.h
> +++ b/hw/isa.h
> @@ -41,8 +41,8 @@ struct ISABusOps {
> ISABus *isa_bus_bridge_init(void);
>
> 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_init_ioport(ISADevice *dev, uint16_t ioport);
> void isa_init_ioport_range(ISADevice *dev, uint16_t start, uint16_t length);
> @@ -52,6 +52,11 @@ 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)
> +{
> + return DO_UPCAST(ISABus, qbus, d->qdev.parent_bus);
> +}
> +
> extern target_phys_addr_t isa_mem_base;
>
> void isa_mmio_setup(MemoryRegion *mr, target_phys_addr_t size);
> 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 24a8198..d3f97bb 100644
> --- a/hw/mips_jazz.c
> +++ b/hw/mips_jazz.c
> @@ -183,7 +183,7 @@ void mips_jazz_init (ram_addr_t ram_size,
> /* ISA devices */
> i8259 = i8259_init(env->irq[4]);
> isa_bus = isa_bus_bridge_init();
> - 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 7690822..829b602 100644
> --- a/hw/mips_malta.c
> +++ b/hw/mips_malta.c
> @@ -941,10 +941,10 @@ void mips_malta_init (ram_addr_t ram_size,
> ide_drive_get(hd, MAX_IDE_BUS);
>
> 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 78eef37..c8f9877 100644
> --- a/hw/mips_r4k.c
> +++ b/hw/mips_r4k.c
> @@ -268,7 +268,7 @@ void mips_r4k_init (ram_addr_t ram_size,
> /* The PIC is attached to the MIPS CPU INT0 pin */
> i8259 = i8259_init(env->irq[2]);
> isa_bus = isa_bus_bridge_init();
> - 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 ed8fc0d..47475a0 100644
> --- a/hw/pc_piix.c
> +++ b/hw/pc_piix.c
> @@ -152,9 +152,9 @@ static void pc_init1(MemoryRegion *system_memory,
> i440fx_state = NULL;
> isa_bus = isa_bus_bridge_init();
> }
> - isa_bus_irqs(isa_irq);
> + isa_bus_irqs(isa_bus, isa_irq);
>
> - 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);
>
> @@ -178,9 +178,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");
> @@ -214,7 +215,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 d8d3fae..053254d 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,
> pci_bus = pci_prep_init(i8259, get_system_memory(), get_system_io());
> /* Hmm, prep has no pci-isa bridge ??? */
> isa_bus = isa_bus_bridge_init();
> - 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,
^ permalink raw reply [flat|nested] 14+ messages in thread
end of thread, other threads:[~2011-09-23 18:41 UTC | newest]
Thread overview: 14+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-09-20 5:23 [Qemu-devel] [PATCH v2 00/12] ISA bus improvements Hervé Poussineau
2011-09-20 5:23 ` [Qemu-devel] [PATCH v2 01/12] isa: rename isa_bus_new to isa_bus_bridge_init Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 02/12] isa: rework ISA bus internals, and add ISA bus ops structure Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 03/12] isa: implement isa_address_space() as a method of ISA bus Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 04/12] audio: give ISA bus to sound cards, instead of PIC Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 05/12] pc: improve bus implementation of PIIX3 bridge Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 06/12] fulong2e: move pic initialization + ISA bus creation to south bridge Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 07/12] sun4u: improve bus implementation of EBus bridge Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 08/12] malta: improve bus implementation of PIIX4 bridge Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 09/12] isa: remove unused parameter to isa_bus_bridge_init() Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 10/12] isa: give bus to isa_create() methods Hervé Poussineau
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 11/12] isa: give bus to isa_get_irq() and isa_bus_irqs() Hervé Poussineau
2011-09-23 18:41 ` Anthony Liguori
2011-09-20 5:24 ` [Qemu-devel] [PATCH v2 12/12] isa: remove limitation of only one ISA bus Hervé Poussineau
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.