svn commit: r243979 - in projects/physbio/sys: arm/arm ia64/ia64 mips/mips powerpc/powerpc sparc64/sparc64 sys x86/x86
Jeff Roberson
jeff at FreeBSD.org
Fri Dec 7 07:24:18 UTC 2012
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,
More information about the svn-src-projects
mailing list