diff options
Diffstat (limited to 'hw')
-rw-r--r-- | hw/sun4m.c | 160 |
1 files changed, 25 insertions, 135 deletions
diff --git a/hw/sun4m.c b/hw/sun4m.c index 54c468c245..41fb84ea5b 100644 --- a/hw/sun4m.c +++ b/hw/sun4m.c @@ -98,10 +98,6 @@ struct sun4m_hwdef { target_phys_addr_t ecc_base; uint32_t ecc_version; long vram_size, nvram_size; - // IRQ numbers are not PIL ones, but master interrupt controller - // register bit numbers - int esp_irq, le_irq, clock_irq, clock1_irq; - int ser_irq, ms_kb_irq, fd_irq, me_irq, cs_irq, ecc_irq; uint8_t nvram_machine_id; uint16_t machine_id; uint32_t iommu_version; @@ -120,9 +116,6 @@ struct sun4d_hwdef { target_phys_addr_t tcx_base; target_phys_addr_t sbi_base; unsigned long vram_size, nvram_size; - // IRQ numbers are not PIL ones, but SBI register bit numbers - int esp_irq, le_irq, clock_irq, clock1_irq; - int ser_irq, ms_kb_irq, me_irq; uint8_t nvram_machine_id; uint16_t machine_id; uint32_t iounit_version; @@ -137,10 +130,6 @@ struct sun4c_hwdef { target_phys_addr_t idreg_base, dma_base, esp_base, le_base; target_phys_addr_t tcx_base, aux1_base; long vram_size, nvram_size; - // IRQ numbers are not PIL ones, but master interrupt controller - // register bit numbers - int esp_irq, le_irq, clock_irq, clock1_irq; - int ser_irq, ms_kb_irq, fd_irq, me_irq; uint8_t nvram_machine_id; uint16_t machine_id; uint32_t iommu_version; @@ -778,7 +767,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, dev = slavio_intctl_init(hwdef->intctl_base, hwdef->intctl_base + 0x10000ULL, cpu_irqs, - hwdef->clock_irq); + 7); for (i = 0; i < 32; i++) { slavio_irq[i] = qdev_get_gpio_in(dev, i); @@ -792,13 +781,13 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, } iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version, - slavio_irq[hwdef->me_irq]); + slavio_irq[30]); - espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq], + espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[18], iommu, &espdma_irq, &esp_reset); ledma = sparc32_dma_init(hwdef->dma_base + 16ULL, - slavio_irq[hwdef->le_irq], iommu, &ledma_irq, + slavio_irq[16], iommu, &ledma_irq, &le_reset); if (graphic_depth != 8 && graphic_depth != 24) { @@ -813,20 +802,19 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0, hwdef->nvram_size, 8); - slavio_timer_init_all(hwdef->counter_base, slavio_irq[hwdef->clock1_irq], - slavio_cpu_irq, smp_cpus); + slavio_timer_init_all(hwdef->counter_base, slavio_irq[19], slavio_cpu_irq, smp_cpus); - slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq], + slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[14], display_type == DT_NOGRAPHIC, ESCC_CLOCK, 1); // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device - escc_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], slavio_irq[hwdef->ser_irq], + escc_init(hwdef->serial_base, slavio_irq[15], slavio_irq[15], serial_hds[0], serial_hds[1], ESCC_CLOCK, 1); cpu_halt = qemu_allocate_irqs(cpu_halt_signal, NULL, 1); slavio_misc = slavio_misc_init(hwdef->slavio_base, hwdef->aux1_base, hwdef->aux2_base, - slavio_irq[hwdef->me_irq], fdc_tc); + slavio_irq[30], fdc_tc); if (hwdef->apc_base) { apc_init(hwdef->apc_base, cpu_halt[0]); } @@ -838,7 +826,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, if (dinfo) fd[0] = dinfo->bdrv; - sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd, + sun4m_fdctrl_init(slavio_irq[22], hwdef->fd_base, fd, &fdc_tc); } @@ -853,7 +841,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, if (hwdef->cs_base) { sysbus_create_simple("SUNW,CS4231", hwdef->cs_base, - slavio_irq[hwdef->cs_irq]); + slavio_irq[5]); } kernel_size = sun4m_load_kernel(kernel_filename, initrd_filename, @@ -865,7 +853,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef, ram_addr_t RAM_size, "Sun4m"); if (hwdef->ecc_base) - ecc_init(hwdef->ecc_base, slavio_irq[hwdef->ecc_irq], + ecc_init(hwdef->ecc_base, slavio_irq[28], hwdef->ecc_version); fw_cfg = fw_cfg_init(0, 0, CFG_ADDR, CFG_ADDR + 2); @@ -924,15 +912,6 @@ static const struct sun4m_hwdef sun4m_hwdefs[] = { .aux2_base = 0x71910000, .vram_size = 0x00100000, .nvram_size = 0x2000, - .esp_irq = 18, - .le_irq = 16, - .clock_irq = 7, - .clock1_irq = 19, - .ms_kb_irq = 14, - .ser_irq = 15, - .fd_irq = 22, - .me_irq = 30, - .cs_irq = 5, .nvram_machine_id = 0x80, .machine_id = ss5_id, .iommu_version = 0x05000000, @@ -961,15 +940,6 @@ static const struct sun4m_hwdef sun4m_hwdefs[] = { .ecc_version = 0x10000000, // version 0, implementation 1 .vram_size = 0x00100000, .nvram_size = 0x2000, - .esp_irq = 18, - .le_irq = 16, - .clock_irq = 7, - .clock1_irq = 19, - .ms_kb_irq = 14, - .ser_irq = 15, - .fd_irq = 22, - .me_irq = 30, - .ecc_irq = 28, .nvram_machine_id = 0x72, .machine_id = ss10_id, .iommu_version = 0x03000000, @@ -996,15 +966,6 @@ static const struct sun4m_hwdef sun4m_hwdefs[] = { .ecc_version = 0x00000000, // version 0, implementation 0 .vram_size = 0x00100000, .nvram_size = 0x2000, - .esp_irq = 18, - .le_irq = 16, - .clock_irq = 7, - .clock1_irq = 19, - .ms_kb_irq = 14, - .ser_irq = 15, - .fd_irq = 22, - .me_irq = 30, - .ecc_irq = 28, .nvram_machine_id = 0x71, .machine_id = ss600mp_id, .iommu_version = 0x01000000, @@ -1033,15 +994,6 @@ static const struct sun4m_hwdef sun4m_hwdefs[] = { .ecc_version = 0x20000000, // version 0, implementation 2 .vram_size = 0x00100000, .nvram_size = 0x2000, - .esp_irq = 18, - .le_irq = 16, - .clock_irq = 7, - .clock1_irq = 19, - .ms_kb_irq = 14, - .ser_irq = 15, - .fd_irq = 22, - .me_irq = 30, - .ecc_irq = 28, .nvram_machine_id = 0x72, .machine_id = ss20_id, .iommu_version = 0x13000000, @@ -1068,14 +1020,6 @@ static const struct sun4m_hwdef sun4m_hwdefs[] = { .aux2_base = 0x71910000, .vram_size = 0x00100000, .nvram_size = 0x2000, - .esp_irq = 18, - .le_irq = 16, - .clock_irq = 7, - .clock1_irq = 19, - .ms_kb_irq = 14, - .ser_irq = 15, - .fd_irq = 22, - .me_irq = 30, .nvram_machine_id = 0x80, .machine_id = vger_id, .iommu_version = 0x05000000, @@ -1101,14 +1045,6 @@ static const struct sun4m_hwdef sun4m_hwdefs[] = { .aux2_base = 0x71910000, .vram_size = 0x00100000, .nvram_size = 0x2000, - .esp_irq = 18, - .le_irq = 16, - .clock_irq = 7, - .clock1_irq = 19, - .ms_kb_irq = 14, - .ser_irq = 15, - .fd_irq = 22, - .me_irq = 30, .nvram_machine_id = 0x80, .machine_id = lx_id, .iommu_version = 0x04000000, @@ -1136,15 +1072,6 @@ static const struct sun4m_hwdef sun4m_hwdefs[] = { .aux2_base = 0x71910000, .vram_size = 0x00100000, .nvram_size = 0x2000, - .esp_irq = 18, - .le_irq = 16, - .clock_irq = 7, - .clock1_irq = 19, - .ms_kb_irq = 14, - .ser_irq = 15, - .fd_irq = 22, - .me_irq = 30, - .cs_irq = 5, .nvram_machine_id = 0x80, .machine_id = ss4_id, .iommu_version = 0x05000000, @@ -1171,14 +1098,6 @@ static const struct sun4m_hwdef sun4m_hwdefs[] = { .aux2_base = 0x71910000, .vram_size = 0x00100000, .nvram_size = 0x2000, - .esp_irq = 18, - .le_irq = 16, - .clock_irq = 7, - .clock1_irq = 19, - .ms_kb_irq = 14, - .ser_irq = 15, - .fd_irq = 22, - .me_irq = 30, .nvram_machine_id = 0x80, .machine_id = scls_id, .iommu_version = 0x05000000, @@ -1205,14 +1124,6 @@ static const struct sun4m_hwdef sun4m_hwdefs[] = { .aux2_base = 0x71910000, .vram_size = 0x00100000, .nvram_size = 0x2000, - .esp_irq = 18, - .le_irq = 16, - .clock_irq = 7, - .clock1_irq = 19, - .ms_kb_irq = 14, - .ser_irq = 15, - .fd_irq = 22, - .me_irq = 30, .nvram_machine_id = 0x80, .machine_id = sbook_id, .iommu_version = 0x05000000, @@ -1402,12 +1313,6 @@ static const struct sun4d_hwdef sun4d_hwdefs[] = { .sbi_base = 0xf02800000ULL, .vram_size = 0x00100000, .nvram_size = 0x2000, - .esp_irq = 3, - .le_irq = 4, - .clock_irq = 14, - .clock1_irq = 10, - .ms_kb_irq = 12, - .ser_irq = 12, .nvram_machine_id = 0x80, .machine_id = ss1000_id, .iounit_version = 0x03000000, @@ -1436,12 +1341,6 @@ static const struct sun4d_hwdef sun4d_hwdefs[] = { .sbi_base = 0xf02800000ULL, .vram_size = 0x00100000, .nvram_size = 0x2000, - .esp_irq = 3, - .le_irq = 4, - .clock_irq = 14, - .clock1_irq = 10, - .ms_kb_irq = 12, - .ser_irq = 12, .nvram_machine_id = 0x80, .machine_id = ss2000_id, .iounit_version = 0x03000000, @@ -1515,12 +1414,12 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, if (hwdef->iounit_bases[i] != (target_phys_addr_t)-1) iounits[i] = iommu_init(hwdef->iounit_bases[i], hwdef->iounit_version, - sbi_irq[hwdef->me_irq]); + sbi_irq[0]); - espdma = sparc32_dma_init(hwdef->espdma_base, sbi_irq[hwdef->esp_irq], + espdma = sparc32_dma_init(hwdef->espdma_base, sbi_irq[3], iounits[0], &espdma_irq, &esp_reset); - ledma = sparc32_dma_init(hwdef->ledma_base, sbi_irq[hwdef->le_irq], + ledma = sparc32_dma_init(hwdef->ledma_base, sbi_irq[4], iounits[0], &ledma_irq, &le_reset); if (graphic_depth != 8 && graphic_depth != 24) { @@ -1535,14 +1434,13 @@ static void sun4d_hw_init(const struct sun4d_hwdef *hwdef, ram_addr_t RAM_size, nvram = m48t59_init(sbi_irq[0], hwdef->nvram_base, 0, hwdef->nvram_size, 8); - slavio_timer_init_all(hwdef->counter_base, sbi_irq[hwdef->clock1_irq], - sbi_cpu_irq, smp_cpus); + slavio_timer_init_all(hwdef->counter_base, sbi_irq[10], sbi_cpu_irq, smp_cpus); - slavio_serial_ms_kbd_init(hwdef->ms_kb_base, sbi_irq[hwdef->ms_kb_irq], + slavio_serial_ms_kbd_init(hwdef->ms_kb_base, sbi_irq[12], display_type == DT_NOGRAPHIC, ESCC_CLOCK, 1); // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device - escc_init(hwdef->serial_base, sbi_irq[hwdef->ser_irq], sbi_irq[hwdef->ser_irq], + escc_init(hwdef->serial_base, sbi_irq[12], sbi_irq[12], serial_hds[0], serial_hds[1], ESCC_CLOCK, 1); if (drive_get_max_bus(IF_SCSI) > 0) { @@ -1635,14 +1533,6 @@ static const struct sun4c_hwdef sun4c_hwdefs[] = { .aux1_base = 0xf7400003, .vram_size = 0x00100000, .nvram_size = 0x800, - .esp_irq = 2, - .le_irq = 3, - .clock_irq = 5, - .clock1_irq = 7, - .ms_kb_irq = 1, - .ser_irq = 1, - .fd_irq = 1, - .me_irq = 1, .nvram_machine_id = 0x55, .machine_id = ss2_id, .max_mem = 0x10000000, @@ -1706,13 +1596,13 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, } iommu = iommu_init(hwdef->iommu_base, hwdef->iommu_version, - slavio_irq[hwdef->me_irq]); + slavio_irq[1]); - espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[hwdef->esp_irq], + espdma = sparc32_dma_init(hwdef->dma_base, slavio_irq[2], iommu, &espdma_irq, &esp_reset); ledma = sparc32_dma_init(hwdef->dma_base + 16ULL, - slavio_irq[hwdef->le_irq], iommu, &ledma_irq, + slavio_irq[3], iommu, &ledma_irq, &le_reset); if (graphic_depth != 8 && graphic_depth != 24) { @@ -1727,16 +1617,16 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, nvram = m48t59_init(slavio_irq[0], hwdef->nvram_base, 0, hwdef->nvram_size, 2); - slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[hwdef->ms_kb_irq], + slavio_serial_ms_kbd_init(hwdef->ms_kb_base, slavio_irq[1], display_type == DT_NOGRAPHIC, ESCC_CLOCK, 1); // Slavio TTYA (base+4, Linux ttyS0) is the first Qemu serial device // Slavio TTYB (base+0, Linux ttyS1) is the second Qemu serial device - escc_init(hwdef->serial_base, slavio_irq[hwdef->ser_irq], - slavio_irq[hwdef->ser_irq], serial_hds[0], serial_hds[1], + escc_init(hwdef->serial_base, slavio_irq[1], + slavio_irq[1], serial_hds[0], serial_hds[1], ESCC_CLOCK, 1); slavio_misc = slavio_misc_init(0, hwdef->aux1_base, 0, - slavio_irq[hwdef->me_irq], fdc_tc); + slavio_irq[1], fdc_tc); if (hwdef->fd_base != (target_phys_addr_t)-1) { /* there is zero or one floppy drive */ @@ -1745,7 +1635,7 @@ static void sun4c_hw_init(const struct sun4c_hwdef *hwdef, ram_addr_t RAM_size, if (dinfo) fd[0] = dinfo->bdrv; - sun4m_fdctrl_init(slavio_irq[hwdef->fd_irq], hwdef->fd_base, fd, + sun4m_fdctrl_init(slavio_irq[1], hwdef->fd_base, fd, &fdc_tc); } |