aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_ttm.c
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2011-11-01 20:46:13 -0400
committerDave Airlie <airlied@redhat.com>2011-12-06 05:39:17 -0500
commit649bf3ca77343e3be1e0af8e21356fa569b1abd9 (patch)
tree01ad6a5f3f74b087cb791f5965d3190916975789 /drivers/gpu/drm/radeon/radeon_ttm.c
parent822c4d9ae0d55a4fcea9f0a462bc6406a06692e2 (diff)
drm/ttm: merge ttm_backend and ttm_tt V5
ttm_backend will only exist with a ttm_tt, and ttm_tt will only be of interest when bound to a backend. Merge them to avoid code and data duplication. V2 Rebase on top of memory accounting overhaul V3 Rebase on top of more memory accounting changes V4 Rebase on top of no memory account changes (where/when is my delorean when i need it ?) V5 make sure ttm is unbound before destroying, change commit message on suggestion from Tormod Volden Signed-off-by: Jerome Glisse <jglisse@redhat.com> Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com> Reviewed-by: Thomas Hellstrom <thellstrom@vmware.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_ttm.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_ttm.c219
1 files changed, 83 insertions, 136 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c b/drivers/gpu/drm/radeon/radeon_ttm.c
index 97c76aeae42e..af4d5f258afb 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -114,24 +114,6 @@ static void radeon_ttm_global_fini(struct radeon_device *rdev)
114 } 114 }
115} 115}
116 116
117struct ttm_backend *radeon_ttm_backend_create(struct radeon_device *rdev);
118
119static struct ttm_backend*
120radeon_create_ttm_backend_entry(struct ttm_bo_device *bdev)
121{
122 struct radeon_device *rdev;
123
124 rdev = radeon_get_rdev(bdev);
125#if __OS_HAS_AGP
126 if (rdev->flags & RADEON_IS_AGP) {
127 return ttm_agp_backend_init(bdev, rdev->ddev->agp->bridge);
128 } else
129#endif
130 {
131 return radeon_ttm_backend_create(rdev);
132 }
133}
134
135static int radeon_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags) 117static int radeon_invalidate_caches(struct ttm_bo_device *bdev, uint32_t flags)
136{ 118{
137 return 0; 119 return 0;
@@ -515,8 +497,90 @@ static bool radeon_sync_obj_signaled(void *sync_obj, void *sync_arg)
515 return radeon_fence_signaled((struct radeon_fence *)sync_obj); 497 return radeon_fence_signaled((struct radeon_fence *)sync_obj);
516} 498}
517 499
500/*
501 * TTM backend functions.
502 */
503struct radeon_ttm_tt {
504 struct ttm_tt ttm;
505 struct radeon_device *rdev;
506 u64 offset;
507};
508
509static int radeon_ttm_backend_bind(struct ttm_tt *ttm,
510 struct ttm_mem_reg *bo_mem)
511{
512 struct radeon_ttm_tt *gtt;
513 int r;
514
515 gtt = container_of(ttm, struct radeon_ttm_tt, ttm);
516 gtt->offset = (unsigned long)(bo_mem->start << PAGE_SHIFT);
517 if (!ttm->num_pages) {
518 WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n",
519 ttm->num_pages, bo_mem, ttm);
520 }
521 r = radeon_gart_bind(gtt->rdev, gtt->offset,
522 ttm->num_pages, ttm->pages, ttm->dma_address);
523 if (r) {
524 DRM_ERROR("failed to bind %lu pages at 0x%08X\n",
525 ttm->num_pages, (unsigned)gtt->offset);
526 return r;
527 }
528 return 0;
529}
530
531static int radeon_ttm_backend_unbind(struct ttm_tt *ttm)
532{
533 struct radeon_ttm_tt *gtt;
534
535 gtt = container_of(ttm, struct radeon_ttm_tt, ttm);
536 radeon_gart_unbind(gtt->rdev, gtt->offset, ttm->num_pages);
537 return 0;
538}
539
540static void radeon_ttm_backend_destroy(struct ttm_tt *ttm)
541{
542 struct radeon_ttm_tt *gtt;
543
544 gtt = container_of(ttm, struct radeon_ttm_tt, ttm);
545 kfree(gtt);
546}
547
548static struct ttm_backend_func radeon_backend_func = {
549 .bind = &radeon_ttm_backend_bind,
550 .unbind = &radeon_ttm_backend_unbind,
551 .destroy = &radeon_ttm_backend_destroy,
552};
553
554struct ttm_tt *radeon_ttm_tt_create(struct ttm_bo_device *bdev,
555 unsigned long size, uint32_t page_flags,
556 struct page *dummy_read_page)
557{
558 struct radeon_device *rdev;
559 struct radeon_ttm_tt *gtt;
560
561 rdev = radeon_get_rdev(bdev);
562#if __OS_HAS_AGP
563 if (rdev->flags & RADEON_IS_AGP) {
564 return ttm_agp_tt_create(bdev, rdev->ddev->agp->bridge,
565 size, page_flags, dummy_read_page);
566 }
567#endif
568
569 gtt = kzalloc(sizeof(struct radeon_ttm_tt), GFP_KERNEL);
570 if (gtt == NULL) {
571 return NULL;
572 }
573 gtt->ttm.func = &radeon_backend_func;
574 gtt->rdev = rdev;
575 if (ttm_tt_init(&gtt->ttm, bdev, size, page_flags, dummy_read_page)) {
576 return NULL;
577 }
578 return &gtt->ttm;
579}
580
581
518static struct ttm_bo_driver radeon_bo_driver = { 582static struct ttm_bo_driver radeon_bo_driver = {
519 .create_ttm_backend_entry = &radeon_create_ttm_backend_entry, 583 .ttm_tt_create = &radeon_ttm_tt_create,
520 .invalidate_caches = &radeon_invalidate_caches, 584 .invalidate_caches = &radeon_invalidate_caches,
521 .init_mem_type = &radeon_init_mem_type, 585 .init_mem_type = &radeon_init_mem_type,
522 .evict_flags = &radeon_evict_flags, 586 .evict_flags = &radeon_evict_flags,
@@ -680,123 +744,6 @@ int radeon_mmap(struct file *filp, struct vm_area_struct *vma)
680} 744}
681 745
682 746
683/*
684 * TTM backend functions.
685 */
686struct radeon_ttm_backend {
687 struct ttm_backend backend;
688 struct radeon_device *rdev;
689 unsigned long num_pages;
690 struct page **pages;
691 struct page *dummy_read_page;
692 dma_addr_t *dma_addrs;
693 bool populated;
694 bool bound;
695 unsigned offset;
696};
697
698static int radeon_ttm_backend_populate(struct ttm_backend *backend,
699 unsigned long num_pages,
700 struct page **pages,
701 struct page *dummy_read_page,
702 dma_addr_t *dma_addrs)
703{
704 struct radeon_ttm_backend *gtt;
705
706 gtt = container_of(backend, struct radeon_ttm_backend, backend);
707 gtt->pages = pages;
708 gtt->dma_addrs = dma_addrs;
709 gtt->num_pages = num_pages;
710 gtt->dummy_read_page = dummy_read_page;
711 gtt->populated = true;
712 return 0;
713}
714
715static void radeon_ttm_backend_clear(struct ttm_backend *backend)
716{
717 struct radeon_ttm_backend *gtt;
718
719 gtt = container_of(backend, struct radeon_ttm_backend, backend);
720 gtt->pages = NULL;
721 gtt->dma_addrs = NULL;
722 gtt->num_pages = 0;
723 gtt->dummy_read_page = NULL;
724 gtt->populated = false;
725 gtt->bound = false;
726}
727
728
729static int radeon_ttm_backend_bind(struct ttm_backend *backend,
730 struct ttm_mem_reg *bo_mem)
731{
732 struct radeon_ttm_backend *gtt;
733 int r;
734
735 gtt = container_of(backend, struct radeon_ttm_backend, backend);
736 gtt->offset = bo_mem->start << PAGE_SHIFT;
737 if (!gtt->num_pages) {
738 WARN(1, "nothing to bind %lu pages for mreg %p back %p!\n",
739 gtt->num_pages, bo_mem, backend);
740 }
741 r = radeon_gart_bind(gtt->rdev, gtt->offset,
742 gtt->num_pages, gtt->pages, gtt->dma_addrs);
743 if (r) {
744 DRM_ERROR("failed to bind %lu pages at 0x%08X\n",
745 gtt->num_pages, gtt->offset);
746 return r;
747 }
748 gtt->bound = true;
749 return 0;
750}
751
752static int radeon_ttm_backend_unbind(struct ttm_backend *backend)
753{
754 struct radeon_ttm_backend *gtt;
755
756 gtt = container_of(backend, struct radeon_ttm_backend, backend);
757 radeon_gart_unbind(gtt->rdev, gtt->offset, gtt->num_pages);
758 gtt->bound = false;
759 return 0;
760}
761
762static void radeon_ttm_backend_destroy(struct ttm_backend *backend)
763{
764 struct radeon_ttm_backend *gtt;
765
766 gtt = container_of(backend, struct radeon_ttm_backend, backend);
767 if (gtt->bound) {
768 radeon_ttm_backend_unbind(backend);
769 }
770 kfree(gtt);
771}
772
773static struct ttm_backend_func radeon_backend_func = {
774 .populate = &radeon_ttm_backend_populate,
775 .clear = &radeon_ttm_backend_clear,
776 .bind = &radeon_ttm_backend_bind,
777 .unbind = &radeon_ttm_backend_unbind,
778 .destroy = &radeon_ttm_backend_destroy,
779};
780
781struct ttm_backend *radeon_ttm_backend_create(struct radeon_device *rdev)
782{
783 struct radeon_ttm_backend *gtt;
784
785 gtt = kzalloc(sizeof(struct radeon_ttm_backend), GFP_KERNEL);
786 if (gtt == NULL) {
787 return NULL;
788 }
789 gtt->backend.bdev = &rdev->mman.bdev;
790 gtt->backend.func = &radeon_backend_func;
791 gtt->rdev = rdev;
792 gtt->pages = NULL;
793 gtt->num_pages = 0;
794 gtt->dummy_read_page = NULL;
795 gtt->populated = false;
796 gtt->bound = false;
797 return &gtt->backend;
798}
799
800#define RADEON_DEBUGFS_MEM_TYPES 2 747#define RADEON_DEBUGFS_MEM_TYPES 2
801 748
802#if defined(CONFIG_DEBUG_FS) 749#if defined(CONFIG_DEBUG_FS)