int ttm_tt_populate(struct ttm_tt *ttm) { struct page *page; unsigned long i; struct ttm_backend *be; int ret; if (ttm->state != tt_unpopulated) return 0; if (unlikely(ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)) { ret = ttm_tt_swapin(ttm); if (unlikely(ret != 0)) return ret; } be = ttm->be; for (i = 0; i < ttm->num_pages; ++i) { page = __ttm_tt_get_page(ttm, i); if (!page) return -ENOMEM; } be->func->populate(be, ttm->num_pages, ttm->pages, ttm->dummy_read_page); ttm->state = tt_unbound; return 0; }
int ttm_bus_dma_populate(struct ttm_dma_tt *ttm_dma) { int ret; /* If it's already populated, nothing to do. */ if (ttm_dma->ttm.state != tt_unpopulated) return 0; /* Wire the pages, allocating them if necessary. */ ret = ttm_tt_swapin(&ttm_dma->ttm); if (ret) goto fail0; /* Load the DMA map. */ /* XXX errno NetBSD->Linux */ ret = -bus_dmamap_load_pglist(ttm_dma->ttm.bdev->dmat, ttm_dma->dma_address, &ttm_dma->ttm.pglist, (ttm_dma->ttm.num_pages << PAGE_SHIFT), BUS_DMA_NOWAIT); if (ret) goto fail1; /* Success! */ ttm_dma->ttm.state = tt_unbound; return 0; fail2: __unused bus_dmamap_unload(ttm_dma->ttm.bdev->dmat, ttm_dma->dma_address); fail1: ttm_tt_swapout(&ttm_dma->ttm, NULL); fail0: KASSERT(ret); return ret; }
struct page *ttm_tt_get_page(struct ttm_tt *ttm, int index) { int ret; if (unlikely(ttm->page_flags & TTM_PAGE_FLAG_SWAPPED)) { ret = ttm_tt_swapin(ttm); if (unlikely(ret != 0)) return NULL; } return __ttm_tt_get_page(ttm, index); }