From owner-p4-projects@FreeBSD.ORG Mon Aug 16 19:53:08 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id EC5891065729; Mon, 16 Aug 2010 19:53:07 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 0153A1065674 for ; Mon, 16 Aug 2010 19:53:07 +0000 (UTC) (envelope-from jceel@freebsd.org) Received: from skunkworks.freebsd.org (skunkworks.freebsd.org [IPv6:2001:4f8:fff6::2d]) by mx1.freebsd.org (Postfix) with ESMTP id E238E8FC22 for ; Mon, 16 Aug 2010 19:53:06 +0000 (UTC) Received: from skunkworks.freebsd.org (localhost [127.0.0.1]) by skunkworks.freebsd.org (8.14.4/8.14.4) with ESMTP id o7GJr6WK018899 for ; Mon, 16 Aug 2010 19:53:06 GMT (envelope-from jceel@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id o7GJr6jN018896 for perforce@freebsd.org; Mon, 16 Aug 2010 19:53:06 GMT (envelope-from jceel@freebsd.org) Date: Mon, 16 Aug 2010 19:53:06 GMT Message-Id: <201008161953.o7GJr6jN018896@skunkworks.freebsd.org> X-Authentication-Warning: skunkworks.freebsd.org: perforce set sender to jceel@freebsd.org using -f From: Jakub Wojciech Klama To: Perforce Change Reviews Precedence: bulk Cc: Subject: PERFORCE change 182478 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 16 Aug 2010 19:53:08 -0000 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: