39#include <sys/busdma_bufalloc.h>
40#include <sys/domainset.h>
41#include <sys/malloc.h>
44#include <vm/vm_extern.h>
45#include <vm/vm_kern.h>
55#define MIN_ZONE_BUFSIZE 32
56#define MAX_ZONE_BUFSIZE PAGE_SIZE
66#error Unsupported page size
77 uma_alloc alloc_func, uma_free free_func, uint32_t zcreate_flags)
80 struct busdma_bufzone *bz;
99 ++i, ++bz, cursize <<= 1) {
100 snprintf(bz->name,
sizeof(bz->name),
"dma %.10s %ju",
101 name, (uintmax_t)cursize);
103 bz->umazone = uma_zcreate(bz->name, bz->size,
104 NULL, NULL, NULL, NULL, bz->size - 1, zcreate_flags);
105 if (bz->umazone == NULL) {
109 if (alloc_func != NULL)
110 uma_zone_set_allocf(bz->umazone, alloc_func);
111 if (free_func != NULL)
112 uma_zone_set_freef(bz->umazone, free_func);
122 struct busdma_bufzone *bz;
128 for (i = 0, bz = ba->buf_zones; i < ba->num_zones; ++i, ++bz) {
129 uma_zdestroy(bz->umazone);
135struct busdma_bufzone *
138 struct busdma_bufzone *bz;
144 for (i = 0, bz = ba->buf_zones; i < ba->num_zones; ++i, ++bz) {
145 if (bz->size >= size)
149 panic(
"Didn't find a buffer zone of the right size");
154 uint8_t *pflag,
int wait)
157#ifdef VM_MEMATTR_UNCACHEABLE
159 *pflag = UMA_SLAB_KERNEL;
161 return ((
void *)kmem_alloc_attr_domainset(DOMAINSET_FIXED(
domain), size,
162 wait, 0, BUS_SPACE_MAXADDR, VM_MEMATTR_UNCACHEABLE));
164 panic(
"VM_MEMATTR_UNCACHEABLE unavailable");
172 kmem_free((vm_offset_t)item, size);
void *() malloc(size_t size, struct malloc_type *mtp, int flags)
void free(void *addr, struct malloc_type *mtp)
void panic(const char *fmt,...)
struct iommu_domain ** domain
struct busdma_bufzone buf_zones[12]
void busdma_bufalloc_free_uncacheable(void *item, vm_size_t size, uint8_t pflag)
void * busdma_bufalloc_alloc_uncacheable(uma_zone_t zone, vm_size_t size, int domain, uint8_t *pflag, int wait)
void busdma_bufalloc_destroy(busdma_bufalloc_t ba)
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, uint32_t zcreate_flags)
int snprintf(char *str, size_t size, const char *format,...)