Commit 97aff481656b984559a3b6602e6be69ebbe746a4

Authored by Paul Brook
1 parent cfb9de9c

PL190 qdev conversion

Signed-off-by: Paul Brook <paul@codesourcery.com>
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++) {
... ...