Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[safe/jmp/linux-2.6] / drivers / gpu / drm / radeon / radeon_fence.c
index 01a8963..4cdd8b4 100644 (file)
@@ -168,46 +168,6 @@ bool radeon_fence_signaled(struct radeon_fence *fence)
        return signaled;
 }
 
-int r600_fence_wait(struct radeon_fence *fence,  bool intr, bool lazy)
-{
-       struct radeon_device *rdev;
-       unsigned long cur_jiffies;
-       unsigned long timeout;
-       int ret = 0;
-
-       cur_jiffies = jiffies;
-       timeout = HZ / 100;
-
-       if (time_after(fence->timeout, cur_jiffies)) {
-               timeout = fence->timeout - cur_jiffies;
-       }
-
-       rdev = fence->rdev;
-
-       __set_current_state(intr ? TASK_INTERRUPTIBLE : TASK_UNINTERRUPTIBLE);
-
-       while (1) {
-               if (radeon_fence_signaled(fence))
-                       break;
-
-               if (time_after_eq(jiffies, timeout)) {
-                       ret = -EBUSY;
-                       break;
-               }
-
-               if (lazy)
-                       schedule_timeout(1);
-
-               if (intr && signal_pending(current)) {
-                       ret = -ERESTARTSYS;
-                       break;
-               }
-       }
-       __set_current_state(TASK_RUNNING);
-       return ret;
-}
-
-
 int radeon_fence_wait(struct radeon_fence *fence, bool intr)
 {
        struct radeon_device *rdev;
@@ -225,13 +185,6 @@ int radeon_fence_wait(struct radeon_fence *fence, bool intr)
                return 0;
        }
 
-       if (rdev->family >= CHIP_R600) {
-               r = r600_fence_wait(fence, intr, 0);
-               if (r == -ERESTARTSYS)
-                       return -EBUSY;
-               return r;
-       }
-
 retry:
        cur_jiffies = jiffies;
        timeout = HZ / 100;
@@ -240,14 +193,17 @@ retry:
        }
 
        if (intr) {
+               radeon_irq_kms_sw_irq_get(rdev);
                r = wait_event_interruptible_timeout(rdev->fence_drv.queue,
                                radeon_fence_signaled(fence), timeout);
-               if (unlikely(r == -ERESTARTSYS)) {
-                       return -EBUSY;
-               }
+               radeon_irq_kms_sw_irq_put(rdev);
+               if (unlikely(r < 0))
+                       return r;
        } else {
+               radeon_irq_kms_sw_irq_get(rdev);
                r = wait_event_timeout(rdev->fence_drv.queue,
                         radeon_fence_signaled(fence), timeout);
+               radeon_irq_kms_sw_irq_put(rdev);
        }
        if (unlikely(!radeon_fence_signaled(fence))) {
                if (unlikely(r == 0)) {
@@ -368,7 +324,7 @@ int radeon_fence_driver_init(struct radeon_device *rdev)
        write_lock_irqsave(&rdev->fence_drv.lock, irq_flags);
        r = radeon_scratch_get(rdev, &rdev->fence_drv.scratch_reg);
        if (r) {
-               DRM_ERROR("Fence failed to get a scratch register.");
+               dev_err(rdev->dev, "fence failed to get scratch register\n");
                write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
                return r;
        }
@@ -379,9 +335,10 @@ int radeon_fence_driver_init(struct radeon_device *rdev)
        INIT_LIST_HEAD(&rdev->fence_drv.signaled);
        rdev->fence_drv.count_timeout = 0;
        init_waitqueue_head(&rdev->fence_drv.queue);
+       rdev->fence_drv.initialized = true;
        write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
        if (radeon_debugfs_fence_init(rdev)) {
-               DRM_ERROR("Failed to register debugfs file for fence !\n");
+               dev_err(rdev->dev, "fence debugfs file creation failed\n");
        }
        return 0;
 }
@@ -390,11 +347,13 @@ void radeon_fence_driver_fini(struct radeon_device *rdev)
 {
        unsigned long irq_flags;
 
+       if (!rdev->fence_drv.initialized)
+               return;
        wake_up_all(&rdev->fence_drv.queue);
        write_lock_irqsave(&rdev->fence_drv.lock, irq_flags);
        radeon_scratch_free(rdev, rdev->fence_drv.scratch_reg);
        write_unlock_irqrestore(&rdev->fence_drv.lock, irq_flags);
-       DRM_INFO("radeon: fence finalized\n");
+       rdev->fence_drv.initialized = false;
 }