Signed-off-by: Maarten Lankhorst <maarten.lankhorst at canonical.com>
---
 drivers/gpu/drm/nouveau/nouveau_bo.c      |  2 +-
 drivers/gpu/drm/nouveau/nouveau_display.c |  4 ++--
 drivers/gpu/drm/nouveau/nouveau_fence.c   | 14 ++++++--------
 drivers/gpu/drm/nouveau/nouveau_fence.h   |  2 +-
 drivers/gpu/drm/nouveau/nouveau_gem.c     |  2 +-
 5 files changed, 11 insertions(+), 13 deletions(-)

diff --git a/drivers/gpu/drm/nouveau/nouveau_bo.c 
b/drivers/gpu/drm/nouveau/nouveau_bo.c
index eea74b127b03..049f5de90928 100644
--- a/drivers/gpu/drm/nouveau/nouveau_bo.c
+++ b/drivers/gpu/drm/nouveau/nouveau_bo.c
@@ -970,7 +970,7 @@ nouveau_bo_move_m2mf(struct ttm_buffer_object *bo, int 
evict, bool intr,
        }

        mutex_lock_nested(&cli->mutex, SINGLE_DEPTH_NESTING);
-       ret = nouveau_fence_sync(nouveau_bo(bo), chan, true);
+       ret = nouveau_fence_sync(nouveau_bo(bo), chan, true, intr);
        if (ret == 0) {
                ret = drm->ttm.move(chan, bo, &bo->mem, new_mem);
                if (ret == 0) {
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c 
b/drivers/gpu/drm/nouveau/nouveau_display.c
index 6d0a3cdc752b..334db3c6e40c 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -658,7 +658,7 @@ nouveau_page_flip_emit(struct nouveau_channel *chan,
        spin_unlock_irqrestore(&dev->event_lock, flags);

        /* Synchronize with the old framebuffer */
-       ret = nouveau_fence_sync(old_bo, chan, false);
+       ret = nouveau_fence_sync(old_bo, chan, false, false);
        if (ret)
                goto fail;

@@ -722,7 +722,7 @@ nouveau_crtc_page_flip(struct drm_crtc *crtc, struct 
drm_framebuffer *fb,
                goto fail_unpin;

        /* synchronise rendering channel with the kernel's channel */
-       ret = nouveau_fence_sync(new_bo, chan, false);
+       ret = nouveau_fence_sync(new_bo, chan, false, true);
        if (ret) {
                ttm_bo_unreserve(&new_bo->bo);
                goto fail_unpin;
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c 
b/drivers/gpu/drm/nouveau/nouveau_fence.c
index decfe6c4ac07..dfd0b9ed4195 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
@@ -226,12 +226,10 @@ nouveau_fence_emit(struct nouveau_fence *fence, struct 
nouveau_channel *chan)

        if (priv->uevent)
                fence_init(&fence->base, &nouveau_fence_ops_uevent,
-                          &fctx->lock,
-                          priv->context_base + chan->chid, ++fctx->sequence);
+                          &fctx->lock, fctx->context, ++fctx->sequence);
        else
                fence_init(&fence->base, &nouveau_fence_ops_legacy,
-                          &fctx->lock,
-                          priv->context_base + chan->chid, ++fctx->sequence);
+                          &fctx->lock, fctx->context, ++fctx->sequence);

        trace_fence_emit(&fence->base);
        ret = fctx->emit(fence);
@@ -342,7 +340,7 @@ nouveau_fence_wait(struct nouveau_fence *fence, bool lazy, 
bool intr)
 }

 int
-nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool 
exclusive)
+nouveau_fence_sync(struct nouveau_bo *nvbo, struct nouveau_channel *chan, bool 
exclusive, bool intr)
 {
        struct nouveau_fence_chan *fctx = chan->fence;
        struct fence *fence;
@@ -369,7 +367,7 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct 
nouveau_channel *chan, bool e
                        prev = f->channel;

                if (!prev || (prev != chan && (ret = fctx->sync(f, prev, 
chan))))
-                       ret = fence_wait(fence, true);
+                       ret = fence_wait(fence, intr);

                return ret;
        }
@@ -387,8 +385,8 @@ nouveau_fence_sync(struct nouveau_bo *nvbo, struct 
nouveau_channel *chan, bool e
                if (f)
                        prev = f->channel;

-               if (!prev || (ret = fctx->sync(f, prev, chan)))
-                       ret = fence_wait(fence, true);
+               if (!prev || (prev != chan && (ret = fctx->sync(f, prev, 
chan))))
+                       ret = fence_wait(fence, intr);

                if (ret)
                        break;
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.h 
b/drivers/gpu/drm/nouveau/nouveau_fence.h
index 986c8135e564..a7dc5375c320 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.h
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.h
@@ -26,7 +26,7 @@ int  nouveau_fence_emit(struct nouveau_fence *, struct 
nouveau_channel *);
 bool nouveau_fence_done(struct nouveau_fence *);
 void nouveau_fence_work(struct fence *, void (*)(void *), void *);
 int  nouveau_fence_wait(struct nouveau_fence *, bool lazy, bool intr);
-int  nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *, bool 
exclusive);
+int  nouveau_fence_sync(struct nouveau_bo *, struct nouveau_channel *, bool 
exclusive, bool intr);

 struct nouveau_fence_chan {
        spinlock_t lock;
diff --git a/drivers/gpu/drm/nouveau/nouveau_gem.c 
b/drivers/gpu/drm/nouveau/nouveau_gem.c
index b7dbd16904e0..3f693c1f5b36 100644
--- a/drivers/gpu/drm/nouveau/nouveau_gem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_gem.c
@@ -459,7 +459,7 @@ validate_list(struct nouveau_channel *chan, struct 
nouveau_cli *cli,
                        return ret;
                }

-               ret = nouveau_fence_sync(nvbo, chan, !!b->write_domains);
+               ret = nouveau_fence_sync(nvbo, chan, !!b->write_domains, true);
                if (unlikely(ret)) {
                        if (ret != -ERESTARTSYS)
                                NV_PRINTK(error, cli, "fail post-validate 
sync\n");
-- 
2.0.4

Reply via email to