qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
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);

  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).