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,8 +7,7 @@ | ||
| 7 | * This code is licenced under the GPL. | 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 | /* The number of virtual priority levels. 16 user vectors plus the | 12 | /* The number of virtual priority levels. 16 user vectors plus the |
| 14 | unvectored IRQ. Chained interrupts would require an additional level | 13 | unvectored IRQ. Chained interrupts would require an additional level |
| @@ -17,6 +16,7 @@ | @@ -17,6 +16,7 @@ | ||
| 17 | #define PL190_NUM_PRIO 17 | 16 | #define PL190_NUM_PRIO 17 |
| 18 | 17 | ||
| 19 | typedef struct { | 18 | typedef struct { |
| 19 | + SysBusDevice busdev; | ||
| 20 | uint32_t level; | 20 | uint32_t level; |
| 21 | uint32_t soft_level; | 21 | uint32_t soft_level; |
| 22 | uint32_t irq_enable; | 22 | uint32_t irq_enable; |
| @@ -227,20 +227,24 @@ static void pl190_reset(pl190_state *s) | @@ -227,20 +227,24 @@ static void pl190_reset(pl190_state *s) | ||
| 227 | pl190_update_vectors(s); | 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 | int iomemtype; | 233 | int iomemtype; |
| 235 | 234 | ||
| 236 | - s = (pl190_state *)qemu_mallocz(sizeof(pl190_state)); | ||
| 237 | iomemtype = cpu_register_io_memory(0, pl190_readfn, | 235 | iomemtype = cpu_register_io_memory(0, pl190_readfn, |
| 238 | pl190_writefn, s); | 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 | pl190_reset(s); | 241 | pl190_reset(s); |
| 244 | /* ??? Save/restore. */ | 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,9 +17,6 @@ qemu_irq *pl061_init(uint32_t base, qemu_irq irq, qemu_irq **out); | ||
| 17 | /* pl080.c */ | 17 | /* pl080.c */ |
| 18 | void *pl080_init(uint32_t base, qemu_irq irq, int nchannels); | 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 | /* realview_gic.c */ | 20 | /* realview_gic.c */ |
| 24 | qemu_irq *realview_gic_init(uint32_t base, qemu_irq parent_irq); | 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,6 +27,6 @@ extern qemu_irq *mpcore_irq_init(qemu_irq *cpu_irq); | ||
| 30 | void arm_sysctl_init(uint32_t base, uint32_t sys_id); | 27 | void arm_sysctl_init(uint32_t base, uint32_t sys_id); |
| 31 | 28 | ||
| 32 | /* versatile_pci.c */ | 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 | #endif | 32 | #endif |
hw/realview.c
| @@ -100,7 +100,7 @@ static void realview_init(ram_addr_t ram_size, | @@ -100,7 +100,7 @@ static void realview_init(ram_addr_t ram_size, | ||
| 100 | 100 | ||
| 101 | sysbus_create_simple("pl031", 0x10017000, pic[10]); | 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 | if (usb_enabled) { | 104 | if (usb_enabled) { |
| 105 | usb_ohci_init_pci(pci_bus, 3, -1); | 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,8 +79,6 @@ static CPUReadMemoryFunc *pci_vpb_config_read[] = { | ||
| 79 | &pci_vpb_config_readl, | 79 | &pci_vpb_config_readl, |
| 80 | }; | 80 | }; |
| 81 | 81 | ||
| 82 | -static int pci_vpb_irq; | ||
| 83 | - | ||
| 84 | static int pci_vpb_map_irq(PCIDevice *d, int irq_num) | 82 | static int pci_vpb_map_irq(PCIDevice *d, int irq_num) |
| 85 | { | 83 | { |
| 86 | return irq_num; | 84 | return irq_num; |
| @@ -88,18 +86,23 @@ static int pci_vpb_map_irq(PCIDevice *d, int irq_num) | @@ -88,18 +86,23 @@ static int pci_vpb_map_irq(PCIDevice *d, int irq_num) | ||
| 88 | 86 | ||
| 89 | static void pci_vpb_set_irq(qemu_irq *pic, int irq_num, int level) | 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 | PCIBus *s; | 94 | PCIBus *s; |
| 97 | PCIDevice *d; | 95 | PCIDevice *d; |
| 98 | int mem_config; | 96 | int mem_config; |
| 99 | uint32_t base; | 97 | uint32_t base; |
| 100 | const char * name; | 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 | if (realview) { | 106 | if (realview) { |
| 104 | base = 0x60000000; | 107 | base = 0x60000000; |
| 105 | name = "RealView EB PCI Controller"; | 108 | name = "RealView EB PCI Controller"; |
| @@ -107,7 +110,7 @@ PCIBus *pci_vpb_init(qemu_irq *pic, int irq, int realview) | @@ -107,7 +110,7 @@ PCIBus *pci_vpb_init(qemu_irq *pic, int irq, int realview) | ||
| 107 | base = 0x40000000; | 110 | base = 0x40000000; |
| 108 | name = "Versatile/PB PCI Controller"; | 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 | /* ??? Register memory space. */ | 114 | /* ??? Register memory space. */ |
| 112 | 115 | ||
| 113 | mem_config = cpu_register_io_memory(0, pci_vpb_config_read, | 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,7 +23,7 @@ typedef struct vpb_sic_state | ||
| 23 | uint32_t level; | 23 | uint32_t level; |
| 24 | uint32_t mask; | 24 | uint32_t mask; |
| 25 | uint32_t pic_enable; | 25 | uint32_t pic_enable; |
| 26 | - qemu_irq *parent; | 26 | + qemu_irq parent[32]; |
| 27 | int irq; | 27 | int irq; |
| 28 | } vpb_sic_state; | 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,10 +133,13 @@ static qemu_irq *vpb_sic_init(uint32_t base, qemu_irq *parent, int irq) | ||
| 133 | vpb_sic_state *s; | 133 | vpb_sic_state *s; |
| 134 | qemu_irq *qi; | 134 | qemu_irq *qi; |
| 135 | int iomemtype; | 135 | int iomemtype; |
| 136 | + int i; | ||
| 136 | 137 | ||
| 137 | s = (vpb_sic_state *)qemu_mallocz(sizeof(vpb_sic_state)); | 138 | s = (vpb_sic_state *)qemu_mallocz(sizeof(vpb_sic_state)); |
| 138 | qi = qemu_allocate_irqs(vpb_sic_set_irq, s, 32); | 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 | s->irq = irq; | 143 | s->irq = irq; |
| 141 | iomemtype = cpu_register_io_memory(0, vpb_sic_readfn, | 144 | iomemtype = cpu_register_io_memory(0, vpb_sic_readfn, |
| 142 | vpb_sic_writefn, s); | 145 | vpb_sic_writefn, s); |
| @@ -161,8 +164,10 @@ static void versatile_init(ram_addr_t ram_size, | @@ -161,8 +164,10 @@ static void versatile_init(ram_addr_t ram_size, | ||
| 161 | { | 164 | { |
| 162 | CPUState *env; | 165 | CPUState *env; |
| 163 | ram_addr_t ram_offset; | 166 | ram_addr_t ram_offset; |
| 164 | - qemu_irq *pic; | 167 | + qemu_irq *cpu_pic; |
| 168 | + qemu_irq pic[32]; | ||
| 165 | qemu_irq *sic; | 169 | qemu_irq *sic; |
| 170 | + DeviceState *dev; | ||
| 166 | PCIBus *pci_bus; | 171 | PCIBus *pci_bus; |
| 167 | NICInfo *nd; | 172 | NICInfo *nd; |
| 168 | int n; | 173 | int n; |
| @@ -181,14 +186,18 @@ static void versatile_init(ram_addr_t ram_size, | @@ -181,14 +186,18 @@ static void versatile_init(ram_addr_t ram_size, | ||
| 181 | cpu_register_physical_memory(0, ram_size, ram_offset | IO_MEM_RAM); | 186 | cpu_register_physical_memory(0, ram_size, ram_offset | IO_MEM_RAM); |
| 182 | 187 | ||
| 183 | arm_sysctl_init(0x10000000, 0x41007004); | 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 | sic = vpb_sic_init(0x10003000, pic, 31); | 195 | sic = vpb_sic_init(0x10003000, pic, 31); |
| 187 | 196 | ||
| 188 | sysbus_create_simple("pl050_keyboard", 0x10006000, sic[3]); | 197 | sysbus_create_simple("pl050_keyboard", 0x10006000, sic[3]); |
| 189 | sysbus_create_simple("pl050_mouse", 0x10007000, sic[4]); | 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 | /* The Versatile PCI bridge does not provide access to PCI IO space, | 201 | /* The Versatile PCI bridge does not provide access to PCI IO space, |
| 193 | so many of the qemu PCI devices are not useable. */ | 202 | so many of the qemu PCI devices are not useable. */ |
| 194 | for(n = 0; n < nb_nics; n++) { | 203 | for(n = 0; n < nb_nics; n++) { |