diff options
-rw-r--r-- | drivers/gpu/drm/radeon/radeon.h | 4 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_cs.c | 17 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.c | 55 | ||||
-rw-r--r-- | drivers/gpu/drm/radeon/radeon_object.h | 3 |
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 | ||
261 | struct radeon_bo_list { | 262 | struct 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 | |||
302 | int 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 | |||
316 | void 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 | ||
364 | void 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 | |||
383 | int radeon_bo_fbdev_mmap(struct radeon_bo *bo, | 336 | int 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); | |||
152 | extern void radeon_bo_fini(struct radeon_device *rdev); | 152 | extern void radeon_bo_fini(struct radeon_device *rdev); |
153 | extern void radeon_bo_list_add_object(struct radeon_bo_list *lobj, | 153 | extern void radeon_bo_list_add_object(struct radeon_bo_list *lobj, |
154 | struct list_head *head); | 154 | struct list_head *head); |
155 | extern int radeon_bo_list_reserve(struct list_head *head); | ||
156 | extern void radeon_bo_list_unreserve(struct list_head *head); | ||
157 | extern int radeon_bo_list_validate(struct list_head *head); | 155 | extern int radeon_bo_list_validate(struct list_head *head); |
158 | extern void radeon_bo_list_fence(struct list_head *head, void *fence); | ||
159 | extern int radeon_bo_fbdev_mmap(struct radeon_bo *bo, | 156 | extern int radeon_bo_fbdev_mmap(struct radeon_bo *bo, |
160 | struct vm_area_struct *vma); | 157 | struct vm_area_struct *vma); |
161 | extern int radeon_bo_set_tiling_flags(struct radeon_bo *bo, | 158 | extern int radeon_bo_set_tiling_flags(struct radeon_bo *bo, |