268
268
typedef struct icp_pic_state
270
arm_pic_handler handler;
273
272
uint32_t irq_enabled;
274
273
uint32_t fiq_enabled;
280
278
static void icp_pic_update(icp_pic_state *s)
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);
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);
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);
294
288
static void icp_pic_set_irq(void *opaque, int irq, int level)
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)
386
380
icp_pic_state *s;
389
384
s = (icp_pic_state *)qemu_mallocz(sizeof(icp_pic_state));
392
s->handler = icp_pic_set_irq;
387
qi = qemu_allocate_irqs(icp_pic_set_irq, s, 32);
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
cpu_register_physical_memory(base, 0x007fffff, iomemtype);
393
cpu_register_physical_memory(base, 0x00800000, iomemtype);
400
394
/* ??? Save/restore. */
404
398
/* CP control registers. */
471
465
static void integratorcp_init(int ram_size, int vga_ram_size, int boot_device,
472
466
DisplayState *ds, const char **fd_filename, int snapshot,
473
467
const char *kernel_filename, const char *kernel_cmdline,
474
const char *initrd_filename, uint32_t cpuid)
468
const char *initrd_filename, const char *cpu_model)
477
471
uint32_t bios_offset;
481
475
env = cpu_init();
482
cpu_arm_set_model(env, cpuid);
477
cpu_model = "arm926";
478
cpu_arm_set_model(env, cpu_model);
483
479
bios_offset = ram_size + vga_ram_size;
484
480
/* ??? On a real system the first 1Mb is mapped as SSRAM or boot flash. */
485
481
/* ??? RAM shoud repeat to fill physical memory space. */
491
487
integratorcm_init(ram_size >> 20, bios_offset);
492
488
cpu_pic = arm_pic_init_cpu(env);
493
pic = icp_pic_init(0x14000000, cpu_pic, ARM_PIC_CPU_IRQ, ARM_PIC_CPU_FIQ);
494
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);
495
492
icp_pit_init(0x13000000, pic, 5);
496
pl011_init(0x16000000, pic, 1, serial_hds[0]);
497
pl011_init(0x17000000, pic, 2, serial_hds[1]);
493
pl031_init(0x15000000, pic[8]);
494
pl011_init(0x16000000, pic[1], serial_hds[0]);
495
pl011_init(0x17000000, pic[2], serial_hds[1]);
498
496
icp_control_init(0xcb000000);
499
pl050_init(0x18000000, pic, 3, 0);
500
pl050_init(0x19000000, pic, 4, 1);
497
pl050_init(0x18000000, pic[3], 0);
498
pl050_init(0x19000000, pic[4], 1);
499
pl181_init(0x1c000000, sd_bdrv, pic[23], pic[24]);
501
500
if (nd_table[0].vlan) {
502
501
if (nd_table[0].model == NULL
503
502
|| strcmp(nd_table[0].model, "smc91c111") == 0) {
504
smc91c111_init(&nd_table[0], 0xc8000000, pic, 27);
503
smc91c111_init(&nd_table[0], 0xc8000000, pic[27]);
504
} else if (strcmp(nd_table[0].model, "?") == 0) {
505
fprintf(stderr, "qemu: Supported NICs: smc91c111\n");
506
508
fprintf(stderr, "qemu: Unsupported NIC: %s\n", nd_table[0].model);
510
pl110_init(ds, 0xc0000000, pic, 22, 0);
512
pl110_init(ds, 0xc0000000, pic[22], 0);
512
514
arm_load_kernel(env, ram_size, kernel_filename, kernel_cmdline,
513
initrd_filename, 0x113);
516
static void integratorcp926_init(int ram_size, int vga_ram_size,
517
int boot_device, DisplayState *ds, const char **fd_filename, int snapshot,
518
const char *kernel_filename, const char *kernel_cmdline,
519
const char *initrd_filename)
521
integratorcp_init(ram_size, vga_ram_size, boot_device, ds, fd_filename,
522
snapshot, kernel_filename, kernel_cmdline,
523
initrd_filename, ARM_CPUID_ARM926);
526
static void integratorcp1026_init(int ram_size, int vga_ram_size,
527
int boot_device, DisplayState *ds, const char **fd_filename, int snapshot,
528
const char *kernel_filename, const char *kernel_cmdline,
529
const char *initrd_filename)
531
integratorcp_init(ram_size, vga_ram_size, boot_device, ds, fd_filename,
532
snapshot, kernel_filename, kernel_cmdline,
533
initrd_filename, ARM_CPUID_ARM1026);
536
QEMUMachine integratorcp926_machine = {
515
initrd_filename, 0x113, 0x0);
518
QEMUMachine integratorcp_machine = {
538
520
"ARM Integrator/CP (ARM926EJ-S)",
539
integratorcp926_init,
542
QEMUMachine integratorcp1026_machine = {
544
"ARM Integrator/CP (ARM1026EJ-S)",
545
integratorcp1026_init,