Date: Fri, 3 Sep 2010 21:51:09 GMT From: Jakub Wojciech Klama <jceel@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 183321 for review Message-ID: <201009032151.o83Lp9Gc053720@skunkworks.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/@@183321?ac=10 Change 183321 by jceel@jceel on 2010/09/03 21:50:34 Move syncing DMA maps and calling transfer callbacks from DMA engine driver to GPDMA framework. Affected files ... .. //depot/projects/soc2010/jceel_dma/sys/arm/davinci/davinci_edma.c#8 edit .. //depot/projects/soc2010/jceel_dma/sys/dev/gpdma/gpdma.c#5 edit .. //depot/projects/soc2010/jceel_dma/sys/dev/gpdma/gpdma.h#5 edit Differences ... ==== //depot/projects/soc2010/jceel_dma/sys/arm/davinci/davinci_edma.c#8 (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) @@ -456,23 +456,8 @@ KASSERT(ch->dc_status != CHANNEL_IDLE, ("invalid channel state")); - 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); - } + gpdma_transfer_done(xfer, GPDMA_TRANSFER_COMPLETED); - 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) davinci_write_edmacc_4(sc, DAVINCI_EDMACC_ICRH, (1 << (chno - 32))); else @@ -518,10 +503,7 @@ KASSERT(ch->dc_status != CHANNEL_IDLE, ("invalid channel state")); - if (xfer->dt_callback != NULL) { - xfer->dt_callback(GPDMA_TRANSFER_ERROR, - xfer->dt_callback_arg); - } + gpdma_transfer_done(xfer, GPDMA_TRANSFER_ERROR); ch->dc_status = CHANNEL_IDLE; @@ -553,8 +535,6 @@ static void davinci_edma_tcerr(struct davinci_edma_softc *sc, int tc) { -// struct davinci_edma_channel *ch; -// struct gpdma_transfer *xfer; uint32_t errstat, errdet; int chno; @@ -575,9 +555,6 @@ device_printf(sc->ds_dev, "Transfer descriptor that has failed:\n"); davinci_edma_printdesc(sc, chno); -// ch = &sc->ds_channels[chno]; -// xfer = ch->dc_xfer; - panic("DMA transfer controller error"); } ==== //depot/projects/soc2010/jceel_dma/sys/dev/gpdma/gpdma.c#5 (text+ko) ==== @@ -46,7 +46,7 @@ #include "gpdma_if.h" #define DEBUG -#undef DEBUG +//#undef DEBUG #ifdef DEBUG #define debugf(fmt, args...) do { \ printf("gpdma: " fmt "\n", ##args); } while (0) @@ -356,6 +356,33 @@ free(xfer, M_GPDMA); } +void +gpdma_transfer_done(struct gpdma_transfer *xfer, int status) +{ + 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); + bus_dmamap_unload(xfer->dt_src.db_dmatag, + xfer->dt_src.db_dmamap); + bus_dmamap_destroy(xfer->dt_src.db_dmatag, + xfer->dt_src.db_dmamap); + } + + 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); + bus_dmamap_unload(xfer->dt_dst.db_dmatag, + xfer->dt_src.db_dmamap); + bus_dmamap_destroy(xfer->dt_dst.db_dmatag, + xfer->dt_dst.db_dmamap); + } + + if (xfer->dt_callback != NULL) + xfer->dt_callback(status, xfer->dt_callback_arg); +} + int gpdma_load_buffer_raw(struct gpdma_transfer *xfer, int buffer, bus_addr_t paddr, bus_size_t length) ==== //depot/projects/soc2010/jceel_dma/sys/dev/gpdma/gpdma.h#5 (text+ko) ==== @@ -161,6 +161,8 @@ int gpdma_stop_transfer(void *); int gpdma_get_transfer_status(void *); +void gpdma_transfer_done(struct gpdma_transfer *, int); + int gpdma_load_buffer_raw(gpdma_transfer_t, int, bus_addr_t, bus_size_t); int gpdma_load_buffer_virt(gpdma_transfer_t, int, void *, size_t); int gpdma_load_buffer_uio(gpdma_transfer_t, int, struct uio *);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201009032151.o83Lp9Gc053720>