[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