drm/radeon: do not move bo to different placement at each cs
authorJerome Glisse <jglisse@redhat.com>
Thu, 29 Nov 2012 15:35:41 +0000 (10:35 -0500)
committerAlex Deucher <alexander.deucher@amd.com>
Wed, 12 Dec 2012 19:34:07 +0000 (14:34 -0500)
The bo creation placement is where the bo will be. Instead of trying
to move bo at each command stream let this work to another worker
thread that will use more advance heuristic.

agd5f: remove leftover unused variable

Signed-off-by: Jerome Glisse <jglisse@redhat.com>
Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
drivers/gpu/drm/radeon/radeon.h
drivers/gpu/drm/radeon/radeon_object.c

index 5d68346b2c01746ac4820a1fef5b8f893ef1dbba..1b9120a875efaf23f4b8ad86ad2aace00168a1e9 100644 (file)
@@ -318,6 +318,7 @@ struct radeon_bo {
        struct list_head                list;
        /* Protected by tbo.reserved */
        u32                             placements[3];
+       u32                             busy_placements[3];
        struct ttm_placement            placement;
        struct ttm_buffer_object        tbo;
        struct ttm_bo_kmap_obj          kmap;
index bfb332e616dcc28f00b0d811c8af4181e7439da3..93d3445477be11c45e730071c284feca9700fafa 100644 (file)
@@ -84,7 +84,6 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
        rbo->placement.fpfn = 0;
        rbo->placement.lpfn = 0;
        rbo->placement.placement = rbo->placements;
-       rbo->placement.busy_placement = rbo->placements;
        if (domain & RADEON_GEM_DOMAIN_VRAM)
                rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
                                        TTM_PL_FLAG_VRAM;
@@ -105,6 +104,14 @@ void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
        if (!c)
                rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
        rbo->placement.num_placement = c;
+
+       c = 0;
+       rbo->placement.busy_placement = rbo->busy_placements;
+       if (rbo->rdev->flags & RADEON_IS_AGP) {
+               rbo->busy_placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_TT;
+       } else {
+               rbo->busy_placements[c++] = TTM_PL_FLAG_CACHED | TTM_PL_FLAG_TT;
+       }
        rbo->placement.num_busy_placement = c;
 }
 
@@ -350,7 +357,6 @@ int radeon_bo_list_validate(struct list_head *head)
 {
        struct radeon_bo_list *lobj;
        struct radeon_bo *bo;
-       u32 domain;
        int r;
 
        r = ttm_eu_reserve_buffers(head);
@@ -360,17 +366,9 @@ int radeon_bo_list_validate(struct list_head *head)
        list_for_each_entry(lobj, head, tv.head) {
                bo = lobj->bo;
                if (!bo->pin_count) {
-                       domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain;
-                       
-               retry:
-                       radeon_ttm_placement_from_domain(bo, domain);
                        r = ttm_bo_validate(&bo->tbo, &bo->placement,
                                                true, false);
                        if (unlikely(r)) {
-                               if (r != -ERESTARTSYS && domain == RADEON_GEM_DOMAIN_VRAM) {
-                                       domain |= RADEON_GEM_DOMAIN_GTT;
-                                       goto retry;
-                               }
                                return r;
                        }
                }