mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-06 02:50:49 +09:00
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:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user