Re: [PATCH] remoteproc: qcom: q6v5: Request shutdown if crash is triggered host-side

Mukesh Ojha <[email protected]> Thu, 23 Jul 2026 15:16:03 +0530
Newsgroups org.kernel.vger.linux-remoteproc,org.kernel.vger.linux-arm-msm,org.kernel.vger.linux-kernel
Message-ID <[email protected]>
On Thu, Jul 23, 2026 at 03:00:41AM +0000, Bjorn Andersson wrote:
> rpmsg client drivers are allowed to invoke rproc_report_crash() on their
> grandparent when they determine that the otherwise seemingly healthy
> remoteproc has entered a functionally broken state.
> 
> In the crash handling path qcom_q6v5_request_stop() is invoked, which is
> based on the current rproc state whether to request a graceful shutdown.
> 
> But the current rproc `state` will be RPROC_CRASHED regardless of where
> the crash handler was initiated from, and empirical data shows that
> unless the firmware is taking part of the shutdown the system state is
> often left such that it's not possible to start the subsystem again.
> 
> Use the `running` state in the q6v5 driver to make the decision instead,
> as this does represent the actual state of the firmware.
> 
> This makes it possible to reliably trigger a restart from client
> drivers.
> 
> Fixes: 3cc889eb83f5 ("remoteproc: qcom: q6v5: Avoid setting smem bit in case of crash shutdown")
> Signed-off-by: Bjorn Andersson <[email protected]>
> ---
>  drivers/remoteproc/qcom_q6v5.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/remoteproc/qcom_q6v5.c b/drivers/remoteproc/qcom_q6v5.c
> index 1075ef4027b7..fe148b4b3775 100644
> --- a/drivers/remoteproc/qcom_q6v5.c
> +++ b/drivers/remoteproc/qcom_q6v5.c
> @@ -229,13 +229,13 @@ static irqreturn_t q6v5_stop_interrupt(int irq, void *data)
>   */
>  int qcom_q6v5_request_stop(struct qcom_q6v5 *q6v5, struct qcom_sysmon *sysmon)
>  {
> +	bool was_running = q6v5->running;
>  	int ret;
>  
>  	q6v5->running = false;
>  
> -	/* Don't perform SMP2P dance if remote isn't running */
> -	if ((q6v5->rproc->state != RPROC_RUNNING && q6v5->rproc->state != RPROC_ATTACHED) ||
> -	    qcom_sysmon_shutdown_acked(sysmon))
> +	/* A watchdog/fatal IRQ clears running; logical crashes still need a stop. */
> +	if (!was_running || qcom_sysmon_shutdown_acked(sysmon))
>  		return 0;
>  

Reviewed-by: Mukesh Ojha <[email protected]>

-- 
-Mukesh Ojha