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);