qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).