qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Alexander Graf <agraf@suse.de>
To: qemu-ppc@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
	programmingkidx@gmail.com, mark.cave-ayland@ilande.co.uk,
	qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 13/15] PPC: dbdma: Wait for DMA until we have data
Date: Sun, 30 Jun 2013 03:27:07 +0200	[thread overview]
Message-ID: <1372555629-17976-14-git-send-email-agraf@suse.de> (raw)
In-Reply-To: <1372555629-17976-1-git-send-email-agraf@suse.de>

We should only start processing DMA requests when we have data to process.
Hold off working through the DMA shuffling until the IDE core told us that
it's ready.

This is required because the guest can program the DMA engine or the IDE
transfer first. Both are legal.

Signed-off-by: Alexander Graf <agraf@suse.de>
---
 hw/ide/macio.c | 19 +++++++++++++++++++
 hw/ppc/mac.h   |  1 +
 2 files changed, 20 insertions(+)

diff --git a/hw/ide/macio.c b/hw/ide/macio.c
index bd1b972..095e1f1 100644
--- a/hw/ide/macio.c
+++ b/hw/ide/macio.c
@@ -59,6 +59,14 @@ static void pmac_ide_atapi_transfer_cb(void *opaque, int ret)
         goto done;
     }
 
+    if (!m->dma_active) {
+        MACIO_DPRINTF("waiting for data (%#x - %#x - %x)\n",
+                      s->nsector, io->len, s->status);
+        /* data not ready yet, wait for the channel to get restarted */
+        io->processing = 0;
+        return;
+    }
+
     MACIO_DPRINTF("io_buffer_size = %#x\n", s->io_buffer_size);
 
     if (s->io_buffer_size > 0) {
@@ -76,6 +84,7 @@ static void pmac_ide_atapi_transfer_cb(void *opaque, int ret)
     if (s->packet_transfer_size <= 0) {
         MACIO_DPRINTF("end of transfer\n");
         ide_atapi_cmd_ok(s);
+        m->dma_active = false;
     }
 
     /* end of DMA ? */
@@ -127,6 +136,14 @@ static void pmac_ide_transfer_cb(void *opaque, int ret)
         goto done;
     }
 
+    if (!m->dma_active) {
+        MACIO_DPRINTF("waiting for data (%#x - %#x - %x)\n",
+                      s->nsector, io->len, s->status);
+        /* data not ready yet, wait for the channel to get restarted */
+        io->processing = 0;
+        return;
+    }
+
     sector_num = ide_get_sector(s);
     MACIO_DPRINTF("io_buffer_size = %#x\n", s->io_buffer_size);
     if (s->io_buffer_size > 0) {
@@ -143,6 +160,7 @@ static void pmac_ide_transfer_cb(void *opaque, int ret)
         MACIO_DPRINTF("end of transfer\n");
         s->status = READY_STAT | SEEK_STAT;
         ide_set_irq(s->bus);
+        m->dma_active = false;
     }
 
     /* end of DMA ? */
@@ -379,6 +397,7 @@ static void ide_dbdma_start(IDEDMA *dma, IDEState *s,
     MACIOIDEState *m = container_of(dma, MACIOIDEState, dma);
 
     MACIO_DPRINTF("\n", __LINE__);
+    m->dma_active = true;
     DBDMA_kick(m->dbdma);
 }
 
diff --git a/hw/ppc/mac.h b/hw/ppc/mac.h
index 27c4ca3..1e578dd 100644
--- a/hw/ppc/mac.h
+++ b/hw/ppc/mac.h
@@ -133,6 +133,7 @@ typedef struct MACIOIDEState {
     BlockDriverAIOCB *aiocb;
     IDEDMA dma;
     void *dbdma;
+    bool dma_active;
 } MACIOIDEState;
 
 void macio_ide_init_drives(MACIOIDEState *ide, DriveInfo **hd_table);
-- 
1.8.1.4

  parent reply	other threads:[~2013-06-30  1:27 UTC|newest]

Thread overview: 23+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-30  1:26 [Qemu-devel] [PATCH 00/15] PPC: Mac OS X guest bringup Alexander Graf
2013-06-30  1:26 ` [Qemu-devel] [PATCH 01/15] PPC: Mac: Fix guest exported tbfreq values Alexander Graf
2013-06-30  1:26 ` [Qemu-devel] [PATCH 02/15] PPC: g3beige: Move secondary IDE bus to mac-io Alexander Graf
2013-06-30  6:33   ` Andreas Färber
2013-06-30 23:18     ` Alexander Graf
2013-06-30  1:26 ` [Qemu-devel] [PATCH 03/15] PPC: Macio: Replace tabs with spaces Alexander Graf
2013-06-30  1:26 ` [Qemu-devel] [PATCH 04/15] PPC: dbdma: " Alexander Graf
2013-06-30  6:35   ` Andreas Färber
2013-06-30 11:21     ` Alexander Graf
2013-06-30  1:26 ` [Qemu-devel] [PATCH 05/15] PPC: Mac: Add debug prints in macio and dbdma code Alexander Graf
2013-06-30  6:42   ` Andreas Färber
2013-06-30 23:30     ` Alexander Graf
2013-06-30  1:27 ` [Qemu-devel] [PATCH 06/15] PPC: dbdma: Fix debug print Alexander Graf
2013-06-30  1:27 ` [Qemu-devel] [PATCH 07/15] PPC: dbdma: Allow new commands in RUN state Alexander Graf
2013-06-30  1:27 ` [Qemu-devel] [PATCH 08/15] PPC: dbdma: Move defines into header file Alexander Graf
2013-06-30  1:27 ` [Qemu-devel] [PATCH 09/15] PPC: dbdma: Introduce kick function Alexander Graf
2013-06-30  1:27 ` [Qemu-devel] [PATCH 10/15] PPC: dbdma: Move static bh variable to device struct Alexander Graf
2013-06-30  1:27 ` [Qemu-devel] [PATCH 11/15] PPC: dbdma: macio: Add DMA callback Alexander Graf
2013-06-30  1:27 ` [Qemu-devel] [PATCH 12/15] PPC: dbdma: Move processing to io Alexander Graf
2013-06-30  6:48   ` Andreas Färber
2013-06-30 23:35     ` Alexander Graf
2013-06-30  1:27 ` Alexander Graf [this message]
2013-06-30  1:27 ` [Qemu-devel] [PATCH 14/15] PPC: dbdma: Support unaligned DMA access Alexander Graf

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1372555629-17976-14-git-send-email-agraf@suse.de \
    --to=agraf@suse.de \
    --cc=kwolf@redhat.com \
    --cc=mark.cave-ayland@ilande.co.uk \
    --cc=programmingkidx@gmail.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).