Revision d537cf6c hw/ide.c
b/hw/ide.c | ||
---|---|---|
300 | 300 |
int mult_sectors; |
301 | 301 |
int identify_set; |
302 | 302 |
uint16_t identify_data[256]; |
303 |
SetIRQFunc *set_irq; |
|
304 |
void *irq_opaque; |
|
305 |
int irq; |
|
303 |
qemu_irq irq; |
|
306 | 304 |
PCIDevice *pci_dev; |
307 | 305 |
struct BMDMAState *bmdma; |
308 | 306 |
int drive_serial; |
... | ... | |
575 | 573 |
if (bm) { |
576 | 574 |
bm->status |= BM_STATUS_INT; |
577 | 575 |
} |
578 |
s->set_irq(s->irq_opaque, s->irq, 1);
|
|
576 |
qemu_irq_raise(s->irq);
|
|
579 | 577 |
} |
580 | 578 |
} |
581 | 579 |
|
... | ... | |
1889 | 1887 |
ret = 0; |
1890 | 1888 |
else |
1891 | 1889 |
ret = s->status; |
1892 |
s->set_irq(s->irq_opaque, s->irq, 0);
|
|
1890 |
qemu_irq_lower(s->irq);
|
|
1893 | 1891 |
break; |
1894 | 1892 |
} |
1895 | 1893 |
#ifdef DEBUG_IDE |
... | ... | |
2084 | 2082 |
|
2085 | 2083 |
static void ide_init2(IDEState *ide_state, |
2086 | 2084 |
BlockDriverState *hd0, BlockDriverState *hd1, |
2087 |
SetIRQFunc *set_irq, void *irq_opaque, int irq)
|
|
2085 |
qemu_irq irq)
|
|
2088 | 2086 |
{ |
2089 | 2087 |
IDEState *s; |
2090 | 2088 |
static int drive_serial = 1; |
... | ... | |
2155 | 2153 |
} |
2156 | 2154 |
} |
2157 | 2155 |
s->drive_serial = drive_serial++; |
2158 |
s->set_irq = set_irq; |
|
2159 |
s->irq_opaque = irq_opaque; |
|
2160 | 2156 |
s->irq = irq; |
2161 | 2157 |
s->sector_write_timer = qemu_new_timer(vm_clock, |
2162 | 2158 |
ide_sector_write_timer_cb, s); |
... | ... | |
2183 | 2179 |
/***********************************************************/ |
2184 | 2180 |
/* ISA IDE definitions */ |
2185 | 2181 |
|
2186 |
void isa_ide_init(int iobase, int iobase2, int irq,
|
|
2182 |
void isa_ide_init(int iobase, int iobase2, qemu_irq irq,
|
|
2187 | 2183 |
BlockDriverState *hd0, BlockDriverState *hd1) |
2188 | 2184 |
{ |
2189 | 2185 |
IDEState *ide_state; |
... | ... | |
2192 | 2188 |
if (!ide_state) |
2193 | 2189 |
return; |
2194 | 2190 |
|
2195 |
ide_init2(ide_state, hd0, hd1, pic_set_irq_new, isa_pic, irq);
|
|
2191 |
ide_init2(ide_state, hd0, hd1, irq); |
|
2196 | 2192 |
ide_init_ioport(ide_state, iobase, iobase2); |
2197 | 2193 |
} |
2198 | 2194 |
|
... | ... | |
2399 | 2395 |
!(d->dev.config[MRDMODE] & MRDMODE_BLK_CH0)) || |
2400 | 2396 |
((d->dev.config[MRDMODE] & MRDMODE_INTR_CH1) && |
2401 | 2397 |
!(d->dev.config[MRDMODE] & MRDMODE_BLK_CH1)); |
2402 |
pci_set_irq((PCIDevice *)d, 0, pci_level);
|
|
2398 |
qemu_set_irq(d->dev.irq[0], pci_level);
|
|
2403 | 2399 |
} |
2404 | 2400 |
|
2405 | 2401 |
/* the PCI irq level is the logical OR of the two channels */ |
... | ... | |
2423 | 2419 |
PCIIDEState *d; |
2424 | 2420 |
uint8_t *pci_conf; |
2425 | 2421 |
int i; |
2422 |
qemu_irq *irq; |
|
2426 | 2423 |
|
2427 | 2424 |
d = (PCIIDEState *)pci_register_device(bus, "CMD646 IDE", |
2428 | 2425 |
sizeof(PCIIDEState), |
... | ... | |
2462 | 2459 |
|
2463 | 2460 |
for(i = 0; i < 4; i++) |
2464 | 2461 |
d->ide_if[i].pci_dev = (PCIDevice *)d; |
2465 |
ide_init2(&d->ide_if[0], hd_table[0], hd_table[1], |
|
2466 |
cmd646_set_irq, d, 0);
|
|
2467 |
ide_init2(&d->ide_if[2], hd_table[2], hd_table[3],
|
|
2468 |
cmd646_set_irq, d, 1);
|
|
2462 |
|
|
2463 |
irq = qemu_allocate_irqs(cmd646_set_irq, d, 2);
|
|
2464 |
ide_init2(&d->ide_if[0], hd_table[0], hd_table[1], irq[0]);
|
|
2465 |
ide_init2(&d->ide_if[2], hd_table[2], hd_table[3], irq[1]);
|
|
2469 | 2466 |
} |
2470 | 2467 |
|
2471 | 2468 |
static void pci_ide_save(QEMUFile* f, void *opaque) |
... | ... | |
2592 | 2589 |
|
2593 | 2590 |
/* hd_table must contain 4 block drivers */ |
2594 | 2591 |
/* NOTE: for the PIIX3, the IRQs and IOports are hardcoded */ |
2595 |
void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn) |
|
2592 |
void pci_piix3_ide_init(PCIBus *bus, BlockDriverState **hd_table, int devfn, |
|
2593 |
qemu_irq *pic) |
|
2596 | 2594 |
{ |
2597 | 2595 |
PCIIDEState *d; |
2598 | 2596 |
uint8_t *pci_conf; |
... | ... | |
2619 | 2617 |
pci_register_io_region((PCIDevice *)d, 4, 0x10, |
2620 | 2618 |
PCI_ADDRESS_SPACE_IO, bmdma_map); |
2621 | 2619 |
|
2622 |
ide_init2(&d->ide_if[0], hd_table[0], hd_table[1], |
|
2623 |
pic_set_irq_new, isa_pic, 14); |
|
2624 |
ide_init2(&d->ide_if[2], hd_table[2], hd_table[3], |
|
2625 |
pic_set_irq_new, isa_pic, 15); |
|
2620 |
ide_init2(&d->ide_if[0], hd_table[0], hd_table[1], pic[14]); |
|
2621 |
ide_init2(&d->ide_if[2], hd_table[2], hd_table[3], pic[15]); |
|
2626 | 2622 |
ide_init_ioport(&d->ide_if[0], 0x1f0, 0x3f6); |
2627 | 2623 |
ide_init_ioport(&d->ide_if[2], 0x170, 0x376); |
2628 | 2624 |
|
... | ... | |
2741 | 2737 |
/* hd_table must contain 4 block drivers */ |
2742 | 2738 |
/* PowerMac uses memory mapped registers, not I/O. Return the memory |
2743 | 2739 |
I/O index to access the ide. */ |
2744 |
int pmac_ide_init (BlockDriverState **hd_table, |
|
2745 |
SetIRQFunc *set_irq, void *irq_opaque, int irq) |
|
2740 |
int pmac_ide_init (BlockDriverState **hd_table, qemu_irq irq) |
|
2746 | 2741 |
{ |
2747 | 2742 |
IDEState *ide_if; |
2748 | 2743 |
int pmac_ide_memory; |
2749 | 2744 |
|
2750 | 2745 |
ide_if = qemu_mallocz(sizeof(IDEState) * 2); |
2751 |
ide_init2(&ide_if[0], hd_table[0], hd_table[1], |
|
2752 |
set_irq, irq_opaque, irq); |
|
2746 |
ide_init2(&ide_if[0], hd_table[0], hd_table[1], irq); |
|
2753 | 2747 |
|
2754 | 2748 |
pmac_ide_memory = cpu_register_io_memory(0, pmac_ide_read, |
2755 | 2749 |
pmac_ide_write, &ide_if[0]); |
Also available in: Unified diff