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
This commit is contained in:
parent
9424879158
commit
2f36da87cb
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=239354
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user