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>