diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0456-drm-amdgpu-fix-waiting-for-all-fences-before-flippin.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0456-drm-amdgpu-fix-waiting-for-all-fences-before-flippin.patch | 166 |
1 files changed, 0 insertions, 166 deletions
diff --git a/common/recipes-kernel/linux/files/0456-drm-amdgpu-fix-waiting-for-all-fences-before-flippin.patch b/common/recipes-kernel/linux/files/0456-drm-amdgpu-fix-waiting-for-all-fences-before-flippin.patch deleted file mode 100644 index bfb862ab..00000000 --- a/common/recipes-kernel/linux/files/0456-drm-amdgpu-fix-waiting-for-all-fences-before-flippin.patch +++ /dev/null @@ -1,166 +0,0 @@ -From 1ffd265243803ac5de9927dfc32541f41da2acf3 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Christian=20K=C3=B6nig?= <christian.koenig@amd.com> -Date: Tue, 11 Aug 2015 17:29:52 +0200 -Subject: [PATCH 0456/1050] drm/amdgpu: fix waiting for all fences before - flipping -MIME-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit - -Otherwise we might see corruption. - -Signed-off-by: Christian König <christian.koenig@amd.com> -Reviewed-by: Alex Deucher <alexander.deucher@amd.com> ---- - drivers/gpu/drm/amd/amdgpu/amdgpu.h | 4 +- - drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 81 +++++++++++++++++++---------- - 2 files changed, 56 insertions(+), 29 deletions(-) - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu.h b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -index 7a3a00f..68beb40 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu.h -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu.h -@@ -828,7 +828,9 @@ struct amdgpu_flip_work { - uint64_t base; - struct drm_pending_vblank_event *event; - struct amdgpu_bo *old_rbo; -- struct fence *fence; -+ struct fence *excl; -+ unsigned shared_count; -+ struct fence **shared; - }; - - -diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c -index e12931e..e3d7077 100644 ---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c -+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c -@@ -35,6 +35,36 @@ - #include <drm/drm_crtc_helper.h> - #include <drm/drm_edid.h> - -+static void amdgpu_flip_wait_fence(struct amdgpu_device *adev, -+ struct fence **f) -+{ -+ struct amdgpu_fence *fence; -+ long r; -+ -+ if (*f == NULL) -+ return; -+ -+ fence = to_amdgpu_fence(*f); -+ if (fence) { -+ r = fence_wait(&fence->base, false); -+ if (r == -EDEADLK) { -+ up_read(&adev->exclusive_lock); -+ r = amdgpu_gpu_reset(adev); -+ down_read(&adev->exclusive_lock); -+ } -+ } else -+ r = fence_wait(*f, false); -+ -+ if (r) -+ DRM_ERROR("failed to wait on page flip fence (%ld)!\n", r); -+ -+ /* We continue with the page flip even if we failed to wait on -+ * the fence, otherwise the DRM core and userspace will be -+ * confused about which BO the CRTC is scanning out -+ */ -+ fence_put(*f); -+ *f = NULL; -+} - - static void amdgpu_flip_work_func(struct work_struct *__work) - { -@@ -44,34 +74,13 @@ static void amdgpu_flip_work_func(struct work_struct *__work) - struct amdgpu_crtc *amdgpuCrtc = adev->mode_info.crtcs[work->crtc_id]; - - struct drm_crtc *crtc = &amdgpuCrtc->base; -- struct amdgpu_fence *fence; - unsigned long flags; -- int r; -+ unsigned i; - - down_read(&adev->exclusive_lock); -- if (work->fence) { -- fence = to_amdgpu_fence(work->fence); -- if (fence) { -- r = fence_wait(&fence->base, false); -- if (r == -EDEADLK) { -- up_read(&adev->exclusive_lock); -- r = amdgpu_gpu_reset(adev); -- down_read(&adev->exclusive_lock); -- } -- } else -- r = fence_wait(work->fence, false); -- -- if (r) -- DRM_ERROR("failed to wait on page flip fence (%d)!\n", r); -- -- /* We continue with the page flip even if we failed to wait on -- * the fence, otherwise the DRM core and userspace will be -- * confused about which BO the CRTC is scanning out -- */ -- -- fence_put(work->fence); -- work->fence = NULL; -- } -+ amdgpu_flip_wait_fence(adev, &work->excl); -+ for (i = 0; i < work->shared_count; ++i) -+ amdgpu_flip_wait_fence(adev, &work->shared[i]); - - /* We borrow the event spin lock for protecting flip_status */ - spin_lock_irqsave(&crtc->dev->event_lock, flags); -@@ -108,6 +117,7 @@ static void amdgpu_unpin_work_func(struct work_struct *__work) - DRM_ERROR("failed to reserve buffer after flip\n"); - - drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base); -+ kfree(work->shared); - kfree(work); - } - -@@ -127,7 +137,7 @@ int amdgpu_crtc_page_flip(struct drm_crtc *crtc, - unsigned long flags; - u64 tiling_flags; - u64 base; -- int r; -+ int i, r; - - work = kzalloc(sizeof *work, GFP_KERNEL); - if (work == NULL) -@@ -167,7 +177,19 @@ int amdgpu_crtc_page_flip(struct drm_crtc *crtc, - goto cleanup; - } - -- work->fence = fence_get(reservation_object_get_excl(new_rbo->tbo.resv)); -+ r = reservation_object_get_fences_rcu(new_rbo->tbo.resv, &work->excl, -+ &work->shared_count, -+ &work->shared); -+ if (unlikely(r != 0)) { -+ amdgpu_bo_unreserve(new_rbo); -+ DRM_ERROR("failed to get fences for buffer\n"); -+ goto cleanup; -+ } -+ -+ fence_get(work->excl); -+ for (i = 0; i < work->shared_count; ++i) -+ fence_get(work->shared[i]); -+ - amdgpu_bo_get_tiling_flags(new_rbo, &tiling_flags); - amdgpu_bo_unreserve(new_rbo); - -@@ -212,7 +234,10 @@ pflip_cleanup: - - cleanup: - drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base); -- fence_put(work->fence); -+ fence_put(work->excl); -+ for (i = 0; i < work->shared_count; ++i) -+ fence_put(work->shared[i]); -+ kfree(work->shared); - kfree(work); - - return r; --- -1.9.1 - |