Revision 1452411b hw/pc.c

b/hw/pc.c
88 88
    qemu_register_reset(option_rom_reset, rrd);
89 89
}
90 90

  
91
typedef struct isa_irq_state {
92
    qemu_irq *i8259;
93
} IsaIrqState;
94

  
95
static void isa_irq_handler(void *opaque, int n, int level)
96
{
97
    IsaIrqState *isa = (IsaIrqState *)opaque;
98

  
99
    qemu_set_irq(isa->i8259[n], level);
100
}
101

  
91 102
static void ioport80_write(void *opaque, uint32_t addr, uint32_t data)
92 103
{
93 104
}
......
1122 1133
    int piix3_devfn = -1;
1123 1134
    CPUState *env;
1124 1135
    qemu_irq *cpu_irq;
1136
    qemu_irq *isa_irq;
1125 1137
    qemu_irq *i8259;
1138
    IsaIrqState *isa_irq_state;
1126 1139
    DriveInfo *dinfo;
1127 1140
    BlockDriverState *hd[MAX_IDE_BUS * MAX_IDE_DEVS];
1128 1141
    BlockDriverState *fd[MAX_FD];
......
1267 1280

  
1268 1281
    cpu_irq = qemu_allocate_irqs(pic_irq_request, NULL, 1);
1269 1282
    i8259 = i8259_init(cpu_irq[0]);
1270
    ferr_irq = i8259[13];
1283
    isa_irq_state = qemu_mallocz(sizeof(*isa_irq_state));
1284
    isa_irq_state->i8259 = i8259;
1285
    isa_irq = qemu_allocate_irqs(isa_irq_handler, isa_irq_state, 16);
1286
    ferr_irq = isa_irq[13];
1271 1287

  
1272 1288
    if (pci_enabled) {
1273
        pci_bus = i440fx_init(&i440fx_state, i8259);
1289
        pci_bus = i440fx_init(&i440fx_state, isa_irq);
1274 1290
        piix3_devfn = piix3_init(pci_bus, -1);
1275 1291
    } else {
1276 1292
        pci_bus = NULL;
......
1300 1316
        }
1301 1317
    }
1302 1318

  
1303
    rtc_state = rtc_init(0x70, i8259[8], 2000);
1319
    rtc_state = rtc_init(0x70, isa_irq[8], 2000);
1304 1320

  
1305 1321
    qemu_register_boot_set(pc_boot_set, rtc_state);
1306 1322

  
......
1310 1326
    if (pci_enabled) {
1311 1327
        ioapic = ioapic_init();
1312 1328
    }
1313
    pit = pit_init(0x40, i8259[0]);
1329
    pit = pit_init(0x40, isa_irq[0]);
1314 1330
    pcspk_init(pit);
1315 1331
    if (!no_hpet) {
1316
        hpet_init(i8259);
1332
        hpet_init(isa_irq);
1317 1333
    }
1318 1334
    if (pci_enabled) {
1319 1335
        pic_set_alt_irq_func(isa_pic, ioapic_set_irq, ioapic);
......
1321 1337

  
1322 1338
    for(i = 0; i < MAX_SERIAL_PORTS; i++) {
1323 1339
        if (serial_hds[i]) {
1324
            serial_init(serial_io[i], i8259[serial_irq[i]], 115200,
1340
            serial_init(serial_io[i], isa_irq[serial_irq[i]], 115200,
1325 1341
                        serial_hds[i]);
1326 1342
        }
1327 1343
    }
1328 1344

  
1329 1345
    for(i = 0; i < MAX_PARALLEL_PORTS; i++) {
1330 1346
        if (parallel_hds[i]) {
1331
            parallel_init(parallel_io[i], i8259[parallel_irq[i]],
1347
            parallel_init(parallel_io[i], isa_irq[parallel_irq[i]],
1332 1348
                          parallel_hds[i]);
1333 1349
        }
1334 1350
    }
......
1339 1355
        NICInfo *nd = &nd_table[i];
1340 1356

  
1341 1357
        if (!pci_enabled || (nd->model && strcmp(nd->model, "ne2k_isa") == 0))
1342
            pc_init_ne2k_isa(nd, i8259);
1358
            pc_init_ne2k_isa(nd, isa_irq);
1343 1359
        else
1344 1360
            pci_nic_init(nd, "ne2k_pci", NULL);
1345 1361
    }
......
1357 1373
    }
1358 1374

  
1359 1375
    if (pci_enabled) {
1360
        pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1, i8259);
1376
        pci_piix3_ide_init(pci_bus, hd, piix3_devfn + 1, isa_irq);
1361 1377
    } else {
1362 1378
        for(i = 0; i < MAX_IDE_BUS; i++) {
1363
            isa_ide_init(ide_iobase[i], ide_iobase2[i], i8259[ide_irq[i]],
1379
            isa_ide_init(ide_iobase[i], ide_iobase2[i], isa_irq[ide_irq[i]],
1364 1380
	                 hd[MAX_IDE_DEVS * i], hd[MAX_IDE_DEVS * i + 1]);
1365 1381
        }
1366 1382
    }
1367 1383

  
1368 1384
    isa_dev = isa_create_simple("i8042", 0x60, 0x64);
1369
    isa_connect_irq(isa_dev, 0, i8259[1]);
1370
    isa_connect_irq(isa_dev, 1, i8259[12]);
1385
    isa_connect_irq(isa_dev, 0, isa_irq[1]);
1386
    isa_connect_irq(isa_dev, 1, isa_irq[12]);
1371 1387
    DMA_init(0);
1372 1388
#ifdef HAS_AUDIO
1373
    audio_init(pci_enabled ? pci_bus : NULL, i8259);
1389
    audio_init(pci_enabled ? pci_bus : NULL, isa_irq);
1374 1390
#endif
1375 1391

  
1376 1392
    for(i = 0; i < MAX_FD; i++) {
1377 1393
        dinfo = drive_get(IF_FLOPPY, 0, i);
1378 1394
        fd[i] = dinfo ? dinfo->bdrv : NULL;
1379 1395
    }
1380
    floppy_controller = fdctrl_init(i8259[6], 2, 0, 0x3f0, fd);
1396
    floppy_controller = fdctrl_init(isa_irq[6], 2, 0, 0x3f0, fd);
1381 1397

  
1382 1398
    cmos_init(below_4g_mem_size, above_4g_mem_size, boot_device, hd);
1383 1399

  
......
1390 1406
        i2c_bus *smbus;
1391 1407

  
1392 1408
        /* TODO: Populate SPD eeprom data.  */
1393
        smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100, i8259[9]);
1409
        smbus = piix4_pm_init(pci_bus, piix3_devfn + 3, 0xb100, isa_irq[9]);
1394 1410
        for (i = 0; i < 8; i++) {
1395 1411
            DeviceState *eeprom;
1396 1412
            eeprom = qdev_create((BusState *)smbus, "smbus-eeprom");

Also available in: Unified diff