summaryrefslogtreecommitdiffstats
path: root/sys/sys/bus_dma.h
diff options
context:
space:
mode:
authorscottl <scottl@FreeBSD.org>2003-01-29 07:25:27 +0000
committerscottl <scottl@FreeBSD.org>2003-01-29 07:25:27 +0000
commit27cbbd88a297ee95096971d969fc28f1f2c7a09c (patch)
treed21203bdfa9f1d0c2ea53afbd752b1326d109e6c /sys/sys/bus_dma.h
parent1bc11f23c6b4c14967b2c1745df47caa7147c66e (diff)
downloadFreeBSD-src-27cbbd88a297ee95096971d969fc28f1f2c7a09c.zip
FreeBSD-src-27cbbd88a297ee95096971d969fc28f1f2c7a09c.tar.gz
Implement bus_dmamem_alloc_size() and bus_dmamem_free_size() as
counterparts to bus_dmamem_alloc() and bus_dmamem_free(). This allows the caller to specify the size of the allocation instead of it defaulting to the max_size field of the busdma tag. This is intended to aid in converting drivers to busdma. Lots of hardware cannot understand scatter/gather lists, which forces the driver to copy the i/o buffers to a single contiguous region before sending it to the hardware. Without these new methods, this would require a new busdma tag for each operation, or a complex internal allocator/cache for each driver. Allocations greater than PAGE_SIZE are rounded up to the next PAGE_SIZE by contigmalloc(), so this is not suitable for multiple static allocations that would be better served by a single fixed-length subdivided allocation. Reviewed by: jake (sparc64)
Diffstat (limited to 'sys/sys/bus_dma.h')
-rw-r--r--sys/sys/bus_dma.h6
1 files changed, 6 insertions, 0 deletions
diff --git a/sys/sys/bus_dma.h b/sys/sys/bus_dma.h
index 6790731..4a1740d 100644
--- a/sys/sys/bus_dma.h
+++ b/sys/sys/bus_dma.h
@@ -180,6 +180,9 @@ int bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map);
* bus device space based on the constraints lited in the dma tag.
* A dmamap to for use with dmamap_load is also allocated.
*/
+int bus_dmamem_alloc_size(bus_dma_tag_t dmat, void** vaddr, int flags,
+ bus_dmamap_t *mapp, bus_size_t size);
+
int bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags,
bus_dmamap_t *mapp);
@@ -187,6 +190,9 @@ int bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags,
* Free a piece of memory and it's allociated dmamap, that was allocated
* via bus_dmamem_alloc.
*/
+void bus_dmamem_free_size(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map,
+ bus_size_t size);
+
void bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map);
/*
OpenPOWER on IntegriCloud