From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:40390) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X5V9C-0007IY-3t for qemu-devel@nongnu.org; Fri, 11 Jul 2014 03:21:40 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1X5V95-00065t-7s for qemu-devel@nongnu.org; Fri, 11 Jul 2014 03:21:33 -0400 Received: from mail-we0-f177.google.com ([74.125.82.177]:57601) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1X5V94-00065A-UP for qemu-devel@nongnu.org; Fri, 11 Jul 2014 03:21:27 -0400 Received: by mail-we0-f177.google.com with SMTP id u56so595068wes.8 for ; Fri, 11 Jul 2014 00:21:23 -0700 (PDT) From: Alvise Rigo Date: Fri, 11 Jul 2014 09:21:04 +0200 Message-Id: <1405063270-18902-3-git-send-email-a.rigo@virtualopensystems.com> In-Reply-To: <1405063270-18902-1-git-send-email-a.rigo@virtualopensystems.com> References: <1405063270-18902-1-git-send-email-a.rigo@virtualopensystems.com> Subject: [Qemu-devel] [RFC PATCH 2/8] mach-virt: improve PCI memory topology definition List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org, rob.herring@linaro.org Cc: Peter Maydell , tech@virtualopensystems.com, Alvise Rigo Some of the unnecessary redundancy here will be decreased later in this series. Signed-off-by: Alvise Rigo --- hw/arm/virt.c | 37 +++++++++++++++++++++++++------------ 1 file changed, 25 insertions(+), 12 deletions(-) diff --git a/hw/arm/virt.c b/hw/arm/virt.c index ed9fc7a..c93152f 100644 --- a/hw/arm/virt.c +++ b/hw/arm/virt.c @@ -42,7 +42,6 @@ #include "qemu/bitops.h" #include "qemu/error-report.h" -#define NUM_VIRTIO_TRANSPORTS 32 /* Number of external interrupt lines to configure the GIC with */ #define NUM_IRQS 128 @@ -65,8 +64,14 @@ enum { VIRT_GIC_DIST, VIRT_GIC_CPU, VIRT_UART, +#define VIRT_UART_IRQS 16 VIRT_MMIO, +#define NUM_VIRTIO_TRANSPORTS 32 +#define VIRTIO_BASE_IRQ VIRT_UART_IRQS VIRT_PCI_CFG, + VIRT_PCI_IO, + VIRT_PCI_MEM, +#define PCI_BASE_IRQ (VIRTIO_BASE_IRQ + NUM_VIRTIO_TRANSPORTS - 1) }; typedef struct MemMapEntry { @@ -108,12 +113,15 @@ static const MemMapEntry a15memmap[] = { /* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */ /* 0x10000000 .. 0x40000000 reserved for PCI */ [VIRT_PCI_CFG] = { 0x10000000, 0x01000000 }, + [VIRT_PCI_IO] = { 0x11000000, 0x00010000 }, + [VIRT_PCI_MEM] = { 0x12000000, 0x2e000000 }, [VIRT_MEM] = { 0x40000000, 30ULL * 1024 * 1024 * 1024 }, }; static const int a15irqmap[] = { [VIRT_UART] = 1, - [VIRT_MMIO] = 16, /* ...to 16 + NUM_VIRTIO_TRANSPORTS - 1 */ + [VIRT_MMIO] = VIRTIO_BASE_IRQ, /* ...to 16 + NUM_VIRTIO_TRANSPORTS - 1 */ + [VIRT_PCI_CFG] = PCI_BASE_IRQ, }; static VirtBoardInfo machines[] = { @@ -351,10 +359,14 @@ static void create_pci_host(const VirtBoardInfo *vbi, qemu_irq *pic) SysBusDevice *busdev; uint32_t gic_phandle; char *nodename; - hwaddr base = vbi->memmap[VIRT_PCI_CFG].base; - hwaddr size = vbi->memmap[VIRT_PCI_CFG].size; - - nodename = g_strdup_printf("/pci@%" PRIx64, base); + hwaddr cfg_base = vbi->memmap[VIRT_PCI_CFG].base; + hwaddr cfg_size = vbi->memmap[VIRT_PCI_CFG].size; + hwaddr io_base = vbi->memmap[VIRT_PCI_IO].base; + hwaddr io_size = vbi->memmap[VIRT_PCI_IO].size; + hwaddr mem_base = vbi->memmap[VIRT_PCI_MEM].base; + hwaddr mem_size = vbi->memmap[VIRT_PCI_MEM].size; + + nodename = g_strdup_printf("/pci@%" PRIx64, cfg_base); qemu_fdt_add_subnode(vbi->fdt, nodename); qemu_fdt_setprop_string(vbi->fdt, nodename, "compatible", "pci-host-cam-generic"); @@ -363,11 +375,12 @@ static void create_pci_host(const VirtBoardInfo *vbi, qemu_irq *pic) qemu_fdt_setprop_cell(vbi->fdt, nodename, "#size-cells", 0x2); qemu_fdt_setprop_cell(vbi->fdt, nodename, "#interrupt-cells", 0x1); - qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg", 2, base, 2, size); + qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "reg", 2, cfg_base, + 2, cfg_size); qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "ranges", - 1, 0x01000000, 2, 0x00000000, 2, 0x11000000, 2, 0x00010000, - 1, 0x02000000, 2, 0x12000000, 2, 0x12000000, 2, 0x2e000000); + 1, 0x01000000, 2, 0x00000000, 2, io_base, 2, io_size, + 1, 0x02000000, 2, 0x12000000, 2, mem_size, 2, mem_size); gic_phandle = qemu_fdt_get_phandle(vbi->fdt, "/intc"); qemu_fdt_setprop_sized_cells(vbi->fdt, nodename, "interrupt-map-mask", @@ -381,9 +394,9 @@ static void create_pci_host(const VirtBoardInfo *vbi, qemu_irq *pic) dev = qdev_create(NULL, "generic_pci"); busdev = SYS_BUS_DEVICE(dev); qdev_init_nofail(dev); - sysbus_mmio_map(busdev, 0, base); /* PCI config */ - sysbus_mmio_map(busdev, 1, 0x11000000); /* PCI I/O */ - sysbus_mmio_map(busdev, 2, 0x12000000); /* PCI memory window */ + sysbus_mmio_map(busdev, 0, cfg_base); /* PCI config */ + sysbus_mmio_map(busdev, 1, io_base); /* PCI I/O */ + sysbus_mmio_map(busdev, 2, mem_base); /* PCI memory window */ sysbus_connect_irq(busdev, 0, pic[4]); sysbus_connect_irq(busdev, 1, pic[5]); sysbus_connect_irq(busdev, 2, pic[6]); -- 1.9.1