[PATCH] Revert "drm/amdgpu: Refactor flip into prepare submit and submit. (v2)"

Christian König deathsimple at vodafone.de
Thu Apr 27 10:04:03 UTC 2017


Am 27.04.2017 um 10:18 schrieb Michel Dänzer:
> From: Michel Dänzer <michel.daenzer at amd.com>
>
> This reverts commit cb341a319f7e66f879d69af929c3dadfc1a8f31e.
>
> The purpose of the refactor was for amdgpu_crtc_prepare/submit_flip to
> be used by the DC code, but that's no longer the case.
>
> Signed-off-by: Michel Dänzer <michel.daenzer at amd.com>
> ---
>   drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 147 ++++++----------------------
>   drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h    |  17 ----
>   2 files changed, 29 insertions(+), 135 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> index 7cf226dfb602..0415875656c1 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> @@ -138,56 +138,10 @@ static void amdgpu_unpin_work_func(struct work_struct *__work)
>   	kfree(work);
>   }
>   
> -
> -static void amdgpu_flip_work_cleanup(struct amdgpu_flip_work *work)
> -{
> -	int i;
> -
> -	amdgpu_bo_unref(&work->old_abo);
> -	fence_put(work->excl);
> -	for (i = 0; i < work->shared_count; ++i)
> -		fence_put(work->shared[i]);
> -	kfree(work->shared);
> -	kfree(work);
> -}
> -
> -static void amdgpu_flip_cleanup_unreserve(
> -		struct amdgpu_flip_work *work,
> -		struct amdgpu_bo *new_abo)
> -{
> -	amdgpu_bo_unreserve(new_abo);
> -	amdgpu_flip_work_cleanup(work);
> -}
> -
> -static void amdgpu_flip_cleanup_unpin(
> -		struct amdgpu_flip_work *work,
> -		struct amdgpu_bo *new_abo)
> -{
> -	if (unlikely(amdgpu_bo_unpin(new_abo) != 0))
> -		DRM_ERROR("failed to unpin new abo in error path\n");
> -	amdgpu_flip_cleanup_unreserve(work, new_abo);
> -}
> -
> -void amdgpu_crtc_cleanup_flip_ctx(
> -		struct amdgpu_flip_work *work,
> -		struct amdgpu_bo *new_abo)
> -{
> -	if (unlikely(amdgpu_bo_reserve(new_abo, false) != 0)) {
> -		DRM_ERROR("failed to reserve new abo in error path\n");
> -		amdgpu_flip_work_cleanup(work);
> -		return;
> -	}
> -	amdgpu_flip_cleanup_unpin(work, new_abo);
> -}
> -
> -int amdgpu_crtc_prepare_flip(
> -				struct drm_crtc *crtc,
> -				struct drm_framebuffer *fb,
> -				struct drm_pending_vblank_event *event,
> -				uint32_t page_flip_flags,
> -				uint32_t target,
> -				struct amdgpu_flip_work **work_p,
> -				struct amdgpu_bo **new_abo_p)
> +int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
> +				 struct drm_framebuffer *fb,
> +				 struct drm_pending_vblank_event *event,
> +				 uint32_t page_flip_flags, uint32_t target)
>   {
>   	struct drm_device *dev = crtc->dev;
>   	struct amdgpu_device *adev = dev->dev_private;
> @@ -200,7 +154,7 @@ int amdgpu_crtc_prepare_flip(
>   	unsigned long flags;
>   	u64 tiling_flags;
>   	u64 base;
> -	int r;
> +	int i, r;
>   
>   	work = kzalloc(sizeof *work, GFP_KERNEL);
>   	if (work == NULL)
> @@ -261,84 +215,41 @@ int amdgpu_crtc_prepare_flip(
>   		spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
>   		r = -EBUSY;
>   		goto pflip_cleanup;
> -
>   	}
> -	spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
> -
> -	*work_p = work;
> -	*new_abo_p = new_abo;
>   
> -	return 0;
> -
> -pflip_cleanup:
> -	amdgpu_crtc_cleanup_flip_ctx(work, new_abo);
> -	return r;
> -
> -unpin:
> -	amdgpu_flip_cleanup_unpin(work, new_abo);
> -	return r;
> -
> -unreserve:
> -	amdgpu_flip_cleanup_unreserve(work, new_abo);
> -	return r;
> -
> -cleanup:
> -	amdgpu_flip_work_cleanup(work);
> -	return r;
> -
> -}
> -
> -void amdgpu_crtc_submit_flip(
> -		struct drm_crtc *crtc,
> -		struct drm_framebuffer *fb,
> -		struct amdgpu_flip_work *work,
> -		struct amdgpu_bo *new_abo)
> -{
> -	unsigned long flags;
> -	struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
> -
> -	spin_lock_irqsave(&crtc->dev->event_lock, flags);
>   	amdgpu_crtc->pflip_status = AMDGPU_FLIP_PENDING;
>   	amdgpu_crtc->pflip_works = work;
>   
> +
> +	DRM_DEBUG_DRIVER("crtc:%d[%p], pflip_stat:AMDGPU_FLIP_PENDING, work: %p,\n",
> +			 amdgpu_crtc->crtc_id, amdgpu_crtc, work);
>   	/* update crtc fb */
>   	crtc->primary->fb = fb;
>   	spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
> -
> -	DRM_DEBUG_DRIVER(
> -			"crtc:%d[%p], pflip_stat:AMDGPU_FLIP_PENDING, work: %p,\n",
> -			amdgpu_crtc->crtc_id, amdgpu_crtc, work);
> -
>   	amdgpu_flip_work_func(&work->flip_work.work);
> -}
> +	return 0;
>   
> -int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
> -			  struct drm_framebuffer *fb,
> -			  struct drm_pending_vblank_event *event,
> -			  uint32_t page_flip_flags,
> -			  uint32_t target)
> -{
> -	struct amdgpu_bo *new_abo;
> -	struct amdgpu_flip_work *work;
> -	int r = amdgpu_crtc_prepare_flip(
> -			crtc,
> -			fb,
> -			event,
> -			page_flip_flags,
> -			target,
> -			&work,
> -			&new_abo);
> -
> -	if (r)
> -		return r;
> -
> -	amdgpu_crtc_submit_flip(
> -			crtc,
> -			fb,
> -			work,
> -			new_abo);
> +pflip_cleanup:
> +	if (unlikely(amdgpu_bo_reserve(new_abo, false) != 0)) {

Well here we explicitly shouldn't use an interruptible wait, otherwise 
we would keep the BO pinned.

Christian.

> +		DRM_ERROR("failed to reserve new abo in error path\n");
> +		goto cleanup;
> +	}
> +unpin:
> +	if (unlikely(amdgpu_bo_unpin(new_abo) != 0)) {
> +		DRM_ERROR("failed to unpin new abo in error path\n");
> +	}
> +unreserve:
> +	amdgpu_bo_unreserve(new_abo);
>   
> -	return 0;
> +cleanup:
> +	amdgpu_bo_unref(&work->old_abo);
> +	fence_put(work->excl);
> +	for (i = 0; i < work->shared_count; ++i)
> +		fence_put(work->shared[i]);
> +	kfree(work->shared);
> +	kfree(work);
> +
> +	return r;
>   }
>   
>   int amdgpu_crtc_set_config(struct drm_mode_set *set)
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
> index be3e8d66955e..9362a04eaa59 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
> @@ -702,23 +702,6 @@ int amdgpu_crtc_page_flip_target(struct drm_crtc *crtc,
>   				 struct drm_framebuffer *fb,
>   				 struct drm_pending_vblank_event *event,
>   				 uint32_t page_flip_flags, uint32_t target);
> -void amdgpu_crtc_cleanup_flip_ctx(
> -		struct amdgpu_flip_work *work,
> -		struct amdgpu_bo *new_abo);
> -int amdgpu_crtc_prepare_flip(struct drm_crtc *crtc,
> -			  struct drm_framebuffer *fb,
> -			  struct drm_pending_vblank_event *event,
> -			  uint32_t page_flip_flags,
> -			  uint32_t target,
> -			  struct amdgpu_flip_work **work,
> -			  struct amdgpu_bo **new_abo);
> -
> -void amdgpu_crtc_submit_flip(
> -		struct drm_crtc *crtc,
> -		struct drm_framebuffer *fb,
> -		struct amdgpu_flip_work *work,
> -		struct amdgpu_bo *new_abo);
> -
>   extern const struct drm_mode_config_funcs amdgpu_mode_funcs;
>   
>   #endif




More information about the amd-gfx mailing list