diff --git a/msm/sde/sde_fence.c b/msm/sde/sde_fence.c index b38d0258d0..ffd8d69cde 100644 --- a/msm/sde/sde_fence.c +++ b/msm/sde/sde_fence.c @@ -11,6 +11,7 @@ #include "sde_fence.h" #define TIMELINE_VAL_LENGTH 128 +#define SPEC_FENCE_FLAG_FENCE_ARRAY 0x10 void *sde_sync_get(uint64_t fd) { @@ -42,13 +43,19 @@ signed long sde_sync_wait(void *fnc, long timeout_ms) fence->ops->timeline_value_str(fence, timeline_str, TIMELINE_VAL_LENGTH); - SDE_ERROR( - "fence driver name:%s timeline name:%s seqno:0x%llx timeline:%s signaled:0x%x error:%d\n", - fence->ops->get_driver_name(fence), - fence->ops->get_timeline_name(fence), - fence->seqno, timeline_str, - fence->ops->signaled ? + 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; + } else { + SDE_ERROR( + "fence driver name:%s timeline name:%s seqno:0x%llx timeline:%s signaled:0x%x error:%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); + } } return rc; diff --git a/msm/sde/sde_plane.c b/msm/sde/sde_plane.c index 193ecee610..8c22aa67f6 100644 --- a/msm/sde/sde_plane.c +++ b/msm/sde/sde_plane.c @@ -643,6 +643,13 @@ int sde_plane_wait_input_fence(struct drm_plane *plane, uint32_t wait_ms) psde->is_error = true; ret = -EINVAL; break; + case -EBADF: + SDE_INFO("plane%d spec fd signaled on bind failure fd %lld\n", + plane->base.id, + sde_plane_get_property(pstate, PLANE_PROP_INPUT_FENCE)); + psde->is_error = true; + ret = 0; + break; default: SDE_DEBUG_PLANE(psde, "signaled\n"); ret = 0;