drm/radeon: track VM update fences separately
[firefly-linux-kernel-4.4.55.git] / drivers / gpu / drm / radeon / radeon_ib.c
index 5bf2c0a05827f57b459ca1be85e268af0bbf32ce..c39ce1f057037e6ae3ddae1c11be1d07d1572b95 100644 (file)
@@ -64,10 +64,7 @@ int radeon_ib_get(struct radeon_device *rdev, int ring,
                return r;
        }
 
-       r = radeon_semaphore_create(rdev, &ib->semaphore);
-       if (r) {
-               return r;
-       }
+       radeon_sync_create(&ib->sync);
 
        ib->ring = ring;
        ib->fence = NULL;
@@ -96,7 +93,7 @@ int radeon_ib_get(struct radeon_device *rdev, int ring,
  */
 void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib)
 {
-       radeon_semaphore_free(rdev, &ib->semaphore, ib->fence);
+       radeon_sync_free(rdev, &ib->sync, ib->fence);
        radeon_sa_bo_free(rdev, &ib->sa_bo, ib->fence);
        radeon_fence_unref(&ib->fence);
 }
@@ -145,11 +142,11 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib,
        if (ib->vm) {
                struct radeon_fence *vm_id_fence;
                vm_id_fence = radeon_vm_grab_id(rdev, ib->vm, ib->ring);
-               radeon_semaphore_sync_to(ib->semaphore, vm_id_fence);
+               radeon_sync_fence(&ib->sync, vm_id_fence);
        }
 
        /* sync with other rings */
-       r = radeon_semaphore_sync_rings(rdev, ib->semaphore, ib->ring);
+       r = radeon_sync_rings(rdev, &ib->sync, ib->ring);
        if (r) {
                dev_err(rdev->dev, "failed to sync rings (%d)\n", r);
                radeon_ring_unlock_undo(rdev, ring);
@@ -157,11 +154,12 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib,
        }
 
        if (ib->vm)
-               radeon_vm_flush(rdev, ib->vm, ib->ring);
+               radeon_vm_flush(rdev, ib->vm, ib->ring,
+                               ib->sync.last_vm_update);
 
        if (const_ib) {
                radeon_ring_ib_execute(rdev, const_ib->ring, const_ib);
-               radeon_semaphore_free(rdev, &const_ib->semaphore, NULL);
+               radeon_sync_free(rdev, &const_ib->sync, NULL);
        }
        radeon_ring_ib_execute(rdev, ib->ring, ib);
        r = radeon_fence_emit(rdev, &ib->fence, ib->ring);
@@ -269,6 +267,7 @@ int radeon_ib_ring_tests(struct radeon_device *rdev)
 
                r = radeon_ib_test(rdev, i, ring);
                if (r) {
+                       radeon_fence_driver_force_completion(rdev, i);
                        ring->ready = false;
                        rdev->needs_reset = false;