video: rockchip: rga3: scheduler needs to be locked when operating registers

Signed-off-by: Yu Qiaowei <cerf.yu@rock-chips.com>
Change-Id: I729f1e0dac96022ffe01b3367a964d61e4e739e1
This commit is contained in:
Yu Qiaowei
2024-05-22 15:18:52 +08:00
committed by Tao Huang
parent 4f91478b80
commit 171188308c

View File

@@ -2863,6 +2863,7 @@ static int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
int i;
bool master_mode_en;
uint32_t sys_ctrl;
unsigned long flags;
ktime_t now = ktime_get();
/*
@@ -2874,12 +2875,6 @@ static int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
else
master_mode_en = false;
if (job->pre_intr_info.enable)
rga2_set_pre_intr_reg(job, scheduler);
if (job->full_csc.flag)
rga2_set_reg_full_csc(job, scheduler);
if (DEBUGGER_EN(REG)) {
uint32_t *p;
@@ -2894,16 +2889,24 @@ static int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
p[2 + i * 4], p[3 + i * 4]);
}
/* All CMD finish int */
rga_write(rga_read(RGA2_INT, scheduler) |
m_RGA2_INT_ERROR_ENABLE_MASK | m_RGA2_INT_ALL_CMD_DONE_INT_EN,
RGA2_INT, scheduler);
/* sys_reg init */
sys_ctrl = m_RGA2_SYS_CTRL_AUTO_CKG | m_RGA2_SYS_CTRL_AUTO_RST |
m_RGA2_SYS_CTRL_RST_PROTECT_P | m_RGA2_SYS_CTRL_DST_WR_OPT_DIS |
m_RGA2_SYS_CTRL_SRC0YUV420SP_RD_OPT_DIS;
spin_lock_irqsave(&scheduler->irq_lock, flags);
if (job->pre_intr_info.enable)
rga2_set_pre_intr_reg(job, scheduler);
if (job->full_csc.flag)
rga2_set_reg_full_csc(job, scheduler);
/* All CMD finish int */
rga_write(rga_read(RGA2_INT, scheduler) |
m_RGA2_INT_ERROR_ENABLE_MASK | m_RGA2_INT_ALL_CMD_DONE_INT_EN,
RGA2_INT, scheduler);
if (master_mode_en) {
/* master mode */
sys_ctrl |= s_RGA2_SYS_CTRL_CMD_MODE(1);
@@ -2926,10 +2929,7 @@ static int rga2_set_reg(struct rga_job *job, struct rga_scheduler_t *scheduler)
rga_write(sys_ctrl, RGA2_SYS_CTRL, scheduler);
}
if (DEBUGGER_EN(REG))
pr_info("sys_ctrl = %x, int = %x\n",
rga_read(RGA2_SYS_CTRL, scheduler),
rga_read(RGA2_INT, scheduler));
spin_unlock_irqrestore(&scheduler->irq_lock, flags);
if (DEBUGGER_EN(TIME))
pr_info("request[%d], set register cost time %lld us\n",