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>
This commit is contained in:
Родитель
eba67093f5
Коммит
147666fb3b
|
@ -69,6 +69,7 @@
|
||||||
#include <ttm/ttm_bo_driver.h>
|
#include <ttm/ttm_bo_driver.h>
|
||||||
#include <ttm/ttm_placement.h>
|
#include <ttm/ttm_placement.h>
|
||||||
#include <ttm/ttm_module.h>
|
#include <ttm/ttm_module.h>
|
||||||
|
#include <ttm/ttm_execbuf_util.h>
|
||||||
|
|
||||||
#include "radeon_family.h"
|
#include "radeon_family.h"
|
||||||
#include "radeon_mode.h"
|
#include "radeon_mode.h"
|
||||||
|
@ -259,13 +260,12 @@ struct radeon_bo {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct radeon_bo_list {
|
struct radeon_bo_list {
|
||||||
struct list_head list;
|
struct ttm_validate_buffer tv;
|
||||||
struct radeon_bo *bo;
|
struct radeon_bo *bo;
|
||||||
uint64_t gpu_offset;
|
uint64_t gpu_offset;
|
||||||
unsigned rdomain;
|
unsigned rdomain;
|
||||||
unsigned wdomain;
|
unsigned wdomain;
|
||||||
u32 tiling_flags;
|
u32 tiling_flags;
|
||||||
bool reserved;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -77,11 +77,11 @@ int radeon_cs_parser_relocs(struct radeon_cs_parser *p)
|
||||||
p->relocs_ptr[i] = &p->relocs[i];
|
p->relocs_ptr[i] = &p->relocs[i];
|
||||||
p->relocs[i].robj = p->relocs[i].gobj->driver_private;
|
p->relocs[i].robj = p->relocs[i].gobj->driver_private;
|
||||||
p->relocs[i].lobj.bo = p->relocs[i].robj;
|
p->relocs[i].lobj.bo = p->relocs[i].robj;
|
||||||
p->relocs[i].lobj.rdomain = r->read_domains;
|
|
||||||
p->relocs[i].lobj.wdomain = r->write_domain;
|
p->relocs[i].lobj.wdomain = r->write_domain;
|
||||||
|
p->relocs[i].lobj.rdomain = r->read_domains;
|
||||||
|
p->relocs[i].lobj.tv.bo = &p->relocs[i].robj->tbo;
|
||||||
p->relocs[i].handle = r->handle;
|
p->relocs[i].handle = r->handle;
|
||||||
p->relocs[i].flags = r->flags;
|
p->relocs[i].flags = r->flags;
|
||||||
INIT_LIST_HEAD(&p->relocs[i].lobj.list);
|
|
||||||
radeon_bo_list_add_object(&p->relocs[i].lobj,
|
radeon_bo_list_add_object(&p->relocs[i].lobj,
|
||||||
&p->validated);
|
&p->validated);
|
||||||
}
|
}
|
||||||
|
@ -189,10 +189,13 @@ static void radeon_cs_parser_fini(struct radeon_cs_parser *parser, int error)
|
||||||
{
|
{
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
if (!error && parser->ib) {
|
|
||||||
radeon_bo_list_fence(&parser->validated, parser->ib->fence);
|
if (!error && parser->ib)
|
||||||
}
|
ttm_eu_fence_buffer_objects(&parser->validated,
|
||||||
radeon_bo_list_unreserve(&parser->validated);
|
parser->ib->fence);
|
||||||
|
else
|
||||||
|
ttm_eu_backoff_reservation(&parser->validated);
|
||||||
|
|
||||||
if (parser->relocs != NULL) {
|
if (parser->relocs != NULL) {
|
||||||
for (i = 0; i < parser->nrelocs; i++) {
|
for (i = 0; i < parser->nrelocs; i++) {
|
||||||
if (parser->relocs[i].gobj)
|
if (parser->relocs[i].gobj)
|
||||||
|
|
|
@ -293,34 +293,9 @@ void radeon_bo_list_add_object(struct radeon_bo_list *lobj,
|
||||||
struct list_head *head)
|
struct list_head *head)
|
||||||
{
|
{
|
||||||
if (lobj->wdomain) {
|
if (lobj->wdomain) {
|
||||||
list_add(&lobj->list, head);
|
list_add(&lobj->tv.head, head);
|
||||||
} else {
|
} else {
|
||||||
list_add_tail(&lobj->list, head);
|
list_add_tail(&lobj->tv.head, head);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int radeon_bo_list_reserve(struct list_head *head)
|
|
||||||
{
|
|
||||||
struct radeon_bo_list *lobj;
|
|
||||||
int r;
|
|
||||||
|
|
||||||
list_for_each_entry(lobj, head, list){
|
|
||||||
r = radeon_bo_reserve(lobj->bo, false);
|
|
||||||
if (unlikely(r != 0))
|
|
||||||
return r;
|
|
||||||
lobj->reserved = true;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void radeon_bo_list_unreserve(struct list_head *head)
|
|
||||||
{
|
|
||||||
struct radeon_bo_list *lobj;
|
|
||||||
|
|
||||||
list_for_each_entry(lobj, head, list) {
|
|
||||||
/* only unreserve object we successfully reserved */
|
|
||||||
if (lobj->reserved && radeon_bo_is_reserved(lobj->bo))
|
|
||||||
radeon_bo_unreserve(lobj->bo);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -331,14 +306,11 @@ int radeon_bo_list_validate(struct list_head *head)
|
||||||
u32 domain;
|
u32 domain;
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
list_for_each_entry(lobj, head, list) {
|
r = ttm_eu_reserve_buffers(head);
|
||||||
lobj->reserved = false;
|
|
||||||
}
|
|
||||||
r = radeon_bo_list_reserve(head);
|
|
||||||
if (unlikely(r != 0)) {
|
if (unlikely(r != 0)) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
list_for_each_entry(lobj, head, list) {
|
list_for_each_entry(lobj, head, tv.head) {
|
||||||
bo = lobj->bo;
|
bo = lobj->bo;
|
||||||
if (!bo->pin_count) {
|
if (!bo->pin_count) {
|
||||||
domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain;
|
domain = lobj->wdomain ? lobj->wdomain : lobj->rdomain;
|
||||||
|
@ -361,25 +333,6 @@ int radeon_bo_list_validate(struct list_head *head)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void radeon_bo_list_fence(struct list_head *head, void *fence)
|
|
||||||
{
|
|
||||||
struct radeon_bo_list *lobj;
|
|
||||||
struct radeon_bo *bo;
|
|
||||||
struct radeon_fence *old_fence = NULL;
|
|
||||||
|
|
||||||
list_for_each_entry(lobj, head, list) {
|
|
||||||
bo = lobj->bo;
|
|
||||||
spin_lock(&bo->tbo.bdev->fence_lock);
|
|
||||||
old_fence = (struct radeon_fence *)bo->tbo.sync_obj;
|
|
||||||
bo->tbo.sync_obj = radeon_fence_ref(fence);
|
|
||||||
bo->tbo.sync_obj_arg = NULL;
|
|
||||||
spin_unlock(&bo->tbo.bdev->fence_lock);
|
|
||||||
if (old_fence) {
|
|
||||||
radeon_fence_unref(&old_fence);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int radeon_bo_fbdev_mmap(struct radeon_bo *bo,
|
int radeon_bo_fbdev_mmap(struct radeon_bo *bo,
|
||||||
struct vm_area_struct *vma)
|
struct vm_area_struct *vma)
|
||||||
{
|
{
|
||||||
|
|
|
@ -152,10 +152,7 @@ extern int radeon_bo_init(struct radeon_device *rdev);
|
||||||
extern void radeon_bo_fini(struct radeon_device *rdev);
|
extern void radeon_bo_fini(struct radeon_device *rdev);
|
||||||
extern void radeon_bo_list_add_object(struct radeon_bo_list *lobj,
|
extern void radeon_bo_list_add_object(struct radeon_bo_list *lobj,
|
||||||
struct list_head *head);
|
struct list_head *head);
|
||||||
extern int radeon_bo_list_reserve(struct list_head *head);
|
|
||||||
extern void radeon_bo_list_unreserve(struct list_head *head);
|
|
||||||
extern int radeon_bo_list_validate(struct list_head *head);
|
extern int radeon_bo_list_validate(struct list_head *head);
|
||||||
extern void radeon_bo_list_fence(struct list_head *head, void *fence);
|
|
||||||
extern int radeon_bo_fbdev_mmap(struct radeon_bo *bo,
|
extern int radeon_bo_fbdev_mmap(struct radeon_bo *bo,
|
||||||
struct vm_area_struct *vma);
|
struct vm_area_struct *vma);
|
||||||
extern int radeon_bo_set_tiling_flags(struct radeon_bo *bo,
|
extern int radeon_bo_set_tiling_flags(struct radeon_bo *bo,
|
||||||
|
|
Загрузка…
Ссылка в новой задаче