qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v3 16/16] [RFC] dma/rc4030: do multiple calls to


From: Hervé Poussineau
Subject: Re: [Qemu-devel] [PATCH v3 16/16] [RFC] dma/rc4030: do multiple calls to address_space_rw when doing DMA transfers
Date: Wed, 10 Jun 2015 21:37:11 +0200
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Icedove/31.7.0

Hi Leon,

Le 10/06/2015 14:00, Leon Alrae a écrit :
Hi Hervé,

On 03/06/2015 21:45, Hervé Poussineau wrote:
This fixes Windows NT 4.0/MIPS, which was always bugchecking with
IRQL_NOT_LESS_OR_EQUAL.

Signed-off-by: Hervé Poussineau <address@hidden>
---
  hw/dma/rc4030.c | 14 ++++++++++++--
  1 file changed, 12 insertions(+), 2 deletions(-)

diff --git a/hw/dma/rc4030.c b/hw/dma/rc4030.c
index 3efa6de..deac0a8 100644
--- a/hw/dma/rc4030.c
+++ b/hw/dma/rc4030.c
@@ -681,6 +681,7 @@ static void rc4030_do_dma(void *opaque, int n, uint8_t 
*buf, int len, int is_wri
      rc4030State *s = opaque;
      hwaddr dma_addr;
      int dev_to_mem;
+    int i;

      s->dma_regs[n][DMA_REG_ENABLE] &= ~(DMA_FLAG_TC_INTR | DMA_FLAG_MEM_INTR 
| DMA_FLAG_ADDR_INTR);

@@ -699,8 +700,17 @@ static void rc4030_do_dma(void *opaque, int n, uint8_t 
*buf, int len, int is_wri
      dma_addr = s->dma_regs[n][DMA_REG_ADDRESS];

      /* Read/write data at right place */
-    address_space_rw(&s->dma_as, dma_addr, MEMTXATTRS_UNSPECIFIED,
-                     buf, len, is_write);
+    for (i = 0; i < len; ) {
+        int ncpy = DMA_PAGESIZE - (dma_addr & (DMA_PAGESIZE - 1));
+        if (ncpy > len - i) {
+            ncpy = len - i;
+        }
+        address_space_rw(&s->dma_as, dma_addr, MEMTXATTRS_UNSPECIFIED,
+                         buf + i, ncpy, is_write);
+
+        dma_addr += ncpy;
+        i += ncpy;
+    }

      s->dma_regs[n][DMA_REG_ENABLE] |= DMA_FLAG_TC_INTR;
      s->dma_regs[n][DMA_REG_COUNT] -= len;


I'm sending out current target-mips queue soon and I can include this series,
but I'm not quite sure what to do with this RFC patch. I presume you put RFC
here because it's a workaround for a bug, but it's not clear where the actual
bug is?

Indeed, that's a workaround for a bug that I failed to identify. You can still 
take the RFC patch as a patch, as I didn't see any objection (yet).
I think we can defer the bug correction for later.

Regards,

Hervé




reply via email to

[Prev in Thread] Current Thread [Next in Thread]