Revision 4b48bf05 hw/sun4m.c

b/hw/sun4m.c
36 36
#include "isa.h"
37 37
#include "fw_cfg.h"
38 38
#include "escc.h"
39
#include "qdev-addr.h"
39 40

  
40 41
//#define DEBUG_IRQ
41 42

  
......
364 365
    return kernel_size;
365 366
}
366 367

  
368
static void *iommu_init(target_phys_addr_t addr, uint32_t version, qemu_irq irq)
369
{
370
    DeviceState *dev;
371
    SysBusDevice *s;
372

  
373
    dev = qdev_create(NULL, "iommu");
374
    qdev_prop_set_uint32(dev, "version", version);
375
    qdev_init(dev);
376
    s = sysbus_from_qdev(dev);
377
    sysbus_connect_irq(s, 0, irq);
378
    sysbus_mmio_map(s, 0, addr);
379

  
380
    return s;
381
}
382

  
367 383
static void lance_init(NICInfo *nd, target_phys_addr_t leaddr,
368 384
                       void *dma_opaque, qemu_irq irq, qemu_irq *reset)
369 385
{
......
382 398
    *reset = qdev_get_gpio_in(dev, 0);
383 399
}
384 400

  
401
static DeviceState *slavio_intctl_init(target_phys_addr_t addr,
402
                                       target_phys_addr_t addrg,
403
                                       const uint32_t *intbit_to_level,
404
                                       qemu_irq **parent_irq,
405
                                       unsigned int cputimer)
406
{
407
    DeviceState *dev;
408
    SysBusDevice *s;
409
    unsigned int i, j;
410

  
411
    dev = qdev_create(NULL, "slavio_intctl");
412
    qdev_prop_set_ptr(dev, "intbit_to_level", (void *)intbit_to_level);
413
    qdev_prop_set_uint32(dev, "cputimer_bit", cputimer);
414
    qdev_init(dev);
415

  
416
    s = sysbus_from_qdev(dev);
417

  
418
    for (i = 0; i < MAX_CPUS; i++) {
419
        for (j = 0; j < MAX_PILS; j++) {
420
            sysbus_connect_irq(s, i * MAX_PILS + j, parent_irq[i][j]);
421
        }
422
    }
423
    sysbus_mmio_map(s, 0, addrg);
424
    for (i = 0; i < MAX_CPUS; i++) {
425
        sysbus_mmio_map(s, i + 1, addr + i * TARGET_PAGE_SIZE);
426
    }
427

  
428
    return dev;
429
}
430

  
431
#define SYS_TIMER_OFFSET      0x10000ULL
432
#define CPU_TIMER_OFFSET(cpu) (0x1000ULL * cpu)
433

  
434
static void slavio_timer_init_all(target_phys_addr_t addr, qemu_irq master_irq,
435
                                  qemu_irq *cpu_irqs, unsigned int num_cpus)
436
{
437
    DeviceState *dev;
438
    SysBusDevice *s;
439
    unsigned int i;
440

  
441
    dev = qdev_create(NULL, "slavio_timer");
442
    qdev_prop_set_uint32(dev, "num_cpus", num_cpus);
443
    qdev_init(dev);
444
    s = sysbus_from_qdev(dev);
445
    sysbus_connect_irq(s, 0, master_irq);
446
    sysbus_mmio_map(s, 0, addr + SYS_TIMER_OFFSET);
447

  
448
    for (i = 0; i < MAX_CPUS; i++) {
449
        sysbus_mmio_map(s, i + 1, addr + (target_phys_addr_t)CPU_TIMER_OFFSET(i));
450
        sysbus_connect_irq(s, i + 1, cpu_irqs[i]);
451
    }
452
}
453

  
454
#define MISC_LEDS 0x01600000
455
#define MISC_CFG  0x01800000
456
#define MISC_DIAG 0x01a00000
457
#define MISC_MDM  0x01b00000
458
#define MISC_SYS  0x01f00000
459

  
460
static void *slavio_misc_init(target_phys_addr_t base,
461
                              target_phys_addr_t aux1_base,
462
                              target_phys_addr_t aux2_base, qemu_irq irq,
463
                              qemu_irq fdc_tc)
464
{
465
    DeviceState *dev;
466
    SysBusDevice *s;
467

  
468
    dev = qdev_create(NULL, "slavio_misc");
469
    qdev_init(dev);
470
    s = sysbus_from_qdev(dev);
471
    if (base) {
472
        /* 8 bit registers */
473
        /* Slavio control */
474
        sysbus_mmio_map(s, 0, base + MISC_CFG);
475
        /* Diagnostics */
476
        sysbus_mmio_map(s, 1, base + MISC_DIAG);
477
        /* Modem control */
478
        sysbus_mmio_map(s, 2, base + MISC_MDM);
479
        /* 16 bit registers */
480
        /* ss600mp diag LEDs */
481
        sysbus_mmio_map(s, 3, base + MISC_LEDS);
482
        /* 32 bit registers */
483
        /* System control */
484
        sysbus_mmio_map(s, 4, base + MISC_SYS);
485
    }
486
    if (aux1_base) {
487
        /* AUX 1 (Misc System Functions) */
488
        sysbus_mmio_map(s, 5, aux1_base);
489
    }
490
    if (aux2_base) {
491
        /* AUX 2 (Software Powerdown Control) */
492
        sysbus_mmio_map(s, 6, aux2_base);
493
    }
494
    sysbus_connect_irq(s, 0, irq);
495
    sysbus_connect_irq(s, 1, fdc_tc);
496

  
497
    return s;
498
}
499

  
500
static void ecc_init(target_phys_addr_t base, qemu_irq irq, uint32_t version)
501
{
502
    DeviceState *dev;
503
    SysBusDevice *s;
504

  
505
    dev = qdev_create(NULL, "eccmemctl");
506
    qdev_prop_set_uint32(dev, "version", version);
507
    qdev_init(dev);
508
    s = sysbus_from_qdev(dev);
509
    sysbus_connect_irq(s, 0, irq);
510
    sysbus_mmio_map(s, 0, base);
511
    if (version == 0) { // SS-600MP only
512
        sysbus_mmio_map(s, 1, base + 0x1000);
513
    }
514
}
515

  
516
static void apc_init(target_phys_addr_t power_base, qemu_irq cpu_halt)
517
{
518
    DeviceState *dev;
519
    SysBusDevice *s;
520

  
521
    dev = qdev_create(NULL, "apc");
522
    qdev_init(dev);
523
    s = sysbus_from_qdev(dev);
524
    /* Power management (APC) XXX: not a Slavio device */
525
    sysbus_mmio_map(s, 0, power_base);
526
    sysbus_connect_irq(s, 0, cpu_halt);
527
}
528

  
529
static void tcx_init(target_phys_addr_t addr, int vram_size, int width,
530
                     int height, int depth)
531
{
532
    DeviceState *dev;
533
    SysBusDevice *s;
534

  
535
    dev = qdev_create(NULL, "SUNW,tcx");
536
    qdev_prop_set_taddr(dev, "addr", addr);
537
    qdev_prop_set_uint32(dev, "vram_size", vram_size);
538
    qdev_prop_set_uint16(dev, "width", width);
539
    qdev_prop_set_uint16(dev, "height", height);
540
    qdev_prop_set_uint16(dev, "depth", depth);
541
    qdev_init(dev);
542
    s = sysbus_from_qdev(dev);
543
    /* 8-bit plane */
544
    sysbus_mmio_map(s, 0, addr + 0x00800000ULL);
545
    /* DAC */
546
    sysbus_mmio_map(s, 1, addr + 0x00200000ULL);
547
    /* TEC (dummy) */
548
    sysbus_mmio_map(s, 2, addr + 0x00700000ULL);
549
    /* THC 24 bit: NetBSD writes here even with 8-bit display: dummy */
550
    sysbus_mmio_map(s, 3, addr + 0x00301000ULL);
551
    if (depth == 24) {
552
        /* 24-bit plane */
553
        sysbus_mmio_map(s, 4, addr + 0x02000000ULL);
554
        /* Control plane */
555
        sysbus_mmio_map(s, 5, addr + 0x0a000000ULL);
556
    } else {
557
        /* THC 8 bit (dummy) */
558
        sysbus_mmio_map(s, 4, addr + 0x00300000ULL);
559
    }
560
}
561

  
385 562
/* NCR89C100/MACIO Internal ID register */
386 563
static const uint8_t idreg_data[] = { 0xfe, 0x81, 0x01, 0x03 };
387 564

  
......
1314 1491
    },
1315 1492
};
1316 1493

  
1494
static DeviceState *sbi_init(target_phys_addr_t addr, qemu_irq **parent_irq)
1495
{
1496
    DeviceState *dev;
1497
    SysBusDevice *s;
1498
    unsigned int i;
1499

  
1500
    dev = qdev_create(NULL, "sbi");
1501
    qdev_init(dev);
1502

  
1503
    s = sysbus_from_qdev(dev);
1504

  
1505
    for (i = 0; i < MAX_CPUS; i++) {
1506
        sysbus_connect_irq(s, i, *parent_irq[i]);
1507
    }
1508

  
1509
    sysbus_mmio_map(s, 0, addr);
1510

  
1511
    return dev;
1512
}
1513

  
1317 1514
static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size,
1318 1515
                          const char *boot_device,
1319 1516
                          const char *kernel_filename,
......
1494 1691
    },
1495 1692
};
1496 1693

  
1694
static DeviceState *sun4c_intctl_init(target_phys_addr_t addr,
1695
                                      qemu_irq *parent_irq)
1696
{
1697
    DeviceState *dev;
1698
    SysBusDevice *s;
1699
    unsigned int i;
1700

  
1701
    dev = qdev_create(NULL, "sun4c_intctl");
1702
    qdev_init(dev);
1703

  
1704
    s = sysbus_from_qdev(dev);
1705

  
1706
    for (i = 0; i < MAX_PILS; i++) {
1707
        sysbus_connect_irq(s, i, parent_irq[i]);
1708
    }
1709
    sysbus_mmio_map(s, 0, addr);
1710

  
1711
    return dev;
1712
}
1713

  
1497 1714
static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size,
1498 1715
                          const char *boot_device,
1499 1716
                          const char *kernel_filename,

Also available in: Unified diff