video: rockchip: rga3: fix RGA3 state has been cleared in IRQ

Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
Change-Id: Iea781894feca6099949232aa2f53a35e3a41eb49
This commit is contained in:
Yu Qiaowei
2024-11-26 11:25:06 +08:00
committed by Tao Huang
parent e44e890e55
commit e3a10aac75
2 changed files with 21 additions and 8 deletions

View File

@@ -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;
}

View File

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