summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAmadeusz Sławiński <amade@asmblr.net>2013-02-21 07:34:11 +0000
committerAlexander Graf <agraf@suse.de>2013-03-08 21:04:53 +0100
commit987422bc4a4c6366ca6a7fbfa38a9920fd7ada2f (patch)
treebd74c61b98681253bb0d781e190a2537ead3332d
parente13da40448fabb0829d75b01dc57da5f44f391b3 (diff)
downloadhqemu-987422bc4a4c6366ca6a7fbfa38a9920fd7ada2f.zip
hqemu-987422bc4a4c6366ca6a7fbfa38a9920fd7ada2f.tar.gz
PPC: xnu kernel expects FLUSH to be cleared on STOP
otherwise it gets stuck in a loop so clear it when unsetting run when flush is set void IODBDMAStop( volatile IODBDMAChannelRegisters *registers) { IOSetDBDMAChannelControl( registers, IOClearDBDMAChannelControlBits( kdbdmaRun ) | IOSetDBDMAChannelControlBits( kdbdmaFlush )); DBDMA: writel 0x0000000000000b00 <= 0xa0002000 DBDMA: channel 0x16 reg 0x0 DBDMA: status 0x00002000 while( IOGetDBDMAChannelStatus( registers) & ( kdbdmaActive | kdbdmaFlush)) eieio(); DBDMA: readl 0x0000000000000b04 => 0x00002000 DBDMA: channel 0x16 reg 0x1 DBDMA: readl 0x0000000000000b04 => 0x00002000 DBDMA: channel 0x16 reg 0x1 DBDMA: readl 0x0000000000000b04 => 0x00002000 DBDMA: channel 0x16 reg 0x1 DBDMA: readl 0x0000000000000b04 => 0x00002000 DBDMA: channel 0x16 reg 0x1 it continues to get printed } Signed-off-by: Amadeusz Sławiński <amade@asmblr.net> [agraf: replace tabs with spaces] Signed-off-by: Alexander Graf <agraf@suse.de>
-rw-r--r--hw/mac_dbdma.c4
1 files changed, 4 insertions, 0 deletions
diff --git a/hw/mac_dbdma.c b/hw/mac_dbdma.c
index b894ab2..73d74c2 100644
--- a/hw/mac_dbdma.c
+++ b/hw/mac_dbdma.c
@@ -688,6 +688,10 @@ dbdma_control_write(DBDMA_channel *ch)
if ((ch->regs[DBDMA_STATUS] & RUN) && !(status & RUN)) {
/* RUN is cleared */
status &= ~(ACTIVE|DEAD);
+ if ((status & FLUSH) && ch->flush) {
+ ch->flush(&ch->io);
+ status &= ~FLUSH;
+ }
}
DBDMA_DPRINTF(" status 0x%08x\n", status);
OpenPOWER on IntegriCloud