remoteproc: mediatek: Report watchdog crash to all cores
authorTinghan Shen <tinghan.shen@mediatek.com>
Fri, 1 Sep 2023 08:09:33 +0000 (16:09 +0800)
committerMathieu Poirier <mathieu.poirier@linaro.org>
Wed, 13 Sep 2023 17:46:24 +0000 (11:46 -0600)
To ensure consistent behavior, the watchdog timeout handling of the
multi-core SCP should reset the whole SCP sub-system when watchdog
timeout. Triggering the rproc recovery flow on all instances will
ensure proper recovery of the SCP sub-system.

Signed-off-by: Tinghan Shen <tinghan.shen@mediatek.com>
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Tested-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Link: https://lore.kernel.org/r/20230901080935.14571-13-tinghan.shen@mediatek.com
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
drivers/remoteproc/mtk_scp.c

index 147f56d600966834ef3f10b5043b7ebba6278014..a28c9b017f3a4781f1cd39f2572a28458d7667d1 100644 (file)
@@ -68,8 +68,14 @@ EXPORT_SYMBOL_GPL(scp_put);
 
 static void scp_wdt_handler(struct mtk_scp *scp, u32 scp_to_host)
 {
+       struct mtk_scp_of_cluster *scp_cluster = scp->cluster;
+       struct mtk_scp *scp_node;
+
        dev_err(scp->dev, "SCP watchdog timeout! 0x%x", scp_to_host);
-       rproc_report_crash(scp->rproc, RPROC_WATCHDOG);
+
+       /* report watchdog timeout to all cores */
+       list_for_each_entry(scp_node, &scp_cluster->mtk_scp_list, elem)
+               rproc_report_crash(scp_node->rproc, RPROC_WATCHDOG);
 }
 
 static void scp_init_ipi_handler(void *data, unsigned int len, void *priv)