]> git.proxmox.com Git - mirror_ubuntu-artful-kernel.git/blobdiff - drivers/gpu/drm/radeon/radeon_display.c
Merge remote-tracking branch 'airlied/drm-next' into topic/vblank-rework
[mirror_ubuntu-artful-kernel.git] / drivers / gpu / drm / radeon / radeon_display.c
index fd8cd0c3600f5bb0b2cc38049dbae991bbffdf55..4eb37976f8799070c72565eab59b7e6e1f9338fe 100644 (file)
@@ -405,7 +405,9 @@ static void radeon_flip_work_func(struct work_struct *__work)
                r = radeon_fence_wait(work->fence, false);
                if (r == -EDEADLK) {
                        up_read(&rdev->exclusive_lock);
-                       r = radeon_gpu_reset(rdev);
+                       do {
+                               r = radeon_gpu_reset(rdev);
+                       } while (r == -EAGAIN);
                        down_read(&rdev->exclusive_lock);
                }
                if (r)
@@ -474,11 +476,6 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
        obj = new_radeon_fb->obj;
        new_rbo = gem_to_radeon_bo(obj);
 
-       spin_lock(&new_rbo->tbo.bdev->fence_lock);
-       if (new_rbo->tbo.sync_obj)
-               work->fence = radeon_fence_ref(new_rbo->tbo.sync_obj);
-       spin_unlock(&new_rbo->tbo.bdev->fence_lock);
-
        /* pin the new buffer */
        DRM_DEBUG_DRIVER("flip-ioctl() cur_rbo = %p, new_rbo = %p\n",
                         work->old_rbo, new_rbo);
@@ -497,6 +494,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
                DRM_ERROR("failed to pin new rbo buffer before flip\n");
                goto cleanup;
        }
+       work->fence = (struct radeon_fence *)fence_get(reservation_object_get_excl(new_rbo->tbo.resv));
        radeon_bo_get_tiling_flags(new_rbo, &tiling_flags, NULL);
        radeon_bo_unreserve(new_rbo);
 
@@ -580,7 +578,6 @@ cleanup:
        drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
        radeon_fence_unref(&work->fence);
        kfree(work);
-
        return r;
 }