Revision 34e538ae

b/hw/ide.c
297 297
    int64_t nb_sectors;
298 298
    int mult_sectors;
299 299
    int irq;
300
    PCIDevice *pci_dev;
300 301
    int drive_serial;
301 302
    /* ide regs */
302 303
    uint8_t feature;
......
463 464
static inline void ide_set_irq(IDEState *s)
464 465
{
465 466
    if (!(s->cmd & IDE_CMD_DISABLE_IRQ)) {
466
        pic_set_irq(s->irq, 1);
467
        if (s->irq == 16)
468
            pci_set_irq(s->pci_dev, 0, 1);
469
        else
470
            pic_set_irq(s->irq, 1);
467 471
    }
468 472
}
469 473

  
......
1169 1173
            s->status = READY_STAT;
1170 1174
            ide_set_irq(s);
1171 1175
            break;
1172

  
1176
        case WIN_SETFEATURES:
1177
            if (!s->bs)
1178
                goto abort_cmd;
1179
            /* XXX: valid for CDROM ? */
1180
            switch(s->feature) {
1181
            case 0x02: /* write cache enable */
1182
            case 0x82: /* write cache disable */
1183
            case 0xaa: /* read look-ahead enable */
1184
            case 0x55: /* read look-ahead disable */
1185
                s->status = READY_STAT;
1186
                ide_set_irq(s);
1187
                break;
1188
            default:
1189
                goto abort_cmd;
1190
            }
1191
            break;
1173 1192
            /* ATAPI commands */
1174 1193
        case WIN_PIDENTIFY:
1175 1194
            if (s->is_cdrom) {
......
1262 1281
            ret = 0;
1263 1282
        else
1264 1283
            ret = s->status;
1265
        pic_set_irq(s->irq, 0);
1284
        if (s->irq == 16)
1285
            pci_set_irq(s->pci_dev, 0, 0);
1286
        else
1287
            pic_set_irq(s->irq, 0);
1266 1288
        break;
1267 1289
    }
1268 1290
#ifdef DEBUG_IDE
......
1481 1503
    }
1482 1504
}
1483 1505

  
1484
/***********************************************************/
1485
/* ISA IDE definitions */
1486

  
1487
void isa_ide_init(int iobase, int iobase2, int irq,
1488
                  BlockDriverState *hd0, BlockDriverState *hd1)
1506
static void ide_init_ioport(IDEState *ide_state, int iobase, int iobase2)
1489 1507
{
1490
    IDEState *ide_state;
1491

  
1492
    ide_state = qemu_mallocz(sizeof(IDEState) * 2);
1493
    if (!ide_state)
1494
        return;
1495
    
1496
    ide_init2(ide_state, irq, hd0, hd1);
1497

  
1498 1508
    register_ioport_write(iobase, 8, 1, ide_ioport_write, ide_state);
1499 1509
    register_ioport_read(iobase, 8, 1, ide_ioport_read, ide_state);
1500 1510
    if (iobase2) {
......
1510 1520
}
1511 1521

  
1512 1522
/***********************************************************/
1523
/* ISA IDE definitions */
1524

  
1525
void isa_ide_init(int iobase, int iobase2, int irq,
1526
                  BlockDriverState *hd0, BlockDriverState *hd1)
1527
{
1528
    IDEState *ide_state;
1529

  
1530
    ide_state = qemu_mallocz(sizeof(IDEState) * 2);
1531
    if (!ide_state)
1532
        return;
1533
    
1534
    ide_init2(ide_state, irq, hd0, hd1);
1535
    ide_init_ioport(ide_state, iobase, iobase2);
1536
}
1537

  
1538
/***********************************************************/
1513 1539
/* PCI IDE definitions */
1514 1540

  
1515 1541
typedef struct PCIIDEState {
......
1546 1572
{
1547 1573
    PCIIDEState *d;
1548 1574
    uint8_t *pci_conf;
1549
    
1575
    int i;
1576

  
1550 1577
    d = (PCIIDEState *)pci_register_device("IDE", sizeof(PCIIDEState),
1551 1578
                                           0, -1, 
1552 1579
                                           NULL, NULL);
......
1573 1600
    pci_register_io_region((PCIDevice *)d, 3, 0x4, 
1574 1601
                           PCI_ADDRESS_SPACE_IO, ide_map);
1575 1602

  
1603
    pci_conf[0x3d] = 0x01; // interrupt on pin 1
1604

  
1605
    for(i = 0; i < 4; i++)
1606
        d->ide_if[i].pci_dev = (PCIDevice *)d;
1607
    ide_init2(&d->ide_if[0], 16, hd_table[0], hd_table[1]);
1608
    ide_init2(&d->ide_if[2], 16, hd_table[2], hd_table[3]);
1609
}
1610

  
1611
/* hd_table must contain 4 block drivers */
1612
/* NOTE: for the PIIX3, the IRQs and IOports are hardcoded */
1613
void pci_piix3_ide_init(BlockDriverState **hd_table)
1614
{
1615
    PCIIDEState *d;
1616
    uint8_t *pci_conf;
1617
    
1618
    /* register a function 1 of PIIX3 */
1619
    d = (PCIIDEState *)pci_register_device("PIIX3 IDE", sizeof(PCIIDEState),
1620
                                           0, ((PCIDevice *)piix3_state)->devfn + 1, 
1621
                                           NULL, NULL);
1622
    pci_conf = d->dev.config;
1623
    pci_conf[0x00] = 0x86; // Intel
1624
    pci_conf[0x01] = 0x80;
1625
    pci_conf[0x02] = 0x10;
1626
    pci_conf[0x03] = 0x70;
1627
    pci_conf[0x0a] = 0x01; // class_sub = PCI_IDE
1628
    pci_conf[0x0b] = 0x01; // class_base = PCI_mass_storage
1629
    pci_conf[0x0e] = 0x00; // header_type
1630

  
1631
    /* XXX: must add BMDMA support to be fully compliant */
1632

  
1576 1633
    ide_init2(&d->ide_if[0], 14, hd_table[0], hd_table[1]);
1577 1634
    ide_init2(&d->ide_if[2], 15, hd_table[2], hd_table[3]);
1635
    ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6);
1636
    ide_init_ioport(&d->ide_if[2], 0x170, 0x376);
1578 1637
}

Also available in: Unified diff