diff options
author | Ben Skeggs <bskeggs@redhat.com> | 2013-11-22 10:39:57 +1000 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2014-01-23 13:10:49 +1000 |
commit | 1bfeff5668a81e692446d144a2fb4284a49971c0 (patch) | |
tree | a3743f6514a0efec56384feb258a79920446f1d3 /drm/nouveau_bo.c | |
parent | 89c331b23b01a91b47429632d33bfb96ea351954 (diff) | |
download | nouveau-1bfeff5668a81e692446d144a2fb4284a49971c0.tar.gz |
ttm: explicity sync with kernel channel before moving buffer
The GEM code handles this currently, but that'll be removed.
Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drm/nouveau_bo.c')
-rw-r--r-- | drm/nouveau_bo.c | 41 |
1 files changed, 13 insertions, 28 deletions
diff --git a/drm/nouveau_bo.c b/drm/nouveau_bo.c index 7a52fb850..03e9a31cb 100644 --- a/drm/nouveau_bo.c +++ b/drm/nouveau_bo.c @@ -560,28 +560,6 @@ nouveau_bo_evict_flags(struct ttm_buffer_object *bo, struct ttm_placement *pl) } -/* GPU-assisted copy using NV_MEMORY_TO_MEMORY_FORMAT, can access - * TTM_PL_{VRAM,TT} directly. - */ - -static int -nouveau_bo_move_accel_cleanup(struct nouveau_channel *chan, - struct nouveau_bo *nvbo, bool evict, - bool no_wait_gpu, struct ttm_mem_reg *new_mem) -{ - struct nouveau_fence *fence = NULL; - int ret; - - ret = nouveau_fence_new(chan, false, &fence); - if (ret) - return ret; - - ret = ttm_bo_move_accel_cleanup(&nvbo->bo, fence, evict, - no_wait_gpu, new_mem); - nouveau_fence_unref(&fence); - return ret; -} - static int nve0_bo_move_init(struct nouveau_channel *chan, u32 handle) { @@ -967,6 +945,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr, { struct nouveau_drm *drm = nouveau_bdev(bo->bdev); struct nouveau_channel *chan = drm->ttm.chan; + struct nouveau_fence *fence; int ret; /* create temporary vmas for the transfer and attach them to the @@ -980,14 +959,20 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int evict, bool intr, } mutex_lock_nested(&chan->cli->mutex, SINGLE_DEPTH_NESTING); - - ret = drm->ttm.move(chan, bo, &bo->mem, new_mem); + ret = nouveau_fence_sync(bo->sync_obj, chan); if (ret == 0) { - struct nouveau_bo *nvbo = nouveau_bo(bo); - ret = nouveau_bo_move_accel_cleanup(chan, nvbo, evict, - no_wait_gpu, new_mem); + ret = drm->ttm.move(chan, bo, &bo->mem, new_mem); + if (ret == 0) { + ret = nouveau_fence_new(chan, false, &fence); + if (ret == 0) { + ret = ttm_bo_move_accel_cleanup(bo, fence, + evict, + no_wait_gpu, + new_mem); + nouveau_fence_unref(&fence); + } + } } - mutex_unlock(&chan->cli->mutex); return ret; } |