From 83e96ce187434e23a700fe4c7b8d6f4f3d8682e1 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Tue, 16 Aug 2022 17:13:31 +0800 Subject: [PATCH] video: rockchip: rga3: Async mode will pass error code through fence Signed-off-by: Yu Qiaowei Change-Id: I2354d6d2e0253aa061c759fef39aa29af54119e7 --- drivers/video/rockchip/rga3/include/rga_fence.h | 14 ++++++++++---- drivers/video/rockchip/rga3/rga_job.c | 8 +++++++- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/drivers/video/rockchip/rga3/include/rga_fence.h b/drivers/video/rockchip/rga3/include/rga_fence.h index 61c43904aa58..7e3bbeebbc3a 100644 --- a/drivers/video/rockchip/rga3/include/rga_fence.h +++ b/drivers/video/rockchip/rga3/include/rga_fence.h @@ -38,15 +38,21 @@ static inline void rga_dma_fence_put(struct dma_fence *fence) dma_fence_put(fence); } -static inline void rga_dma_fence_signal(struct dma_fence *fence) +static inline void rga_dma_fence_signal(struct dma_fence *fence, int error) { - if (fence) + if (fence) { + if (error != 0) + dma_fence_set_error(fence, error); dma_fence_signal(fence); + } } static inline int rga_dma_fence_get_status(struct dma_fence *fence) { - return dma_fence_get_status(fence); + if (fence) + return dma_fence_get_status(fence); + else + return 1; } #else @@ -81,7 +87,7 @@ static inline void rga_dma_fence_put(struct dma_fence *fence) { } -static inline void rga_dma_fence_signal(struct dma_fence *fence) +static inline void rga_dma_fence_signal(struct dma_fence *fence, int error) { } diff --git a/drivers/video/rockchip/rga3/rga_job.c b/drivers/video/rockchip/rga3/rga_job.c index 9dd7ec2eb7bc..f29b5b076464 100644 --- a/drivers/video/rockchip/rga3/rga_job.c +++ b/drivers/video/rockchip/rga3/rga_job.c @@ -755,6 +755,8 @@ err_request_abort: spin_unlock_irqrestore(&request->lock, flags); + rga_dma_fence_signal(request->release_fence, -EBUSY); + mutex_lock(&request_manager->lock); /* current submit request put */ rga_request_put(request); @@ -843,7 +845,8 @@ int rga_request_release_signal(struct rga_scheduler_t *scheduler, struct rga_job spin_unlock_irqrestore(&request->lock, flags); - rga_dma_fence_signal(request->release_fence); + rga_dma_fence_signal(request->release_fence, request->ret); + wake_up(&request->finished_wq); if (DEBUGGER_EN(MSG)) @@ -1141,6 +1144,9 @@ static void rga_request_kref_release(struct kref *ref) request = container_of(ref, struct rga_request, refcount); + if (rga_dma_fence_get_status(request->release_fence) == 0) + rga_dma_fence_signal(request->release_fence, -EEXIST); + spin_lock_irqsave(&request->lock, flags); rga_dma_fence_put(request->release_fence);