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