From cc6122b749a8d7376e521d0609a397338d9f7610 Mon Sep 17 00:00:00 2001 From: Jayaprakash Madisetty Date: Sat, 28 Aug 2021 12:07:10 +0530 Subject: [PATCH] disp: msm: sde: allow spec fence signaled with PENDING_ERROR as non fatal In concurrent display usecases, dma_fence_array signaled op can be called early which sets SIGNALED_BIT on spec fence, but irq_dma_fence_array_work is not scheduled yet which clears the PENDING_ERROR in dma_fence. Add changes to treat pending_error with signaled cases as non fatal. Change-Id: I3a59032345b8c6d1488e947e74985ed929112d1c Signed-off-by: Jayaprakash Madisetty --- msm/sde/sde_fence.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/msm/sde/sde_fence.c b/msm/sde/sde_fence.c index ffd8d69cde..1a1055130f 100644 --- a/msm/sde/sde_fence.c +++ b/msm/sde/sde_fence.c @@ -28,7 +28,7 @@ void sde_sync_put(void *fence) signed long sde_sync_wait(void *fnc, long timeout_ms) { struct dma_fence *fence = fnc; - int rc; + int rc, status = 0; char timeline_str[TIMELINE_VAL_LENGTH]; if (!fence) @@ -43,18 +43,31 @@ signed long sde_sync_wait(void *fnc, long timeout_ms) fence->ops->timeline_value_str(fence, timeline_str, TIMELINE_VAL_LENGTH); - if (test_bit(SPEC_FENCE_FLAG_FENCE_ARRAY, &fence->flags) && - fence->error == -EINVAL) { - SDE_INFO("spec fence bind error :%d\n", fence->error); - rc = -EBADF; + status = dma_fence_get_status(fence); + if (test_bit(SPEC_FENCE_FLAG_FENCE_ARRAY, &fence->flags)) { + if (status == -EINVAL) { + SDE_INFO("spec fence bind failure status:%d\n", status); + rc = -EBADF; + } else if (fence->ops->signaled && fence->ops->signaled(fence)) { + SDE_INFO("spec fence status:%d\n", status); + } else { + SDE_ERROR( + "fence driver name:%s timeline name:%s signaled:0x%x status:%d flags:0x%x rc:%d\n", + fence->ops->get_driver_name(fence), + fence->ops->get_timeline_name(fence), + fence->ops->signaled ? + fence->ops->signaled(fence) : 0xffffffff, + status, fence->flags, rc); + } } else { SDE_ERROR( - "fence driver name:%s timeline name:%s seqno:0x%llx timeline:%s signaled:0x%x error:%d\n", + "fence driver name:%s timeline name:%s seqno:0x%llx timeline:%s signaled:0x%x status:%d\n", fence->ops->get_driver_name(fence), fence->ops->get_timeline_name(fence), fence->seqno, timeline_str, fence->ops->signaled ? - fence->ops->signaled(fence) : 0xffffffff, fence->error); + fence->ops->signaled(fence) : 0xffffffff, + status); } }