diff options
Diffstat (limited to 'drivers/gpu/drm/nouveau/nouveau_fence.c')
| -rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_fence.c | 32 | 
1 files changed, 15 insertions, 17 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_fence.c b/drivers/gpu/drm/nouveau/nouveau_fence.c index be3149932c2..ab5ea3b0d66 100644 --- a/drivers/gpu/drm/nouveau/nouveau_fence.c +++ b/drivers/gpu/drm/nouveau/nouveau_fence.c @@ -143,7 +143,7 @@ nouveau_fence_emit(struct nouveau_fence *fence, struct nouveau_channel *chan)  	int ret;  	fence->channel  = chan; -	fence->timeout  = jiffies + (15 * DRM_HZ); +	fence->timeout  = jiffies + (15 * HZ);  	fence->sequence = ++fctx->sequence;  	ret = fctx->emit(fence); @@ -165,17 +165,11 @@ nouveau_fence_done(struct nouveau_fence *fence)  	return !fence->channel;  } -struct nouveau_fence_uevent { -	struct nouveau_eventh handler; -	struct nouveau_fence_priv *priv; -}; -  static int -nouveau_fence_wait_uevent_handler(struct nouveau_eventh *event, int index) +nouveau_fence_wait_uevent_handler(void *data, u32 type, int index)  { -	struct nouveau_fence_uevent *uevent = -		container_of(event, struct nouveau_fence_uevent, handler); -	wake_up_all(&uevent->priv->waiting); +	struct nouveau_fence_priv *priv = data; +	wake_up_all(&priv->waiting);  	return NVKM_EVENT_KEEP;  } @@ -186,13 +180,16 @@ nouveau_fence_wait_uevent(struct nouveau_fence *fence, bool intr)  	struct nouveau_channel *chan = fence->channel;  	struct nouveau_fifo *pfifo = nouveau_fifo(chan->drm->device);  	struct nouveau_fence_priv *priv = chan->drm->fence; -	struct nouveau_fence_uevent uevent = { -		.handler.func = nouveau_fence_wait_uevent_handler, -		.priv = priv, -	}; +	struct nouveau_eventh *handler;  	int ret = 0; -	nouveau_event_get(pfifo->uevent, 0, &uevent.handler); +	ret = nouveau_event_new(pfifo->uevent, 1, 0, +				nouveau_fence_wait_uevent_handler, +				priv, &handler); +	if (ret) +		return ret; + +	nouveau_event_get(handler);  	if (fence->timeout) {  		unsigned long timeout = fence->timeout - jiffies; @@ -224,7 +221,7 @@ nouveau_fence_wait_uevent(struct nouveau_fence *fence, bool intr)  		}  	} -	nouveau_event_put(pfifo->uevent, 0, &uevent.handler); +	nouveau_event_ref(NULL, &handler);  	if (unlikely(ret < 0))  		return ret; @@ -309,7 +306,8 @@ nouveau_fence_unref(struct nouveau_fence **pfence)  struct nouveau_fence *  nouveau_fence_ref(struct nouveau_fence *fence)  { -	kref_get(&fence->kref); +	if (fence) +		kref_get(&fence->kref);  	return fence;  }  | 
