|
@@ -499,25 +499,41 @@ int msm_wait_fence_interruptable(struct drm_device *dev, uint32_t fence,
|
|
struct timespec *timeout)
|
|
struct timespec *timeout)
|
|
{
|
|
{
|
|
struct msm_drm_private *priv = dev->dev_private;
|
|
struct msm_drm_private *priv = dev->dev_private;
|
|
- unsigned long timeout_jiffies = timespec_to_jiffies(timeout);
|
|
|
|
- unsigned long start_jiffies = jiffies;
|
|
|
|
- unsigned long remaining_jiffies;
|
|
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- if (time_after(start_jiffies, timeout_jiffies))
|
|
|
|
- remaining_jiffies = 0;
|
|
|
|
- else
|
|
|
|
- remaining_jiffies = timeout_jiffies - start_jiffies;
|
|
|
|
-
|
|
|
|
- ret = wait_event_interruptible_timeout(priv->fence_event,
|
|
|
|
- priv->completed_fence >= fence,
|
|
|
|
- remaining_jiffies);
|
|
|
|
- if (ret == 0) {
|
|
|
|
- DBG("timeout waiting for fence: %u (completed: %u)",
|
|
|
|
- fence, priv->completed_fence);
|
|
|
|
- ret = -ETIMEDOUT;
|
|
|
|
- } else if (ret != -ERESTARTSYS) {
|
|
|
|
- ret = 0;
|
|
|
|
|
|
+ if (!priv->gpu)
|
|
|
|
+ return 0;
|
|
|
|
+
|
|
|
|
+ if (fence > priv->gpu->submitted_fence) {
|
|
|
|
+ DRM_ERROR("waiting on invalid fence: %u (of %u)\n",
|
|
|
|
+ fence, priv->gpu->submitted_fence);
|
|
|
|
+ return -EINVAL;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (!timeout) {
|
|
|
|
+ /* no-wait: */
|
|
|
|
+ ret = fence_completed(dev, fence) ? 0 : -EBUSY;
|
|
|
|
+ } else {
|
|
|
|
+ unsigned long timeout_jiffies = timespec_to_jiffies(timeout);
|
|
|
|
+ unsigned long start_jiffies = jiffies;
|
|
|
|
+ unsigned long remaining_jiffies;
|
|
|
|
+
|
|
|
|
+ if (time_after(start_jiffies, timeout_jiffies))
|
|
|
|
+ remaining_jiffies = 0;
|
|
|
|
+ else
|
|
|
|
+ remaining_jiffies = timeout_jiffies - start_jiffies;
|
|
|
|
+
|
|
|
|
+ ret = wait_event_interruptible_timeout(priv->fence_event,
|
|
|
|
+ fence_completed(dev, fence),
|
|
|
|
+ remaining_jiffies);
|
|
|
|
+
|
|
|
|
+ if (ret == 0) {
|
|
|
|
+ DBG("timeout waiting for fence: %u (completed: %u)",
|
|
|
|
+ fence, priv->completed_fence);
|
|
|
|
+ ret = -ETIMEDOUT;
|
|
|
|
+ } else if (ret != -ERESTARTSYS) {
|
|
|
|
+ ret = 0;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
return ret;
|
|
return ret;
|