Commit 97aff481656b984559a3b6602e6be69ebbe746a4
1 parent
cfb9de9c
PL190 qdev conversion
Signed-off-by: Paul Brook <paul@codesourcery.com>
Showing
5 changed files
with
41 additions
and
28 deletions
hw/pl190.c
| ... | ... | @@ -7,8 +7,7 @@ |
| 7 | 7 | * This code is licenced under the GPL. |
| 8 | 8 | */ |
| 9 | 9 | |
| 10 | -#include "hw.h" | |
| 11 | -#include "primecell.h" | |
| 10 | +#include "sysbus.h" | |
| 12 | 11 | |
| 13 | 12 | /* The number of virtual priority levels. 16 user vectors plus the |
| 14 | 13 | unvectored IRQ. Chained interrupts would require an additional level |
| ... | ... | @@ -17,6 +16,7 @@ |
| 17 | 16 | #define PL190_NUM_PRIO 17 |
| 18 | 17 | |
| 19 | 18 | typedef struct { |
| 19 | + SysBusDevice busdev; | |
| 20 | 20 | uint32_t level; |
| 21 | 21 | uint32_t soft_level; |
| 22 | 22 | uint32_t irq_enable; |
| ... | ... | @@ -227,20 +227,24 @@ static void pl190_reset(pl190_state *s) |
| 227 | 227 | pl190_update_vectors(s); |
| 228 | 228 | } |
| 229 | 229 | |
| 230 | -qemu_irq *pl190_init(uint32_t base, qemu_irq irq, qemu_irq fiq) | |
| 230 | +static void pl190_init(SysBusDevice *dev) | |
| 231 | 231 | { |
| 232 | - pl190_state *s; | |
| 233 | - qemu_irq *qi; | |
| 232 | + pl190_state *s = FROM_SYSBUS(pl190_state, dev); | |
| 234 | 233 | int iomemtype; |
| 235 | 234 | |
| 236 | - s = (pl190_state *)qemu_mallocz(sizeof(pl190_state)); | |
| 237 | 235 | iomemtype = cpu_register_io_memory(0, pl190_readfn, |
| 238 | 236 | pl190_writefn, s); |
| 239 | - cpu_register_physical_memory(base, 0x00001000, iomemtype); | |
| 240 | - qi = qemu_allocate_irqs(pl190_set_irq, s, 32); | |
| 241 | - s->irq = irq; | |
| 242 | - s->fiq = fiq; | |
| 237 | + sysbus_init_mmio(dev, 0x1000, iomemtype); | |
| 238 | + qdev_init_irq_sink(&dev->qdev, pl190_set_irq, 32); | |
| 239 | + sysbus_init_irq(dev, &s->irq); | |
| 240 | + sysbus_init_irq(dev, &s->fiq); | |
| 243 | 241 | pl190_reset(s); |
| 244 | 242 | /* ??? Save/restore. */ |
| 245 | - return qi; | |
| 246 | 243 | } |
| 244 | + | |
| 245 | +static void pl190_register_devices(void) | |
| 246 | +{ | |
| 247 | + sysbus_register_dev("pl190", sizeof(pl190_state), pl190_init); | |
| 248 | +} | |
| 249 | + | |
| 250 | +device_init(pl190_register_devices) | ... | ... |
hw/primecell.h
| ... | ... | @@ -17,9 +17,6 @@ qemu_irq *pl061_init(uint32_t base, qemu_irq irq, qemu_irq **out); |
| 17 | 17 | /* pl080.c */ |
| 18 | 18 | void *pl080_init(uint32_t base, qemu_irq irq, int nchannels); |
| 19 | 19 | |
| 20 | -/* pl190.c */ | |
| 21 | -qemu_irq *pl190_init(uint32_t base, qemu_irq irq, qemu_irq fiq); | |
| 22 | - | |
| 23 | 20 | /* realview_gic.c */ |
| 24 | 21 | qemu_irq *realview_gic_init(uint32_t base, qemu_irq parent_irq); |
| 25 | 22 | |
| ... | ... | @@ -30,6 +27,6 @@ extern qemu_irq *mpcore_irq_init(qemu_irq *cpu_irq); |
| 30 | 27 | void arm_sysctl_init(uint32_t base, uint32_t sys_id); |
| 31 | 28 | |
| 32 | 29 | /* versatile_pci.c */ |
| 33 | -PCIBus *pci_vpb_init(qemu_irq *pic, int irq, int realview); | |
| 30 | +PCIBus *pci_vpb_init(qemu_irq *pic, int realview); | |
| 34 | 31 | |
| 35 | 32 | #endif | ... | ... |
hw/realview.c
| ... | ... | @@ -100,7 +100,7 @@ static void realview_init(ram_addr_t ram_size, |
| 100 | 100 | |
| 101 | 101 | sysbus_create_simple("pl031", 0x10017000, pic[10]); |
| 102 | 102 | |
| 103 | - pci_bus = pci_vpb_init(pic, 48, 1); | |
| 103 | + pci_bus = pci_vpb_init(pic + 48, 1); | |
| 104 | 104 | if (usb_enabled) { |
| 105 | 105 | usb_ohci_init_pci(pci_bus, 3, -1); |
| 106 | 106 | } | ... | ... |
hw/versatile_pci.c
| ... | ... | @@ -79,8 +79,6 @@ static CPUReadMemoryFunc *pci_vpb_config_read[] = { |
| 79 | 79 | &pci_vpb_config_readl, |
| 80 | 80 | }; |
| 81 | 81 | |
| 82 | -static int pci_vpb_irq; | |
| 83 | - | |
| 84 | 82 | static int pci_vpb_map_irq(PCIDevice *d, int irq_num) |
| 85 | 83 | { |
| 86 | 84 | return irq_num; |
| ... | ... | @@ -88,18 +86,23 @@ static int pci_vpb_map_irq(PCIDevice *d, int irq_num) |
| 88 | 86 | |
| 89 | 87 | static void pci_vpb_set_irq(qemu_irq *pic, int irq_num, int level) |
| 90 | 88 | { |
| 91 | - qemu_set_irq(pic[pci_vpb_irq + irq_num], level); | |
| 89 | + qemu_set_irq(pic[irq_num], level); | |
| 92 | 90 | } |
| 93 | 91 | |
| 94 | -PCIBus *pci_vpb_init(qemu_irq *pic, int irq, int realview) | |
| 92 | +PCIBus *pci_vpb_init(qemu_irq *pic, int realview) | |
| 95 | 93 | { |
| 96 | 94 | PCIBus *s; |
| 97 | 95 | PCIDevice *d; |
| 98 | 96 | int mem_config; |
| 99 | 97 | uint32_t base; |
| 100 | 98 | const char * name; |
| 99 | + qemu_irq *irqs; | |
| 100 | + int i; | |
| 101 | 101 | |
| 102 | - pci_vpb_irq = irq; | |
| 102 | + irqs = qemu_mallocz(sizeof(qemu_irq) * 4); | |
| 103 | + for (i = 0; i < 4; i++) { | |
| 104 | + irqs[i] = pic[i]; | |
| 105 | + } | |
| 103 | 106 | if (realview) { |
| 104 | 107 | base = 0x60000000; |
| 105 | 108 | name = "RealView EB PCI Controller"; |
| ... | ... | @@ -107,7 +110,7 @@ PCIBus *pci_vpb_init(qemu_irq *pic, int irq, int realview) |
| 107 | 110 | base = 0x40000000; |
| 108 | 111 | name = "Versatile/PB PCI Controller"; |
| 109 | 112 | } |
| 110 | - s = pci_register_bus(pci_vpb_set_irq, pci_vpb_map_irq, pic, 11 << 3, 4); | |
| 113 | + s = pci_register_bus(pci_vpb_set_irq, pci_vpb_map_irq, irqs, 11 << 3, 4); | |
| 111 | 114 | /* ??? Register memory space. */ |
| 112 | 115 | |
| 113 | 116 | mem_config = cpu_register_io_memory(0, pci_vpb_config_read, | ... | ... |
hw/versatilepb.c
| ... | ... | @@ -23,7 +23,7 @@ typedef struct vpb_sic_state |
| 23 | 23 | uint32_t level; |
| 24 | 24 | uint32_t mask; |
| 25 | 25 | uint32_t pic_enable; |
| 26 | - qemu_irq *parent; | |
| 26 | + qemu_irq parent[32]; | |
| 27 | 27 | int irq; |
| 28 | 28 | } vpb_sic_state; |
| 29 | 29 | |
| ... | ... | @@ -133,10 +133,13 @@ static qemu_irq *vpb_sic_init(uint32_t base, qemu_irq *parent, int irq) |
| 133 | 133 | vpb_sic_state *s; |
| 134 | 134 | qemu_irq *qi; |
| 135 | 135 | int iomemtype; |
| 136 | + int i; | |
| 136 | 137 | |
| 137 | 138 | s = (vpb_sic_state *)qemu_mallocz(sizeof(vpb_sic_state)); |
| 138 | 139 | qi = qemu_allocate_irqs(vpb_sic_set_irq, s, 32); |
| 139 | - s->parent = parent; | |
| 140 | + for (i = 0; i < 32; i++) { | |
| 141 | + s->parent[i] = parent[i]; | |
| 142 | + } | |
| 140 | 143 | s->irq = irq; |
| 141 | 144 | iomemtype = cpu_register_io_memory(0, vpb_sic_readfn, |
| 142 | 145 | vpb_sic_writefn, s); |
| ... | ... | @@ -161,8 +164,10 @@ static void versatile_init(ram_addr_t ram_size, |
| 161 | 164 | { |
| 162 | 165 | CPUState *env; |
| 163 | 166 | ram_addr_t ram_offset; |
| 164 | - qemu_irq *pic; | |
| 167 | + qemu_irq *cpu_pic; | |
| 168 | + qemu_irq pic[32]; | |
| 165 | 169 | qemu_irq *sic; |
| 170 | + DeviceState *dev; | |
| 166 | 171 | PCIBus *pci_bus; |
| 167 | 172 | NICInfo *nd; |
| 168 | 173 | int n; |
| ... | ... | @@ -181,14 +186,18 @@ static void versatile_init(ram_addr_t ram_size, |
| 181 | 186 | cpu_register_physical_memory(0, ram_size, ram_offset | IO_MEM_RAM); |
| 182 | 187 | |
| 183 | 188 | arm_sysctl_init(0x10000000, 0x41007004); |
| 184 | - pic = arm_pic_init_cpu(env); | |
| 185 | - pic = pl190_init(0x10140000, pic[0], pic[1]); | |
| 189 | + cpu_pic = arm_pic_init_cpu(env); | |
| 190 | + dev = sysbus_create_varargs("pl190", 0x10140000, | |
| 191 | + cpu_pic[0], cpu_pic[1], NULL); | |
| 192 | + for (n = 0; n < 32; n++) { | |
| 193 | + pic[n] = qdev_get_irq_sink(dev, n); | |
| 194 | + } | |
| 186 | 195 | sic = vpb_sic_init(0x10003000, pic, 31); |
| 187 | 196 | |
| 188 | 197 | sysbus_create_simple("pl050_keyboard", 0x10006000, sic[3]); |
| 189 | 198 | sysbus_create_simple("pl050_mouse", 0x10007000, sic[4]); |
| 190 | 199 | |
| 191 | - pci_bus = pci_vpb_init(sic, 27, 0); | |
| 200 | + pci_bus = pci_vpb_init(sic + 27, 0); | |
| 192 | 201 | /* The Versatile PCI bridge does not provide access to PCI IO space, |
| 193 | 202 | so many of the qemu PCI devices are not useable. */ |
| 194 | 203 | for(n = 0; n < nb_nics; n++) { | ... | ... |