Changeset View
Changeset View
Standalone View
Standalone View
head/sys/x86/x86/busdma_bounce.c
Show First 20 Lines • Show All 265 Lines • ▼ Show 20 Lines | if (dmat->map_count != 0) { | ||||
error = EBUSY; | error = EBUSY; | ||||
goto out; | goto out; | ||||
} | } | ||||
while (dmat != NULL) { | while (dmat != NULL) { | ||||
parent = (bus_dma_tag_t)dmat->common.parent; | parent = (bus_dma_tag_t)dmat->common.parent; | ||||
atomic_subtract_int(&dmat->common.ref_count, 1); | atomic_subtract_int(&dmat->common.ref_count, 1); | ||||
if (dmat->common.ref_count == 0) { | if (dmat->common.ref_count == 0) { | ||||
if (dmat->segments != NULL) | if (dmat->segments != NULL) | ||||
free_domain(dmat->segments, M_DEVBUF); | free(dmat->segments, M_DEVBUF); | ||||
free(dmat, M_DEVBUF); | free(dmat, M_DEVBUF); | ||||
/* | /* | ||||
* Last reference count, so | * Last reference count, so | ||||
* release our reference | * release our reference | ||||
* count on our parent. | * count on our parent. | ||||
*/ | */ | ||||
dmat = parent; | dmat = parent; | ||||
} else | } else | ||||
▲ Show 20 Lines • Show All 99 Lines • ▼ Show 20 Lines | bounce_bus_dmamap_destroy(bus_dma_tag_t dmat, bus_dmamap_t map) | ||||
if (map != NULL && map != &nobounce_dmamap) { | if (map != NULL && map != &nobounce_dmamap) { | ||||
if (STAILQ_FIRST(&map->bpages) != NULL) { | if (STAILQ_FIRST(&map->bpages) != NULL) { | ||||
CTR3(KTR_BUSDMA, "%s: tag %p error %d", | CTR3(KTR_BUSDMA, "%s: tag %p error %d", | ||||
__func__, dmat, EBUSY); | __func__, dmat, EBUSY); | ||||
return (EBUSY); | return (EBUSY); | ||||
} | } | ||||
if (dmat->bounce_zone) | if (dmat->bounce_zone) | ||||
dmat->bounce_zone->map_count--; | dmat->bounce_zone->map_count--; | ||||
free_domain(map, M_DEVBUF); | free(map, M_DEVBUF); | ||||
} | } | ||||
dmat->map_count--; | dmat->map_count--; | ||||
CTR2(KTR_BUSDMA, "%s: tag %p error 0", __func__, dmat); | CTR2(KTR_BUSDMA, "%s: tag %p error 0", __func__, dmat); | ||||
return (0); | return (0); | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 100 Lines • ▼ Show 20 Lines | bounce_bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) | ||||
/* | /* | ||||
* dmamem does not need to be bounced, so the map should be | * dmamem does not need to be bounced, so the map should be | ||||
* NULL and the BUS_DMA_KMEM_ALLOC flag cleared if malloc() | * NULL and the BUS_DMA_KMEM_ALLOC flag cleared if malloc() | ||||
* was used and set if kmem_alloc_contig() was used. | * was used and set if kmem_alloc_contig() was used. | ||||
*/ | */ | ||||
if (map != NULL) | if (map != NULL) | ||||
panic("bus_dmamem_free: Invalid map freed\n"); | panic("bus_dmamem_free: Invalid map freed\n"); | ||||
if ((dmat->bounce_flags & BUS_DMA_KMEM_ALLOC) == 0) | if ((dmat->bounce_flags & BUS_DMA_KMEM_ALLOC) == 0) | ||||
free_domain(vaddr, M_DEVBUF); | free(vaddr, M_DEVBUF); | ||||
else | else | ||||
kmem_free((vm_offset_t)vaddr, dmat->common.maxsize); | kmem_free((vm_offset_t)vaddr, dmat->common.maxsize); | ||||
CTR3(KTR_BUSDMA, "%s: tag %p flags 0x%x", __func__, dmat, | CTR3(KTR_BUSDMA, "%s: tag %p flags 0x%x", __func__, dmat, | ||||
dmat->bounce_flags); | dmat->bounce_flags); | ||||
} | } | ||||
static bool | static bool | ||||
_bus_dmamap_pagesneeded(bus_dma_tag_t dmat, vm_paddr_t buf, bus_size_t buflen, | _bus_dmamap_pagesneeded(bus_dma_tag_t dmat, vm_paddr_t buf, bus_size_t buflen, | ||||
▲ Show 20 Lines • Show All 667 Lines • ▼ Show 20 Lines | bpage = malloc_domainset(sizeof(*bpage), M_DEVBUF, | ||||
DOMAINSET_PREF(dmat->common.domain), M_NOWAIT | M_ZERO); | DOMAINSET_PREF(dmat->common.domain), M_NOWAIT | M_ZERO); | ||||
if (bpage == NULL) | if (bpage == NULL) | ||||
break; | break; | ||||
bpage->vaddr = (vm_offset_t)contigmalloc_domainset(PAGE_SIZE, | bpage->vaddr = (vm_offset_t)contigmalloc_domainset(PAGE_SIZE, | ||||
M_DEVBUF, DOMAINSET_PREF(dmat->common.domain), M_NOWAIT, | M_DEVBUF, DOMAINSET_PREF(dmat->common.domain), M_NOWAIT, | ||||
0ul, bz->lowaddr, PAGE_SIZE, 0); | 0ul, bz->lowaddr, PAGE_SIZE, 0); | ||||
if (bpage->vaddr == 0) { | if (bpage->vaddr == 0) { | ||||
free_domain(bpage, M_DEVBUF); | free(bpage, M_DEVBUF); | ||||
break; | break; | ||||
} | } | ||||
bpage->busaddr = pmap_kextract(bpage->vaddr); | bpage->busaddr = pmap_kextract(bpage->vaddr); | ||||
mtx_lock(&bounce_lock); | mtx_lock(&bounce_lock); | ||||
STAILQ_INSERT_TAIL(&bz->bounce_page_list, bpage, links); | STAILQ_INSERT_TAIL(&bz->bounce_page_list, bpage, links); | ||||
total_bpages++; | total_bpages++; | ||||
bz->total_bpages++; | bz->total_bpages++; | ||||
bz->free_bpages++; | bz->free_bpages++; | ||||
▲ Show 20 Lines • Show All 147 Lines • Show Last 20 Lines |