diff options
author | John Baldwin <jhb@FreeBSD.org> | 2012-08-17 14:14:25 +0000 |
---|---|---|
committer | John Baldwin <jhb@FreeBSD.org> | 2012-08-17 14:14:25 +0000 |
commit | 2f36da87cb319d1592d28cd629a3182c39a7835f (patch) | |
tree | f3b06e3dfc8e5bda650835609c975dc8a2250703 /sys/x86 | |
parent | 942487915890f773a919849fe39950688c097d56 (diff) | |
download | src-2f36da87cb319d1592d28cd629a3182c39a7835f.tar.gz src-2f36da87cb319d1592d28cd629a3182c39a7835f.zip |
Allow static DMA allocations that allow for enough segments to do page-sized
segments for the entire allocation to use kmem_alloc_attr() to allocate
KVM rather than using kmem_alloc_contig(). This avoids requiring
a single physically contiguous chunk in this case.
Submitted by: Peter Jeremy (original version)
MFC after: 1 month
Notes
Notes:
svn path=/head/; revision=239354
Diffstat (limited to 'sys/x86')
-rw-r--r-- | sys/x86/x86/busdma_machdep.c | 13 |
1 files changed, 7 insertions, 6 deletions
diff --git a/sys/x86/x86/busdma_machdep.c b/sys/x86/x86/busdma_machdep.c index 00f2e0b59102..ffa8807f2d3d 100644 --- a/sys/x86/x86/busdma_machdep.c +++ b/sys/x86/x86/busdma_machdep.c @@ -533,13 +533,14 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, dmat->lowaddr >= ptoa((vm_paddr_t)Maxmem) && attr == VM_MEMATTR_DEFAULT) { *vaddr = malloc(dmat->maxsize, M_DEVBUF, mflags); + } else if (dmat->nsegments >= btoc(dmat->maxsize) && + dmat->alignment <= PAGE_SIZE && + (dmat->boundary == 0 || dmat->boundary >= dmat->lowaddr)) { + /* Page-based multi-segment allocations allowed */ + *vaddr = (void *)kmem_alloc_attr(kernel_map, dmat->maxsize, + mflags, 0ul, dmat->lowaddr, attr); + *mapp = &contig_dmamap; } else { - /* - * XXX Use Contigmalloc until it is merged into this facility - * and handles multi-seg allocations. Nobody is doing - * multi-seg allocations yet though. - * XXX Certain AGP hardware does. - */ *vaddr = (void *)kmem_alloc_contig(kernel_map, dmat->maxsize, mflags, 0ul, dmat->lowaddr, dmat->alignment ? dmat->alignment : 1ul, dmat->boundary, attr); |