| 1366 | } |
| 1367 | |
| 1368 | static bus_addr_t |
| 1369 | add_bounce_page(bus_dma_tag_t dmat, bus_dmamap_t map, vm_offset_t vaddr, |
| 1370 | bus_addr_t addr, bus_size_t size) |
| 1371 | { |
| 1372 | struct bounce_zone *bz; |
| 1373 | struct bounce_page *bpage; |
| 1374 | |
| 1375 | KASSERT(dmat->bounce_zone != NULL, ("no bounce zone in dma tag")); |
| 1376 | |
| 1377 | bz = dmat->bounce_zone; |
| 1378 | if (map->pagesneeded == 0) |
| 1379 | panic("add_bounce_page: map doesn't need any pages"); |
| 1380 | map->pagesneeded--; |
| 1381 | |
| 1382 | if (map->pagesreserved == 0) |
| 1383 | panic("add_bounce_page: map doesn't need any pages"); |
| 1384 | map->pagesreserved--; |
| 1385 | |
| 1386 | mtx_lock(&bounce_lock); |
| 1387 | bpage = STAILQ_FIRST(&bz->bounce_page_list); |
| 1388 | if (bpage == NULL) |
| 1389 | panic("add_bounce_page: free page list is empty"); |
| 1390 | |
| 1391 | STAILQ_REMOVE_HEAD(&bz->bounce_page_list, links); |
| 1392 | bz->reserved_bpages--; |
| 1393 | bz->active_bpages++; |
| 1394 | mtx_unlock(&bounce_lock); |
| 1395 | |
| 1396 | if (dmat->common.flags & BUS_DMA_KEEP_PG_OFFSET) { |
| 1397 | /* Page offset needs to be preserved. */ |
| 1398 | bpage->vaddr |= addr & PAGE_MASK; |
| 1399 | bpage->busaddr |= addr & PAGE_MASK; |
| 1400 | } |
| 1401 | bpage->datavaddr = vaddr; |
| 1402 | bpage->datapage = PHYS_TO_VM_PAGE(addr); |
| 1403 | bpage->dataoffs = addr & PAGE_MASK; |
| 1404 | bpage->datacount = size; |
| 1405 | STAILQ_INSERT_TAIL(&(map->bpages), bpage, links); |
| 1406 | return (bpage->busaddr); |
| 1407 | } |
| 1408 | |
| 1409 | static void |
| 1410 | free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage) |
no test coverage detected