aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Hellstrom <thellstrom@vmware.com>2010-11-17 07:38:32 -0500
committerDave Airlie <airlied@redhat.com>2010-11-21 22:25:23 -0500
commit147666fb3b93b8c484f562da33a37f886ddff768 (patch)
tree24e383df4e984b907651f79d3fb0642aa0691426
parenteba67093f535322cb4f1c4b737319c0907a0c81d (diff)
drm/radeon: Use the ttm execbuf utilities
Rather than re-implementing in the Radeon driver, Use the execbuf / cs / pushbuf utilities that comes with TTM. This comes with an even greater benefit now that many spinlocks have been optimized away... Signed-off-by: Thomas Hellstrom <thellstrom@vmware.com> Signed-off-by: Dave Airlie <airlied@redhat.com>
-rw-r--r--drivers/gpu/drm/radeon/radeon.h4
-rw-r--r--drivers/gpu/drm/radeon/radeon_cs.c17
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.c55
-rw-r--r--drivers/gpu/drm/radeon/radeon_object.h3
4 files changed, 16 insertions, 63 deletions
diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
index 3a7095743d44..b1e073b7381f 100644
--- a/drivers/gpu/drm/radeon/radeon.h
+++ b/drivers/gpu/drm/radeon/radeon.h
@@ -69,6 +69,7 @@
69#include <ttm/ttm_bo_driver.h> 69#include <ttm/ttm_bo_driver.h>
70#include <ttm/ttm_placement.h> 70#include <ttm/ttm_placement.h>
71#include <ttm/ttm_module.h> 71#include <ttm/ttm_module.h>
72#include <ttm/ttm_execbuf_util.h>
72 73
73#include "radeon_family.h" 74#include "radeon_family.h"
74#include "radeon_mode.h" 75#include "radeon_mode.h"
@@ -259,13 +260,12 @@ struct radeon_bo {
259}; 260};
260 261
261struct radeon_bo_list { 262struct radeon_bo_list {
262 struct list_head list; 263 struct ttm_validate_buffer tv;
263 struct radeon_bo *bo; 264 struct radeon_bo *bo;
264 uint64_t gpu_offset; 265 uint64_t gpu_offset;
265 unsigned rdomain; 266 unsigned rdomain;
266 unsigned wdomain; 267 unsigned wdomain;
267 u32 tiling_flags; 268 u32 tiling_flags;
268 bool reserved;
269}; 269};
270 270
271/* 271/*
diff --git a/drivers/gpu/drm/radeon/radeon_cs.c b/drivers/gpu/drm/radeon/radeon_cs.c
index 6d64a2705f12..35b5eb8fbe2a 100644
--- a/drivers/gpu/drm/radeon/radeon_cs.c
+++ b/drivers/gpu/drm/radeon/radeon_cs.c
@@ -77,13 +77,13 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
77 p->relocs_ptr[i] = &p->relocs[i]; 77 p->relocs_ptr[i] = &p->relocs[i];
78 p->relocs[i].robj = p->relocs[i].gobj->driver_private; 78 p->relocs[i].robj = p->relocs[i].gobj->driver_private;
79 p->relocs[i].lobj.bo = p->relocs[i].robj; 79 p->relocs[i].lobj.bo = p->relocs[i].robj;
80 p->relocs[i].lobj.rdomain = r->read_domains;
81 p->relocs[i].lobj.wdomain = r->write_domain; 80 p->relocs[i].lobj.wdomain = r->write_domain;
81 p->relocs[i].lobj.rdomain = r->read_domains;
82 p->relocs[i].lobj.tv.bo = &p->relocs[i].robj->tbo;
82 p->relocs[i].handle = r->handle; 83 p->relocs[i].handle = r->handle;
83 p->relocs[i].flags = r->flags; 84 p->relocs[i].flags = r->flags;
84 INIT_LIST_HEAD(&p->relocs[i].lobj.list);
85 radeon_bo_list_add_object(&p->relocs[i].lobj, 85 radeon_bo_list_add_object(&p->relocs[i].lobj,
86 &p->validated); 86 &p->validated);
87 } 87 }
88 } 88 }
89 return radeon_bo_list_validate(&p->validated); 89 return radeon_bo_list_validate(&p->validated);
@@ -189,10 +189,13 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error)
189{ 189{
190 unsigned i; 190 unsigned i;
191 191
192 if (!error && parser->ib) { 192
193 radeon_bo_list_fence(&parser->validated, parser->ib->fence); 193 if (!error && parser->ib)
194 } 194 ttm_eu_fence_buffer_objects(&parser->validated,
195 radeon_bo_list_unreserve(&parser->validated); 195 parser->ib->fence);
196 else
197 ttm_eu_backoff_reservation(&parser->validated);
198
196 if (parser->relocs != NULL) { 199 if (parser->relocs != NULL) {
197 for (i = 0; i < parser->nrelocs; i++) { 200 for (i = 0; i < parser->nrelocs; i++) {
198 if (parser->relocs[i].gobj) 201 if (parser->relocs[i].gobj)
diff --git a/drivers/gpu/drm/radeon/radeon_object.c b/drivers/gpu/drm/radeon/radeon_object.c
index e939cb6a91cc..a8594d289bcf 100644
--- a/drivers/gpu/drm/radeon/radeon_object.c
+++ b/drivers/gpu/drm/radeon/radeon_object.c
@@ -293,34 +293,9 @@ void radeon_bo_list_add_object(struct radeon_bo_list *lobj,
293 struct list_head *head) 293 struct list_head *head)
294{ 294{
295 if (lobj->wdomain) { 295 if (lobj->wdomain) {
296 list_add(&lobj->list, head); 296 list_add(&lobj->tv.head, head);
297 } else { 297 } else {
298 list_add_tail(&lobj->list, head); 298 list_add_tail(&lobj->tv.head, head);
299 }
300}
301
302int radeon_bo_list_reserve(struct list_head *head)
303{
304 struct radeon_bo_list *lobj;
305 int r;
306
307 list_for_each_entry(lobj, head, list){
308 r = radeon_bo_reserve(lobj->bo, false);
309 if (unlikely(r != 0))
310 return r;
311 lobj->reserved = true;
312 }
313 return 0;
314}
315
316void radeon_bo_list_unreserve(struct list_head *head)
317{
318 struct radeon_bo_list *lobj;
319
320 list_for_each_entry(lobj, head, list) {
321 /* only unreserve object we successfully reserved */
322 if (lobj->reserved && radeon_bo_is_reserved(lobj->bo))
323 radeon_bo_unreserve(lobj->bo);
324 } 299 }
325} 300}
326 301
@@ -331,14 +306,11 @@ int radeon_bo_list_validate(struct list_head *head)
331 u32 domain; 306 u32 domain;
332 int r; 307 int r;
333 308
334 list_for_each_entry(lobj, head, list) { 309 r = ttm_eu_reserve_buffers(head);
335 lobj->reserved = false;
336 }
337 r = radeon_bo_list_reserve(head);
338 if (unlikely(r != 0)) { 310 if (unlikely(r != 0)) {
339 return r; 311 return r;
340 } 312 }
341 list_for_each_entry(lobj, head, list) { 313 list_for_each_entry(lobj, head, tv.head) {
342 bo = lobj->bo; 314 bo = lobj->bo;
343 if (!bo->pin_count) { 315 if (!bo->pin_count) {
344 domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain; 316 domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain;
@@ -361,25 +333,6 @@ int radeon_bo_list_validate(struct list_head *head)
361 return 0; 333 return 0;
362} 334}
363 335
364void radeon_bo_list_fence(struct list_head *head, void *fence)
365{
366 struct radeon_bo_list *lobj;
367 struct radeon_bo *bo;
368 struct radeon_fence *old_fence = NULL;
369
370 list_for_each_entry(lobj, head, list) {
371 bo = lobj->bo;
372 spin_lock(&bo->tbo.bdev->fence_lock);
373 old_fence = (struct radeon_fence *)bo->tbo.sync_obj;
374 bo->tbo.sync_obj = radeon_fence_ref(fence);
375 bo->tbo.sync_obj_arg = NULL;
376 spin_unlock(&bo->tbo.bdev->fence_lock);
377 if (old_fence) {
378 radeon_fence_unref(&old_fence);
379 }
380 }
381}
382
383int radeon_bo_fbdev_mmap(struct radeon_bo *bo, 336int radeon_bo_fbdev_mmap(struct radeon_bo *bo,
384 struct vm_area_struct *vma) 337 struct vm_area_struct *vma)
385{ 338{
diff --git a/drivers/gpu/drm/radeon/radeon_object.h b/drivers/gpu/drm/radeon/radeon_object.h
index fd536751f865..22d4c237dea5 100644
--- a/drivers/gpu/drm/radeon/radeon_object.h
+++ b/drivers/gpu/drm/radeon/radeon_object.h
@@ -152,10 +152,7 @@ extern int radeon_bo_init(struct radeon_device *rdev);
152extern void radeon_bo_fini(struct radeon_device *rdev); 152extern void radeon_bo_fini(struct radeon_device *rdev);
153extern void radeon_bo_list_add_object(struct radeon_bo_list *lobj, 153extern void radeon_bo_list_add_object(struct radeon_bo_list *lobj,
154 struct list_head *head); 154 struct list_head *head);
155extern int radeon_bo_list_reserve(struct list_head *head);
156extern void radeon_bo_list_unreserve(struct list_head *head);
157extern int radeon_bo_list_validate(struct list_head *head); 155extern int radeon_bo_list_validate(struct list_head *head);
158extern void radeon_bo_list_fence(struct list_head *head, void *fence);
159extern int radeon_bo_fbdev_mmap(struct radeon_bo *bo, 156extern int radeon_bo_fbdev_mmap(struct radeon_bo *bo,
160 struct vm_area_struct *vma); 157 struct vm_area_struct *vma);
161extern int radeon_bo_set_tiling_flags(struct radeon_bo *bo, 158extern int radeon_bo_set_tiling_flags(struct radeon_bo *bo,