Commit a7086888fc9d08d725eb5c8cc862c3434f7503e2
1 parent
aa9311d8
Integrator/CP core qdev conversion
Signed-off-by: Paul Brook <paul@codesourcery.com>
Showing
1 changed file
with
37 additions
and
20 deletions
hw/integratorcp.c
... | ... | @@ -16,6 +16,7 @@ |
16 | 16 | #include "net.h" |
17 | 17 | |
18 | 18 | typedef struct { |
19 | + SysBusDevice busdev; | |
19 | 20 | uint32_t flash_offset; |
20 | 21 | uint32_t cm_osc; |
21 | 22 | uint32_t cm_ctrl; |
... | ... | @@ -225,12 +226,13 @@ static CPUWriteMemoryFunc *integratorcm_writefn[] = { |
225 | 226 | integratorcm_write |
226 | 227 | }; |
227 | 228 | |
228 | -static void integratorcm_init(int memsz) | |
229 | +static void integratorcm_init(SysBusDevice *dev) | |
229 | 230 | { |
230 | 231 | int iomemtype; |
231 | - integratorcm_state *s; | |
232 | + integratorcm_state *s = FROM_SYSBUS(integratorcm_state, dev); | |
233 | + int memsz; | |
232 | 234 | |
233 | - s = (integratorcm_state *)qemu_mallocz(sizeof(integratorcm_state)); | |
235 | + memsz = qdev_get_prop_int(&dev->qdev, "memsz", 0); | |
234 | 236 | s->cm_osc = 0x01000048; |
235 | 237 | /* ??? What should the high bits of this value be? */ |
236 | 238 | s->cm_auxosc = 0x0007feff; |
... | ... | @@ -256,7 +258,7 @@ static void integratorcm_init(int memsz) |
256 | 258 | |
257 | 259 | iomemtype = cpu_register_io_memory(0, integratorcm_readfn, |
258 | 260 | integratorcm_writefn, s); |
259 | - cpu_register_physical_memory(0x10000000, 0x00800000, iomemtype); | |
261 | + sysbus_init_mmio(dev, 0x00800000, iomemtype); | |
260 | 262 | integratorcm_do_remap(s, 1); |
261 | 263 | /* ??? Save/restore. */ |
262 | 264 | } |
... | ... | @@ -266,6 +268,7 @@ static void integratorcm_init(int memsz) |
266 | 268 | |
267 | 269 | typedef struct icp_pic_state |
268 | 270 | { |
271 | + SysBusDevice busdev; | |
269 | 272 | uint32_t level; |
270 | 273 | uint32_t irq_enabled; |
271 | 274 | uint32_t fiq_enabled; |
... | ... | @@ -370,22 +373,17 @@ static CPUWriteMemoryFunc *icp_pic_writefn[] = { |
370 | 373 | icp_pic_write |
371 | 374 | }; |
372 | 375 | |
373 | -static qemu_irq *icp_pic_init(uint32_t base, | |
374 | - qemu_irq parent_irq, qemu_irq parent_fiq) | |
376 | +static void icp_pic_init(SysBusDevice *dev) | |
375 | 377 | { |
376 | - icp_pic_state *s; | |
378 | + icp_pic_state *s = FROM_SYSBUS(icp_pic_state, dev); | |
377 | 379 | int iomemtype; |
378 | - qemu_irq *qi; | |
379 | 380 | |
380 | - s = (icp_pic_state *)qemu_mallocz(sizeof(icp_pic_state)); | |
381 | - qi = qemu_allocate_irqs(icp_pic_set_irq, s, 32); | |
382 | - s->parent_irq = parent_irq; | |
383 | - s->parent_fiq = parent_fiq; | |
381 | + qdev_init_irq_sink(&dev->qdev, icp_pic_set_irq, 32); | |
382 | + sysbus_init_irq(dev, &s->parent_irq); | |
383 | + sysbus_init_irq(dev, &s->parent_fiq); | |
384 | 384 | iomemtype = cpu_register_io_memory(0, icp_pic_readfn, |
385 | 385 | icp_pic_writefn, s); |
386 | - cpu_register_physical_memory(base, 0x00800000, iomemtype); | |
387 | - /* ??? Save/restore. */ | |
388 | - return qi; | |
386 | + sysbus_init_mmio(dev, 0x00800000, iomemtype); | |
389 | 387 | } |
390 | 388 | |
391 | 389 | /* CP control registers. */ |
... | ... | @@ -456,8 +454,10 @@ static void integratorcp_init(ram_addr_t ram_size, |
456 | 454 | { |
457 | 455 | CPUState *env; |
458 | 456 | ram_addr_t ram_offset; |
459 | - qemu_irq *pic; | |
457 | + qemu_irq pic[32]; | |
460 | 458 | qemu_irq *cpu_pic; |
459 | + DeviceState *dev; | |
460 | + int i; | |
461 | 461 | |
462 | 462 | if (!cpu_model) |
463 | 463 | cpu_model = "arm926"; |
... | ... | @@ -474,11 +474,19 @@ static void integratorcp_init(ram_addr_t ram_size, |
474 | 474 | /* And again at address 0x80000000 */ |
475 | 475 | cpu_register_physical_memory(0x80000000, ram_size, ram_offset | IO_MEM_RAM); |
476 | 476 | |
477 | - integratorcm_init(ram_size >> 20); | |
477 | + dev = qdev_create(NULL, "integrator_core"); | |
478 | + qdev_set_prop_int(dev, "memsz", ram_size >> 20); | |
479 | + qdev_init(dev); | |
480 | + sysbus_mmio_map((SysBusDevice *)dev, 0, 0x10000000); | |
481 | + | |
478 | 482 | cpu_pic = arm_pic_init_cpu(env); |
479 | - pic = icp_pic_init(0x14000000, cpu_pic[ARM_PIC_CPU_IRQ], | |
480 | - cpu_pic[ARM_PIC_CPU_FIQ]); | |
481 | - icp_pic_init(0xca000000, pic[26], NULL); | |
483 | + dev = sysbus_create_varargs("integrator_pic", 0x14000000, | |
484 | + cpu_pic[ARM_PIC_CPU_IRQ], | |
485 | + cpu_pic[ARM_PIC_CPU_FIQ], NULL); | |
486 | + for (i = 0; i < 32; i++) { | |
487 | + pic[i] = qdev_get_irq_sink(dev, i); | |
488 | + } | |
489 | + dev = sysbus_create_simple("integrator_pic", 0xca000000, pic[26]); | |
482 | 490 | icp_pit_init(0x13000000, pic, 5); |
483 | 491 | sysbus_create_simple("pl031", 0x15000000, pic[8]); |
484 | 492 | sysbus_create_simple("pl011", 0x16000000, pic[1]); |
... | ... | @@ -504,3 +512,12 @@ QEMUMachine integratorcp_machine = { |
504 | 512 | .desc = "ARM Integrator/CP (ARM926EJ-S)", |
505 | 513 | .init = integratorcp_init, |
506 | 514 | }; |
515 | + | |
516 | +static void integratorcp_register_devices(void) | |
517 | +{ | |
518 | + sysbus_register_dev("integrator_pic", sizeof(icp_pic_state), icp_pic_init); | |
519 | + sysbus_register_dev("integrator_core", sizeof(integratorcm_state), | |
520 | + integratorcm_init); | |
521 | +} | |
522 | + | |
523 | +device_init(integratorcp_register_devices) | ... | ... |