Commit 0027b06d0ef6450a52f96827d303865d7333b196
1 parent
0e058a8a
ARM PCI host qdev conversion
Signed-off-by: Paul Brook <paul@codesourcery.com>
Showing
4 changed files
with
62 additions
and
37 deletions
hw/primecell.h
| @@ -26,7 +26,4 @@ extern qemu_irq *mpcore_irq_init(qemu_irq *cpu_irq); | @@ -26,7 +26,4 @@ extern qemu_irq *mpcore_irq_init(qemu_irq *cpu_irq); | ||
| 26 | /* arm_sysctl.c */ | 26 | /* arm_sysctl.c */ |
| 27 | void arm_sysctl_init(uint32_t base, uint32_t sys_id); | 27 | void arm_sysctl_init(uint32_t base, uint32_t sys_id); |
| 28 | 28 | ||
| 29 | -/* versatile_pci.c */ | ||
| 30 | -PCIBus *pci_vpb_init(qemu_irq *pic, int realview); | ||
| 31 | - | ||
| 32 | #endif | 29 | #endif |
hw/realview.c
| @@ -32,6 +32,7 @@ static void realview_init(ram_addr_t ram_size, | @@ -32,6 +32,7 @@ static void realview_init(ram_addr_t ram_size, | ||
| 32 | CPUState *env; | 32 | CPUState *env; |
| 33 | ram_addr_t ram_offset; | 33 | ram_addr_t ram_offset; |
| 34 | qemu_irq *pic; | 34 | qemu_irq *pic; |
| 35 | + DeviceState *dev; | ||
| 35 | PCIBus *pci_bus; | 36 | PCIBus *pci_bus; |
| 36 | NICInfo *nd; | 37 | NICInfo *nd; |
| 37 | int n; | 38 | int n; |
| @@ -100,7 +101,9 @@ static void realview_init(ram_addr_t ram_size, | @@ -100,7 +101,9 @@ static void realview_init(ram_addr_t ram_size, | ||
| 100 | 101 | ||
| 101 | sysbus_create_simple("pl031", 0x10017000, pic[10]); | 102 | sysbus_create_simple("pl031", 0x10017000, pic[10]); |
| 102 | 103 | ||
| 103 | - pci_bus = pci_vpb_init(pic + 48, 1); | 104 | + dev = sysbus_create_varargs("realview_pci", 0x60000000, |
| 105 | + pic[48], pic[49], pic[50], pic[51], NULL); | ||
| 106 | + pci_bus = qdev_get_child_bus(dev, "pci"); | ||
| 104 | if (usb_enabled) { | 107 | if (usb_enabled) { |
| 105 | usb_ohci_init_pci(pci_bus, 3, -1); | 108 | usb_ohci_init_pci(pci_bus, 3, -1); |
| 106 | } | 109 | } |
hw/versatile_pci.c
| 1 | /* | 1 | /* |
| 2 | * ARM Versatile/PB PCI host controller | 2 | * ARM Versatile/PB PCI host controller |
| 3 | * | 3 | * |
| 4 | - * Copyright (c) 2006 CodeSourcery. | 4 | + * Copyright (c) 2006-2009 CodeSourcery. |
| 5 | * Written by Paul Brook | 5 | * Written by Paul Brook |
| 6 | * | 6 | * |
| 7 | * This code is licenced under the LGPL. | 7 | * This code is licenced under the LGPL. |
| 8 | */ | 8 | */ |
| 9 | 9 | ||
| 10 | -#include "hw.h" | 10 | +#include "sysbus.h" |
| 11 | #include "pci.h" | 11 | #include "pci.h" |
| 12 | -#include "primecell.h" | 12 | + |
| 13 | +typedef struct { | ||
| 14 | + SysBusDevice busdev; | ||
| 15 | + qemu_irq irq[4]; | ||
| 16 | + int realview; | ||
| 17 | + int mem_config; | ||
| 18 | +} PCIVPBState; | ||
| 13 | 19 | ||
| 14 | static inline uint32_t vpb_pci_config_addr(target_phys_addr_t addr) | 20 | static inline uint32_t vpb_pci_config_addr(target_phys_addr_t addr) |
| 15 | { | 21 | { |
| @@ -89,44 +95,51 @@ static void pci_vpb_set_irq(qemu_irq *pic, int irq_num, int level) | @@ -89,44 +95,51 @@ static void pci_vpb_set_irq(qemu_irq *pic, int irq_num, int level) | ||
| 89 | qemu_set_irq(pic[irq_num], level); | 95 | qemu_set_irq(pic[irq_num], level); |
| 90 | } | 96 | } |
| 91 | 97 | ||
| 92 | -PCIBus *pci_vpb_init(qemu_irq *pic, int realview) | 98 | +static void pci_vpb_map(SysBusDevice *dev, target_phys_addr_t base) |
| 93 | { | 99 | { |
| 94 | - PCIBus *s; | ||
| 95 | - PCIDevice *d; | ||
| 96 | - int mem_config; | ||
| 97 | - uint32_t base; | ||
| 98 | - const char * name; | ||
| 99 | - qemu_irq *irqs; | 100 | + PCIVPBState *s = (PCIVPBState *)dev; |
| 101 | + /* Selfconfig area. */ | ||
| 102 | + cpu_register_physical_memory(base + 0x01000000, 0x1000000, s->mem_config); | ||
| 103 | + /* Normal config area. */ | ||
| 104 | + cpu_register_physical_memory(base + 0x02000000, 0x1000000, s->mem_config); | ||
| 105 | + | ||
| 106 | + if (s->realview) { | ||
| 107 | + /* IO memory area. */ | ||
| 108 | + isa_mmio_init(base + 0x03000000, 0x00100000); | ||
| 109 | + } | ||
| 110 | +} | ||
| 111 | + | ||
| 112 | +static void pci_vpb_init(SysBusDevice *dev) | ||
| 113 | +{ | ||
| 114 | + PCIVPBState *s = FROM_SYSBUS(PCIVPBState, dev); | ||
| 115 | + PCIBus *bus; | ||
| 100 | int i; | 116 | int i; |
| 101 | 117 | ||
| 102 | - irqs = qemu_mallocz(sizeof(qemu_irq) * 4); | ||
| 103 | for (i = 0; i < 4; i++) { | 118 | for (i = 0; i < 4; i++) { |
| 104 | - irqs[i] = pic[i]; | ||
| 105 | - } | ||
| 106 | - if (realview) { | ||
| 107 | - base = 0x60000000; | ||
| 108 | - name = "RealView EB PCI Controller"; | ||
| 109 | - } else { | ||
| 110 | - base = 0x40000000; | ||
| 111 | - name = "Versatile/PB PCI Controller"; | 119 | + sysbus_init_irq(dev, &s->irq[i]); |
| 112 | } | 120 | } |
| 113 | - s = pci_register_bus(pci_vpb_set_irq, pci_vpb_map_irq, irqs, 11 << 3, 4); | 121 | + bus = pci_register_bus(pci_vpb_set_irq, pci_vpb_map_irq, s->irq, |
| 122 | + 11 << 3, 4); | ||
| 123 | + qdev_attach_child_bus(&dev->qdev, "pci", bus); | ||
| 124 | + | ||
| 114 | /* ??? Register memory space. */ | 125 | /* ??? Register memory space. */ |
| 115 | 126 | ||
| 116 | - mem_config = cpu_register_io_memory(0, pci_vpb_config_read, | ||
| 117 | - pci_vpb_config_write, s); | ||
| 118 | - /* Selfconfig area. */ | ||
| 119 | - cpu_register_physical_memory(base + 0x01000000, 0x1000000, mem_config); | ||
| 120 | - /* Normal config area. */ | ||
| 121 | - cpu_register_physical_memory(base + 0x02000000, 0x1000000, mem_config); | 127 | + s->mem_config = cpu_register_io_memory(0, pci_vpb_config_read, |
| 128 | + pci_vpb_config_write, bus); | ||
| 129 | + sysbus_init_mmio_cb(dev, 0x04000000, pci_vpb_map); | ||
| 122 | 130 | ||
| 123 | - d = pci_register_device(s, name, sizeof(PCIDevice), -1, NULL, NULL); | 131 | + pci_create_simple(bus, -1, "versatile_pci_host"); |
| 132 | +} | ||
| 124 | 133 | ||
| 125 | - if (realview) { | ||
| 126 | - /* IO memory area. */ | ||
| 127 | - isa_mmio_init(base + 0x03000000, 0x00100000); | ||
| 128 | - } | 134 | +static void pci_realview_init(SysBusDevice *dev) |
| 135 | +{ | ||
| 136 | + PCIVPBState *s = FROM_SYSBUS(PCIVPBState, dev); | ||
| 137 | + s->realview = 1; | ||
| 138 | + pci_vpb_init(dev); | ||
| 139 | +} | ||
| 129 | 140 | ||
| 141 | +static void versatile_pci_host_init(PCIDevice *d) | ||
| 142 | +{ | ||
| 130 | pci_config_set_vendor_id(d->config, PCI_VENDOR_ID_XILINX); | 143 | pci_config_set_vendor_id(d->config, PCI_VENDOR_ID_XILINX); |
| 131 | /* Both boards have the same device ID. Oh well. */ | 144 | /* Both boards have the same device ID. Oh well. */ |
| 132 | pci_config_set_device_id(d->config, PCI_DEVICE_ID_XILINX_XC2VP30); | 145 | pci_config_set_device_id(d->config, PCI_DEVICE_ID_XILINX_XC2VP30); |
| @@ -138,6 +151,15 @@ PCIBus *pci_vpb_init(qemu_irq *pic, int realview) | @@ -138,6 +151,15 @@ PCIBus *pci_vpb_init(qemu_irq *pic, int realview) | ||
| 138 | d->config[0x09] = 0x00; // programming i/f | 151 | d->config[0x09] = 0x00; // programming i/f |
| 139 | pci_config_set_class(d->config, PCI_CLASS_PROCESSOR_CO); | 152 | pci_config_set_class(d->config, PCI_CLASS_PROCESSOR_CO); |
| 140 | d->config[0x0D] = 0x10; // latency_timer | 153 | d->config[0x0D] = 0x10; // latency_timer |
| 154 | +} | ||
| 141 | 155 | ||
| 142 | - return s; | 156 | +static void versatile_pci_register_devices(void) |
| 157 | +{ | ||
| 158 | + sysbus_register_dev("versatile_pci", sizeof(PCIVPBState), pci_vpb_init); | ||
| 159 | + sysbus_register_dev("realview_pci", sizeof(PCIVPBState), | ||
| 160 | + pci_realview_init); | ||
| 161 | + pci_qdev_register("versatile_pci_host", sizeof(PCIDevice), | ||
| 162 | + versatile_pci_host_init); | ||
| 143 | } | 163 | } |
| 164 | + | ||
| 165 | +device_init(versatile_pci_register_devices) |
hw/versatilepb.c
| @@ -199,7 +199,10 @@ static void versatile_init(ram_addr_t ram_size, | @@ -199,7 +199,10 @@ static void versatile_init(ram_addr_t ram_size, | ||
| 199 | sysbus_create_simple("pl050_keyboard", 0x10006000, sic[3]); | 199 | sysbus_create_simple("pl050_keyboard", 0x10006000, sic[3]); |
| 200 | sysbus_create_simple("pl050_mouse", 0x10007000, sic[4]); | 200 | sysbus_create_simple("pl050_mouse", 0x10007000, sic[4]); |
| 201 | 201 | ||
| 202 | - pci_bus = pci_vpb_init(sic + 27, 0); | 202 | + dev = sysbus_create_varargs("versatile_pci", 0x40000000, |
| 203 | + sic[27], sic[28], sic[29], sic[30], NULL); | ||
| 204 | + pci_bus = qdev_get_child_bus(dev, "pci"); | ||
| 205 | + | ||
| 203 | /* The Versatile PCI bridge does not provide access to PCI IO space, | 206 | /* The Versatile PCI bridge does not provide access to PCI IO space, |
| 204 | so many of the qemu PCI devices are not useable. */ | 207 | so many of the qemu PCI devices are not useable. */ |
| 205 | for(n = 0; n < nb_nics; n++) { | 208 | for(n = 0; n < nb_nics; n++) { |