Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 16 Aug 2010 19:53:06 GMT
From:      Jakub Wojciech Klama <jceel@FreeBSD.org>
To:        Perforce Change Reviews <perforce@freebsd.org>
Subject:   PERFORCE change 182478 for review
Message-ID:  <201008161953.o7GJr6jN018896@skunkworks.freebsd.org>

next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@182478?ac=10

Change 182478 by jceel@jceel on 2010/08/16 19:53:04

	Sync DMA maps in the proper way.

Affected files ...

.. //depot/projects/soc2010/jceel_dma/sys/arm/davinci/davinci_edma.c#7 edit
.. //depot/projects/soc2010/jceel_dma/sys/arm/davinci/davinci_mmc.c#3 edit

Differences ...

==== //depot/projects/soc2010/jceel_dma/sys/arm/davinci/davinci_edma.c#7 (text+ko) ====

@@ -71,7 +71,7 @@
 #include "gpdma_if.h"
 
 #define	DEBUG
-//#undef	DEBUG
+#undef	DEBUG
 #ifdef	DEBUG
 #define	debugf(fmt, args...) do { \
 	            printf("edma: " fmt "\n", ##args); } while (0)
@@ -289,13 +289,15 @@
 		ret = davinci_edma_setupdesc(xfer->dt_next, &link_desc);
 		if (ret)
 			return (ret);
-		debugf("calling davinci_edma_copydesc(&link_desc=%p, chno=%d)\n", &link_desc, chno + 64);
+		
 		davinci_edma_copydesc(sc, &link_desc, chno + 64);
 	}
 
+#if 0
 	/* Enable channel interrupts */
-//	if ((xfer->dt_flags & GPDMA_TRANSFER_EXTTRIG) == 0)
-//		davinci_edma_enable_channel(sc, chno);
+	if ((xfer->dt_flags & GPDMA_TRANSFER_EXTTRIG) == 0)
+		davinci_edma_enable_channel(sc, chno);
+#endif
 
 	if (chno > 31) {
 		chno -= 32;
@@ -454,24 +456,27 @@
 
 			KASSERT(ch->dc_status != CHANNEL_IDLE, ("invalid channel state"));
 
-	printf("src dmatag=%p dst dmatag=%p src dmamap=%p dst dmamap=%p\n", xfer->dt_src.db_dmatag, xfer->dt_dst.db_dmatag, xfer->dt_src.db_dmamap, xfer->dt_dst.db_dmamap);
-	bus_dmamap_sync(xfer->dt_src.db_dmatag, xfer->dt_src.db_dmamap, BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
-	bus_dmamap_sync(xfer->dt_dst.db_dmatag, xfer->dt_dst.db_dmamap, BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTWRITE);
+			if (xfer->dt_src.db_needsync) {
+				bus_dmamap_sync(xfer->dt_src.db_dmatag,
+				    xfer->dt_src.db_dmamap, 
+				    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+			}
 
+			if (xfer->dt_dst.db_needsync) {
+				bus_dmamap_sync(xfer->dt_dst.db_dmatag, 
+				    xfer->dt_dst.db_dmamap,
+				    BUS_DMASYNC_POSTWRITE | BUS_DMASYNC_POSTWRITE);
+			}
 
-
 			if (xfer->dt_callback != NULL) {
 				xfer->dt_callback(GPDMA_TRANSFER_COMPLETED,
 				    xfer->dt_callback_arg);
 			}
 		
-			if (chno > 32) { 
+			if (chno > 32) 
 				davinci_write_edmacc_4(sc, DAVINCI_EDMACC_ICRH, (1 << (chno - 32)));
-		//		davinci_write_edmacc_4(sc, DAVINCI_EDMACC_ECRH, (1 << (chno - 32)));
-			} else {
+			else
 				davinci_write_edmacc_4(sc, DAVINCI_EDMACC_ICR, (1 << chno));
-		//		davinci_write_edmacc_4(sc, DAVINCI_EDMACC_ECR, (1 << chno));
-			}
 
 			ipr &= ~(1ULL << chno);
 
@@ -668,7 +673,7 @@
 		srcbidx = acnt;
 	}
 
-	//if ((xfer->dt_flags & GPDMA_TRANSFER_STRIDE_SYNC) == 0)
+	if ((xfer->dt_flags & GPDMA_TRANSFER_STRIDE_STOP) == 0)
 		desc->edma_opt |= DAVINCI_EDMA_OPT_SYNCDIM;
 
 	/* Set up DMA descriptor */

==== //depot/projects/soc2010/jceel_dma/sys/arm/davinci/davinci_mmc.c#3 (text+ko) ====

@@ -279,13 +279,9 @@
 		
 		/* Pre-set some transfer settings */
 		gpdma_set_transfer_func(sc->dm_rx_xfer, GPDMA_COPY);
-		gpdma_set_transfer_opts(sc->dm_rx_xfer, GPDMA_TRANSFER_EXTTRIG | 
-		    GPDMA_TRANSFER_STRIDE_SYNC);
+		gpdma_set_transfer_opts(sc->dm_rx_xfer, GPDMA_TRANSFER_EXTTRIG);
 		gpdma_set_transfer_callback(sc->dm_rx_xfer, davinci_mmc_dmarxintr, sc);
 		
-		sc->dm_rx_xfer->dt_dst.db_dmatag = sc->dm_rx_tag;
-		sc->dm_rx_xfer->dt_dst.db_dmamap = sc->dm_rx_map;
-
 		/* Source buffer */
 		gpdma_set_buffer_layout(sc->dm_rx_xfer, GPDMA_BUF_SRC, GPDMABUF_FRAME);
 		gpdma_set_buffer_flags(sc->dm_rx_xfer, GPDMA_BUF_SRC, GPDMA_BUFFER_FIFO);
@@ -462,11 +458,6 @@
 
 	/* Data receive|transmit ready */
 	if (mmcst0 & (DAVINCI_MMC_DRRDY | DAVINCI_MMC_DXRDY)) {
-	//	if (mmcst0 & DAVINCI_MMC_DRRDY)
-	//		printf("davinci_mmc: DAVINCI_MMC_DRRDY\n");
-	//	if (mmcst0 & DAVINCI_MMC_DXRDY)
-	//		printf("davinci_mmc: DAVINCI_MMC_DXRDY\n");
-	
 		if (!sc->dm_use_dma)
 			davinci_mmc_fifo_xfer(sc);
 	}
@@ -481,7 +472,13 @@
 		if (!sc->dm_use_dma)
 			davinci_mmc_fifo_xfer(sc);
 		else if (sc->dm_xfer_direction == DIRECTION_READ) {
-			memcpy(sc->dm_data->data, sc->dm_rx_buffer, sc->dm_data->len);
+			bus_dmamap_sync(sc->dm_rx_tag, sc->dm_rx_map,
+			    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
+			memcpy(sc->dm_data->data, sc->dm_rx_buffer,
+			    sc->dm_data->len);
+		} else {
+			bus_dmamap_sync(sc->dm_tx_tag, sc->dm_tx_map,
+			    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
 		}
 
 		if (sc->dm_req->stop) {
@@ -494,16 +491,16 @@
 		}
 	}
 
-//#if 0
+#if 0
 	/* Transfer done */
 	if (mmcst0 & DAVINCI_MMC_TRNDNE) {
-	//	device_printf(sc->dm_dev, "transfer done\n");
+		device_printf(sc->dm_dev, "transfer done\n");
 		/* 
 		 * Not sure what to do here... probably we don't need
 		 * this interrupt.
 		 */
 	}
-//#endif
+#endif
 
 	/* Request is done */
 	if (done) {
@@ -626,7 +623,10 @@
 			    sc->dm_rx_phys, sc->dm_data->len);
 			gpdma_program_transfer(sc->dm_rx_xfer, &cookie);
 	
-			debugf("### READ data buffer: %p\n", sc->dm_data->data);
+			bus_dmamap_sync(sc->dm_rx_tag, sc->dm_rx_map,
+			    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
+
+			debugf("READ data buffer: %p\n", sc->dm_data->data);
 
 			break;
 		case DIRECTION_WRITE:
@@ -638,8 +638,11 @@
 			    (bus_addr_t)(DAVINCI_CFGBUS_PHYS_BASE + 0x210000 +
 			    DAVINCI_MMC_MMCDXR), sc->dm_data->len);
 			gpdma_program_transfer(sc->dm_tx_xfer, &cookie);
+
+			bus_dmamap_sync(sc->dm_tx_tag, sc->dm_tx_map,
+			    BUS_DMASYNC_PREREAD | BUS_DMASYNC_PREWRITE);
 		
-			debugf("### WRITE data buffer: %p\n", sc->dm_data->data);
+			debugf("WRITE data buffer: %p\n", sc->dm_data->data);
 
 			break;
 		default:



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201008161953.o7GJr6jN018896>