msm: kgsl: Avoid a deadlock in the IRQ handler
If a major GPU fault occurs, interrupts should be turned off to
avoid a storm. Calling disable_irq from within the IRQ handler,
however has deadlock problems. Call disable_irq_nosync in an
interrupt context instead.
CRs-fixed: 299686
Signed-off-by: Jordan Crouse <jcrouse@codeaurora.org>
diff --git a/drivers/gpu/msm/adreno_a2xx.c b/drivers/gpu/msm/adreno_a2xx.c
index eb923df..f8ae18a 100644
--- a/drivers/gpu/msm/adreno_a2xx.c
+++ b/drivers/gpu/msm/adreno_a2xx.c
@@ -1556,6 +1556,9 @@
adreno_regwrite(device, REG_CP_INT_CNTL, 0);
adreno_regwrite(device, MH_INTERRUPT_MASK, 0);
}
+
+ /* Force the writes to post before touching the IRQ line */
+ wmb();
}
struct adreno_gpudev adreno_a2xx_gpudev = {
diff --git a/drivers/gpu/msm/kgsl_pwrctrl.c b/drivers/gpu/msm/kgsl_pwrctrl.c
index 572e0e8..ab20e81 100644
--- a/drivers/gpu/msm/kgsl_pwrctrl.c
+++ b/drivers/gpu/msm/kgsl_pwrctrl.c
@@ -336,7 +336,10 @@
KGSL_PWR_INFO(device,
"irq off, device %d\n", device->id);
device->ftbl->irqctrl(device, 0);
- disable_irq(pwr->interrupt_num);
+ if (in_interrupt())
+ disable_irq_nosync(pwr->interrupt_num);
+ else
+ disable_irq(pwr->interrupt_num);
}
}
}