From e3a10aac758ef1fc0fec4a9acd7f377fa4aba0a2 Mon Sep 17 00:00:00 2001 From: Yu Qiaowei Date: Tue, 26 Nov 2024 11:25:06 +0800 Subject: [PATCH] video: rockchip: rga3: fix RGA3 state has been cleared in IRQ Signed-off-by: Yu Qiaowei Change-Id: Iea781894feca6099949232aa2f53a35e3a41eb49 --- drivers/video/rockchip/rga3/rga3_reg_info.c | 22 ++++++++++++++++----- drivers/video/rockchip/rga3/rga_job.c | 7 ++++--- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/drivers/video/rockchip/rga3/rga3_reg_info.c b/drivers/video/rockchip/rga3/rga3_reg_info.c index a32c842c1b8f..78abe724edb0 100644 --- a/drivers/video/rockchip/rga3/rga3_reg_info.c +++ b/drivers/video/rockchip/rga3/rga3_reg_info.c @@ -2161,19 +2161,29 @@ static int rga3_read_status(struct rga_job *job, struct rga_scheduler_t *schedul return 0; } +static void rga3_clear_intr(struct rga_scheduler_t *scheduler) +{ + rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK, + RGA3_INT_CLR, scheduler); +} + static int rga3_irq(struct rga_scheduler_t *scheduler) { struct rga_job *job = scheduler->running_job; - /*clear INTR */ - rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK, - RGA3_INT_CLR, scheduler); + if (job == NULL) { + rga3_clear_intr(scheduler); + rga_err("core[%d], invalid job, INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x]\n", + scheduler->core, rga_read(RGA3_INT_RAW, scheduler), + rga_read(RGA3_STATUS0, scheduler), rga_read(RGA3_CMD_STATE, scheduler)); - if (job == NULL) return IRQ_HANDLED; + } - if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) + if (test_bit(RGA_JOB_STATE_INTR_ERR, &job->state)) { + rga3_clear_intr(scheduler); return IRQ_WAKE_THREAD; + } scheduler->ops->read_status(job, scheduler); @@ -2191,6 +2201,8 @@ static int rga3_irq(struct rga_scheduler_t *scheduler) scheduler->ops->soft_reset(scheduler); } + rga3_clear_intr(scheduler); + return IRQ_WAKE_THREAD; } diff --git a/drivers/video/rockchip/rga3/rga_job.c b/drivers/video/rockchip/rga3/rga_job.c index 0fb81a1c0280..b7481a07bf9d 100644 --- a/drivers/video/rockchip/rga3/rga_job.c +++ b/drivers/video/rockchip/rga3/rga_job.c @@ -270,6 +270,7 @@ struct rga_job *rga_job_done(struct rga_scheduler_t *scheduler) static int rga_job_timeout_query_state(struct rga_job *job, int orig_ret) { + int ret = orig_ret; struct rga_scheduler_t *scheduler = job->scheduler; if (test_bit(RGA_JOB_STATE_DONE, &job->state) && @@ -279,7 +280,7 @@ static int rga_job_timeout_query_state(struct rga_job *job, int orig_ret) test_bit(RGA_JOB_STATE_FINISH, &job->state)) { rga_job_err(job, "job hardware has finished, but the software has timeout!\n"); - return -EBUSY; + ret = -EBUSY; } else if (!test_bit(RGA_JOB_STATE_DONE, &job->state) && !test_bit(RGA_JOB_STATE_FINISH, &job->state)) { rga_job_err(job, "job hardware has timeout.\n"); @@ -287,7 +288,7 @@ static int rga_job_timeout_query_state(struct rga_job *job, int orig_ret) if (scheduler->ops->read_status) scheduler->ops->read_status(job, scheduler); - return -EBUSY; + ret = -EBUSY; } rga_job_err(job, "timeout core[%d]: INTR[0x%x], HW_STATUS[0x%x], CMD_STATUS[0x%x], WORK_CYCLE[0x%x(%d)]\n", @@ -295,7 +296,7 @@ static int rga_job_timeout_query_state(struct rga_job *job, int orig_ret) job->intr_status, job->hw_status, job->cmd_status, job->work_cycle, job->work_cycle); - return orig_ret; + return ret; } static void rga_job_scheduler_timeout_clean(struct rga_scheduler_t *scheduler)