aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/nouveau/nouveau_fence.c
diff options
context:
space:
mode:
authorBen Skeggs <bskeggs@redhat.com>2013-02-13 22:20:17 -0500
committerBen Skeggs <bskeggs@redhat.com>2013-02-20 01:00:53 -0500
commit827520ce06568f699dad275dcca61647cce08757 (patch)
tree707c9ab051ca1bd8a14f14fb153510c7fbf133c3 /drivers/gpu/drm/nouveau/nouveau_fence.c
parent60e5cb79cbd27a36836fc04177d7c323ee873563 (diff)
drm/nouveau/fence: make internal hooks part of the context
A step towards being able to provide fences from other engines not connected to PFIFO. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_fence.c')
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_fence.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c
index b7349a636546..6a7a5b576273 100644
--- a/drivers/gpu/drm/nouveau/nouveau_fence.c
+++ b/drivers/gpu/drm/nouveau/nouveau_fence.c
@@ -61,13 +61,12 @@ nouveau_fence_context_new(struct nouveau_fence_chan *fctx)
61static void 61static void
62nouveau_fence_update(struct nouveau_channel *chan) 62nouveau_fence_update(struct nouveau_channel *chan)
63{ 63{
64 struct nouveau_fence_priv *priv = chan->drm->fence;
65 struct nouveau_fence_chan *fctx = chan->fence; 64 struct nouveau_fence_chan *fctx = chan->fence;
66 struct nouveau_fence *fence, *fnext; 65 struct nouveau_fence *fence, *fnext;
67 66
68 spin_lock(&fctx->lock); 67 spin_lock(&fctx->lock);
69 list_for_each_entry_safe(fence, fnext, &fctx->pending, head) { 68 list_for_each_entry_safe(fence, fnext, &fctx->pending, head) {
70 if (priv->read(chan) < fence->sequence) 69 if (fctx->read(chan) < fence->sequence)
71 break; 70 break;
72 71
73 if (fence->work) 72 if (fence->work)
@@ -82,7 +81,6 @@ nouveau_fence_update(struct nouveau_channel *chan)
82int 81int
83nouveau_fence_emit(struct nouveau_fence *fence, struct nouveau_channel *chan) 82nouveau_fence_emit(struct nouveau_fence *fence, struct nouveau_channel *chan)
84{ 83{
85 struct nouveau_fence_priv *priv = chan->drm->fence;
86 struct nouveau_fence_chan *fctx = chan->fence; 84 struct nouveau_fence_chan *fctx = chan->fence;
87 int ret; 85 int ret;
88 86
@@ -90,7 +88,7 @@ nouveau_fence_emit(struct nouveau_fence *fence, struct nouveau_channel *chan)
90 fence->timeout = jiffies + (3 * DRM_HZ); 88 fence->timeout = jiffies + (3 * DRM_HZ);
91 fence->sequence = ++fctx->sequence; 89 fence->sequence = ++fctx->sequence;
92 90
93 ret = priv->emit(fence); 91 ret = fctx->emit(fence);
94 if (!ret) { 92 if (!ret) {
95 kref_get(&fence->kref); 93 kref_get(&fence->kref);
96 spin_lock(&fctx->lock); 94 spin_lock(&fctx->lock);
@@ -219,14 +217,14 @@ nouveau_fence_wait(struct nouveau_fence *fence, bool lazy, bool intr)
219int 217int
220nouveau_fence_sync(struct nouveau_fence *fence, struct nouveau_channel *chan) 218nouveau_fence_sync(struct nouveau_fence *fence, struct nouveau_channel *chan)
221{ 219{
222 struct nouveau_fence_priv *priv = chan->drm->fence; 220 struct nouveau_fence_chan *fctx = chan->fence;
223 struct nouveau_channel *prev; 221 struct nouveau_channel *prev;
224 int ret = 0; 222 int ret = 0;
225 223
226 prev = fence ? fence->channel : NULL; 224 prev = fence ? fence->channel : NULL;
227 if (prev) { 225 if (prev) {
228 if (unlikely(prev != chan && !nouveau_fence_done(fence))) { 226 if (unlikely(prev != chan && !nouveau_fence_done(fence))) {
229 ret = priv->sync(fence, prev, chan); 227 ret = fctx->sync(fence, prev, chan);
230 if (unlikely(ret)) 228 if (unlikely(ret))
231 ret = nouveau_fence_wait(fence, true, false); 229 ret = nouveau_fence_wait(fence, true, false);
232 } 230 }