aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>2020-12-29 17:56:16 +0000
committerMark Cave-Ayland <mark.cave-ayland@ilande.co.uk>2021-01-13 12:20:55 +0000
commit6ce97b225eeba491f843cd01f28d1b3566d56f90 (patch)
tree1022ce4e505e340536168265eb2e65756d1ed447
parent370022ce313d0e797c969bd5be2be545c97f004d (diff)
downloadqemu-6ce97b225eeba491f843cd01f28d1b3566d56f90.zip
qemu-6ce97b225eeba491f843cd01f28d1b3566d56f90.tar.gz
qemu-6ce97b225eeba491f843cd01f28d1b3566d56f90.tar.bz2
mac_newworld: delay wiring of PCI IRQs in New World machine
In order to move the OpenPIC device to the macio device, the PCI bus needs to be initialised before the macio device and also before wiring the OpenPIC IRQs. Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Message-Id: <20201229175619.6051-5-mark.cave-ayland@ilande.co.uk> Signed-off-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>
-rw-r--r--hw/ppc/mac_newworld.c46
1 files changed, 26 insertions, 20 deletions
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index c0accda..708bb2f 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -139,6 +139,7 @@ static void ppc_core99_init(MachineState *machine)
int machine_arch;
SysBusDevice *s;
DeviceState *dev, *pic_dev;
+ DeviceState *uninorth_internal_dev = NULL, *uninorth_agp_dev = NULL;
hwaddr nvram_addr = 0xFFF04000;
uint64_t tbfreq;
unsigned int smp_cpus = machine->smp.cpus;
@@ -320,35 +321,24 @@ static void ppc_core99_init(MachineState *machine)
sysbus_mmio_map(s, 0, 0xf0800000);
sysbus_mmio_map(s, 1, 0xf0c00000);
- for (i = 0; i < 4; i++) {
- qdev_connect_gpio_out(dev, i, qdev_get_gpio_in(pic_dev, 0x1b + i));
- }
-
machine_arch = ARCH_MAC99_U3;
} else {
/* Use values found on a real PowerMac */
/* Uninorth AGP bus */
- dev = qdev_new(TYPE_UNI_NORTH_AGP_HOST_BRIDGE);
- s = SYS_BUS_DEVICE(dev);
+ uninorth_agp_dev = qdev_new(TYPE_UNI_NORTH_AGP_HOST_BRIDGE);
+ s = SYS_BUS_DEVICE(uninorth_agp_dev);
sysbus_realize_and_unref(s, &error_fatal);
sysbus_mmio_map(s, 0, 0xf0800000);
sysbus_mmio_map(s, 1, 0xf0c00000);
- for (i = 0; i < 4; i++) {
- qdev_connect_gpio_out(dev, i, qdev_get_gpio_in(pic_dev, 0x1b + i));
- }
-
/* Uninorth internal bus */
- dev = qdev_new(TYPE_UNI_NORTH_INTERNAL_PCI_HOST_BRIDGE);
- s = SYS_BUS_DEVICE(dev);
+ uninorth_internal_dev = qdev_new(
+ TYPE_UNI_NORTH_INTERNAL_PCI_HOST_BRIDGE);
+ s = SYS_BUS_DEVICE(uninorth_internal_dev);
sysbus_realize_and_unref(s, &error_fatal);
sysbus_mmio_map(s, 0, 0xf4800000);
sysbus_mmio_map(s, 1, 0xf4c00000);
- for (i = 0; i < 4; i++) {
- qdev_connect_gpio_out(dev, i, qdev_get_gpio_in(pic_dev, 0x1b + i));
- }
-
/* Uninorth main bus */
dev = qdev_new(TYPE_UNI_NORTH_PCI_HOST_BRIDGE);
qdev_prop_set_uint32(dev, "ofw-addr", 0xf2000000);
@@ -364,10 +354,6 @@ static void ppc_core99_init(MachineState *machine)
sysbus_mmio_map(s, 0, 0xf2800000);
sysbus_mmio_map(s, 1, 0xf2c00000);
- for (i = 0; i < 4; i++) {
- qdev_connect_gpio_out(dev, i, qdev_get_gpio_in(pic_dev, 0x1b + i));
- }
-
machine_arch = ARCH_MAC99;
}
@@ -401,6 +387,26 @@ static void ppc_core99_init(MachineState *machine)
pci_realize_and_unref(macio, pci_bus, &error_fatal);
+ for (i = 0; i < 4; i++) {
+ qdev_connect_gpio_out(DEVICE(uninorth_pci), i,
+ qdev_get_gpio_in(pic_dev, 0x1b + i));
+ }
+
+ /* TODO: additional PCI buses only wired up for 32-bit machines */
+ if (PPC_INPUT(env) != PPC_FLAGS_INPUT_970) {
+ /* Uninorth AGP bus */
+ for (i = 0; i < 4; i++) {
+ qdev_connect_gpio_out(uninorth_agp_dev, i,
+ qdev_get_gpio_in(pic_dev, 0x1b + i));
+ }
+
+ /* Uninorth internal bus */
+ for (i = 0; i < 4; i++) {
+ qdev_connect_gpio_out(uninorth_internal_dev, i,
+ qdev_get_gpio_in(pic_dev, 0x1b + i));
+ }
+ }
+
/* We only emulate 2 out of 3 IDE controllers for now */
ide_drive_get(hd, ARRAY_SIZE(hd));