From mboxrd@z Thu Jan 1 00:00:00 1970 From: =?windows-1252?Q?Christian_K=F6nig?= Subject: Re: [PATCH 5/8] drm/radeon: cope with foreign fences inside display Date: Wed, 17 Sep 2014 15:16:28 +0200 Message-ID: <541989AC.90603@vodafone.de> References: <1410957305-10190-1-git-send-email-maarten.lankhorst@canonical.com> <1410957305-10190-6-git-send-email-maarten.lankhorst@canonical.com> Mime-Version: 1.0 Content-Type: text/plain; charset="windows-1252"; Format="flowed" Content-Transfer-Encoding: quoted-printable Return-path: Received: from pegasos-out.vodafone.de (pegasos-out.vodafone.de [80.84.1.38]) by gabe.freedesktop.org (Postfix) with ESMTP id 894616E504 for ; Wed, 17 Sep 2014 06:16:36 -0700 (PDT) In-Reply-To: <1410957305-10190-6-git-send-email-maarten.lankhorst@canonical.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Maarten Lankhorst , dri-devel@lists.freedesktop.org List-Id: dri-devel@lists.freedesktop.org Am 17.09.2014 um 14:35 schrieb Maarten Lankhorst: > Signed-off-by: Maarten Lankhorst Reviewed-by: Christian K=F6nig > --- > 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/rad= eon.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/ra= deon/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_struc= t *__work) > = > down_read(&rdev->exclusive_lock); > if (work->fence) { > - r =3D radeon_fence_wait(work->fence, false); > - if (r =3D=3D -EDEADLK) { > - up_read(&rdev->exclusive_lock); > - do { > - r =3D radeon_gpu_reset(rdev); > - } while (r =3D=3D -EAGAIN); > - down_read(&rdev->exclusive_lock); > - } > + struct radeon_fence *fence; > + > + fence =3D to_radeon_fence(work->fence); > + if (fence && fence->rdev =3D=3D rdev) { > + r =3D radeon_fence_wait(fence, false); > + if (r =3D=3D -EDEADLK) { > + up_read(&rdev->exclusive_lock); > + do { > + r =3D radeon_gpu_reset(rdev); > + } while (r =3D=3D -EAGAIN); > + down_read(&rdev->exclusive_lock); > + } > + } else > + r =3D 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 =3D NULL; > } > = > /* We borrow the event spin lock for protecting flip_status */ > @@ -494,7 +502,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crt= c, > DRM_ERROR("failed to pin new rbo buffer before flip\n"); > goto cleanup; > } > - work->fence =3D (struct radeon_fence *)fence_get(reservation_object_get= _excl(new_rbo->tbo.resv)); > + work->fence =3D 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; > }