iommu: msm: Ensure power is on in pg fault handler
There is a race condition between turning off the power to the IOMMU
and accessing registers in the page fault handler. The iommu detach
function might get called just after a page fault happens. The detach
function will turn off the regulators to the IOMMU. Since the page
fault handler is a threaded irq it might not run until after the
detach call has turned off the regulators.
Add a check in the page fault handler that power is still on before
accessing any IOMMU registers.
CRs-fixed: 480439
Change-Id: I3a4a5f4cb7bfa5e1418b68b1f9683df75e0f8038
Signed-off-by: Olav Haugan <ohaugan@codeaurora.org>
diff --git a/drivers/iommu/msm_iommu-v1.c b/drivers/iommu/msm_iommu-v1.c
index 8a26003..8e68beb 100644
--- a/drivers/iommu/msm_iommu-v1.c
+++ b/drivers/iommu/msm_iommu-v1.c
@@ -804,6 +804,19 @@
ctx_drvdata = dev_get_drvdata(&pdev->dev);
BUG_ON(!ctx_drvdata);
+ if (!drvdata->ctx_attach_count) {
+ pr_err("Unexpected IOMMU page fault!\n");
+ pr_err("name = %s\n", drvdata->name);
+ pr_err("Power is OFF. Unable to read page fault information\n");
+ /*
+ * We cannot determine which context bank caused the issue so
+ * we just return handled here to ensure IRQ handler code is
+ * happy
+ */
+ ret = IRQ_HANDLED;
+ goto fail;
+ }
+
ret = __enable_clocks(drvdata);
if (ret) {
ret = IRQ_NONE;