Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/linville/wirel...
[linux-drm-fsl-dcu.git] / drivers / gpu / drm / radeon / radeon_ring.c
index 18254e1c3e718ee1c7c4cdd4321bf95b15581970..9214403ae173c146573cf8c4441a6a71cf052665 100644 (file)
@@ -61,7 +61,7 @@ int radeon_ib_get(struct radeon_device *rdev, int ring,
                  struct radeon_ib *ib, struct radeon_vm *vm,
                  unsigned size)
 {
-       int i, r;
+       int r;
 
        r = radeon_sa_bo_new(rdev, &rdev->ring_tmp_bo, &ib->sa_bo, size, 256, true);
        if (r) {
@@ -87,8 +87,6 @@ int radeon_ib_get(struct radeon_device *rdev, int ring,
                ib->gpu_addr = radeon_sa_bo_gpu_addr(ib->sa_bo);
        }
        ib->is_const_ib = false;
-       for (i = 0; i < RADEON_NUM_RINGS; ++i)
-               ib->sync_to[i] = NULL;
 
        return 0;
 }
@@ -108,25 +106,6 @@ void radeon_ib_free(struct radeon_device *rdev, struct radeon_ib *ib)
        radeon_fence_unref(&ib->fence);
 }
 
-/**
- * radeon_ib_sync_to - sync to fence before executing the IB
- *
- * @ib: IB object to add fence to
- * @fence: fence to sync to
- *
- * Sync to the fence before executing the IB
- */
-void radeon_ib_sync_to(struct radeon_ib *ib, struct radeon_fence *fence)
-{
-       struct radeon_fence *other;
-
-       if (!fence)
-               return;
-
-       other = ib->sync_to[fence->ring];
-       ib->sync_to[fence->ring] = radeon_fence_later(fence, other);
-}
-
 /**
  * radeon_ib_schedule - schedule an IB (Indirect Buffer) on the ring
  *
@@ -151,8 +130,7 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib,
                       struct radeon_ib *const_ib)
 {
        struct radeon_ring *ring = &rdev->ring[ib->ring];
-       bool need_sync = false;
-       int i, r = 0;
+       int r = 0;
 
        if (!ib->length_dw || !ring->ready) {
                /* TODO: Nothings in the ib we should report. */
@@ -166,19 +144,15 @@ int radeon_ib_schedule(struct radeon_device *rdev, struct radeon_ib *ib,
                dev_err(rdev->dev, "scheduling IB failed (%d).\n", r);
                return r;
        }
-       for (i = 0; i < RADEON_NUM_RINGS; ++i) {
-               struct radeon_fence *fence = ib->sync_to[i];
-               if (radeon_fence_need_sync(fence, ib->ring)) {
-                       need_sync = true;
-                       radeon_semaphore_sync_rings(rdev, ib->semaphore,
-                                                   fence->ring, ib->ring);
-                       radeon_fence_note_sync(fence, ib->ring);
-               }
-       }
-       /* immediately free semaphore when we don't need to sync */
-       if (!need_sync) {
-               radeon_semaphore_free(rdev, &ib->semaphore, NULL);
+
+       /* sync with other rings */
+       r = radeon_semaphore_sync_rings(rdev, ib->semaphore, ib->ring);
+       if (r) {
+               dev_err(rdev->dev, "failed to sync rings (%d)\n", r);
+               radeon_ring_unlock_undo(rdev, ring);
+               return r;
        }
+
        /* if we can't remember our last VM flush then flush now! */
        /* XXX figure out why we have to flush for every IB */
        if (ib->vm /*&& !ib->vm->last_flush*/) {