[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 10/12] isa: give bus to isa_create() methods
From: |
Hervé Poussineau |
Subject: |
[Qemu-devel] [PATCH v2 10/12] isa: give bus to isa_create() methods |
Date: |
Tue, 20 Sep 2011 07:24:08 +0200 |
Bus argument is mandatory, and allows to create a device on specified ISA bus.
Signed-off-by: Hervé Poussineau <address@hidden>
---
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
- [Qemu-devel] [PATCH v2 00/12] ISA bus improvements, Hervé Poussineau, 2011/09/20
- [Qemu-devel] [PATCH v2 01/12] isa: rename isa_bus_new to isa_bus_bridge_init, Hervé Poussineau, 2011/09/20
- [Qemu-devel] [PATCH v2 03/12] isa: implement isa_address_space() as a method of ISA bus, Hervé Poussineau, 2011/09/20
- [Qemu-devel] [PATCH v2 02/12] isa: rework ISA bus internals, and add ISA bus ops structure, Hervé Poussineau, 2011/09/20
- [Qemu-devel] [PATCH v2 04/12] audio: give ISA bus to sound cards, instead of PIC, Hervé Poussineau, 2011/09/20
- [Qemu-devel] [PATCH v2 05/12] pc: improve bus implementation of PIIX3 bridge, Hervé Poussineau, 2011/09/20
- [Qemu-devel] [PATCH v2 06/12] fulong2e: move pic initialization + ISA bus creation to south bridge, Hervé Poussineau, 2011/09/20
- [Qemu-devel] [PATCH v2 07/12] sun4u: improve bus implementation of EBus bridge, Hervé Poussineau, 2011/09/20
- [Qemu-devel] [PATCH v2 08/12] malta: improve bus implementation of PIIX4 bridge, Hervé Poussineau, 2011/09/20
- [Qemu-devel] [PATCH v2 09/12] isa: remove unused parameter to isa_bus_bridge_init(), Hervé Poussineau, 2011/09/20
- [Qemu-devel] [PATCH v2 10/12] isa: give bus to isa_create() methods,
Hervé Poussineau <=
- [Qemu-devel] [PATCH v2 11/12] isa: give bus to isa_get_irq() and isa_bus_irqs(), Hervé Poussineau, 2011/09/20
- [Qemu-devel] [PATCH v2 12/12] isa: remove limitation of only one ISA bus, Hervé Poussineau, 2011/09/20