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