Revision d537cf6c hw/integratorcp.c
b/hw/integratorcp.c | ||
---|---|---|
267 | 267 |
|
268 | 268 |
typedef struct icp_pic_state |
269 | 269 |
{ |
270 |
arm_pic_handler handler; |
|
271 | 270 |
uint32_t base; |
272 | 271 |
uint32_t level; |
273 | 272 |
uint32_t irq_enabled; |
274 | 273 |
uint32_t fiq_enabled; |
275 |
void *parent; |
|
276 |
int parent_irq; |
|
277 |
int parent_fiq; |
|
274 |
qemu_irq parent_irq; |
|
275 |
qemu_irq parent_fiq; |
|
278 | 276 |
} icp_pic_state; |
279 | 277 |
|
280 | 278 |
static void icp_pic_update(icp_pic_state *s) |
281 | 279 |
{ |
282 | 280 |
uint32_t flags; |
283 | 281 |
|
284 |
if (s->parent_irq != -1) { |
|
285 |
flags = (s->level & s->irq_enabled); |
|
286 |
pic_set_irq_new(s->parent, s->parent_irq, flags != 0); |
|
287 |
} |
|
288 |
if (s->parent_fiq != -1) { |
|
289 |
flags = (s->level & s->fiq_enabled); |
|
290 |
pic_set_irq_new(s->parent, s->parent_fiq, flags != 0); |
|
291 |
} |
|
282 |
flags = (s->level & s->irq_enabled); |
|
283 |
qemu_set_irq(s->parent_irq, flags != 0); |
|
284 |
flags = (s->level & s->fiq_enabled); |
|
285 |
qemu_set_irq(s->parent_fiq, flags != 0); |
|
292 | 286 |
} |
293 | 287 |
|
294 | 288 |
static void icp_pic_set_irq(void *opaque, int irq, int level) |
... | ... | |
345 | 339 |
break; |
346 | 340 |
case 4: /* INT_SOFTSET */ |
347 | 341 |
if (value & 1) |
348 |
pic_set_irq_new(s, 0, 1);
|
|
342 |
icp_pic_set_irq(s, 0, 1);
|
|
349 | 343 |
break; |
350 | 344 |
case 5: /* INT_SOFTCLR */ |
351 | 345 |
if (value & 1) |
352 |
pic_set_irq_new(s, 0, 0);
|
|
346 |
icp_pic_set_irq(s, 0, 0);
|
|
353 | 347 |
break; |
354 | 348 |
case 10: /* FRQ_ENABLESET */ |
355 | 349 |
s->fiq_enabled |= value; |
... | ... | |
380 | 374 |
icp_pic_write |
381 | 375 |
}; |
382 | 376 |
|
383 |
static icp_pic_state *icp_pic_init(uint32_t base, void *parent,
|
|
384 |
int parent_irq, int parent_fiq)
|
|
377 |
static qemu_irq *icp_pic_init(uint32_t base,
|
|
378 |
qemu_irq parent_irq, qemu_irq parent_fiq)
|
|
385 | 379 |
{ |
386 | 380 |
icp_pic_state *s; |
387 | 381 |
int iomemtype; |
382 |
qemu_irq *qi; |
|
388 | 383 |
|
389 | 384 |
s = (icp_pic_state *)qemu_mallocz(sizeof(icp_pic_state)); |
390 | 385 |
if (!s) |
391 | 386 |
return NULL; |
392 |
s->handler = icp_pic_set_irq;
|
|
387 |
qi = qemu_allocate_irqs(icp_pic_set_irq, s, 32);
|
|
393 | 388 |
s->base = base; |
394 |
s->parent = parent; |
|
395 | 389 |
s->parent_irq = parent_irq; |
396 | 390 |
s->parent_fiq = parent_fiq; |
397 | 391 |
iomemtype = cpu_register_io_memory(0, icp_pic_readfn, |
398 | 392 |
icp_pic_writefn, s); |
399 | 393 |
cpu_register_physical_memory(base, 0x007fffff, iomemtype); |
400 | 394 |
/* ??? Save/restore. */ |
401 |
return s;
|
|
395 |
return qi;
|
|
402 | 396 |
} |
403 | 397 |
|
404 | 398 |
/* CP control registers. */ |
... | ... | |
475 | 469 |
{ |
476 | 470 |
CPUState *env; |
477 | 471 |
uint32_t bios_offset; |
478 |
icp_pic_state *pic;
|
|
479 |
void *cpu_pic;
|
|
472 |
qemu_irq *pic;
|
|
473 |
qemu_irq *cpu_pic;
|
|
480 | 474 |
|
481 | 475 |
env = cpu_init(); |
482 | 476 |
if (!cpu_model) |
... | ... | |
492 | 486 |
|
493 | 487 |
integratorcm_init(ram_size >> 20, bios_offset); |
494 | 488 |
cpu_pic = arm_pic_init_cpu(env); |
495 |
pic = icp_pic_init(0x14000000, cpu_pic, ARM_PIC_CPU_IRQ, ARM_PIC_CPU_FIQ); |
|
496 |
icp_pic_init(0xca000000, pic, 26, -1); |
|
489 |
pic = icp_pic_init(0x14000000, cpu_pic[ARM_PIC_CPU_IRQ], |
|
490 |
cpu_pic[ARM_PIC_CPU_FIQ]); |
|
491 |
icp_pic_init(0xca000000, pic[26], NULL); |
|
497 | 492 |
icp_pit_init(0x13000000, pic, 5); |
498 |
pl011_init(0x16000000, pic, 1, serial_hds[0]);
|
|
499 |
pl011_init(0x17000000, pic, 2, serial_hds[1]);
|
|
493 |
pl011_init(0x16000000, pic[1], serial_hds[0]);
|
|
494 |
pl011_init(0x17000000, pic[2], serial_hds[1]);
|
|
500 | 495 |
icp_control_init(0xcb000000); |
501 |
pl050_init(0x18000000, pic, 3, 0);
|
|
502 |
pl050_init(0x19000000, pic, 4, 1);
|
|
503 |
pl181_init(0x1c000000, sd_bdrv, pic, 23, 24);
|
|
496 |
pl050_init(0x18000000, pic[3], 0);
|
|
497 |
pl050_init(0x19000000, pic[4], 1);
|
|
498 |
pl181_init(0x1c000000, sd_bdrv, pic[23], pic[24]);
|
|
504 | 499 |
if (nd_table[0].vlan) { |
505 | 500 |
if (nd_table[0].model == NULL |
506 | 501 |
|| strcmp(nd_table[0].model, "smc91c111") == 0) { |
507 |
smc91c111_init(&nd_table[0], 0xc8000000, pic, 27);
|
|
502 |
smc91c111_init(&nd_table[0], 0xc8000000, pic[27]);
|
|
508 | 503 |
} else { |
509 | 504 |
fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model); |
510 | 505 |
exit (1); |
511 | 506 |
} |
512 | 507 |
} |
513 |
pl110_init(ds, 0xc0000000, pic, 22, 0);
|
|
508 |
pl110_init(ds, 0xc0000000, pic[22], 0);
|
|
514 | 509 |
|
515 | 510 |
arm_load_kernel(env, ram_size, kernel_filename, kernel_cmdline, |
516 | 511 |
initrd_filename, 0x113); |
Also available in: Unified diff