Module Name:    src
Committed By:   jmcneill
Date:           Sun Aug  6 17:13:15 UTC 2017

Modified Files:
        src/sys/arch/arm/sunxi: sun6i_dma.c

Log Message:
Fix burst field encoding, and add a helper function to dump registers
from ddb.


To generate a diff of this commit:
cvs rdiff -u -r1.1 -r1.2 src/sys/arch/arm/sunxi/sun6i_dma.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/arm/sunxi/sun6i_dma.c
diff -u src/sys/arch/arm/sunxi/sun6i_dma.c:1.1 src/sys/arch/arm/sunxi/sun6i_dma.c:1.2
--- src/sys/arch/arm/sunxi/sun6i_dma.c:1.1	Sat Aug  5 17:51:49 2017
+++ src/sys/arch/arm/sunxi/sun6i_dma.c	Sun Aug  6 17:13:15 2017
@@ -1,4 +1,4 @@
-/* $NetBSD: sun6i_dma.c,v 1.1 2017/08/05 17:51:49 jmcneill Exp $ */
+/* $NetBSD: sun6i_dma.c,v 1.2 2017/08/06 17:13:15 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2014-2017 Jared McNeill <jmcne...@invisible.ca>
@@ -26,8 +26,10 @@
  * SUCH DAMAGE.
  */
 
+#include "opt_ddb.h"
+
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sun6i_dma.c,v 1.1 2017/08/05 17:51:49 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sun6i_dma.c,v 1.2 2017/08/06 17:13:15 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/bus.h>
@@ -212,8 +214,8 @@ sun6idma_transfer(device_t dev, void *pr
 
 	mem_width = DMA_CFG_DATA_WIDTH(req->dreq_mem_opt.opt_bus_width);
 	dev_width = DMA_CFG_DATA_WIDTH(req->dreq_dev_opt.opt_bus_width);
-	mem_burst = DMA_CFG_BST_LEN(req->dreq_mem_opt.opt_burst_len / NBBY);
-	dev_burst = DMA_CFG_BST_LEN(req->dreq_dev_opt.opt_burst_len / NBBY);
+	mem_burst = DMA_CFG_BST_LEN(req->dreq_mem_opt.opt_burst_len);
+	dev_burst = DMA_CFG_BST_LEN(req->dreq_dev_opt.opt_burst_len);
 
 	mem_cfg = __SHIFTIN(mem_width, DMA_CFG_SRC_DATA_WIDTH) |
 	    __SHIFTIN(mem_burst, DMA_CFG_SRC_BST_LEN) |
@@ -249,6 +251,12 @@ sun6idma_transfer(device_t dev, void *pr
 	    ch->ch_dmamap->dm_segs[0].ds_addr);
 	DMA_WRITE(sc, DMA_EN_REG(ch->ch_index), DMA_EN_EN);
 
+	if ((DMA_READ(sc, DMA_EN_REG(ch->ch_index)) & DMA_EN_EN) == 0) {
+		aprint_error_dev(sc->sc_dev,
+		    "DMA Channel %u failed to start\n", ch->ch_index);
+		return EIO;
+	}
+
 	return 0;
 }
 
@@ -406,3 +414,40 @@ sun6idma_attach(device_t parent, device_
 
 CFATTACH_DECL_NEW(sun6i_dma, sizeof(struct sun6idma_softc),
         sun6idma_match, sun6idma_attach, NULL, NULL);
+
+#ifdef DDB
+void sun6idma_dump(void);
+
+void
+sun6idma_dump(void)
+{
+	struct sun6idma_softc *sc;
+	device_t dev;
+	u_int index;
+
+	dev = device_find_by_driver_unit("sun6idma", 0);
+	if (dev == NULL)
+		return;
+	sc = device_private(dev);
+
+	device_printf(dev, "DMA_IRQ_EN_REG0_REG:   %08x\n", DMA_READ(sc, DMA_IRQ_EN_REG0_REG));
+	device_printf(dev, "DMA_IRQ_EN_REG1_REG:   %08x\n", DMA_READ(sc, DMA_IRQ_EN_REG1_REG));
+	device_printf(dev, "DMA_IRQ_PEND_REG0_REG: %08x\n", DMA_READ(sc, DMA_IRQ_PEND_REG0_REG));
+	device_printf(dev, "DMA_IRQ_PEND_REG1_REG: %08x\n", DMA_READ(sc, DMA_IRQ_PEND_REG1_REG));
+	device_printf(dev, "DMA_STA_REG:           %08x\n", DMA_READ(sc, DMA_STA_REG));
+
+	for (index = 0; index < sc->sc_nchan; index++) {
+		struct sun6idma_channel *ch = &sc->sc_chan[index];
+		if (ch->ch_callback == NULL)
+			continue;
+		device_printf(dev, " %2d: DMA_EN_REG:         %08x\n", index, DMA_READ(sc, DMA_EN_REG(index)));
+		device_printf(dev, " %2d: DMA_PAU_REG:        %08x\n", index, DMA_READ(sc, DMA_PAU_REG(index)));
+		device_printf(dev, " %2d: DMA_START_ADDR_REG: %08x\n", index, DMA_READ(sc, DMA_START_ADDR_REG(index)));
+		device_printf(dev, " %2d: DMA_CFG_REG:        %08x\n", index, DMA_READ(sc, DMA_CFG_REG(index)));
+		device_printf(dev, " %2d: DMA_CUR_SRC_REG:    %08x\n", index, DMA_READ(sc, DMA_CUR_SRC_REG(index)));
+		device_printf(dev, " %2d: DMA_CUR_DEST_REG:   %08x\n", index, DMA_READ(sc, DMA_CUR_DEST_REG(index)));
+		device_printf(dev, " %2d: DMA_BCNT_LEFT_REG:  %08x\n", index, DMA_READ(sc, DMA_BCNT_LEFT_REG(index)));
+		device_printf(dev, " %2d: DMA_PARA_REG:       %08x\n", index, DMA_READ(sc, DMA_PARA_REG(index)));
+	}
+}
+#endif

Reply via email to