svn commit: r244649 - in projects/physbio/sys: arm/arm ia64/ia64 kern mips/mips powerpc/powerpc sparc64/include sparc64/sparc64 sys x86/x86
Jeff Roberson
jeff at FreeBSD.org
Mon Dec 24 01:00:39 UTC 2012
Author: jeff
Date: Mon Dec 24 01:00:36 2012
New Revision: 244649
URL: http://svnweb.freebsd.org/changeset/base/244649
Log:
- Simplify the bus_dma backend API by eliminating turning the three
complete variants into a single variant and have the caller do the
callbacks. This eliminates a lot of redundant code.
- Add missing slist initializations. Pointed out by Ian Lepore.
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/kern/subr_busdma.c
projects/physbio/sys/mips/mips/busdma_machdep.c
projects/physbio/sys/powerpc/powerpc/busdma_machdep.c
projects/physbio/sys/sparc64/include/bus_dma.h
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 Mon Dec 24 00:46:34 2012 (r244648)
+++ projects/physbio/sys/arm/arm/busdma_machdep-v6.c Mon Dec 24 01:00:36 2012 (r244649)
@@ -838,43 +838,21 @@ cleanup:
void
__bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg,
- int *flags)
+ bus_dmamap_callback_t *callback, void *callback_arg)
{
- (*flags) |= BUS_DMA_WAITOK;
map->callback = callback;
map->callback_arg = callback_arg;
}
-void
+bus_dma_segment_t *
_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg,
- int nsegs, int error)
-{
-
- if (error)
- (*callback)(callback_arg, dmat->segments, 0, error);
- else
- (*callback)(callback_arg, dmat->segments, nsegs, 0);
-}
-
-void
-_bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback2_t *callback,
- void *callback_arg, int nsegs, bus_size_t len, int error)
+ bus_dma_segment_t *segs, int nsegs, int error)
{
- if (error)
- (*callback)(callback_arg, dmat->segments, 0, 0, error);
- else
- (*callback)(callback_arg, dmat->segments, nsegs, len, error);
-}
-
-void
-_bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dma_segment_t *segs, int nsegs, int error)
-{
+ if (segs == NULL)
+ segs = dmat->segments;
+ return (segs);
}
/*
Modified: projects/physbio/sys/arm/arm/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/arm/arm/busdma_machdep.c Mon Dec 24 00:46:34 2012 (r244648)
+++ projects/physbio/sys/arm/arm/busdma_machdep.c Mon Dec 24 01:00:36 2012 (r244649)
@@ -310,9 +310,10 @@ _busdma_alloc_dmamap(bus_dma_tag_t dmat)
map->flags = DMAMAP_ALLOCATED;
} else
map->flags = 0;
- if (map != NULL)
+ if (map != NULL) {
STAILQ_INIT(&map->bpages);
- else
+ map->slist = slist;
+ } else
free(slist, M_DEVBUF);
return (map);
}
@@ -916,45 +917,23 @@ cleanup:
void
__bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg,
- int *flags)
+ bus_dmamap_callback_t *callback, void *callback_arg)
{
KASSERT(dmat != NULL, ("dmatag is NULL"));
KASSERT(map != NULL, ("dmamap is NULL"));
- (*flags) |= BUS_DMA_WAITOK;
map->callback = callback;
map->callback_arg = callback_arg;
}
-void
+bus_dma_segment_t *
_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg,
- int nsegs, int error)
-{
-
- if (error)
- (*callback)(callback_arg, dmat->segments, 0, error);
- else
- (*callback)(callback_arg, dmat->segments, nsegs, 0);
-}
-
-void
-_bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback2_t *callback,
- void *callback_arg, int nsegs, bus_size_t len, int error)
+ bus_dma_segment_t *segs, int nsegs, int error)
{
- if (error)
- (*callback)(callback_arg, dmat->segments, 0, 0, error);
- else
- (*callback)(callback_arg, dmat->segments, nsegs, len, error);
-}
-
-void
-_bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dma_segment_t *segs, int nsegs, int error)
-{
+ if (segs == NULL)
+ segs = dmat->segments;
+ return (segs);
}
/*
Modified: projects/physbio/sys/ia64/ia64/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/ia64/ia64/busdma_machdep.c Mon Dec 24 00:46:34 2012 (r244648)
+++ projects/physbio/sys/ia64/ia64/busdma_machdep.c Mon Dec 24 01:00:36 2012 (r244649)
@@ -616,42 +616,22 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
void
__bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg, int *flags)
+ bus_dmamap_callback_t *callback, void *callback_arg)
{
if (map != NULL) {
- (*flags) |= BUS_DMA_WAITOK;
map->callback = callback;
map->callback_arg = callback_arg;
}
}
-void
+bus_dma_segment_t *
_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg, int nsegs, int error)
-{
-
- if (error)
- (*callback)(callback_arg, dmat->segments, 0, error);
- else
- (*callback)(callback_arg, dmat->segments, nsegs, 0);
-}
-
-void
-_bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback2_t *callback,
- void *callback_arg, int nsegs, bus_size_t len, int error)
+ bus_dma_segment_t *segs, int nsegs, int error)
{
- if (error)
- (*callback)(callback_arg, dmat->segments, 0, 0, error);
- else
- (*callback)(callback_arg, dmat->segments, nsegs, len, error);
-}
-
-void
-_bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dma_segment_t *segs, int nsegs, int error)
-{
+ if (segs == NULL)
+ segs = dmat->segments;
+ return (segs);
}
/*
Modified: projects/physbio/sys/kern/subr_busdma.c
==============================================================================
--- projects/physbio/sys/kern/subr_busdma.c Mon Dec 24 00:46:34 2012 (r244648)
+++ projects/physbio/sys/kern/subr_busdma.c Mon Dec 24 01:00:36 2012 (r244649)
@@ -60,10 +60,12 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
bus_size_t buflen, bus_dmamap_callback_t *callback,
void *callback_arg, int flags)
{
+ bus_dma_segment_t *segs;
int error;
int nsegs;
- _bus_dmamap_mayblock(dmat, map, callback, callback_arg, &flags);
+ if ((flags & BUS_DMA_NOWAIT) == 0)
+ _bus_dmamap_mayblock(dmat, map, callback, callback_arg);
nsegs = -1;
error = _bus_dmamap_load_buffer(dmat, map, buf, buflen, kernel_pmap,
@@ -76,7 +78,11 @@ bus_dmamap_load(bus_dma_tag_t dmat, bus_
if (error == EINPROGRESS)
return (error);
- _bus_dmamap_complete(dmat, map, callback, callback_arg, nsegs, error);
+ segs = _bus_dmamap_complete(dmat, map, NULL, nsegs, error);
+ if (error)
+ (*callback)(callback_arg, segs, 0, error);
+ else
+ (*callback)(callback_arg, segs, nsegs, 0);
/*
* Return ENOMEM to the caller so that it can pass it up the stack.
@@ -121,12 +127,16 @@ int
bus_dmamap_load_mbuf(bus_dma_tag_t dmat, bus_dmamap_t map, struct mbuf *m0,
bus_dmamap_callback2_t *callback, void *callback_arg, int flags)
{
+ bus_dma_segment_t *segs;
int nsegs, error;
error = _bus_dmamap_load_mbuf_sg(dmat, map, m0, NULL, &nsegs, flags);
- _bus_dmamap_complete2(dmat, map, callback, callback_arg, nsegs,
- m0->m_pkthdr.len, error);
+ segs = _bus_dmamap_complete(dmat, map, NULL, nsegs, error);
+ if (error)
+ (*callback)(callback_arg, segs, 0, 0, error);
+ else
+ (*callback)(callback_arg, segs, nsegs, m0->m_pkthdr.len, error);
CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
__func__, dmat, flags, error, nsegs);
@@ -140,7 +150,7 @@ bus_dmamap_load_mbuf_sg(bus_dma_tag_t dm
int error;
error = _bus_dmamap_load_mbuf_sg(dmat, map, m0, segs, nsegs, flags);
- _bus_dmamap_directseg(dmat, map, segs, *nsegs, error);
+ _bus_dmamap_complete(dmat, map, segs, *nsegs, error);
return (error);
}
@@ -151,6 +161,7 @@ int
bus_dmamap_load_uio(bus_dma_tag_t dmat, bus_dmamap_t map, struct uio *uio,
bus_dmamap_callback2_t *callback, void *callback_arg, int flags)
{
+ bus_dma_segment_t *segs;
int nsegs, error, i;
bus_size_t resid;
bus_size_t minlen;
@@ -186,8 +197,11 @@ bus_dmamap_load_uio(bus_dma_tag_t dmat,
}
}
- _bus_dmamap_complete2(dmat, map, callback, callback_arg, nsegs,
- uio->uio_resid, error);
+ segs = _bus_dmamap_complete(dmat, map, NULL, nsegs, error);
+ if (error)
+ (*callback)(callback_arg, segs, 0, 0, error);
+ else
+ (*callback)(callback_arg, segs, nsegs, uio->uio_resid, error);
CTR5(KTR_BUSDMA, "%s: tag %p tag flags 0x%x error %d nsegs %d",
__func__, dmat, dmat, error, nsegs + 1);
@@ -240,7 +254,7 @@ bus_dmamap_load_ccb(bus_dma_tag_t dmat,
callback_arg,
/*flags*/0);
case CAM_DATA_PADDR: {
- struct bus_dma_segment seg;
+ bus_dma_segment_t seg;
seg.ds_addr = (bus_addr_t)(vm_offset_t)data_ptr;
seg.ds_len = dxfer_len;
@@ -248,13 +262,13 @@ bus_dmamap_load_ccb(bus_dma_tag_t dmat,
break;
}
case CAM_DATA_SG: {
- struct bus_dma_segment *segs;
+ bus_dma_segment_t *segs;
int nsegs;
int error;
int i;
flags |= BUS_DMA_NOWAIT;
- segs = (struct bus_dma_segment *)data_ptr;
+ segs = (bus_dma_segment_t *)data_ptr;
nsegs = -1;
error = 0;
for (i = 0; i < sglist_cnt && error == 0; i++) {
@@ -263,16 +277,20 @@ bus_dmamap_load_ccb(bus_dma_tag_t dmat,
kernel_pmap, flags, NULL, &nsegs);
}
nsegs++;
- _bus_dmamap_complete(dmat, map, callback, callback_arg, nsegs,
- error);
+ segs = _bus_dmamap_complete(dmat, map, NULL, nsegs, error);
+ if (error)
+ (*callback)(callback_arg, segs, 0, error);
+ else
+ (*callback)(callback_arg, segs, nsegs, error);
+
if (error == ENOMEM)
return (error);
break;
}
case CAM_DATA_SG_PADDR: {
- struct bus_dma_segment *segs;
+ bus_dma_segment_t *segs;
/* Just use the segments provided */
- segs = (struct bus_dma_segment *)data_ptr;
+ segs = (bus_dma_segment_t *)data_ptr;
callback(callback_arg, segs, sglist_cnt, 0);
break;
}
Modified: projects/physbio/sys/mips/mips/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/mips/mips/busdma_machdep.c Mon Dec 24 00:46:34 2012 (r244648)
+++ projects/physbio/sys/mips/mips/busdma_machdep.c Mon Dec 24 01:00:36 2012 (r244649)
@@ -288,9 +288,10 @@ _busdma_alloc_dmamap(bus_dma_tag_t dmat)
map->flags = DMAMAP_ALLOCATED;
} else
map->flags = 0;
- if (map != NULL)
+ if (map != NULL) {
STAILQ_INIT(&map->bpages);
- else
+ map->slist = slist;
+ } else
free(slist, M_DEVBUF);
return (map);
}
@@ -858,45 +859,23 @@ cleanup:
void
__bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg,
- int *flags)
+ bus_dmamap_callback_t *callback, void *callback_arg)
{
KASSERT(dmat != NULL, ("dmatag is NULL"));
KASSERT(map != NULL, ("dmamap is NULL"));
- (*flags) |= BUS_DMA_WAITOK;
map->callback = callback;
map->callback_arg = callback_arg;
}
-void
-_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg,
- int nsegs, int error)
-{
-
- if (error)
- (*callback)(callback_arg, dmat->segments, 0, error);
- else
- (*callback)(callback_arg, dmat->segments, nsegs, 0);
-}
-
-void
-_bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback2_t *callback,
- void *callback_arg, int nsegs, bus_size_t len, int error)
-{
-
- if (error)
- (*callback)(callback_arg, dmat->segments, 0, 0, error);
- else
- (*callback)(callback_arg, dmat->segments, nsegs, len, error);
-}
-
-void
+bus_dma_segment_t *
_bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dma_segment_t *segs, int nsegs, int error)
+ bus_dma_segment_t *segs, int nsegs, int error)
{
+
+ if (segs == NULL)
+ segs = dmat->segments;
+ return (segs);
}
/*
Modified: projects/physbio/sys/powerpc/powerpc/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/powerpc/powerpc/busdma_machdep.c Mon Dec 24 00:46:34 2012 (r244648)
+++ projects/physbio/sys/powerpc/powerpc/busdma_machdep.c Mon Dec 24 01:00:36 2012 (r244649)
@@ -711,65 +711,31 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
void
__bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg,
- int *flags)
+ bus_dmamap_callback_t *callback, void *callback_arg)
{
if (dmat->flags & BUS_DMA_COULD_BOUNCE) {
- (*flags) |= BUS_DMA_WAITOK;
map->callback = callback;
map->callback_arg = callback_arg;
}
}
-void
+bus_dma_segment_t *
_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg,
- int nsegs, int error)
+ bus_dma_segment_t *segs, int nsegs, int error)
{
- map->nsegs = nsegs;
- if (dmat->iommu != NULL)
- IOMMU_MAP(dmat->iommu, map->segments, &map->nsegs,
- dmat->lowaddr, dmat->highaddr, dmat->alignment,
- dmat->boundary, dmat->iommu_cookie);
-
- if (error)
- (*callback)(callback_arg, map->segments, 0, error);
+ if (segs != NULL)
+ memcpy(map->segments, segs, map->nsegs*sizeof(segs[0]));
else
- (*callback)(callback_arg, map->segments, nsegs, 0);
-}
-
-void
-_bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback2_t *callback,
- void *callback_arg, int nsegs, bus_size_t len, int error)
-{
-
+ segs = map->segments;
map->nsegs = nsegs;
if (dmat->iommu != NULL)
IOMMU_MAP(dmat->iommu, map->segments, &map->nsegs,
dmat->lowaddr, dmat->highaddr, dmat->alignment,
dmat->boundary, dmat->iommu_cookie);
- if (error)
- (*callback)(callback_arg, map->segments, 0, 0, error);
- else
- (*callback)(callback_arg, map->segments, nsegs, len, error);
-}
-
-void
-_bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dma_segment_t *segs, int nsegs, int error)
-{
-
- map->nsegs = nsegs;
- if (dmat->iommu != NULL)
- IOMMU_MAP(dmat->iommu, segs, &map->nsegs, dmat->lowaddr,
- dmat->highaddr, dmat->alignment, dmat->boundary,
- dmat->iommu_cookie);
-
- memcpy(map->segments, segs, map->nsegs*sizeof(segs[0]));
+ return (segs);
}
/*
Modified: projects/physbio/sys/sparc64/include/bus_dma.h
==============================================================================
--- projects/physbio/sys/sparc64/include/bus_dma.h Mon Dec 24 00:46:34 2012 (r244648)
+++ projects/physbio/sys/sparc64/include/bus_dma.h Mon Dec 24 01:00:36 2012 (r244649)
@@ -82,15 +82,9 @@ struct bus_dma_methods {
void *buf, bus_size_t buflen, struct pmap *pmap, int flags,
bus_dma_segment_t *segs, int *segp);
void (*dm_dmamap_mayblock)(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg, int *flags);
- void (*dm_dmamap_complete)(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg, int nsegs,
- int error);
- void (*dm_dmamap_complete2)(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback2_t *callback2, void *callback_arg, int nsegs,
- bus_size_t len, int error);
- void (*dm_dmamap_directseg)(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dma_segment_t *segs, int nsegs, int error);
+ bus_dmamap_callback_t *callback, void *callback_arg);
+ bus_dma_segment_t *(*dm_dmamap_complete)(bus_dma_tag_t dmat,
+ bus_dmamap_t map, bus_dma_segment_t *segs, int nsegs, int error);
void (*dm_dmamap_unload)(bus_dma_tag_t, bus_dmamap_t);
void (*dm_dmamap_sync)(bus_dma_tag_t, bus_dmamap_t,
bus_dmasync_op_t);
@@ -133,14 +127,10 @@ struct bus_dma_tag {
#define _bus_dmamap_load_buffer(t, m, b, l, p, f, s, sp) \
((t)->dt_mt->dm_dmamap_load_buffer((t), (m), (b), (l), (p), \
(f), (s), (sp)))
-#define _bus_dmamap_mayblock(t, m, c, ca, f) \
- ((t)->dt_mt->dm_dmamap_mayblock((t), (m), (c), (ca), (f)))
-#define _bus_dmamap_complete(t, m, c, ca, n, e) \
- ((t)->dt_mt->dm_dmamap_complete((t), (m), (c), (ca), (n), (e)))
-#define _bus_dmamap_complete2(t, m, c, ca, n, l, e) \
- ((t)->dt_mt->dm_dmamap_complete2((t), (m), (c), (ca), (n), (l), (e)))
-#define _bus_dmamap_directseg(t, m, s, n, e) \
- ((t)->dt_mt->dm_dmamap_directseg((t), (m), (s), (n), (e)))
+#define _bus_dmamap_mayblock(t, m, c, ca) \
+ ((t)->dt_mt->dm_dmamap_mayblock((t), (m), (c), (ca)))
+#define _bus_dmamap_complete(t, m, s, n, e) \
+ ((t)->dt_mt->dm_dmamap_complete((t), (m), (s), (n), (e)))
#define bus_dmamap_unload(t, p) \
((t)->dt_mt->dm_dmamap_unload((t), (p)))
#define bus_dmamap_sync(t, m, op) \
Modified: projects/physbio/sys/sparc64/sparc64/bus_machdep.c
==============================================================================
--- projects/physbio/sys/sparc64/sparc64/bus_machdep.c Mon Dec 24 00:46:34 2012 (r244648)
+++ projects/physbio/sys/sparc64/sparc64/bus_machdep.c Mon Dec 24 01:00:36 2012 (r244649)
@@ -405,42 +405,19 @@ nexus_dmamap_load_buffer(bus_dma_tag_t d
static void
nexus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg, int *flags)
+ bus_dmamap_callback_t *callback, void *callback_arg)
{
}
-static void
+static bus_dma_segment_t *
nexus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg, int nsegs, int error)
-{
-
- if (error) {
- (*callback)(callback_arg, dmat->dt_segments, 0, error);
- } else {
- map->dm_flags |= DMF_LOADED;
- (*callback)(callback_arg, dmat->dt_segments, nsegs, 0);
- }
-}
-
-static void
-nexus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback2_t *callback, void *callback_arg, int nsegs,
- bus_size_t len, int error)
-{
-
- if (error) {
- (*callback)(callback_arg, dmat->dt_segments, 0, 0, error);
- } else {
- map->dm_flags |= DMF_LOADED;
- (*callback)(callback_arg, dmat->dt_segments, nsegs, len, error);
- }
-}
-
-static void
-nexus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map,
bus_dma_segment_t *segs, int nsegs, int error)
{
+
+ if (segs == NULL)
+ segs = dmat->dt_segments;
+ return (segs);
}
/*
@@ -546,8 +523,6 @@ static struct bus_dma_methods nexus_dma_
nexus_dmamap_load_buffer,
nexus_dmamap_mayblock,
nexus_dmamap_complete,
- nexus_dmamap_complete2,
- nexus_dmamap_directseg,
nexus_dmamap_unload,
nexus_dmamap_sync,
nexus_dmamem_alloc,
Modified: projects/physbio/sys/sparc64/sparc64/iommu.c
==============================================================================
--- projects/physbio/sys/sparc64/sparc64/iommu.c Mon Dec 24 00:46:34 2012 (r244648)
+++ projects/physbio/sys/sparc64/sparc64/iommu.c Mon Dec 24 01:00:36 2012 (r244649)
@@ -971,51 +971,12 @@ iommu_dvmamap_load_buffer(bus_dma_tag_t
static void
iommu_dvmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg, int *flags)
+ bus_dmamap_callback_t *callback, void *callback_arg)
{
}
-static void
+static bus_dma_segment_t *
iommu_dvmamap_complete(bus_dma_tag_t dt, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg, int nsegs, int error)
-{
- struct iommu_state *is = dt->dt_cookie;
-
- IS_LOCK(is);
- iommu_map_insq(is, map);
- if (error != 0) {
- iommu_dvmamap_vunload(is, map);
- IS_UNLOCK(is);
- (*callback)(callback_arg, dt->dt_segments, 0, error);
- } else {
- IS_UNLOCK(is);
- map->dm_flags |= DMF_LOADED;
- (*callback)(callback_arg, dt->dt_segments, nsegs, 0);
- }
-}
-
-static void
-iommu_dvmamap_complete2(bus_dma_tag_t dt, bus_dmamap_t map,
- bus_dmamap_callback2_t *callback, void *callback_arg, int nsegs,
- bus_size_t len, int error)
-{
- struct iommu_state *is = dt->dt_cookie;
-
- IS_LOCK(is);
- iommu_map_insq(is, map);
- if (error != 0) {
- iommu_dvmamap_vunload(is, map);
- IS_UNLOCK(is);
- (*callback)(callback_arg, dt->dt_segments, 0, 0, error);
- } else {
- IS_UNLOCK(is);
- map->dm_flags |= DMF_LOADED;
- (*callback)(callback_arg, dt->dt_segments, nsegs, len, 0);
- }
-}
-
-static void
-iommu_dvmamap_directseg(bus_dma_tag_t dt, bus_dmamap_t map,
bus_dma_segment_t *segs, int nsegs, int error)
{
struct iommu_state *is = dt->dt_cookie;
@@ -1029,6 +990,9 @@ iommu_dvmamap_directseg(bus_dma_tag_t dt
IS_UNLOCK(is);
map->dm_flags |= DMF_LOADED;
}
+ if (segs == NULL)
+ segs = dt->dt_segments;
+ return (segs);
}
static void
@@ -1127,8 +1091,6 @@ struct bus_dma_methods iommu_dma_methods
iommu_dvmamap_load_buffer,
iommu_dvmamap_mayblock,
iommu_dvmamap_complete,
- iommu_dvmamap_complete2,
- iommu_dvmamap_directseg,
iommu_dvmamap_unload,
iommu_dvmamap_sync,
iommu_dvmamem_alloc,
Modified: projects/physbio/sys/sys/bus_dma.h
==============================================================================
--- projects/physbio/sys/sys/bus_dma.h Mon Dec 24 00:46:34 2012 (r244648)
+++ projects/physbio/sys/sys/bus_dma.h Mon Dec 24 01:00:36 2012 (r244649)
@@ -287,31 +287,23 @@ void _bus_dmamap_unload(bus_dma_tag_t dm
* software.
*/
void __bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg,
- int *flags);
+ bus_dmamap_callback_t *callback, void *callback_arg);
-#define _bus_dmamap_mayblock(dmat, map, callback, callback_arg, flags) \
+#define _bus_dmamap_mayblock(dmat, map, callback, callback_arg) \
do { \
if ((map) != NULL) \
__bus_dmamap_mayblock(dmat, map, callback, \
- callback_arg, flags); \
+ callback_arg); \
} while (0);
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);
-void _bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg,
- int nsegs, int error);
-
-void _bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback2_t *callback2,
- void *callback_arg, int nsegs, bus_size_t len,
- int error);
-
-void _bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dma_segment_t *segs, int nsegs, int error);
+bus_dma_segment_t *_bus_dmamap_complete(bus_dma_tag_t dmat,
+ bus_dmamap_t map,
+ bus_dma_segment_t *segs,
+ int nsegs, int error);
#endif /* __sparc64__ */
Modified: projects/physbio/sys/x86/x86/busdma_machdep.c
==============================================================================
--- projects/physbio/sys/x86/x86/busdma_machdep.c Mon Dec 24 00:46:34 2012 (r244648)
+++ projects/physbio/sys/x86/x86/busdma_machdep.c Mon Dec 24 01:00:36 2012 (r244649)
@@ -745,44 +745,22 @@ _bus_dmamap_load_buffer(bus_dma_tag_t dm
void
__bus_dmamap_mayblock(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg,
- int *flags)
+ bus_dmamap_callback_t *callback, void *callback_arg)
{
if (map != NULL) {
- (*flags) |= BUS_DMA_WAITOK;
map->callback = callback;
map->callback_arg = callback_arg;
}
}
-void
+bus_dma_segment_t *
_bus_dmamap_complete(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback_t *callback, void *callback_arg,
- int nsegs, int error)
-{
-
- if (error)
- (*callback)(callback_arg, dmat->segments, 0, error);
- else
- (*callback)(callback_arg, dmat->segments, nsegs, 0);
-}
-
-void
-_bus_dmamap_complete2(bus_dma_tag_t dmat, bus_dmamap_t map,
- bus_dmamap_callback2_t *callback,
- void *callback_arg, int nsegs, bus_size_t len, int error)
-{
-
- if (error)
- (*callback)(callback_arg, dmat->segments, 0, 0, error);
- else
- (*callback)(callback_arg, dmat->segments, nsegs, len, error);
-}
-
-void
-_bus_dmamap_directseg(bus_dma_tag_t dmat, bus_dmamap_t map,
bus_dma_segment_t *segs, int nsegs, int error)
{
+
+ if (segs == NULL)
+ segs = dmat->segments;
+ return (segs);
}
/*
More information about the svn-src-projects
mailing list