summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorAlan Kwong <akwong@codeaurora.org>2016-07-06 12:11:44 -0400
committerKyle Yan <kyan@codeaurora.org>2016-07-11 18:56:32 -0700
commit610d5d59af64b37dbbae443cef65c8f6219eab8f (patch)
treeb905efcc09396269627d0cf86ab1bdabf66c1ced /drivers
parent9f7a8de9ee315043fb3cc3aefff8cc307e441f40 (diff)
msm: sde: Correct rotator irq enable mismatch
This corrects rotator irq enable mismatch by moving enable/disable sequence to resource allocation/deallocation time. This will eliminate race condition between regdma start and wait for done, which causes unacknowledged rotator interrupt to continuosly trigger MDSS main interrupt handler, ending in watchdog reset. CRs-Fixed: 1035411 Change-Id: I597b58b478a35e9c3e3afb1a2ddd20ad87961c1a Signed-off-by: Alan Kwong <akwong@codeaurora.org>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c36
-rw-r--r--drivers/media/platform/msm/sde/rotator/sde_rotator_r3_internal.h3
2 files changed, 9 insertions, 30 deletions
diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c
index d5388db4a9b1..c141797bcd3c 100644
--- a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c
+++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3.c
@@ -575,14 +575,6 @@ static u32 sde_hw_rotator_start_regdma(struct sde_hw_rotator_context *ctx,
if (rot->irq_num >= 0)
reinit_completion(&ctx->regdma_comp);
- /* enable IRQ for first regdma submission from idle */
- if (atomic_read(&rot->regdma_submit_count) ==
- atomic_read(&rot->regdma_done_count)) {
- SDEROT_DBG("Enable IRQ! regdma submitcnt==donecnt -> %d\n",
- atomic_read(&rot->regdma_submit_count));
- enable_irq(rot->irq_num);
- }
-
/*
* Last ROT command must be ROT_START before REGDMA start
*/
@@ -640,9 +632,6 @@ static u32 sde_hw_rotator_start_regdma(struct sde_hw_rotator_context *ctx,
enableInt | (ts_length << 14) | offset);
}
- /* Update REGDMA submit count */
- atomic_inc(&rot->regdma_submit_count);
-
/* Update command queue write ptr */
sde_hw_rotator_put_regdma_segment(ctx, wrptr);
@@ -731,7 +720,6 @@ static u32 sde_hw_rotator_wait_done_regdma(
u32 last_ts;
u32 int_id;
u32 sts = 0;
- u32 d_count;
unsigned long flags;
if (rot->irq_num >= 0) {
@@ -753,6 +741,8 @@ static u32 sde_hw_rotator_wait_done_regdma(
SDEROT_ERR(
"Timeout wait for regdma interrupt status, ts:%X\n",
ctx->timestamp);
+ SDEROT_ERR("last_isr:0x%X, last_ts:0x%X, rc=%d\n",
+ last_isr, last_ts, rc);
if (status & REGDMA_WATCHDOG_INT)
SDEROT_ERR("REGDMA watchdog interrupt\n");
@@ -784,17 +774,6 @@ static u32 sde_hw_rotator_wait_done_regdma(
status = 0;
}
- /* regardless success or timeout, update done count */
- d_count = atomic_inc_return(&rot->regdma_done_count);
-
- /* disable IRQ if no more regdma submission in queue */
- if (d_count == atomic_read(&rot->regdma_submit_count)) {
- SDEROT_DBG(
- "Disable IRQ!! regdma donecnt==submitcnt -> %d\n",
- d_count);
- disable_irq_nosync(rot->irq_num);
- }
-
spin_unlock_irqrestore(&rot->rotisr_lock, flags);
} else {
int cnt = 200;
@@ -1027,6 +1006,9 @@ static struct sde_rot_hw_resource *sde_hw_rotator_alloc_ext(
sde_hw_rotator_swts_create(resinfo->rot);
}
+ if (resinfo->rot->irq_num >= 0)
+ enable_irq(resinfo->rot->irq_num);
+
SDEROT_DBG("New rotator resource:%p, priority:%d\n",
resinfo, wb_id);
@@ -1053,6 +1035,9 @@ static void sde_hw_rotator_free_ext(struct sde_rot_mgr *mgr,
resinfo, hw->wb_id, atomic_read(&hw->num_active),
hw->pending_count);
+ if (resinfo->rot->irq_num >= 0)
+ disable_irq(resinfo->rot->irq_num);
+
devm_kfree(&mgr->pdev->dev, resinfo);
}
@@ -1505,8 +1490,7 @@ static irqreturn_t sde_hw_rotator_regdmairq_handler(int irq, void *ptr)
ctx->last_regdma_isr_status = isr;
ctx->last_regdma_timestamp = ts;
SDEROT_DBG(
- "regdma complete: ctx:%p, ts:%X, dcount:%X\n",
- ctx, ts, atomic_read(&rot->regdma_done_count));
+ "regdma complete: ctx:%p, ts:%X\n", ctx, ts);
complete_all(&ctx->regdma_comp);
ts = (ts - 1) & SDE_REGDMA_SWTS_MASK;
@@ -1854,8 +1838,6 @@ int sde_rotator_r3_init(struct sde_rot_mgr *mgr)
atomic_set(&rot->timestamp[0], 0);
atomic_set(&rot->timestamp[1], 0);
- atomic_set(&rot->regdma_submit_count, 0);
- atomic_set(&rot->regdma_done_count, 0);
ret = sde_rotator_hw_rev_init(rot);
if (ret)
diff --git a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3_internal.h b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3_internal.h
index 5196b1351542..610caf16c764 100644
--- a/drivers/media/platform/msm/sde/rotator/sde_rotator_r3_internal.h
+++ b/drivers/media/platform/msm/sde/rotator/sde_rotator_r3_internal.h
@@ -263,9 +263,6 @@ struct sde_hw_rotator {
struct completion rot_comp;
struct completion regdma_comp;
- atomic_t regdma_submit_count;
- atomic_t regdma_done_count;
-
spinlock_t rotctx_lock;
spinlock_t rotisr_lock;