mirror of https://gitee.com/openkylin/qemu.git
PPC: dbdma: macio: Add DMA callback
We need to know when the IDE core starts a DMA transfer. Add a notifier function so we have the chance to start transmitting data. Signed-off-by: Alexander Graf <agraf@suse.de>
This commit is contained in:
parent
d2f0ce2189
commit
4aa3510f6f
|
@ -359,11 +359,50 @@ static void macio_ide_reset(DeviceState *dev)
|
|||
ide_bus_reset(&d->bus);
|
||||
}
|
||||
|
||||
static int ide_nop(IDEDMA *dma)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ide_nop_int(IDEDMA *dma, int x)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ide_nop_restart(void *opaque, int x, RunState y)
|
||||
{
|
||||
}
|
||||
|
||||
static void ide_dbdma_start(IDEDMA *dma, IDEState *s,
|
||||
BlockDriverCompletionFunc *cb)
|
||||
{
|
||||
MACIOIDEState *m = container_of(dma, MACIOIDEState, dma);
|
||||
|
||||
MACIO_DPRINTF("\n");
|
||||
DBDMA_kick(m->dbdma);
|
||||
}
|
||||
|
||||
static const IDEDMAOps dbdma_ops = {
|
||||
.start_dma = ide_dbdma_start,
|
||||
.start_transfer = ide_nop,
|
||||
.prepare_buf = ide_nop_int,
|
||||
.rw_buf = ide_nop_int,
|
||||
.set_unit = ide_nop_int,
|
||||
.add_status = ide_nop_int,
|
||||
.set_inactive = ide_nop,
|
||||
.restart_cb = ide_nop_restart,
|
||||
.reset = ide_nop,
|
||||
};
|
||||
|
||||
static void macio_ide_realizefn(DeviceState *dev, Error **errp)
|
||||
{
|
||||
MACIOIDEState *s = MACIO_IDE(dev);
|
||||
|
||||
ide_init2(&s->bus, s->irq);
|
||||
|
||||
/* Register DMA callbacks */
|
||||
s->dma.ops = &dbdma_ops;
|
||||
s->bus.dma = &s->dma;
|
||||
}
|
||||
|
||||
static void macio_ide_initfn(Object *obj)
|
||||
|
@ -414,6 +453,7 @@ void macio_ide_init_drives(MACIOIDEState *s, DriveInfo **hd_table)
|
|||
|
||||
void macio_ide_register_dma(MACIOIDEState *s, void *dbdma, int channel)
|
||||
{
|
||||
s->dbdma = dbdma;
|
||||
DBDMA_register_channel(dbdma, channel, s->dma_irq,
|
||||
pmac_ide_transfer, pmac_ide_flush, s);
|
||||
}
|
||||
|
|
|
@ -131,6 +131,8 @@ typedef struct MACIOIDEState {
|
|||
MemoryRegion mem;
|
||||
IDEBus bus;
|
||||
BlockDriverAIOCB *aiocb;
|
||||
IDEDMA dma;
|
||||
void *dbdma;
|
||||
} MACIOIDEState;
|
||||
|
||||
void macio_ide_init_drives(MACIOIDEState *ide, DriveInfo **hd_table);
|
||||
|
|
Loading…
Reference in New Issue