PERFORCE change 182478 for review
Jakub Wojciech Klama
jceel at FreeBSD.org
Mon Aug 16 19:53:08 UTC 2010
http://p4web.freebsd.org/@@182478?ac=10
Change 182478 by jceel at 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:
More information about the p4-projects
mailing list