aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_object.c
diff options
context:
space:
mode:
authorJerome Glisse <jglisse@redhat.com>2009-12-07 09:52:58 -0500
committerDave Airlie <airlied@redhat.com>2009-12-10 00:09:02 -0500
commit312ea8da049a1830aa50c6e00002e50e30df476e (patch)
tree4fa21909c2fd227cd6491a2729aa5dd17ac1295a /drivers/gpu/drm/radeon/radeon_object.c
parentca262a9998d46196750bb19a9dc4bd465b170ff7 (diff)
drm/radeon/kms: Convert radeon to new TTM validation API (V2)
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 <jglisse@redhat.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_object.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c54
1 files changed, 34 insertions, 20 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index bec494384825..d9b239bce12a 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -75,6 +75,25 @@ static inline u32 radeon_ttm_flags_from_domain(u32 domain)
75 return flags; 75 return flags;
76} 76}
77 77
78void radeon_ttm_placement_from_domain(struct radeon_bo *rbo, u32 domain)
79{
80 u32 c = 0;
81
82 rbo->placement.fpfn = 0;
83 rbo->placement.lpfn = 0;
84 rbo->placement.placement = rbo->placements;
85 rbo->placement.busy_placement = rbo->placements;
86 if (domain & RADEON_GEM_DOMAIN_VRAM)
87 rbo->placements[c++] = TTM_PL_FLAG_WC | TTM_PL_FLAG_UNCACHED |
88 TTM_PL_FLAG_VRAM;
89 if (domain & RADEON_GEM_DOMAIN_GTT)
90 rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_TT;
91 if (domain & RADEON_GEM_DOMAIN_CPU)
92 rbo->placements[c++] = TTM_PL_MASK_CACHING | TTM_PL_FLAG_SYSTEM;
93 rbo->placement.num_placement = c;
94 rbo->placement.num_busy_placement = c;
95}
96
78int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj, 97int radeon_bo_create(struct radeon_device *rdev, struct drm_gem_object *gobj,
79 unsigned long size, bool kernel, u32 domain, 98 unsigned long size, bool kernel, u32 domain,
80 struct radeon_bo **bo_ptr) 99 struct radeon_bo **bo_ptr)
@@ -169,24 +188,20 @@ void radeon_bo_unref(struct radeon_bo **bo)
169 188
170int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr) 189int radeon_bo_pin(struct radeon_bo *bo, u32 domain, u64 *gpu_addr)
171{ 190{
172 u32 flags; 191 int r, i;
173 u32 tmp;
174 int r;
175 192
176 flags = radeon_ttm_flags_from_domain(domain); 193 radeon_ttm_placement_from_domain(bo, domain);
177 if (bo->pin_count) { 194 if (bo->pin_count) {
178 bo->pin_count++; 195 bo->pin_count++;
179 if (gpu_addr) 196 if (gpu_addr)
180 *gpu_addr = radeon_bo_gpu_offset(bo); 197 *gpu_addr = radeon_bo_gpu_offset(bo);
181 return 0; 198 return 0;
182 } 199 }
183 tmp = bo->tbo.mem.placement; 200 radeon_ttm_placement_from_domain(bo, domain);
184 ttm_flag_masked(&tmp, flags, TTM_PL_MASK_MEM); 201 for (i = 0; i < bo->placement.num_placement; i++)
185 bo->tbo.proposed_placement = tmp | TTM_PL_FLAG_NO_EVICT | 202 bo->placements[i] |= TTM_PL_FLAG_NO_EVICT;
186 TTM_PL_MASK_CACHING;
187retry: 203retry:
188 r = ttm_buffer_object_validate(&bo->tbo, bo->tbo.proposed_placement, 204 r = ttm_buffer_object_validate(&bo->tbo, &bo->placement, true, false);
189 true, false);
190 if (likely(r == 0)) { 205 if (likely(r == 0)) {
191 bo->pin_count = 1; 206 bo->pin_count = 1;
192 if (gpu_addr != NULL) 207 if (gpu_addr != NULL)
@@ -202,7 +217,7 @@ retry:
202 217
203int radeon_bo_unpin(struct radeon_bo *bo) 218int radeon_bo_unpin(struct radeon_bo *bo)
204{ 219{
205 int r; 220 int r, i;
206 221
207 if (!bo->pin_count) { 222 if (!bo->pin_count) {
208 dev_warn(bo->rdev->dev, "%p unpin not necessary\n", bo); 223 dev_warn(bo->rdev->dev, "%p unpin not necessary\n", bo);
@@ -211,11 +226,10 @@ int radeon_bo_unpin(struct radeon_bo *bo)
211 bo->pin_count--; 226 bo->pin_count--;
212 if (bo->pin_count) 227 if (bo->pin_count)
213 return 0; 228 return 0;
214 bo->tbo.proposed_placement = bo->tbo.mem.placement & 229 for (i = 0; i < bo->placement.num_placement; i++)
215 ~TTM_PL_FLAG_NO_EVICT; 230 bo->placements[i] &= ~TTM_PL_FLAG_NO_EVICT;
216retry: 231retry:
217 r = ttm_buffer_object_validate(&bo->tbo, bo->tbo.proposed_placement, 232 r = ttm_buffer_object_validate(&bo->tbo, &bo->placement, true, false);
218 true, false);
219 if (unlikely(r != 0)) { 233 if (unlikely(r != 0)) {
220 if (r == -ERESTART) 234 if (r == -ERESTART)
221 goto retry; 235 goto retry;
@@ -326,15 +340,15 @@ int radeon_bo_list_validate(struct list_head *head, void *fence)
326 bo = lobj->bo; 340 bo = lobj->bo;
327 if (!bo->pin_count) { 341 if (!bo->pin_count) {
328 if (lobj->wdomain) { 342 if (lobj->wdomain) {
329 bo->tbo.proposed_placement = 343 radeon_ttm_placement_from_domain(bo,
330 radeon_ttm_flags_from_domain(lobj->wdomain); 344 lobj->wdomain);
331 } else { 345 } else {
332 bo->tbo.proposed_placement = 346 radeon_ttm_placement_from_domain(bo,
333 radeon_ttm_flags_from_domain(lobj->rdomain); 347 lobj->rdomain);
334 } 348 }
335retry: 349retry:
336 r = ttm_buffer_object_validate(&bo->tbo, 350 r = ttm_buffer_object_validate(&bo->tbo,
337 bo->tbo.proposed_placement, 351 &bo->placement,
338 true, false); 352 true, false);
339 if (unlikely(r)) { 353 if (unlikely(r)) {
340 if (r == -ERESTART) 354 if (r == -ERESTART)