This convert radeon to use new TTM validation API, it doesn't
really take advantage of it beside in the eviction case.

Signed-off-by: Jerome Glisse <jgli...@redhat.com>
---
 drivers/gpu/drm/radeon/radeon.h        |    3 ++
 drivers/gpu/drm/radeon/radeon_object.c |   56 +++++++++++++++++++++----------
 drivers/gpu/drm/radeon/radeon_ttm.c    |   57 ++++++++++++++-----------------
 3 files changed, 67 insertions(+), 49 deletions(-)

diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 57416d2..99767d6 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -208,6 +208,7 @@ struct radeon_bo {
        /* Protected by gem.mutex */
        struct list_head                list;
        /* Protected by tbo.reserved */
+       struct ttm_placement            placement;
        struct ttm_buffer_object        tbo;
        struct ttm_bo_kmap_obj          kmap;
        unsigned                        pin_count;
@@ -1000,6 +1001,8 @@ extern void radeon_surface_init(struct radeon_device 
*rdev);
 extern int radeon_cs_parser_init(struct radeon_cs_parser *p, void *data);
 extern void radeon_legacy_set_clock_gating(struct radeon_device *rdev, int 
enable);
 extern void radeon_atom_set_clock_gating(struct radeon_device *rdev, int 
enable);
+extern void radeon_ttm_placement_from_domain(u32 domain,
+                                       struct ttm_placement *placement);
 
 /* r100,rv100,rs100,rv200,rs200,r200,rv250,rs300,rv280 */
 struct r100_mc_save {
diff --git a/drivers/gpu/drm/radeon/radeon_object.c 
b/drivers/gpu/drm/radeon/radeon_object.c
index bec4943..814f4c3 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -75,6 +75,34 @@ static inline u32 radeon_ttm_flags_from_domain(u32 domain)
        return flags;
 }
 
+void radeon_ttm_placement_from_domain(u32 domain,
+                                       struct ttm_placement *placement)
+{
+       u32 c = 0;
+
+       placement->fpfn = 0;
+       placement->lpfn = 0;
+       placement->placements = 0;
+       placement->flags = 0;
+       if (domain & RADEON_GEM_DOMAIN_VRAM) {
+               placement->flags |= TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED;
+               placement->placements |= TTM_PL_VRAM << (4 * (++c));
+       }
+       if (domain & RADEON_GEM_DOMAIN_GTT) {
+               placement->flags |= TTM_PL_MASK_CACHING;
+               placement->placements |= TTM_PL_TT << (4 * (++c));
+       }
+       if (domain & RADEON_GEM_DOMAIN_CPU) {
+               placement->flags |= TTM_PL_MASK_CACHING;
+               placement->placements |= TTM_PL_SYSTEM << (4 * (++c));
+       }
+       placement->placements |= c;
+       if (!placement->placements) {
+               placement->flags = TTM_PL_MASK_CACHING;
+               placement->placements = 1;
+       }
+}
+
 int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
                        unsigned long size, bool kernel, u32 domain,
                        struct radeon_bo **bo_ptr)
@@ -169,24 +197,18 @@ void radeon_bo_unref(struct radeon_bo **bo)
 
 int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr)
 {
-       u32 flags;
-       u32 tmp;
        int r;
 
-       flags = radeon_ttm_flags_from_domain(domain);
+       radeon_ttm_placement_from_domain(domain, &bo->placement);
        if (bo->pin_count) {
                bo->pin_count++;
                if (gpu_addr)
                        *gpu_addr = radeon_bo_gpu_offset(bo);
                return 0;
        }
-       tmp = bo->tbo.mem.placement;
-       ttm_flag_masked(&tmp, flags, TTM_PL_MASK_MEM);
-       bo->tbo.proposed_placement = tmp | TTM_PL_FLAG_NO_EVICT |
-                                       TTM_PL_MASK_CACHING;
+       bo->placement.flags |= TTM_PL_FLAG_NO_EVICT;
 retry:
-       r = ttm_buffer_object_validate(&bo->tbo, bo->tbo.proposed_placement,
-                                       true, false);
+       r = ttm_buffer_object_validate(&bo->tbo, &bo->placement, true, false);
        if (likely(r == 0)) {
                bo->pin_count = 1;
                if (gpu_addr != NULL)
@@ -211,11 +233,9 @@ int radeon_bo_unpin(struct radeon_bo *bo)
        bo->pin_count--;
        if (bo->pin_count)
                return 0;
-       bo->tbo.proposed_placement = bo->tbo.mem.placement &
-                                       ~TTM_PL_FLAG_NO_EVICT;
+       bo->placement.flags &= ~TTM_PL_FLAG_NO_EVICT;
 retry:
-       r = ttm_buffer_object_validate(&bo->tbo, bo->tbo.proposed_placement,
-                                       true, false);
+       r = ttm_buffer_object_validate(&bo->tbo, &bo->placement, true, false);
        if (unlikely(r != 0)) {
                if (r == -ERESTART)
                        goto retry;
@@ -326,15 +346,15 @@ int radeon_bo_list_validate(struct list_head *head, void 
*fence)
                bo = lobj->bo;
                if (!bo->pin_count) {
                        if (lobj->wdomain) {
-                               bo->tbo.proposed_placement =
-                                       
radeon_ttm_flags_from_domain(lobj->wdomain);
+                               radeon_ttm_placement_from_domain(lobj->wdomain,
+                                               &bo->placement);
                        } else {
-                               bo->tbo.proposed_placement =
-                                       
radeon_ttm_flags_from_domain(lobj->rdomain);
+                               radeon_ttm_placement_from_domain(lobj->rdomain,
+                                               &bo->placement);
                        }
 retry:
                        r = ttm_buffer_object_validate(&bo->tbo,
-                                               bo->tbo.proposed_placement,
+                                               &bo->placement,
                                                true, false);
                        if (unlikely(r)) {
                                if (r == -ERESTART)
diff --git a/drivers/gpu/drm/radeon/radeon_ttm.c 
b/drivers/gpu/drm/radeon/radeon_ttm.c
index bdb46c8..152c1d0 100644
--- a/drivers/gpu/drm/radeon/radeon_ttm.c
+++ b/drivers/gpu/drm/radeon/radeon_ttm.c
@@ -197,15 +197,21 @@ static int radeon_init_mem_type(struct ttm_bo_device 
*bdev, uint32_t type,
        return 0;
 }
 
-static uint32_t radeon_evict_flags(struct ttm_buffer_object *bo)
+static void radeon_evict_flags(struct ttm_buffer_object *bo,
+                               struct ttm_placement *placement)
 {
-       uint32_t cur_placement = bo->mem.placement & ~TTM_PL_MASK_MEMTYPE;
-
        switch (bo->mem.mem_type) {
+       case TTM_PL_VRAM:
+               radeon_ttm_placement_from_domain(RADEON_GEM_DOMAIN_GTT,
+                                               placement);
+               break;
+       case TTM_PL_TT:
+               radeon_ttm_placement_from_domain(RADEON_GEM_DOMAIN_CPU,
+                                               placement);
+               break;
        default:
-               return (cur_placement & ~TTM_PL_MASK_CACHING) |
-                       TTM_PL_FLAG_SYSTEM |
-                       TTM_PL_FLAG_CACHED;
+               radeon_ttm_placement_from_domain(RADEON_GEM_DOMAIN_CPU,
+                                               placement);
        }
 }
 
@@ -283,14 +289,14 @@ static int radeon_move_vram_ram(struct ttm_buffer_object 
*bo,
        struct radeon_device *rdev;
        struct ttm_mem_reg *old_mem = &bo->mem;
        struct ttm_mem_reg tmp_mem;
-       uint32_t proposed_placement;
+       struct ttm_placement placement;
        int r;
 
        rdev = radeon_get_rdev(bo->bdev);
        tmp_mem = *new_mem;
        tmp_mem.mm_node = NULL;
-       proposed_placement = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING;
-       r = ttm_bo_mem_space(bo, proposed_placement, &tmp_mem,
+       radeon_ttm_placement_from_domain(RADEON_GEM_DOMAIN_GTT, &placement);
+       r = ttm_bo_mem_space(bo, &placement, &tmp_mem,
                             interruptible, no_wait);
        if (unlikely(r)) {
                return r;
@@ -329,15 +335,14 @@ static int radeon_move_ram_vram(struct ttm_buffer_object 
*bo,
        struct radeon_device *rdev;
        struct ttm_mem_reg *old_mem = &bo->mem;
        struct ttm_mem_reg tmp_mem;
-       uint32_t proposed_flags;
+       struct ttm_placement placement;
        int r;
 
        rdev = radeon_get_rdev(bo->bdev);
        tmp_mem = *new_mem;
        tmp_mem.mm_node = NULL;
-       proposed_flags = TTM_PL_FLAG_TT | TTM_PL_MASK_CACHING;
-       r = ttm_bo_mem_space(bo, proposed_flags, &tmp_mem,
-                            interruptible, no_wait);
+       radeon_ttm_placement_from_domain(RADEON_GEM_DOMAIN_GTT, &placement);
+       r = ttm_bo_mem_space(bo, &placement, &tmp_mem, interruptible, no_wait);
        if (unlikely(r)) {
                return r;
        }
@@ -407,18 +412,6 @@ memcpy:
        return r;
 }
 
-const uint32_t radeon_mem_prios[] = {
-       TTM_PL_VRAM,
-       TTM_PL_TT,
-       TTM_PL_SYSTEM,
-};
-
-const uint32_t radeon_busy_prios[] = {
-       TTM_PL_TT,
-       TTM_PL_VRAM,
-       TTM_PL_SYSTEM,
-};
-
 static int radeon_sync_obj_wait(void *sync_obj, void *sync_arg,
                                bool lazy, bool interruptible)
 {
@@ -446,10 +439,6 @@ static bool radeon_sync_obj_signaled(void *sync_obj, void 
*sync_arg)
 }
 
 static struct ttm_bo_driver radeon_bo_driver = {
-       .mem_type_prio = radeon_mem_prios,
-       .mem_busy_prio = radeon_busy_prios,
-       .num_mem_type_prio = ARRAY_SIZE(radeon_mem_prios),
-       .num_mem_busy_prio = ARRAY_SIZE(radeon_busy_prios),
        .create_ttm_backend_entry = &radeon_create_ttm_backend_entry,
        .invalidate_caches = &radeon_invalidate_caches,
        .init_mem_type = &radeon_init_mem_type,
@@ -483,7 +472,7 @@ int radeon_ttm_init(struct radeon_device *rdev)
                return r;
        }
        r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_VRAM,
-                               0, rdev->mc.real_vram_size >> PAGE_SHIFT);
+                               rdev->mc.real_vram_size >> PAGE_SHIFT);
        if (r) {
                DRM_ERROR("Failed initializing VRAM heap.\n");
                return r;
@@ -506,7 +495,7 @@ int radeon_ttm_init(struct radeon_device *rdev)
        DRM_INFO("radeon: %uM of VRAM memory ready\n",
                 (unsigned)rdev->mc.real_vram_size / (1024 * 1024));
        r = ttm_bo_init_mm(&rdev->mman.bdev, TTM_PL_TT,
-                               0, rdev->mc.gtt_size >> PAGE_SHIFT);
+                               rdev->mc.gtt_size >> PAGE_SHIFT);
        if (r) {
                DRM_ERROR("Failed initializing GTT heap.\n");
                return r;
@@ -537,11 +526,17 @@ void radeon_ttm_fini(struct radeon_device *rdev)
                }
                radeon_bo_unref(&rdev->stollen_vga_memory);
        }
+printk(KERN_INFO "%s %d\n", __func__, __LINE__);
        ttm_bo_clean_mm(&rdev->mman.bdev, TTM_PL_VRAM);
+printk(KERN_INFO "%s %d\n", __func__, __LINE__);
        ttm_bo_clean_mm(&rdev->mman.bdev, TTM_PL_TT);
+printk(KERN_INFO "%s %d\n", __func__, __LINE__);
        ttm_bo_device_release(&rdev->mman.bdev);
+printk(KERN_INFO "%s %d\n", __func__, __LINE__);
        radeon_gart_fini(rdev);
+printk(KERN_INFO "%s %d\n", __func__, __LINE__);
        radeon_ttm_global_fini(rdev);
+printk(KERN_INFO "%s %d\n", __func__, __LINE__);
        DRM_INFO("radeon: ttm finalized\n");
 }
 
-- 
1.6.5.2


------------------------------------------------------------------------------
Join us December 9, 2009 for the Red Hat Virtual Experience,
a free event focused on virtualization and cloud computing. 
Attend in-depth sessions from your desk. Your couch. Anywhere.
http://p.sf.net/sfu/redhat-sfdev2dev
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to