[PATCH 5/8] drm/radeon: cope with foreign fences inside display
Christian König
deathsimple at vodafone.de
Wed Sep 17 06:16:28 PDT 2014
Am 17.09.2014 um 14:35 schrieb Maarten Lankhorst:
> Signed-off-by: Maarten Lankhorst <maarten.lankhorst at canonical.com>
Reviewed-by: Christian König <christian.koenig at amd.com>
> ---
> drivers/gpu/drm/radeon/radeon.h | 2 +-
> drivers/gpu/drm/radeon/radeon_display.c | 30 +++++++++++++++++++-----------
> 2 files changed, 20 insertions(+), 12 deletions(-)
>
> diff --git a/drivers/gpu/drm/radeon/radeon.h b/drivers/gpu/drm/radeon/radeon.h
> index 82b0e11ade89..9aa75c1af4f4 100644
> --- a/drivers/gpu/drm/radeon/radeon.h
> +++ b/drivers/gpu/drm/radeon/radeon.h
> @@ -710,7 +710,7 @@ struct radeon_flip_work {
> uint64_t base;
> struct drm_pending_vblank_event *event;
> struct radeon_bo *old_rbo;
> - struct radeon_fence *fence;
> + struct fence *fence;
> };
>
> struct r500_irq_stat_regs {
> diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
> index 4eb37976f879..00ead8c2758a 100644
> --- a/drivers/gpu/drm/radeon/radeon_display.c
> +++ b/drivers/gpu/drm/radeon/radeon_display.c
> @@ -402,14 +402,21 @@ static void radeon_flip_work_func(struct work_struct *__work)
>
> down_read(&rdev->exclusive_lock);
> if (work->fence) {
> - r = radeon_fence_wait(work->fence, false);
> - if (r == -EDEADLK) {
> - up_read(&rdev->exclusive_lock);
> - do {
> - r = radeon_gpu_reset(rdev);
> - } while (r == -EAGAIN);
> - down_read(&rdev->exclusive_lock);
> - }
> + struct radeon_fence *fence;
> +
> + fence = to_radeon_fence(work->fence);
> + if (fence && fence->rdev == rdev) {
> + r = radeon_fence_wait(fence, false);
> + if (r == -EDEADLK) {
> + up_read(&rdev->exclusive_lock);
> + do {
> + r = radeon_gpu_reset(rdev);
> + } while (r == -EAGAIN);
> + down_read(&rdev->exclusive_lock);
> + }
> + } else
> + r = fence_wait(work->fence, false);
> +
> if (r)
> DRM_ERROR("failed to wait on page flip fence (%d)!\n", r);
>
> @@ -418,7 +425,8 @@ static void radeon_flip_work_func(struct work_struct *__work)
> * confused about which BO the CRTC is scanning out
> */
>
> - radeon_fence_unref(&work->fence);
> + fence_put(work->fence);
> + work->fence = NULL;
> }
>
> /* We borrow the event spin lock for protecting flip_status */
> @@ -494,7 +502,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));
> + work->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);
>
> @@ -576,7 +584,7 @@ pflip_cleanup:
>
> cleanup:
> drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
> - radeon_fence_unref(&work->fence);
> + fence_put(work->fence);
> kfree(work);
> return r;
> }
More information about the dri-devel
mailing list