/* * Process the remoteproc exceptions * * The exception reporting on Keystone DSP remote processors is very simple * compared to the equivalent processors on the OMAP family, it is notified * through a software-designed specific interrupt source in the IPC interrupt * generation register. * * This function just invokes the rproc_report_crash to report the exception * to the remoteproc driver core, to trigger a recovery. */ static irqreturn_t keystone_rproc_exception_interrupt(int irq, void *dev_id) { struct keystone_rproc *ksproc = dev_id; rproc_report_crash(ksproc->rproc, RPROC_FATAL_ERROR); return IRQ_HANDLED; }
static irqreturn_t qproc_wdog_interrupt(int irq, void *dev) { struct qproc *qproc = dev; dev_err(qproc->dev, " WATCHDOG\n"); rproc_report_crash(qproc->rproc, RPROC_WATCHDOG); return IRQ_HANDLED; }
static irqreturn_t qproc_fatal_interrupt(int irq, void *dev) { struct qproc *qproc = dev; dev_err(qproc->dev, " FATAL\n"); rproc_report_crash(qproc->rproc, RPROC_FATAL_ERROR); return IRQ_HANDLED; }
static irqreturn_t q6v5_fatal_interrupt(int irq, void *data) { struct qcom_q6v5 *q6v5 = data; size_t len; char *msg; msg = qcom_smem_get(QCOM_SMEM_HOST_ANY, q6v5->crash_reason, &len); if (!IS_ERR(msg) && len > 0 && msg[0]) dev_err(q6v5->dev, "fatal error received: %s\n", msg); else dev_err(q6v5->dev, "fatal error without message\n"); rproc_report_crash(q6v5->rproc, RPROC_FATAL_ERROR); return IRQ_HANDLED; }
static irqreturn_t q6v5_wdog_interrupt(int irq, void *data) { struct qcom_q6v5 *q6v5 = data; size_t len; char *msg; /* Sometimes the stop triggers a watchdog rather than a stop-ack */ if (!q6v5->running) { complete(&q6v5->stop_done); return IRQ_HANDLED; } msg = qcom_smem_get(QCOM_SMEM_HOST_ANY, q6v5->crash_reason, &len); if (!IS_ERR(msg) && len > 0 && msg[0]) dev_err(q6v5->dev, "watchdog received: %s\n", msg); else dev_err(q6v5->dev, "watchdog without message\n"); rproc_report_crash(q6v5->rproc, RPROC_WATCHDOG); return IRQ_HANDLED; }