aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/radeon/radeon_object.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu/drm/radeon/radeon_object.c')
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c57
1 files changed, 6 insertions, 51 deletions
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index a598d0049aa5..7d6b8e88f746 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -34,6 +34,7 @@
34#include <drm/drmP.h> 34#include <drm/drmP.h>
35#include "radeon_drm.h" 35#include "radeon_drm.h"
36#include "radeon.h" 36#include "radeon.h"
37#include "radeon_trace.h"
37 38
38 39
39int radeon_ttm_init(struct radeon_device *rdev); 40int radeon_ttm_init(struct radeon_device *rdev);
@@ -146,6 +147,7 @@ retry:
146 list_add_tail(&bo->list, &rdev->gem.objects); 147 list_add_tail(&bo->list, &rdev->gem.objects);
147 mutex_unlock(&bo->rdev->gem.mutex); 148 mutex_unlock(&bo->rdev->gem.mutex);
148 } 149 }
150 trace_radeon_bo_create(bo);
149 return 0; 151 return 0;
150} 152}
151 153
@@ -302,34 +304,9 @@ void radeon_bo_list_add_object(struct radeon_bo_list *lobj,
302 struct list_head *head) 304 struct list_head *head)
303{ 305{
304 if (lobj->wdomain) { 306 if (lobj->wdomain) {
305 list_add(&lobj->list, head); 307 list_add(&lobj->tv.head, head);
306 } else { 308 } else {
307 list_add_tail(&lobj->list, head); 309 list_add_tail(&lobj->tv.head, head);
308 }
309}
310
311int radeon_bo_list_reserve(struct list_head *head)
312{
313 struct radeon_bo_list *lobj;
314 int r;
315
316 list_for_each_entry(lobj, head, list){
317 r = radeon_bo_reserve(lobj->bo, false);
318 if (unlikely(r != 0))
319 return r;
320 lobj->reserved = true;
321 }
322 return 0;
323}
324
325void radeon_bo_list_unreserve(struct list_head *head)
326{
327 struct radeon_bo_list *lobj;
328
329 list_for_each_entry(lobj, head, list) {
330 /* only unreserve object we successfully reserved */
331 if (lobj->reserved && radeon_bo_is_reserved(lobj->bo))
332 radeon_bo_unreserve(lobj->bo);
333 } 310 }
334} 311}
335 312
@@ -340,14 +317,11 @@ int radeon_bo_list_validate(struct list_head *head)
340 u32 domain; 317 u32 domain;
341 int r; 318 int r;
342 319
343 list_for_each_entry(lobj, head, list) { 320 r = ttm_eu_reserve_buffers(head);
344 lobj->reserved = false;
345 }
346 r = radeon_bo_list_reserve(head);
347 if (unlikely(r != 0)) { 321 if (unlikely(r != 0)) {
348 return r; 322 return r;
349 } 323 }
350 list_for_each_entry(lobj, head, list) { 324 list_for_each_entry(lobj, head, tv.head) {
351 bo = lobj->bo; 325 bo = lobj->bo;
352 if (!bo->pin_count) { 326 if (!bo->pin_count) {
353 domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain; 327 domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain;
@@ -370,25 +344,6 @@ int radeon_bo_list_validate(struct list_head *head)
370 return 0; 344 return 0;
371} 345}
372 346
373void radeon_bo_list_fence(struct list_head *head, void *fence)
374{
375 struct radeon_bo_list *lobj;
376 struct radeon_bo *bo;
377 struct radeon_fence *old_fence = NULL;
378
379 list_for_each_entry(lobj, head, list) {
380 bo = lobj->bo;
381 spin_lock(&bo->tbo.lock);
382 old_fence = (struct radeon_fence *)bo->tbo.sync_obj;
383 bo->tbo.sync_obj = radeon_fence_ref(fence);
384 bo->tbo.sync_obj_arg = NULL;
385 spin_unlock(&bo->tbo.lock);
386 if (old_fence) {
387 radeon_fence_unref(&old_fence);
388 }
389 }
390}
391
392int radeon_bo_fbdev_mmap(struct radeon_bo *bo, 347int radeon_bo_fbdev_mmap(struct radeon_bo *bo,
393 struct vm_area_struct *vma) 348 struct vm_area_struct *vma)
394{ 349{