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++) { | ... | ... |