drm/radeon/kms: Convert radeon to new TTM validation API (V2)
[safe/jmp/linux-2.6] / drivers / gpu / drm / radeon / radeon_object.c
index bec4943..d9b239b 100644 (file)
@@ -75,6 +75,25 @@ static inline u32 radeon_ttm_flags_from_domain(u32 domain)
        return flags;
 }
 
+void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
+{
+       u32 c = 0;
+
+       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;
+       if (domain & RADEON_GEM_DOMAIN_GTT)
+               rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
+       if (domain & RADEON_GEM_DOMAIN_CPU)
+               rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
+       rbo->placement.num_placement = c;
+       rbo->placement.num_busy_placement = c;
+}
+
 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 +188,20 @@ 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;
+       int r, i;
 
-       flags = radeon_ttm_flags_from_domain(domain);
+       radeon_ttm_placement_from_domain(bo, domain);
        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;
+       radeon_ttm_placement_from_domain(bo, domain);
+       for (i = 0; i < bo->placement.num_placement; i++)
+               bo->placements[i] |= 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)
@@ -202,7 +217,7 @@ retry:
 
 int radeon_bo_unpin(struct radeon_bo *bo)
 {
-       int r;
+       int r, i;
 
        if (!bo->pin_count) {
                dev_warn(bo->rdev->dev, "%p unpin not necessary\n", bo);
@@ -211,11 +226,10 @@ 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;
+       for (i = 0; i < bo->placement.num_placement; i++)
+               bo->placements[i] &= ~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 +340,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(bo,
+                                                               lobj->wdomain);
                        } else {
-                               bo->tbo.proposed_placement =
-                                       radeon_ttm_flags_from_domain(lobj->rdomain);
+                               radeon_ttm_placement_from_domain(bo,
+                                                               lobj->rdomain);
                        }
 retry:
                        r = ttm_buffer_object_validate(&bo->tbo,
-                                               bo->tbo.proposed_placement,
+                                               &bo->placement,
                                                true, false);
                        if (unlikely(r)) {
                                if (r == -ERESTART)