Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 7 Dec 2012 07:24:16 +0000 (UTC)
From:      Jeff Roberson <jeff@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r243979 - in projects/physbio/sys: arm/arm ia64/ia64 mips/mips powerpc/powerpc sparc64/sparc64 sys x86/x86
Message-ID:  <201212070724.qB77OGiC045023@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jeff
Date: Fri Dec  7 07:24:15 2012
New Revision: 243979
URL: http://svnweb.freebsd.org/changeset/base/243979

Log:
   - Make all of the _bus_dmamap_load_buffer routines identical.  Re-arrange
     callers so that the argument order is the same.
   - In the sparc64 iommu move some common code into load_buffer() so that it
     will be easier to combine users with the other implementations.
  
  Sponsored by:	EMC / Isilon Storage Division

Modified:
  projects/physbio/sys/arm/arm/busdma_machdep-v6.c
  projects/physbio/sys/arm/arm/busdma_machdep.c
  projects/physbio/sys/ia64/ia64/busdma_machdep.c
  projects/physbio/sys/mips/mips/busdma_machdep.c
  projects/physbio/sys/powerpc/powerpc/busdma_machdep.c
  projects/physbio/sys/sparc64/sparc64/bus_machdep.c
  projects/physbio/sys/sparc64/sparc64/iommu.c
  projects/physbio/sys/sys/bus_dma.h
  projects/physbio/sys/x86/x86/busdma_machdep.c

Modified: projects/physbio/sys/arm/arm/busdma_machdep-v6.c
==============================================================================
--- projects/physbio/sys/arm/arm/busdma_machdep-v6.c	Fri Dec  7 07:08:39 2012	(r243978)
+++ projects/physbio/sys/arm/arm/busdma_machdep-v6.c	Fri Dec  7 07:24:15 2012	(r243979)
@@ -714,7 +714,7 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
  * Utility function to load a linear buffer.  segp contains
  * the starting segment on entrace, and the ending segment on exit.
  */
-static __inline int
+int
 _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
 			bus_dmamap_t map,
 			void *buf, bus_size_t buflen,

Modified: projects/physbio/sys/arm/arm/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/arm/arm/busdma_machdep.c	Fri Dec  7 07:08:39 2012	(r243978)
+++ projects/physbio/sys/arm/arm/busdma_machdep.c	Fri Dec  7 07:24:15 2012	(r243979)
@@ -222,11 +222,6 @@ SYSINIT(busdma, SI_SUB_VM, SI_ORDER_ANY,
  */
 
 static __inline int
-bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs,
-    bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap,
-    int flags, int *segp);
-
-static __inline int
 _bus_dma_can_bounce(vm_offset_t lowaddr, vm_offset_t highaddr)
 {
 	int i;
@@ -749,10 +744,10 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
  * Utility function to load a linear buffer.  segp contains
  * the starting segment on entrance, and the ending segment on exit.
  */
-static __inline int
-bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs,
-    bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap,
-    int flags, int *segp)
+int
+_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
+    bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs,
+    int *segp)
 {
 	bus_size_t sgsize;
 	bus_addr_t curaddr, baddr, bmask;
@@ -915,9 +910,9 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 	map->flags |= DMAMAP_LINEAR|DMAMAP_COHERENT;
 	map->buffer = buf;
 	map->len = buflen;
-	error = bus_dmamap_load_buffer(dmat,
-	    NULL, map, buf, buflen, kernel_pmap,
-	    flags, &nsegs);
+	error = _bus_dmamap_load_buffer(dmat,
+	    map, buf, buflen, kernel_pmap,
+	    flags, NULL, &nsegs);
 	if (error == EINPROGRESS)
 		return (error);
 	if (error)
@@ -952,9 +947,9 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat,
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
-				error = bus_dmamap_load_buffer(dmat,
-				    NULL, map, m->m_data, m->m_len,
-				    kernel_pmap, flags, &nsegs);
+				error = _bus_dmamap_load_buffer(dmat,
+				    map, m->m_data, m->m_len,
+				    kernel_pmap, flags, NULL, &nsegs);
 				map->len += m->m_len;
 			}
 		}
@@ -996,10 +991,10 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
-				error = bus_dmamap_load_buffer(dmat, segs, map,
+				error = _bus_dmamap_load_buffer(dmat, map,
 						m->m_data, m->m_len,
 						kernel_pmap, flags,
-						nsegs);
+						segs, nsegs);
 				map->len += m->m_len;
 			}
 		}
@@ -1053,8 +1048,8 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		caddr_t addr = (caddr_t) iov[i].iov_base;
 
 		if (minlen > 0) {
-			error = bus_dmamap_load_buffer(dmat, NULL,
-			    map, addr, minlen, pmap, flags, &nsegs);
+			error = _bus_dmamap_load_buffer(dmat,
+			    map, addr, minlen, pmap, flags, NULL, &nsegs);
 
 			map->len += minlen;
 			resid -= minlen;

Modified: projects/physbio/sys/ia64/ia64/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/ia64/ia64/busdma_machdep.c	Fri Dec  7 07:08:39 2012	(r243978)
+++ projects/physbio/sys/ia64/ia64/busdma_machdep.c	Fri Dec  7 07:24:15 2012	(r243979)
@@ -484,7 +484,7 @@ bus_dmamem_free(bus_dma_tag_t dmat, void
  * Utility function to load a linear buffer.  segp contains
  * the starting segment on entrace, and the ending segment on exit.
  */
-static int
+int
 _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
     bus_size_t buflen, pmap_t pmap, int flags,
     bus_dma_segment_t *segs, int *segp)

Modified: projects/physbio/sys/mips/mips/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/mips/mips/busdma_machdep.c	Fri Dec  7 07:08:39 2012	(r243978)
+++ projects/physbio/sys/mips/mips/busdma_machdep.c	Fri Dec  7 07:24:15 2012	(r243979)
@@ -215,11 +215,6 @@ SYSINIT(busdma, SI_SUB_VM, SI_ORDER_ANY,
  */
 
 static __inline int
-bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs,
-    bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap,
-    int flags, int *segp);
-
-static __inline int
 _bus_dma_can_bounce(vm_offset_t lowaddr, vm_offset_t highaddr)
 {
 	int i;
@@ -748,10 +743,10 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
  * the starting segment on entrance, and the ending segment on exit.
  * first indicates if this is the first invocation of this function.
  */
-static __inline int
-bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dma_segment_t *segs,
-    bus_dmamap_t map, void *buf, bus_size_t buflen, struct pmap *pmap,
-    int flags, int *segp)
+int
+_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
+    bus_size_t buflen, struct pmap *pmap, int flags, bus_dma_segment_t *segs,
+    int *segp)
 {
 	bus_size_t sgsize;
 	bus_addr_t curaddr, baddr, bmask;
@@ -858,9 +853,8 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
 	map->flags |= DMAMAP_LINEAR;
 	map->buffer = buf;
 	map->len = buflen;
-	error = bus_dmamap_load_buffer(dmat,
-	    NULL, map, buf, buflen, kernel_pmap,
-	    flags, &nsegs);
+	error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap,
+	    flags, NULL, &nsegs);
 	if (error == EINPROGRESS)
 		return (error);
 	if (error)
@@ -895,9 +889,9 @@ bus_dmamap_load_mbuf(bus_dma_tag_t dmat,
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
-				error = bus_dmamap_load_buffer(dmat,
-				    NULL, map, m->m_data, m->m_len, 
-				    kernel_pmap, flags, &nsegs);
+				error = _bus_dmamap_load_buffer(dmat,
+				    map, m->m_data, m->m_len, 
+				    kernel_pmap, flags, NULL, &nsegs);
 				map->len += m->m_len;
 			}
 		}
@@ -939,10 +933,10 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
-				error = bus_dmamap_load_buffer(dmat, segs, map,
+				error = _bus_dmamap_load_buffer(dmat, map,
 						m->m_data, m->m_len,
 						kernel_pmap, flags,
-						nsegs);
+						segs, nsegs);
 				map->len += m->m_len;
 			}
 		}
@@ -997,8 +991,8 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat, 
 		caddr_t addr = (caddr_t) iov[i].iov_base;
 
 		if (minlen > 0) {
-			error = bus_dmamap_load_buffer(dmat, NULL,
-			    map, addr, minlen, pmap, flags, &nsegs);
+			error = _bus_dmamap_load_buffer(dmat, map, addr,
+			    minlen, pmap, flags, NULL, &nsegs);
 
 			map->len += minlen;
 			resid -= minlen;

Modified: projects/physbio/sys/powerpc/powerpc/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/powerpc/powerpc/busdma_machdep.c	Fri Dec  7 07:08:39 2012	(r243978)
+++ projects/physbio/sys/powerpc/powerpc/busdma_machdep.c	Fri Dec  7 07:24:15 2012	(r243979)
@@ -568,7 +568,7 @@ bus_dmamem_free(bus_dma_tag_t dmat, void
  * Utility function to load a linear buffer.  segp contains
  * the starting segment on entrance, and the ending segment on exit.
  */
-static __inline int
+int
 _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
     			bus_dmamap_t map,
 			void *buf, bus_size_t buflen,

Modified: projects/physbio/sys/sparc64/sparc64/bus_machdep.c
==============================================================================
--- projects/physbio/sys/sparc64/sparc64/bus_machdep.c	Fri Dec  7 07:08:39 2012	(r243978)
+++ projects/physbio/sys/sparc64/sparc64/bus_machdep.c	Fri Dec  7 07:24:15 2012	(r243979)
@@ -330,9 +330,9 @@ nexus_dmamap_destroy(bus_dma_tag_t dmat,
  * the starting segment on entrace, and the ending segment on exit.
  */
 static int
-_nexus_dmamap_load_buffer(bus_dma_tag_t dmat, void *buf, bus_size_t buflen,
-    pmap_t pmap, int flags,
-    bus_dma_segment_t *segs, int *segp)
+_nexus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf,
+    bus_size_t buflen, pmap_t pmap, int flags, bus_dma_segment_t *segs,
+    int *segp)
 {
 	bus_size_t sgsize;
 	bus_addr_t curaddr, baddr, bmask;
@@ -423,7 +423,7 @@ nexus_dmamap_load(bus_dma_tag_t dmat, bu
 	int error, nsegs;
 
 	nsegs = -1;
-	error = _nexus_dmamap_load_buffer(dmat, buf, buflen, kernel_pmap,
+	error = _nexus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap,
 	    flags, NULL, &nsegs);
 
 	if (error == 0) {
@@ -453,7 +453,7 @@ nexus_dmamap_load_mbuf(bus_dma_tag_t dma
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
-				error = _nexus_dmamap_load_buffer(dmat,
+				error = _nexus_dmamap_load_buffer(dmat, map,
 				    m->m_data, m->m_len, kernel_pmap, flags,
 				    NULL, &nsegs);
 			}
@@ -488,7 +488,7 @@ nexus_dmamap_load_mbuf_sg(bus_dma_tag_t 
 
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len > 0) {
-				error = _nexus_dmamap_load_buffer(dmat,
+				error = _nexus_dmamap_load_buffer(dmat, map,
 				    m->m_data, m->m_len, kernel_pmap, flags,
 				    segs, nsegs);
 			}
@@ -533,8 +533,8 @@ nexus_dmamap_load_uio(bus_dma_tag_t dmat
 		caddr_t addr = (caddr_t) iov[i].iov_base;
 
 		if (minlen > 0) {
-			error = _nexus_dmamap_load_buffer(dmat, addr, minlen,
-			    pmap, flags, NULL, &nsegs);
+			error = _nexus_dmamap_load_buffer(dmat, map, addr,
+			    minlen, pmap, flags, NULL, &nsegs);
 			resid -= minlen;
 		}
 	}

Modified: projects/physbio/sys/sparc64/sparc64/iommu.c
==============================================================================
--- projects/physbio/sys/sparc64/sparc64/iommu.c	Fri Dec  7 07:08:39 2012	(r243978)
+++ projects/physbio/sys/sparc64/sparc64/iommu.c	Fri Dec  7 07:24:15 2012	(r243979)
@@ -850,17 +850,40 @@ iommu_dvmamap_destroy(bus_dma_tag_t dt, 
  * IOMMU DVMA operations, common to PCI and SBus
  */
 static int
-iommu_dvmamap_load_buffer(bus_dma_tag_t dt, struct iommu_state *is,
-    bus_dmamap_t map, void *buf, bus_size_t buflen, pmap_t pmap,
-    int flags, bus_dma_segment_t *segs, int *segp)
+iommu_dvmamap_load_buffer(bus_dma_tag_t dt, bus_dmamap_t map, void *buf,
+    bus_size_t buflen, pmap_t pmap, int flags, bus_dma_segment_t *segs,
+    int *segp)
 {
 	bus_addr_t amask, dvmaddr, dvmoffs;
 	bus_size_t sgsize, esize;
+	struct iommu_state *is;
 	vm_offset_t vaddr, voffs;
 	vm_paddr_t curaddr;
 	int error, firstpg, sgcnt;
+	int first;
 	u_int slot;
 
+	is = dt->dt_cookie;
+	if (*segp == -1) {
+		if ((map->dm_flags & DMF_LOADED) != 0) {
+#ifdef DIAGNOSTIC
+			printf("%s: map still in use\n", __func__);
+#endif
+			bus_dmamap_unload(dt, map);
+		}
+
+		/*
+		 * Make sure that the map is not on a queue so that the
+		 * resource list may be safely accessed and modified without
+		 * needing the lock to cover the whole operation.
+		 */
+		IS_LOCK(is);
+		iommu_map_remq(is, map);
+		IS_UNLOCK(is);
+
+		amask = dt->dt_alignment - 1;
+	} else
+		amask = 0;
 	KASSERT(buflen != 0, ("%s: buflen == 0!", __func__));
 	if (buflen > dt->dt_maxsize)
 		return (EINVAL);
@@ -870,7 +893,6 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t 
 
 	vaddr = (vm_offset_t)buf;
 	voffs = vaddr & IO_PAGE_MASK;
-	amask = (*segp == -1) ? dt->dt_alignment - 1 : 0;
 
 	/* Try to find a slab that is large enough. */
 	error = iommu_dvma_vallocseg(dt, is, map, voffs, buflen, amask,
@@ -956,22 +978,6 @@ iommu_dvmamap_load(bus_dma_tag_t dt, bus
 	struct iommu_state *is = dt->dt_cookie;
 	int error, seg = -1;
 
-	if ((map->dm_flags & DMF_LOADED) != 0) {
-#ifdef DIAGNOSTIC
-		printf("%s: map still in use\n", __func__);
-#endif
-		bus_dmamap_unload(dt, map);
-	}
-
-	/*
-	 * Make sure that the map is not on a queue so that the resource list
-	 * may be safely accessed and modified without needing the lock to
-	 * cover the whole operation.
-	 */
-	IS_LOCK(is);
-	iommu_map_remq(is, map);
-	IS_UNLOCK(is);
-
 	error = iommu_dvmamap_load_buffer(dt, is, map, buf, buflen,
 	    kernel_pmap, flags, NULL, &seg);
 
@@ -1000,17 +1006,6 @@ iommu_dvmamap_load_mbuf(bus_dma_tag_t dt
 
 	M_ASSERTPKTHDR(m0);
 
-	if ((map->dm_flags & DMF_LOADED) != 0) {
-#ifdef DIAGNOSTIC
-		printf("%s: map still in use\n", __func__);
-#endif
-		bus_dmamap_unload(dt, map);
-	}
-
-	IS_LOCK(is);
-	iommu_map_remq(is, map);
-	IS_UNLOCK(is);
-
 	if (m0->m_pkthdr.len <= dt->dt_maxsize) {
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
 			if (m->m_len == 0)
@@ -1048,16 +1043,6 @@ iommu_dvmamap_load_mbuf_sg(bus_dma_tag_t
 	M_ASSERTPKTHDR(m0);
 
 	*nsegs = -1;
-	if ((map->dm_flags & DMF_LOADED) != 0) {
-#ifdef DIAGNOSTIC
-		printf("%s: map still in use\n", __func__);
-#endif
-		bus_dmamap_unload(dt, map);
-	}
-
-	IS_LOCK(is);
-	iommu_map_remq(is, map);
-	IS_UNLOCK(is);
 
 	if (m0->m_pkthdr.len <= dt->dt_maxsize) {
 		for (m = m0; m != NULL && error == 0; m = m->m_next) {
@@ -1094,17 +1079,6 @@ iommu_dvmamap_load_uio(bus_dma_tag_t dt,
 	int nsegs = -1, error = 0, i;
 	pmap-t pmap;
 
-	if ((map->dm_flags & DMF_LOADED) != 0) {
-#ifdef DIAGNOSTIC
-		printf("%s: map still in use\n", __func__);
-#endif
-		bus_dmamap_unload(dt, map);
-	}
-
-	IS_LOCK(is);
-	iommu_map_remq(is, map);
-	IS_UNLOCK(is);
-
 	resid = uio->uio_resid;
 	iov = uio->uio_iov;
 

Modified: projects/physbio/sys/sys/bus_dma.h
==============================================================================
--- projects/physbio/sys/sys/bus_dma.h	Fri Dec  7 07:08:39 2012	(r243978)
+++ projects/physbio/sys/sys/bus_dma.h	Fri Dec  7 07:24:15 2012	(r243979)
@@ -282,4 +282,9 @@ void _bus_dmamap_unload(bus_dma_tag_t dm
 
 #endif /* __sparc64__ */
 
+int _bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map,
+			    void *buf, bus_size_t buflen, pmap_t pmap,
+			    int flags, bus_dma_segment_t *segs, int *segp);
+
+
 #endif /* _BUS_DMA_H_ */

Modified: projects/physbio/sys/x86/x86/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/x86/x86/busdma_machdep.c	Fri Dec  7 07:08:39 2012	(r243978)
+++ projects/physbio/sys/x86/x86/busdma_machdep.c	Fri Dec  7 07:24:15 2012	(r243979)
@@ -648,9 +648,9 @@ _bus_dmamap_count_pages(bus_dma_tag_t dm
  * Utility function to load a linear buffer.  segp contains
  * the starting segment on entrace, and the ending segment on exit.
  */
-static __inline int
+int
 _bus_dmamap_load_buffer(bus_dma_tag_t dmat,
-    			bus_dmamap_t map,
+   			bus_dmamap_t map,
 			void *buf, bus_size_t buflen,
 			pmap_t pmap,
 			int flags,



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201212070724.qB77OGiC045023>