From owner-p4-projects@FreeBSD.ORG Fri Sep 3 21:51:10 2010 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id E97C710656BE; Fri, 3 Sep 2010 21:51:09 +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 93F6610656B8 for ; Fri, 3 Sep 2010 21:51:09 +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 666688FC0A for ; Fri, 3 Sep 2010 21:51:09 +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 o83Lp9Zl053723 for ; Fri, 3 Sep 2010 21:51:09 GMT (envelope-from jceel@freebsd.org) Received: (from perforce@localhost) by skunkworks.freebsd.org (8.14.4/8.14.4/Submit) id o83Lp9Gc053720 for perforce@freebsd.org; Fri, 3 Sep 2010 21:51:09 GMT (envelope-from jceel@freebsd.org) Date: Fri, 3 Sep 2010 21:51:09 GMT Message-Id: <201009032151.o83Lp9Gc053720@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 183321 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: Fri, 03 Sep 2010 21:51:10 -0000 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 *);