Changeset View
Changeset View
Standalone View
Standalone View
head/sys/x86/x86/busdma_bounce.c
Show First 20 Lines • Show All 133 Lines • ▼ Show 20 Lines | |||||
static struct bus_dmamap nobounce_dmamap; | static struct bus_dmamap nobounce_dmamap; | ||||
static void init_bounce_pages(void *dummy); | static void init_bounce_pages(void *dummy); | ||||
static int alloc_bounce_zone(bus_dma_tag_t dmat); | static int alloc_bounce_zone(bus_dma_tag_t dmat); | ||||
static int alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages); | static int alloc_bounce_pages(bus_dma_tag_t dmat, u_int numpages); | ||||
static int reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, | static int reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, | ||||
int commit); | int commit); | ||||
static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, | static bus_addr_t add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, | ||||
vm_offset_t vaddr, bus_addr_t addr1, bus_addr_t addr2, bus_size_t size); | vm_offset_t vaddr, vm_paddr_t addr1, vm_paddr_t addr2, bus_size_t size); | ||||
static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage); | static void free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage); | ||||
static void _bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, | static void _bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, | ||||
pmap_t pmap, void *buf, bus_size_t buflen, int flags); | pmap_t pmap, void *buf, bus_size_t buflen, int flags); | ||||
static void _bus_dmamap_count_phys(bus_dma_tag_t dmat, bus_dmamap_t map, | static void _bus_dmamap_count_phys(bus_dma_tag_t dmat, bus_dmamap_t map, | ||||
vm_paddr_t buf, bus_size_t buflen, int flags); | vm_paddr_t buf, bus_size_t buflen, int flags); | ||||
static int _bus_dmamap_reserve_pages(bus_dma_tag_t dmat, bus_dmamap_t map, | static int _bus_dmamap_reserve_pages(bus_dma_tag_t dmat, bus_dmamap_t map, | ||||
int flags); | int flags); | ||||
▲ Show 20 Lines • Show All 351 Lines • ▼ Show 20 Lines | bounce_bus_dmamem_free(bus_dma_tag_t dmat, void *vaddr, bus_dmamap_t map) | ||||
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 void | static void | ||||
_bus_dmamap_count_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf, | _bus_dmamap_count_phys(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t buf, | ||||
bus_size_t buflen, int flags) | bus_size_t buflen, int flags) | ||||
{ | { | ||||
bus_addr_t curaddr; | vm_paddr_t curaddr; | ||||
bus_size_t sgsize; | bus_size_t sgsize; | ||||
if (map != &nobounce_dmamap && map->pagesneeded == 0) { | if (map != &nobounce_dmamap && map->pagesneeded == 0) { | ||||
/* | /* | ||||
* Count the number of bounce pages | * Count the number of bounce pages | ||||
* needed in order to complete this transfer | * needed in order to complete this transfer | ||||
*/ | */ | ||||
curaddr = buf; | curaddr = buf; | ||||
Show All 12 Lines | |||||
} | } | ||||
static void | static void | ||||
_bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, | _bus_dmamap_count_pages(bus_dma_tag_t dmat, bus_dmamap_t map, pmap_t pmap, | ||||
void *buf, bus_size_t buflen, int flags) | void *buf, bus_size_t buflen, int flags) | ||||
{ | { | ||||
vm_offset_t vaddr; | vm_offset_t vaddr; | ||||
vm_offset_t vendaddr; | vm_offset_t vendaddr; | ||||
bus_addr_t paddr; | vm_paddr_t paddr; | ||||
bus_size_t sg_len; | bus_size_t sg_len; | ||||
if (map != &nobounce_dmamap && map->pagesneeded == 0) { | if (map != &nobounce_dmamap && map->pagesneeded == 0) { | ||||
CTR4(KTR_BUSDMA, "lowaddr= %d Maxmem= %d, boundary= %d, " | CTR4(KTR_BUSDMA, "lowaddr= %d Maxmem= %d, boundary= %d, " | ||||
"alignment= %d", dmat->common.lowaddr, | "alignment= %d", dmat->common.lowaddr, | ||||
ptoa((vm_paddr_t)Maxmem), | ptoa((vm_paddr_t)Maxmem), | ||||
dmat->common.boundary, dmat->common.alignment); | dmat->common.boundary, dmat->common.alignment); | ||||
CTR3(KTR_BUSDMA, "map= %p, nobouncemap= %p, pagesneeded= %d", | CTR3(KTR_BUSDMA, "map= %p, nobouncemap= %p, pagesneeded= %d", | ||||
▲ Show 20 Lines • Show All 90 Lines • ▼ Show 20 Lines | _bus_dmamap_reserve_pages(bus_dma_tag_t dmat, bus_dmamap_t map, int flags) | ||||
return (0); | return (0); | ||||
} | } | ||||
/* | /* | ||||
* Add a single contiguous physical range to the segment list. | * Add a single contiguous physical range to the segment list. | ||||
*/ | */ | ||||
static int | static int | ||||
_bus_dmamap_addseg(bus_dma_tag_t dmat, bus_dmamap_t map, bus_addr_t curaddr, | _bus_dmamap_addseg(bus_dma_tag_t dmat, bus_dmamap_t map, vm_paddr_t curaddr, | ||||
bus_size_t sgsize, bus_dma_segment_t *segs, int *segp) | bus_size_t sgsize, bus_dma_segment_t *segs, int *segp) | ||||
{ | { | ||||
bus_addr_t baddr, bmask; | bus_addr_t baddr, bmask; | ||||
int seg; | int seg; | ||||
KASSERT(curaddr <= BUS_SPACE_MAXADDR, | |||||
("ds_addr %#jx > BUS_SPACE_MAXADDR %#jx; dmat %p fl %#x low %#jx " | |||||
"hi %#jx", | |||||
(uintmax_t)curaddr, (uintmax_t)BUS_SPACE_MAXADDR, | |||||
dmat, dmat->bounce_flags, (uintmax_t)dmat->common.lowaddr, | |||||
(uintmax_t)dmat->common.highaddr)); | |||||
/* | /* | ||||
* Make sure we don't cross any boundaries. | * Make sure we don't cross any boundaries. | ||||
*/ | */ | ||||
bmask = ~(dmat->common.boundary - 1); | bmask = ~(dmat->common.boundary - 1); | ||||
if (dmat->common.boundary > 0) { | if (dmat->common.boundary > 0) { | ||||
baddr = (curaddr + dmat->common.boundary) & bmask; | baddr = (curaddr + dmat->common.boundary) & bmask; | ||||
if (sgsize > (baddr - curaddr)) | if (sgsize > (baddr - curaddr)) | ||||
sgsize = (baddr - curaddr); | sgsize = (baddr - curaddr); | ||||
Show All 30 Lines | |||||
* the starting segment on entrace, and the ending segment on exit. | * the starting segment on entrace, and the ending segment on exit. | ||||
*/ | */ | ||||
static int | static int | ||||
bounce_bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, | bounce_bus_dmamap_load_phys(bus_dma_tag_t dmat, bus_dmamap_t map, | ||||
vm_paddr_t buf, bus_size_t buflen, int flags, bus_dma_segment_t *segs, | vm_paddr_t buf, bus_size_t buflen, int flags, bus_dma_segment_t *segs, | ||||
int *segp) | int *segp) | ||||
{ | { | ||||
bus_size_t sgsize; | bus_size_t sgsize; | ||||
bus_addr_t curaddr; | vm_paddr_t curaddr; | ||||
int error; | int error; | ||||
if (map == NULL) | if (map == NULL) | ||||
map = &nobounce_dmamap; | map = &nobounce_dmamap; | ||||
if (segs == NULL) | if (segs == NULL) | ||||
segs = dmat->segments; | segs = dmat->segments; | ||||
Show All 35 Lines | |||||
* the starting segment on entrace, and the ending segment on exit. | * the starting segment on entrace, and the ending segment on exit. | ||||
*/ | */ | ||||
static int | static int | ||||
bounce_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, | bounce_bus_dmamap_load_buffer(bus_dma_tag_t dmat, bus_dmamap_t map, void *buf, | ||||
bus_size_t buflen, pmap_t pmap, int flags, bus_dma_segment_t *segs, | bus_size_t buflen, pmap_t pmap, int flags, bus_dma_segment_t *segs, | ||||
int *segp) | int *segp) | ||||
{ | { | ||||
bus_size_t sgsize, max_sgsize; | bus_size_t sgsize, max_sgsize; | ||||
bus_addr_t curaddr; | vm_paddr_t curaddr; | ||||
vm_offset_t kvaddr, vaddr; | vm_offset_t kvaddr, vaddr; | ||||
int error; | int error; | ||||
if (map == NULL) | if (map == NULL) | ||||
map = &nobounce_dmamap; | map = &nobounce_dmamap; | ||||
if (segs == NULL) | if (segs == NULL) | ||||
segs = dmat->segments; | segs = dmat->segments; | ||||
▲ Show 20 Lines • Show All 430 Lines • ▼ Show 20 Lines | reserve_bounce_pages(bus_dma_tag_t dmat, bus_dmamap_t map, int commit) | ||||
map->pagesreserved += pages; | map->pagesreserved += pages; | ||||
pages = map->pagesneeded - map->pagesreserved; | pages = map->pagesneeded - map->pagesreserved; | ||||
return (pages); | return (pages); | ||||
} | } | ||||
static bus_addr_t | static bus_addr_t | ||||
add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, | add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, | ||||
bus_addr_t addr1, bus_addr_t addr2, bus_size_t size) | vm_paddr_t addr1, vm_paddr_t addr2, bus_size_t size) | ||||
{ | { | ||||
struct bounce_zone *bz; | struct bounce_zone *bz; | ||||
struct bounce_page *bpage; | struct bounce_page *bpage; | ||||
KASSERT(dmat->bounce_zone != NULL, ("no bounce zone in dma tag")); | KASSERT(dmat->bounce_zone != NULL, ("no bounce zone in dma tag")); | ||||
KASSERT(map != NULL && map != &nobounce_dmamap, | KASSERT(map != NULL && map != &nobounce_dmamap, | ||||
("add_bounce_page: bad map %p", map)); | ("add_bounce_page: bad map %p", map)); | ||||
▲ Show 20 Lines • Show All 109 Lines • Show Last 20 Lines |