From: Hollis Blanchard <[EMAIL PROTECTED]> Signed-off-by: Hollis Blanchard <[EMAIL PROTECTED]> Signed-off-by: Avi Kivity <[EMAIL PROTECTED]>
diff --git a/qemu/hw/ppc440.c b/qemu/hw/ppc440.c index 5cec729..eb91688 100644 --- a/qemu/hw/ppc440.c +++ b/qemu/hw/ppc440.c @@ -8,17 +8,32 @@ * */ + +#include "hw.h" +#include "hw/isa.h" #include "ppc440.h" +#define PPC440EP_PCI_CONFIG 0xeec00000 +#define PPC440EP_PCI_INTACK 0xeed00000 +#define PPC440EP_PCI_SPECIAL 0xeed00000 +#define PPC440EP_PCI_REGS 0xef400000 +#define PPC440EP_PCI_IO 0xe8000000 +#define PPC440EP_PCI_IOLEN 0x10000 +#define PPC440EP_PCI_MEM 0xa0000000 +#define PPC440EP_PCI_MEMLEN 0x20000000 + + void ppc440ep_init(CPUState *env, target_phys_addr_t ram_bases[2], target_phys_addr_t ram_sizes[2], qemu_irq **picp, + ppc4xx_pci_t **pcip, int do_init) { ppc4xx_mmio_t *mmio; qemu_irq *pic, *irqs; ram_addr_t offset; + ppc4xx_pci_t *pci; int i; ppc_dcr_init(env, NULL, NULL); @@ -45,6 +60,18 @@ void ppc440ep_init(CPUState *env, for (i = 0; i < 2; i++) offset += ram_sizes[i]; + /* PCI */ + pci = ppc4xx_pci_init(env, pic, + PPC440EP_PCI_CONFIG, + PPC440EP_PCI_INTACK, + PPC440EP_PCI_SPECIAL, + PPC440EP_PCI_REGS); + if (!pci) + printf("couldn't create PCI controller!\n"); + *pcip = pci; + + isa_mmio_init(PPC440EP_PCI_IO, PPC440EP_PCI_IOLEN); + /* serial ports on page 126 of 440EP user manual */ if (serial_hds[0]) { printf("Initializing first serial port\n"); diff --git a/qemu/hw/ppc440.h b/qemu/hw/ppc440.h index 3a979d5..087af19 100644 --- a/qemu/hw/ppc440.h +++ b/qemu/hw/ppc440.h @@ -24,6 +24,7 @@ void ppc440ep_init(CPUState *env, target_phys_addr_t ram_bases[2], target_phys_addr_t ram_sizes[2], qemu_irq **picp, + ppc4xx_pci_t **pcip, int do_init); #endif diff --git a/qemu/hw/ppc440_bamboo.c b/qemu/hw/ppc440_bamboo.c index 24a7a35..57505a5 100644 --- a/qemu/hw/ppc440_bamboo.c +++ b/qemu/hw/ppc440_bamboo.c @@ -9,6 +9,11 @@ */ #include "config.h" +#include "qemu-common.h" +#include "net.h" +#include "hw.h" +#include "pci.h" +#include "sysemu.h" #include "ppc440.h" #include "qemu-kvm.h" #include "device_tree.h" @@ -26,7 +31,9 @@ void bamboo_init(ram_addr_t ram_size, int vga_ram_size, { char *buf=NULL; target_phys_addr_t ram_bases[4], ram_sizes[4]; + NICInfo *nd; qemu_irq *pic; + ppc4xx_pci_t *pci; CPUState *env; target_ulong ep=0; target_ulong la=0; @@ -77,7 +84,7 @@ void bamboo_init(ram_addr_t ram_size, int vga_ram_size, /* call init */ printf("Calling function ppc440_init\n"); - ppc440ep_init(env, ram_bases, ram_sizes, &pic,1); + ppc440ep_init(env, ram_bases, ram_sizes, &pic, &pci, 1); printf("Done calling ppc440_init\n"); /* Register mem */ @@ -168,6 +175,25 @@ void bamboo_init(ram_addr_t ram_size, int vga_ram_size, env->nip = ep; } + if (pci) { + int unit_id = 0; + + /* Add virtio block devices. */ + while ((i = drive_get_index(IF_VIRTIO, 0, unit_id)) != -1) { + virtio_blk_init(pci->bus, 0x1AF4, 0x1001, + drives_table[i].bdrv); + unit_id++; + } + + /* Register network interfaces. */ + for (i = 0; i < nb_nics; i++) { + nd = &nd_table[i]; + if (!nd->model) + nd->model = "virtio"; + pci_nic_init(pci->bus, nd, -1); + } + } + printf("%s: DONE\n", __func__); } diff --git a/qemu/pc-bios/bamboo.dtb b/qemu/pc-bios/bamboo.dtb dissimilarity index 97% index e02fa8e..81f971c 100644 --- a/qemu/pc-bios/bamboo.dtb +++ b/qemu/pc-bios/bamboo.dtb @@ -1,2 +1,3 @@ -Ð þí -g 8 ø ( þí¾ï o À amcc,bamboo !amcc,bamboo , aliases 7/plb/opb/[EMAIL PROTECTED]/plb/opb/[EMAIL PROTECTED]@0 Gcpu PowerPC,[EMAIL PROTECTED] « ¸ Çnative Ù memory Gmemory S interrupt-controller0 !ibm,uic-440ep ibm,uic ç ü À Ù sdr !ibm,sdr-440ep cpr !ibm,cpr-440ep plb % !ibm,plb-440ep ibm,plb-440gp ibm,plb4 WòT sdram !ibm,sdram-440ep ibm,sdram-405gp dma !ibm,dma-440ep ibm,dma-440gp ' opb $ !ibm,opb-440ep ibm,opb-440gp ibm,opb '[EMAIL PROTECTED],ebc-440ep ibm,ebc-440gp ibm,[EMAIL PROTECTED]'[EMAIL PROTECTED]>