Module Name: src Committed By: matt Date: Fri Oct 19 13:46:07 UTC 2012
Modified Files: src/sys/arch/arm/arm32: bus_dma.c src/sys/arch/arm/include: bus_defs.h bus_funcs.h Log Message: Make IS_BOUNCING a map flag and use it to simplify code and to avoid calling the sync routines if (COHERENT|IS_BOUNCING) == COHERENT. (this eeks out a little bit more performance). To generate a diff of this commit: cvs rdiff -u -r1.62 -r1.63 src/sys/arch/arm/arm32/bus_dma.c cvs rdiff -u -r1.3 -r1.4 src/sys/arch/arm/include/bus_defs.h \ src/sys/arch/arm/include/bus_funcs.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/arm32/bus_dma.c diff -u src/sys/arch/arm/arm32/bus_dma.c:1.62 src/sys/arch/arm/arm32/bus_dma.c:1.63 --- src/sys/arch/arm/arm32/bus_dma.c:1.62 Fri Oct 19 11:57:58 2012 +++ src/sys/arch/arm/arm32/bus_dma.c Fri Oct 19 13:46:07 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_dma.c,v 1.62 2012/10/19 11:57:58 matt Exp $ */ +/* $NetBSD: bus_dma.c,v 1.63 2012/10/19 13:46:07 matt Exp $ */ /*- * Copyright (c) 1996, 1997, 1998 The NetBSD Foundation, Inc. @@ -33,7 +33,7 @@ #define _ARM32_BUS_DMA_PRIVATE #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.62 2012/10/19 11:57:58 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: bus_dma.c,v 1.63 2012/10/19 13:46:07 matt Exp $"); #include <sys/param.h> #include <sys/systm.h> @@ -270,6 +270,7 @@ _bus_dma_load_bouncebuf(bus_dma_tag_t t, map->_dm_buftype = buftype; /* ...so _bus_dmamap_sync() knows we're bouncing */ + map->_dm_flags |= _BUS_DMAMAP_IS_BOUNCING; cookie->id_flags |= _BUS_DMA_IS_BOUNCING; return 0; } @@ -436,6 +437,7 @@ _bus_dmamap_load(bus_dma_tag_t t, bus_dm if (cookie->id_flags & _BUS_DMA_IS_BOUNCING) { STAT_INCR(bounced_unloads); cookie->id_flags &= ~_BUS_DMA_IS_BOUNCING; + map->_dm_flags &= ~_BUS_DMAMAP_IS_BOUNCING; } } else #endif @@ -502,6 +504,7 @@ _bus_dmamap_load_mbuf(bus_dma_tag_t t, b if (cookie->id_flags & _BUS_DMA_IS_BOUNCING) { STAT_INCR(bounced_unloads); cookie->id_flags &= ~_BUS_DMA_IS_BOUNCING; + map->_dm_flags &= ~_BUS_DMAMAP_IS_BOUNCING; } } else #endif @@ -760,14 +763,11 @@ static inline void _bus_dmamap_sync_linear(bus_dma_tag_t t, bus_dmamap_t map, bus_addr_t offset, bus_size_t len, int ops) { -#ifdef _ARM32_NEED_BUS_DMA_BOUNCE - struct arm32_bus_dma_cookie * const cookie = map->_dm_cookie; - bool bouncing = (cookie != NULL && (cookie->id_flags & _BUS_DMA_IS_BOUNCING)); -#endif bus_dma_segment_t *ds = map->dm_segs; vaddr_t va = (vaddr_t) map->_dm_origbuf; #ifdef _ARM32_NEED_BUS_DMA_BOUNCE - if (bouncing) { + if (map->_dm_flags & _BUS_DMAMAP_IS_BOUNCING) { + struct arm32_bus_dma_cookie * const cookie = map->_dm_cookie; va = (vaddr_t) cookie->id_bouncebuf; } #endif @@ -902,8 +902,6 @@ void _bus_dmamap_sync(bus_dma_tag_t t, bus_dmamap_t map, bus_addr_t offset, bus_size_t len, int ops) { - bool bouncing = false; - #ifdef DEBUG_DMA printf("dmamap_sync: t=%p map=%p offset=%lx len=%lx ops=%x\n", t, map, offset, len, ops); @@ -940,8 +938,9 @@ _bus_dmamap_sync(bus_dma_tag_t t, bus_dm * POSTWRITE -- Nothing. */ #ifdef _ARM32_NEED_BUS_DMA_BOUNCE - struct arm32_bus_dma_cookie * const cookie = map->_dm_cookie; - bouncing = (cookie != NULL && (cookie->id_flags & _BUS_DMA_IS_BOUNCING)); + const bool bouncing = (map->_dm_flags & _BUS_DMA_IS_BOUNCING); +#else + const bool bouncing = false; #endif const int pre_ops = ops & (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE); @@ -951,6 +950,7 @@ _bus_dmamap_sync(bus_dma_tag_t t, bus_dm #ifdef _ARM32_NEED_BUS_DMA_BOUNCE if (bouncing && (ops & BUS_DMASYNC_PREWRITE)) { + struct arm32_bus_dma_cookie * const cookie = map->_dm_cookie; STAT_INCR(write_bounces); char * const dataptr = (char *)cookie->id_bouncebuf + offset; /* @@ -1045,10 +1045,10 @@ _bus_dmamap_sync(bus_dma_tag_t t, bus_dm #ifdef _ARM32_NEED_BUS_DMA_BOUNCE bounce_it: if ((ops & BUS_DMASYNC_POSTREAD) == 0 - || cookie == NULL - || (cookie->id_flags & _BUS_DMA_IS_BOUNCING) == 0) + || (map->_dm_flags & _BUS_DMAMAP_IS_BOUNCING) == 0) return; + struct arm32_bus_dma_cookie * const cookie = map->_dm_cookie; char * const dataptr = (char *)cookie->id_bouncebuf + offset; STAT_INCR(read_bounces); /* Index: src/sys/arch/arm/include/bus_defs.h diff -u src/sys/arch/arm/include/bus_defs.h:1.3 src/sys/arch/arm/include/bus_defs.h:1.4 --- src/sys/arch/arm/include/bus_defs.h:1.3 Wed Oct 17 20:17:18 2012 +++ src/sys/arch/arm/include/bus_defs.h Fri Oct 19 13:46:07 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_defs.h,v 1.3 2012/10/17 20:17:18 matt Exp $ */ +/* $NetBSD: bus_defs.h,v 1.4 2012/10/19 13:46:07 matt Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc. @@ -300,6 +300,7 @@ struct bus_space { * Private flags stored in the DMA map. */ #define _BUS_DMAMAP_COHERENT 0x10000 /* no cache flush necessary on sync */ +#define _BUS_DMAMAP_IS_BOUNCING 0x20000 /* is bouncing current xfer */ /* Forwards needed by prototypes below. */ struct mbuf; Index: src/sys/arch/arm/include/bus_funcs.h diff -u src/sys/arch/arm/include/bus_funcs.h:1.3 src/sys/arch/arm/include/bus_funcs.h:1.4 --- src/sys/arch/arm/include/bus_funcs.h:1.3 Tue Sep 18 05:47:27 2012 +++ src/sys/arch/arm/include/bus_funcs.h Fri Oct 19 13:46:07 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: bus_funcs.h,v 1.3 2012/09/18 05:47:27 matt Exp $ */ +/* $NetBSD: bus_funcs.h,v 1.4 2012/10/19 13:46:07 matt Exp $ */ /*- * Copyright (c) 1996, 1997, 1998, 2001 The NetBSD Foundation, Inc. @@ -587,6 +587,8 @@ struct uio; (*(t)->_dmamap_unload)((t), (p)) #define bus_dmamap_sync(t, p, o, l, ops) \ do { \ + if (((p)->_dm_flags & (_BUS_DMAMAP_COHERENT|_BUS_DMAMAP_IS_BOUNCING)) == _BUS_DMAMAP_COHERENT) \ + break; \ if (((ops) & (BUS_DMASYNC_PREREAD|BUS_DMASYNC_PREWRITE)) != 0 \ && (t)->_dmamap_sync_pre != NULL) \ (*(t)->_dmamap_sync_pre)((t), (p), (o), (l), (ops)); \