MCPcopy Create free account
hub / github.com/F-Stack/f-stack / add_bounce_page

Function add_bounce_page

freebsd/arm64/arm64/busdma_bounce.c:1368–1407  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

1366}
1367
1368static bus_addr_t
1369add_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
1409static void
1410free_bounce_page(bus_dma_tag_t dmat, struct bounce_page *bpage)

Callers 2

Calls 4

PHYS_TO_VM_PAGEFunction · 0.85
panicFunction · 0.50
mtx_lockFunction · 0.50
mtx_unlockFunction · 0.50

Tested by

no test coverage detected