From 05baafeecfeb55a4767ae3d4dd2d287fe03bf58d Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Fri, 26 Apr 2024 17:03:26 +0800 Subject: [PATCH] video: rockchip: rga3: mpi: fix submit failed causing request to be released Signed-off-by: Yu Qiaowei Change-Id: I05976707580d6892cb706356f8063152c4bfca1e --- drivers/video/rockchip/rga3/rga_drv.c | 20 +++++++------------- drivers/video/rockchip/rga3/rga_job.c | 11 +++++++++++ 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/drivers/video/rockchip/rga3/rga_drv.c b/drivers/video/rockchip/rga3/rga_drv.c index 559a822d68a5..e99ce1dc4de5 100644 --- a/drivers/video/rockchip/rga3/rga_drv.c +++ b/drivers/video/rockchip/rga3/rga_drv.c @@ -127,10 +127,6 @@ int rga_mpi_commit(struct rga_mpi_job_t *mpi_job) return -EINVAL; } - /* - * The mpi commit will use the request repeatedly, so an additional - * get() is added here. - */ rga_request_get(request); mutex_unlock(&request_manager->lock); @@ -217,13 +213,6 @@ int rga_mpi_commit(struct rga_mpi_job_t *mpi_job) goto err_put_request; } - if ((mpi_job->dma_buf_src0 != NULL) && (mpi_cmd.src.yrgb_addr > 0)) - rga_mm_release_buffer(mpi_cmd.src.yrgb_addr); - if ((mpi_job->dma_buf_src1 != NULL) && (mpi_cmd.pat.yrgb_addr > 0)) - rga_mm_release_buffer(mpi_cmd.pat.yrgb_addr); - if ((mpi_job->dma_buf_dst != NULL) && (mpi_cmd.dst.yrgb_addr > 0)) - rga_mm_release_buffer(mpi_cmd.dst.yrgb_addr); - /* copy dst info to mpi job for next node */ if (mpi_job->output != NULL) { mpi_job->output->x_offset = mpi_cmd.dst.x_offset; @@ -236,9 +225,14 @@ int rga_mpi_commit(struct rga_mpi_job_t *mpi_job) mpi_job->output->format = mpi_cmd.dst.format; } - return 0; - err_put_request: + if ((mpi_job->dma_buf_src0 != NULL) && (mpi_cmd.src.yrgb_addr > 0)) + rga_mm_release_buffer(mpi_cmd.src.yrgb_addr); + if ((mpi_job->dma_buf_src1 != NULL) && (mpi_cmd.pat.yrgb_addr > 0)) + rga_mm_release_buffer(mpi_cmd.pat.yrgb_addr); + if ((mpi_job->dma_buf_dst != NULL) && (mpi_cmd.dst.yrgb_addr > 0)) + rga_mm_release_buffer(mpi_cmd.dst.yrgb_addr); + mutex_lock(&request_manager->lock); rga_request_put(request); mutex_unlock(&request_manager->lock); diff --git a/drivers/video/rockchip/rga3/rga_job.c b/drivers/video/rockchip/rga3/rga_job.c index fae613bbf716..05a3f5cb2b83 100644 --- a/drivers/video/rockchip/rga3/rga_job.c +++ b/drivers/video/rockchip/rga3/rga_job.c @@ -1204,6 +1204,9 @@ int rga_request_mpi_submit(struct rga_req *req, struct rga_request *request) int ret = 0; struct rga_job *job = NULL; unsigned long flags; + struct rga_pending_request_manager *request_manager; + + request_manager = rga_drvdata->pend_request_manager; if (request->sync_mode == RGA_BLIT_ASYNC) { pr_err("mpi unsupported async mode!\n"); @@ -1232,6 +1235,14 @@ int rga_request_mpi_submit(struct rga_req *req, struct rga_request *request) spin_unlock_irqrestore(&request->lock, flags); + /* + * The mpi submit will use the request repeatedly, so an additional + * get() is added here. + */ + mutex_lock(&request_manager->lock); + rga_request_get(request); + mutex_unlock(&request_manager->lock); + job = rga_job_commit(req, request); if (IS_ERR_OR_NULL(job)) { pr_err("failed to commit job!\n");