Home | History | Annotate | Download | only in radeon

Lines Matching refs:ttm

52 #include <drm/ttm/ttm_bo_api.h>
53 #include <drm/ttm/ttm_bo_driver.h>
54 #include <drm/ttm/ttm_module.h>
55 #include <drm/ttm/ttm_page_alloc.h>
56 #include <drm/ttm/ttm_placement.h>
197 if (radeon_ttm_tt_has_userptr(bo->ttm))
299 r = ttm_tt_set_placement_caching(bo->ttm, tmp_mem.placement);
304 r = ttm_tt_bind(bo->ttm, &tmp_mem, &ctx);
375 if (old_mem->mem_type == TTM_PL_SYSTEM && bo->ttm == NULL) {
499 * TTM backend functions.
502 struct ttm_dma_tt ttm;
516 static int radeon_ttm_tt_pin_userptr(struct ttm_tt *ttm)
518 struct radeon_device *rdev = radeon_get_rdev(ttm->bdev);
519 struct radeon_ttm_tt *gtt = (void *)ttm;
542 unsigned long end = gtt->userptr + ttm->num_pages * PAGE_SIZE;
567 .iov_len = ttm->num_pages << PAGE_SHIFT,
573 .uio_resid = ttm->num_pages << PAGE_SHIFT,
583 ttm->num_pages << PAGE_SHIFT,
590 r = -bus_dmamap_load_uio(rdev->ddev->dmat, gtt->ttm.dma_address, &uio,
595 /* Get each of the pages as ttm requests. */
596 for (i = 0; i < ttm->num_pages; i++) {
606 ttm->pages[i] = container_of(vmp, struct page, p_vmp);
613 ttm->pages[i] = NULL; /* paranoia */
614 bus_dmamap_unload(rdev->ddev->dmat, gtt->ttm.dma_address);
616 ttm->num_pages << PAGE_SHIFT);
620 unsigned num_pages = ttm->num_pages - pinned;
622 struct page **pages = ttm->pages + pinned;
631 } while (pinned < ttm->num_pages);
633 r = sg_alloc_table_from_pages(ttm->sg, ttm->pages, ttm->num_pages, 0,
634 ttm->num_pages << PAGE_SHIFT,
640 nents = dma_map_sg(rdev->dev, ttm->sg->sgl, ttm->sg->nents, direction);
641 if (nents != ttm->sg->nents)
644 drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
645 gtt->ttm.dma_address, ttm->num_pages);
650 kfree(ttm->sg);
653 release_pages(ttm->pages, pinned);
658 static void radeon_ttm_tt_unpin_userptr(struct ttm_tt *ttm)
661 struct radeon_device *rdev = radeon_get_rdev(ttm->bdev);
662 struct radeon_ttm_tt *gtt = (void *)ttm;
664 bus_dmamap_unload(rdev->ddev->dmat, gtt->ttm.dma_address);
666 ttm->num_pages << PAGE_SHIFT);
668 struct radeon_device *rdev = radeon_get_rdev(ttm->bdev);
669 struct radeon_ttm_tt *gtt = (void *)ttm;
677 if (!ttm->sg->sgl)
681 dma_unmap_sg(rdev->dev, ttm->sg->sgl, ttm->sg->nents, direction);
683 for_each_sg_page(ttm->sg->sgl, &sg_iter, ttm->sg->nents, 0) {
692 sg_free_table(ttm->sg);
696 static int radeon_ttm_backend_bind(struct ttm_tt *ttm,
699 struct radeon_ttm_tt *gtt = (void*)ttm;
705 radeon_ttm_tt_pin_userptr(ttm);
710 if (!ttm->num_pages) {
712 ttm->num_pages, bo_mem, ttm);
714 if (ttm->caching_state == tt_cached)
716 r = radeon_gart_bind(gtt->rdev, gtt->offset, ttm->num_pages,
717 ttm->pages, gtt->ttm.dma_address, flags);
720 ttm->num_pages, (unsigned)gtt->offset);
726 static int radeon_ttm_backend_unbind(struct ttm_tt *ttm)
728 struct radeon_ttm_tt *gtt = (void *)ttm;
730 radeon_gart_unbind(gtt->rdev, gtt->offset, ttm->num_pages);
733 radeon_ttm_tt_unpin_userptr(ttm);
738 static void radeon_ttm_backend_destroy(struct ttm_tt *ttm)
740 struct radeon_ttm_tt *gtt = (void *)ttm;
742 ttm_dma_tt_fini(&gtt->ttm);
770 gtt->ttm.ttm.func = &radeon_backend_func;
772 if (ttm_dma_tt_init(&gtt->ttm, bo, page_flags)) {
776 return &gtt->ttm.ttm;
779 static struct radeon_ttm_tt *radeon_ttm_tt_to_gtt(struct ttm_tt *ttm)
781 if (!ttm || ttm->func != &radeon_backend_func)
783 return (struct radeon_ttm_tt *)ttm;
786 static int radeon_ttm_tt_populate(struct ttm_tt *ttm,
789 struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(ttm);
793 bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);
797 ttm->sg = NULL;
799 ttm->sg = kzalloc(sizeof(struct sg_table), GFP_KERNEL);
800 if (!ttm->sg)
804 ttm->page_flags |= TTM_PAGE_FLAG_SG;
805 ttm->state = tt_unbound;
809 if (slave && ttm->sg) {
811 int r = drm_prime_bus_dmamap_load_sgt(ttm->bdev->dmat,
812 gtt->ttm.dma_address, ttm->sg);
816 drm_prime_sg_to_page_addr_arrays(ttm->sg, ttm->pages,
817 gtt->ttm.dma_address, ttm->num_pages);
819 ttm->state = tt_unbound;
824 rdev = radeon_get_rdev(ttm->bdev);
828 return ttm_agp_tt_populate(ttm, ctx);
834 return ttm_bus_dma_populate(&gtt->ttm);
839 return ttm_dma_populate(&gtt->ttm, rdev->dev, ctx);
843 return ttm_populate_and_map_pages(rdev->dev, &gtt->ttm, ctx);
847 static void radeon_ttm_tt_unpopulate(struct ttm_tt *ttm)
852 struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(ttm);
853 bool slave = !!(ttm->page_flags & TTM_PAGE_FLAG_SG);
856 if (slave && ttm->sg) {
857 bus_dmamap_unload(ttm->bdev->dmat, gtt->ttm.dma_address);
861 kfree(ttm->sg);
862 ttm->page_flags &= ~TTM_PAGE_FLAG_SG;
870 rdev = radeon_get_rdev(ttm->bdev);
874 ttm_agp_tt_unpopulate(ttm);
880 ttm_bus_dma_unpopulate(&gtt->ttm);
886 ttm_dma_unpopulate(&gtt->ttm, rdev->dev);
891 ttm_unmap_and_unpopulate_pages(rdev->dev, &gtt->ttm);
896 static void radeon_ttm_tt_swapout(struct ttm_tt *ttm)
898 struct radeon_ttm_tt *gtt = container_of(ttm, struct radeon_ttm_tt,
899 ttm.ttm);
900 struct ttm_dma_tt *ttm_dma = &gtt->ttm;
915 int radeon_ttm_tt_set_userptr(struct ttm_tt *ttm, uint64_t addr,
918 struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(ttm);
933 bool radeon_ttm_tt_has_userptr(struct ttm_tt *ttm)
935 struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(ttm);
943 bool radeon_ttm_tt_is_readonly(struct ttm_tt *ttm)
945 struct radeon_ttm_tt *gtt = radeon_ttm_tt_to_gtt(ttm);
1056 DRM_INFO("radeon: ttm finalized\n");
1069 /* this just adjusts TTM size idea, which sets lpfn to the correct value */