Skip to content

Commit b430f82

Browse files
Yu Qiaoweirkhuangtao
authored andcommitted
video: rockchip: rga3: fix irq_handler crash when hardware reset
Signed-off-by: Yu Qiaowei <[email protected]> Change-Id: Iee7f20510172fc89c6640503926584a982d2837c
1 parent 4ada27f commit b430f82

File tree

3 files changed

+28
-13
lines changed

3 files changed

+28
-13
lines changed

drivers/video/rockchip/rga3/rga2_reg_info.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3124,6 +3124,13 @@ static int rga2_irq(struct rga_scheduler_t *scheduler)
31243124
{
31253125
struct rga_job *job = scheduler->running_job;
31263126

3127+
/*clear INTR */
3128+
rga_write(rga_read(RGA2_INT, scheduler) |
3129+
(m_RGA2_INT_ERROR_CLEAR_MASK |
3130+
m_RGA2_INT_ALL_CMD_DONE_INT_CLEAR | m_RGA2_INT_NOW_CMD_DONE_INT_CLEAR |
3131+
m_RGA2_INT_LINE_RD_CLEAR | m_RGA2_INT_LINE_WR_CLEAR),
3132+
RGA2_INT, scheduler);
3133+
31273134
/* The hardware interrupt top-half don't need to lock the scheduler. */
31283135
if (job == NULL)
31293136
return IRQ_HANDLED;
@@ -3151,13 +3158,6 @@ static int rga2_irq(struct rga_scheduler_t *scheduler)
31513158
scheduler->ops->soft_reset(scheduler);
31523159
}
31533160

3154-
/*clear INTR */
3155-
rga_write(rga_read(RGA2_INT, scheduler) |
3156-
(m_RGA2_INT_ERROR_CLEAR_MASK |
3157-
m_RGA2_INT_ALL_CMD_DONE_INT_CLEAR | m_RGA2_INT_NOW_CMD_DONE_INT_CLEAR |
3158-
m_RGA2_INT_LINE_RD_CLEAR | m_RGA2_INT_LINE_WR_CLEAR),
3159-
RGA2_INT, scheduler);
3160-
31613161
return IRQ_WAKE_THREAD;
31623162
}
31633163

drivers/video/rockchip/rga3/rga3_reg_info.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2155,6 +2155,10 @@ static int rga3_irq(struct rga_scheduler_t *scheduler)
21552155
{
21562156
struct rga_job *job = scheduler->running_job;
21572157

2158+
/*clear INTR */
2159+
rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK,
2160+
RGA3_INT_CLR, scheduler);
2161+
21582162
if (job == NULL)
21592163
return IRQ_HANDLED;
21602164

@@ -2179,10 +2183,6 @@ static int rga3_irq(struct rga_scheduler_t *scheduler)
21792183
scheduler->ops->soft_reset(scheduler);
21802184
}
21812185

2182-
/*clear INTR */
2183-
rga_write(m_RGA3_INT_FRM_DONE | m_RGA3_INT_CMD_LINE_FINISH | m_RGA3_INT_ERROR_MASK,
2184-
RGA3_INT_CLR, scheduler);
2185-
21862186
return IRQ_WAKE_THREAD;
21872187
}
21882188

drivers/video/rockchip/rga3/rga_drv.c

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1123,11 +1123,26 @@ static irqreturn_t rga_irq_handler(int irq, void *data)
11231123
{
11241124
irqreturn_t irq_ret = IRQ_NONE;
11251125
struct rga_scheduler_t *scheduler = data;
1126+
ktime_t timestamp = ktime_get();
11261127

1127-
scheduler->running_job->timestamp.hw_done = ktime_get();
1128+
spin_lock(&scheduler->irq_lock);
11281129

1129-
if (scheduler->ops->irq)
1130+
if (scheduler->ops->irq) {
11301131
irq_ret = scheduler->ops->irq(scheduler);
1132+
if (irq_ret == IRQ_HANDLED) {
1133+
spin_unlock(&scheduler->irq_lock);
1134+
return irq_ret;
1135+
}
1136+
}
1137+
1138+
if (scheduler->running_job == NULL) {
1139+
spin_unlock(&scheduler->irq_lock);
1140+
return IRQ_HANDLED;
1141+
}
1142+
1143+
scheduler->running_job->timestamp.hw_done = timestamp;
1144+
1145+
spin_unlock(&scheduler->irq_lock);
11311146

11321147
return irq_ret;
11331148
}

0 commit comments

Comments
 (0)