27 #include <sys/cdefs.h>
34 #include <sys/param.h>
35 #include <sys/systm.h>
37 #include <sys/busdma_bufalloc.h>
38 #include <sys/malloc.h>
41 #include <vm/vm_extern.h>
42 #include <vm/vm_kern.h>
52 #define MIN_ZONE_BUFSIZE 32
53 #define MAX_ZONE_BUFSIZE PAGE_SIZE
63 #error Unsupported page size
74 uma_alloc alloc_func, uma_free free_func, u_int32_t zcreate_flags)
77 struct busdma_bufzone *bz;
96 ++i, ++bz, cursize <<= 1) {
97 snprintf(bz->name,
sizeof(bz->name),
"dma %.10s %lu",
100 bz->umazone = uma_zcreate(bz->name, bz->size,
101 NULL, NULL, NULL, NULL, bz->size - 1, zcreate_flags);
102 if (bz->umazone == NULL) {
106 if (alloc_func != NULL)
107 uma_zone_set_allocf(bz->umazone, alloc_func);
108 if (free_func != NULL)
109 uma_zone_set_freef(bz->umazone, free_func);
119 struct busdma_bufzone *bz;
125 for (i = 0, bz = ba->buf_zones; i < ba->num_zones; ++i, ++bz) {
126 uma_zdestroy(bz->umazone);
132 struct busdma_bufzone *
135 struct busdma_bufzone *bz;
141 for (i = 0, bz = ba->buf_zones; i < ba->num_zones; ++i, ++bz) {
142 if (bz->size >= size)
146 panic(
"Didn't find a buffer zone of the right size");
153 #ifdef VM_MEMATTR_UNCACHEABLE
156 *pflag = UMA_SLAB_KERNEL;
158 return ((
void *)kmem_alloc_attr(kernel_map, size, wait, 0,
159 BUS_SPACE_MAXADDR, VM_MEMATTR_UNCACHEABLE));
163 panic(
"VM_MEMATTR_UNCACHEABLE unavailable");
172 kmem_free(kernel_map, (vm_offset_t)item, size);
int snprintf(char *str, size_t size, const char *format,...)
void * malloc(unsigned long size, struct malloc_type *mtp, int flags)
void panic(const char *fmt,...)
void busdma_bufalloc_destroy(busdma_bufalloc_t ba)
void * busdma_bufalloc_alloc_uncacheable(uma_zone_t zone, int size, u_int8_t *pflag, int wait)
void free(void *addr, struct malloc_type *mtp)
struct busdma_bufzone buf_zones[12]
void busdma_bufalloc_free_uncacheable(void *item, int size, u_int8_t pflag)
struct busdma_bufzone * busdma_bufalloc_findzone(busdma_bufalloc_t ba, bus_size_t size)
busdma_bufalloc_t busdma_bufalloc_create(const char *name, bus_size_t minimum_alignment, uma_alloc alloc_func, uma_free free_func, u_int32_t zcreate_flags)