diff options
Diffstat (limited to 'sys/amd64/amd64/busdma_machdep.c')
-rw-r--r-- | sys/amd64/amd64/busdma_machdep.c | 34 |
1 files changed, 26 insertions, 8 deletions
diff --git a/sys/amd64/amd64/busdma_machdep.c b/sys/amd64/amd64/busdma_machdep.c index eb6cc9d..c55469f 100644 --- a/sys/amd64/amd64/busdma_machdep.c +++ b/sys/amd64/amd64/busdma_machdep.c @@ -331,14 +331,18 @@ bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) * A dmamap to for use with dmamap_load is also allocated. */ int -bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, - bus_dmamap_t *mapp) +bus_dmamem_alloc_size(bus_dma_tag_t dmat, void** vaddr, int flags, + bus_dmamap_t *mapp, bus_size_t size) { + + if (size > dmat->maxsize) + return (ENOMEM); + /* If we succeed, no mapping/bouncing will be required */ *mapp = NULL; - if ((dmat->maxsize <= PAGE_SIZE) && dmat->lowaddr >= ptoa(Maxmem)) { - *vaddr = malloc(dmat->maxsize, M_DEVBUF, + if ((size <= PAGE_SIZE) && dmat->lowaddr >= ptoa(Maxmem)) { + *vaddr = malloc(size, M_DEVBUF, (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : 0); } else { /* @@ -346,7 +350,7 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, * and handles multi-seg allocations. Nobody is doing * multi-seg allocations yet though. */ - *vaddr = contigmalloc(dmat->maxsize, M_DEVBUF, + *vaddr = contigmalloc(size, M_DEVBUF, (flags & BUS_DMA_NOWAIT) ? M_NOWAIT : 0, 0ul, dmat->lowaddr, dmat->alignment? dmat->alignment : 1ul, dmat->boundary); @@ -356,12 +360,20 @@ bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, return (0); } +int +bus_dmamem_alloc(bus_dma_tag_t dmat, void** vaddr, int flags, + bus_dmamap_t *mapp) +{ + return (bus_dmamem_alloc_size(dmat, vaddr, flags, mapp, dmat->maxsize)); +} + /* * Free a piece of memory and it's allociated dmamap, that was allocated * via bus_dmamem_alloc. Make the same choice for free/contigfree. */ void -bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) +bus_dmamem_free_size(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map, + bus_size_t size) { /* * dmamem does not need to be bounced, so the map should be @@ -369,10 +381,16 @@ bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) */ if (map != NULL) panic("bus_dmamem_free: Invalid map freed\n"); - if ((dmat->maxsize <= PAGE_SIZE) && dmat->lowaddr >= ptoa(Maxmem)) + if ((size <= PAGE_SIZE) && dmat->lowaddr >= ptoa(Maxmem)) free(vaddr, M_DEVBUF); else - contigfree(vaddr, dmat->maxsize, M_DEVBUF); + contigfree(vaddr, size, M_DEVBUF); +} + +void +bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) +{ + bus_dmamem_free_size(dmat, vaddr, map, dmat->maxsize); } #define BUS_DMAMAP_NSEGS ((BUS_SPACE_MAXSIZE / PAGE_SIZE) + 1) |