• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /freebsd-13-stable/sys/dev/drm2/ttm/

Lines Matching refs:ttm

42 #include <dev/drm2/ttm/ttm_module.h>
43 #include <dev/drm2/ttm/ttm_bo_driver.h>
44 #include <dev/drm2/ttm/ttm_placement.h>
45 #include <dev/drm2/ttm/ttm_page_alloc.h>
50 * Allocates storage for pointers to the pages that back the ttm.
52 static void ttm_tt_alloc_page_directory(struct ttm_tt *ttm)
54 ttm->pages = malloc(ttm->num_pages * sizeof(void *),
58 static void ttm_dma_tt_alloc_page_directory(struct ttm_dma_tt *ttm)
60 ttm->ttm.pages = malloc(ttm->ttm.num_pages * sizeof(void *),
62 ttm->dma_address = malloc(ttm->ttm.num_pages *
63 sizeof(*ttm->dma_address), M_TTM_PD, M_WAITOK);
99 * for range of pages in a ttm.
102 static int ttm_tt_set_caching(struct ttm_tt *ttm,
109 if (ttm->caching_state == c_state)
112 if (ttm->state == tt_unpopulated) {
114 ttm->caching_state = c_state;
118 if (ttm->caching_state == tt_cached)
119 drm_clflush_pages(ttm->pages, ttm->num_pages);
121 for (i = 0; i < ttm->num_pages; ++i) {
122 cur_page = ttm->pages[i];
125 ttm->caching_state,
132 ttm->caching_state = c_state;
138 cur_page = ttm->pages[j];
141 ttm->caching_state);
148 int ttm_tt_set_placement_caching(struct ttm_tt *ttm, uint32_t placement)
159 return ttm_tt_set_caching(ttm, state);
162 void ttm_tt_destroy(struct ttm_tt *ttm)
164 if (unlikely(ttm == NULL))
167 if (ttm->state == tt_bound) {
168 ttm_tt_unbind(ttm);
171 if (likely(ttm->pages != NULL)) {
172 ttm->bdev->driver->ttm_tt_unpopulate(ttm);
175 if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP) &&
176 ttm->swap_storage)
177 vm_object_deallocate(ttm->swap_storage);
179 ttm->swap_storage = NULL;
180 ttm->func->destroy(ttm);
183 int ttm_tt_init(struct ttm_tt *ttm, struct ttm_bo_device *bdev,
187 ttm->bdev = bdev;
188 ttm->glob = bdev->glob;
189 ttm->num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
190 ttm->caching_state = tt_cached;
191 ttm->page_flags = page_flags;
192 ttm->dummy_read_page = dummy_read_page;
193 ttm->state = tt_unpopulated;
194 ttm->swap_storage = NULL;
196 ttm_tt_alloc_page_directory(ttm);
197 if (!ttm->pages) {
198 ttm_tt_destroy(ttm);
205 void ttm_tt_fini(struct ttm_tt *ttm)
207 free(ttm->pages, M_TTM_PD);
208 ttm->pages = NULL;
215 struct ttm_tt *ttm = &ttm_dma->ttm;
217 ttm->bdev = bdev;
218 ttm->glob = bdev->glob;
219 ttm->num_pages = (size + PAGE_SIZE - 1) >> PAGE_SHIFT;
220 ttm->caching_state = tt_cached;
221 ttm->page_flags = page_flags;
222 ttm->dummy_read_page = dummy_read_page;
223 ttm->state = tt_unpopulated;
224 ttm->swap_storage = NULL;
228 if (!ttm->pages || !ttm_dma->dma_address) {
229 ttm_tt_destroy(ttm);
238 struct ttm_tt *ttm = &ttm_dma->ttm;
240 free(ttm->pages, M_TTM_PD);
241 ttm->pages = NULL;
246 void ttm_tt_unbind(struct ttm_tt *ttm)
250 if (ttm->state == tt_bound) {
251 ret = ttm->func->unbind(ttm);
253 ttm->state = tt_unbound;
257 int ttm_tt_bind(struct ttm_tt *ttm, struct ttm_mem_reg *bo_mem)
261 if (!ttm)
264 if (ttm->state == tt_bound)
267 ret = ttm->bdev->driver->ttm_tt_populate(ttm);
271 ret = ttm->func->bind(ttm, bo_mem);
275 ttm->state = tt_bound;
280 int ttm_tt_swapin(struct ttm_tt *ttm)
286 obj = ttm->swap_storage;
289 for (i = 0; i < ttm->num_pages; ++i) {
296 to_page = ttm->pages[i];
307 if (!(ttm->page_flags & TTM_PAGE_FLAG_PERSISTENT_SWAP))
309 ttm->swap_storage = NULL;
310 ttm->page_flags &= ~TTM_PAGE_FLAG_SWAPPED;
318 int ttm_tt_swapout(struct ttm_tt *ttm, vm_object_t persistent_swap_storage)
324 MPASS(ttm->state == tt_unbound || ttm->state == tt_unpopulated);
325 MPASS(ttm->caching_state == tt_cached);
329 IDX_TO_OFF(ttm->num_pages), VM_PROT_DEFAULT, 0,
340 for (i = 0; i < ttm->num_pages; ++i) {
341 from_page = ttm->pages[i];
353 ttm->bdev->driver->ttm_tt_unpopulate(ttm);
354 ttm->swap_storage = obj;
355 ttm->page_flags |= TTM_PAGE_FLAG_SWAPPED;
357 ttm->page_flags |= TTM_PAGE_FLAG_PERSISTENT_SWAP;