From: Stephan Gerhold <[email protected]>

[ Upstream commit 54898664e1eb6b5b3e6cdd9343c6eb15da776153 ]

A remoteproc could theoretically signal handover twice. This is unexpected
and would break the reference counting for the handover resources (power
domains, clocks, regulators, etc), so add a check to prevent that from
happening.

Reviewed-by: Dmitry Baryshkov <[email protected]>
Signed-off-by: Stephan Gerhold <[email protected]>
Link: 
https://lore.kernel.org/r/[email protected]
Signed-off-by: Bjorn Andersson <[email protected]>
Signed-off-by: Sasha Levin <[email protected]>
---

LLM Generated explanations, may be completely bogus:

YES
- `drivers/remoteproc/qcom_q6v5.c:167-177` now refuses to run the
  handover path when the interrupt fires a second time, logging the
  anomaly but otherwise leaving the first-handled state intact; the
  normal single-shot handover flow remains unchanged.
- Without this guard, a duplicate handover IRQ re-enters target-specific
  clean-up hooks that drop regulator/clock/power-domain votes
  (`drivers/remoteproc/qcom_q6v5_pas.c:369-379`,
  `drivers/remoteproc/qcom_q6v5_adsp.c:454-460`,
  `drivers/remoteproc/qcom_q6v5_mss.c:1748-1758`), breaking their
  reference counting and potentially leaving critical resources
  permanently disabled—something a level-triggered or misbehaving remote
  firmware can trigger in the field.
- The fix is self-contained and low risk: `qcom_q6v5_prepare` still
  resets `handover_issued = false` for each boot
  (`drivers/remoteproc/qcom_q6v5.c:64-66`), while the fallback path that
  manually issues the handover when the IRQ never arrives continues to
  work because the flag stays false in that scenario
  (`drivers/remoteproc/qcom_q6v5.c:79-88`).

Next step: consider picking this into all supported stable kernels
carrying the Qualcomm q6v5 remoteproc stack so duplicated handover
signals can’t cascade into power/clock mismanagement.

 drivers/remoteproc/qcom_q6v5.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/drivers/remoteproc/qcom_q6v5.c b/drivers/remoteproc/qcom_q6v5.c
index 769c6d6d6a731..58d5b85e58cda 100644
--- a/drivers/remoteproc/qcom_q6v5.c
+++ b/drivers/remoteproc/qcom_q6v5.c
@@ -164,6 +164,11 @@ static irqreturn_t q6v5_handover_interrupt(int irq, void 
*data)
 {
        struct qcom_q6v5 *q6v5 = data;
 
+       if (q6v5->handover_issued) {
+               dev_err(q6v5->dev, "Handover signaled, but it already 
happened\n");
+               return IRQ_HANDLED;
+       }
+
        if (q6v5->handover)
                q6v5->handover(q6v5);
 
-- 
2.51.0


Reply via email to