summaryrefslogtreecommitdiff
path: root/drivers/spmi
diff options
context:
space:
mode:
authorDavid Collins <collinsd@codeaurora.org>2017-05-12 14:19:20 -0700
committerDavid Collins <collinsd@codeaurora.org>2017-05-26 15:54:42 -0700
commitf1c18592bc1f98fef670f8a2fdbed5d7796ed2d9 (patch)
treed3a3b817418f59227d6dff95ff72c583b226836a /drivers/spmi
parent33a94f46e5ab4eb83334bdf69bfc17155b49da7e (diff)
spmi: spmi-pmic-arb: check apid against limits before calling irq handler
Check that the apid for an SPMI interrupt falls between the min_apid and max_apid that can be handled by the APPS processor before invoking the per-apid interrupt handler: periph_interrupt(). This avoids an access violation in rare cases where the status bit is set for an interrupt that is not owned by the APPS processor. Change-Id: Ib74cb4ae7be9849f0243659bb4c1435340e1e087 Signed-off-by: David Collins <collinsd@codeaurora.org>
Diffstat (limited to 'drivers/spmi')
-rw-r--r--drivers/spmi/spmi-pmic-arb.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/drivers/spmi/spmi-pmic-arb.c b/drivers/spmi/spmi-pmic-arb.c
index 35d4dea41983..d3130cfd6433 100644
--- a/drivers/spmi/spmi-pmic-arb.c
+++ b/drivers/spmi/spmi-pmic-arb.c
@@ -591,6 +591,11 @@ static void __pmic_arb_chained_irq(struct spmi_pmic_arb *pa, bool show)
id = ffs(status) - 1;
status &= ~BIT(id);
apid = id + i * 32;
+ if (apid < pa->min_apid || apid > pa->max_apid) {
+ WARN_ONCE(true, "spurious spmi irq received for apid=%d\n",
+ apid);
+ continue;
+ }
enable = readl_relaxed(pa->intr +
pa->ver_ops->acc_enable(apid));
if (enable & SPMI_PIC_ACC_ENABLE_BIT)