From: BALATON Zoltan <balaton@eik.bme.hu>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] Multiple pci buses
Date: Sun, 16 Mar 2014 18:06:39 +0100 (CET) [thread overview]
Message-ID: <alpine.LMD.2.02.1403161804130.19495@jedlik.phy.bme.hu> (raw)
In-Reply-To: <alpine.LMD.2.02.1403152213250.5373@jedlik.phy.bme.hu>
On Sat, 15 Mar 2014, BALATON Zoltan wrote:
> I'm trying to change hw/ppc/mac_newworld.c and hw/pci-host/uninorth.c to
> bring the mac99 machine type closer to what's seen in these dumps:
I've also tried the patch below based on what I've seen in pci_apb_init
but it only results in this error:
qemu-system-ppc: hw/core/qdev.c:162: qdev_init: Assertion `!dev->realized' failed.
Aborted
Is there some explanation available somewhere on how to do this correctly?
Thank you,
BALATON Zoltan
diff --git a/hw/pci-host/uninorth.c b/hw/pci-host/uninorth.c
index e72fe2a..485c446 100644
--- a/hw/pci-host/uninorth.c
+++ b/hw/pci-host/uninorth.c
@@ -25,6 +25,8 @@
#include "hw/ppc/mac.h"
#include "hw/pci/pci.h"
#include "hw/pci/pci_host.h"
+#include "hw/pci/pci_bridge.h"
+#include "hw/pci/pci_bus.h"
/* debug UniNorth */
//#define DEBUG_UNIN
@@ -214,54 +216,67 @@ static int pci_unin_internal_init_device(SysBusDevice *dev)
PCIBus *pci_pmac_init(qemu_irq *pic,
MemoryRegion *address_space_mem,
- MemoryRegion *address_space_io)
+ MemoryRegion *address_space_io,
+ PCIBus **bus2)
{
DeviceState *dev;
SysBusDevice *s;
PCIHostState *h;
UNINState *d;
+ PCIDevice *pdev;
/* Use values found on a real PowerMac */
- /* Uninorth main bus */
- dev = qdev_create(NULL, TYPE_UNI_NORTH_PCI_HOST_BRIDGE);
+ /* Uninorth AGP bus */
+ dev = qdev_create(NULL, TYPE_UNI_NORTH_AGP_HOST_BRIDGE);
qdev_init_nofail(dev);
s = SYS_BUS_DEVICE(dev);
h = PCI_HOST_BRIDGE(s);
- d = UNI_NORTH_PCI_HOST_BRIDGE(dev);
+ d = UNI_NORTH_AGP_HOST_BRIDGE(dev);
+ /* config space */
+ sysbus_mmio_map(s, 0, 0xf1000000);
+ sysbus_mmio_map(s, 1, 0xf1400000);
+ /* mmio space */
+ memory_region_init(&d->pci_mmio, OBJECT(d), "agp-mmio", 0x100000000ULL);
+ memory_region_init_alias(&d->pci_hole, OBJECT(d), "agp-hole", &d->pci_mmio,
+ 0x90000000ULL, 0x10000000ULL);
+ memory_region_add_subregion(address_space_mem, 0x90000000ULL,
+ &d->pci_hole);
+ h->bus = pci_register_bus(dev, NULL,
+ pci_unin_set_irq, pci_unin_map_irq, pic,
+ &d->pci_mmio,
+ address_space_io,
+ PCI_DEVFN(11, 0), 4, TYPE_PCI_BUS);
+ pci_create_simple(h->bus, PCI_DEVFN(11, 0), "uni-north-agp");
+
+ /* Uninorth PCI bus */
+ pdev = pci_create_simple_multifunction(h->bus, PCI_DEVFN(12, 0), true,
+ "uni-north-pci");
+ qdev_init_nofail(&pdev->qdev);
+ *bus2 = pci_bridge_get_sec_bus(PCI_BRIDGE(pdev));
+#if 0
+ d = UNI_NORTH_PCI_HOST_BRIDGE(pdev);
memory_region_init(&d->pci_mmio, OBJECT(d), "pci-mmio", 0x100000000ULL);
memory_region_init_alias(&d->pci_hole, OBJECT(d), "pci-hole", &d->pci_mmio,
- 0x80000000ULL, 0x70000000ULL);
+ 0x80000000ULL, 0x10000000ULL);
memory_region_add_subregion(address_space_mem, 0x80000000ULL,
&d->pci_hole);
- h->bus = pci_register_bus(dev, NULL,
+ bus2 = pci_register_bus(pdev, NULL,
pci_unin_set_irq, pci_unin_map_irq,
pic,
&d->pci_mmio,
- address_space_io,
+ address_space_io + 0x2000000ULL,
PCI_DEVFN(11, 0), 4, TYPE_PCI_BUS);
-#if 0
- pci_create_simple(h->bus, PCI_DEVFN(11, 0), "uni-north");
+ sysbus_mmio_map(s, 0, 0xf3000000);
+ sysbus_mmio_map(s, 1, 0xf3400000);
#endif
-
- sysbus_mmio_map(s, 0, 0xf2800000);
- sysbus_mmio_map(s, 1, 0xf2c00000);
-
/* DEC 21154 bridge */
#if 0
/* XXX: not activated as PPC BIOS doesn't handle multiple buses properly */
pci_create_simple(h->bus, PCI_DEVFN(12, 0), "dec-21154");
#endif
- /* Uninorth AGP bus */
- pci_create_simple(h->bus, PCI_DEVFN(11, 0), "uni-north-agp");
- dev = qdev_create(NULL, TYPE_UNI_NORTH_AGP_HOST_BRIDGE);
- qdev_init_nofail(dev);
- s = SYS_BUS_DEVICE(dev);
- sysbus_mmio_map(s, 0, 0xf0800000);
- sysbus_mmio_map(s, 1, 0xf0c00000);
-
/* Uninorth internal bus */
#if 0
/* XXX: not needed for now */
diff --git a/hw/ppc/mac.h b/hw/ppc/mac.h
index c1faf9c..c14c7d6 100644
--- a/hw/ppc/mac.h
+++ b/hw/ppc/mac.h
@@ -155,7 +155,8 @@ PCIBus *pci_grackle_init(uint32_t base, qemu_irq *pic,
/* UniNorth PCI */
PCIBus *pci_pmac_init(qemu_irq *pic,
MemoryRegion *address_space_mem,
- MemoryRegion *address_space_io);
+ MemoryRegion *address_space_io,
+ PCIBus **bus2);
PCIBus *pci_pmac_u3_init(qemu_irq *pic,
MemoryRegion *address_space_mem,
MemoryRegion *address_space_io);
diff --git a/hw/ppc/mac_newworld.c b/hw/ppc/mac_newworld.c
index 5e79575..a074935 100644
--- a/hw/ppc/mac_newworld.c
+++ b/hw/ppc/mac_newworld.c
@@ -154,12 +154,14 @@ static void ppc_core99_init(QEMUMachineInitArgs *args)
qemu_irq *pic, **openpic_irqs;
MemoryRegion *isa = g_new(MemoryRegion, 1);
MemoryRegion *unin_memory = g_new(MemoryRegion, 1);
+#if 0
MemoryRegion *unin2_memory = g_new(MemoryRegion, 1);
+#endif
int linux_boot, i, j, k;
MemoryRegion *ram = g_new(MemoryRegion, 1), *bios = g_new(MemoryRegion, 1);
hwaddr kernel_base, initrd_base, cmdline_base = 0;
long kernel_size, initrd_size;
- PCIBus *pci_bus;
+ PCIBus *pci_bus, *pci_bus2;
PCIDevice *macio;
MACIOIDEState *macio_ide;
BusState *adb_bus;
@@ -296,10 +298,10 @@ static void ppc_core99_init(QEMUMachineInitArgs *args)
/* UniN init: XXX should be a real device */
memory_region_init_io(unin_memory, NULL, &unin_ops, token, "unin", 0x1000);
memory_region_add_subregion(get_system_memory(), 0xf8000000, unin_memory);
-
+#if 0
memory_region_init_io(unin2_memory, NULL, &unin_ops, token, "unin", 0x1000);
memory_region_add_subregion(get_system_memory(), 0xf3000000, unin2_memory);
-
+#endif
openpic_irqs = g_malloc0(smp_cpus * sizeof(qemu_irq *));
openpic_irqs[0] =
g_malloc0(smp_cpus * sizeof(qemu_irq) * OPENPIC_OUTPUT_NB);
@@ -367,11 +369,12 @@ static void ppc_core99_init(QEMUMachineInitArgs *args)
pci_bus = pci_pmac_u3_init(pic, get_system_memory(), get_system_io());
machine_arch = ARCH_MAC99_U3;
} else {
- pci_bus = pci_pmac_init(pic, get_system_memory(), get_system_io());
+ pci_bus = pci_pmac_init(pic, get_system_memory(), get_system_io(),
+ &pci_bus2);
machine_arch = ARCH_MAC99;
}
/* init basic PC hardware */
- pci_vga_init(pci_bus);
+ pci_vga_init(pci_bus2);
escc_mem = escc_init(0, pic[0x25], pic[0x24],
serial_hds[0], serial_hds[1], ESCC_CLOCK, 4);
next prev parent reply other threads:[~2014-03-16 17:06 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-03-15 21:21 [Qemu-devel] Multiple pci buses BALATON Zoltan
2014-03-16 17:06 ` BALATON Zoltan [this message]
2014-03-17 2:09 ` Alexey Kardashevskiy
2014-03-17 16:51 ` Andreas Färber
2014-03-17 22:14 ` BALATON Zoltan
2014-03-19 22:36 ` Andreas Färber
2014-03-20 9:42 ` BALATON Zoltan
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=alpine.LMD.2.02.1403161804130.19495@jedlik.phy.bme.hu \
--to=balaton@eik.bme.hu \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
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).