Unverified Commit 4e1f8648 authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Mark Brown
Browse files

ASoC: SOF: Introduce new firmware state: SOF_FW_CRASHED



The SOF_FW_CRASHED state is meant to indicate the unfortunate case when the
firmware has crashed after a successful boot.

IPC tx timeout is not treated as indication of a firmware crash as it tends
to happen regularly while the firmware is operational.

Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Reviewed-by: default avatarPaul Olaru <paul.olaru@oss.nxp.com>
Link: https://lore.kernel.org/r/20211223113628.18582-8-peter.ujfalusi@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent 2f148430
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -939,6 +939,7 @@ static const struct soc_fw_state_info {
	{SOF_FW_BOOT_FAILED, "SOF_FW_BOOT_FAILED"},
	{SOF_FW_BOOT_READY_FAILED, "SOF_FW_BOOT_READY_FAILED"},
	{SOF_FW_BOOT_COMPLETE, "SOF_FW_BOOT_COMPLETE"},
	{SOF_FW_CRASHED, "SOF_FW_CRASHED"},
};

static void snd_sof_dbg_print_fw_state(struct snd_sof_dev *sdev)
+1 −1
Original line number Diff line number Diff line
@@ -302,7 +302,7 @@ static int sof_ipc_tx_message_unlocked(struct snd_sof_ipc *ipc, u32 header,
	struct snd_sof_ipc_msg *msg;
	int ret;

	if (ipc->disable_ipc_tx)
	if (ipc->disable_ipc_tx || sdev->fw_state == SOF_FW_CRASHED)
		return -ENODEV;

	/*
+2 −0
Original line number Diff line number Diff line
@@ -176,6 +176,8 @@ void snd_sof_dsp_panic(struct snd_sof_dev *sdev, u32 offset, bool non_recoverabl

		snd_sof_dsp_dbg_dump(sdev, "DSP panic!",
				     SOF_DBG_DUMP_REGS | SOF_DBG_DUMP_MBOX);
		if (non_recoverable)
			sof_set_fw_state(sdev, SOF_FW_CRASHED);
		snd_sof_trace_notify_for_error(sdev);
	}
}
+7 −0
Original line number Diff line number Diff line
@@ -312,6 +312,13 @@ int snd_sof_prepare(struct device *dev)
	/* will suspend to S3 by default */
	sdev->system_suspend_target = SOF_SUSPEND_S3;

	/*
	 * if the firmware is crashed then we try to aim for S3 to reboot the
	 * firmware
	 */
	if (sdev->fw_state == SOF_FW_CRASHED)
		return 0;

	if (!desc->use_acpi_target_states)
		return 0;

+1 −0
Original line number Diff line number Diff line
@@ -382,6 +382,7 @@ enum snd_sof_fw_state {
	SOF_FW_BOOT_FAILED,
	SOF_FW_BOOT_READY_FAILED, /* firmware booted but fw_ready op failed */
	SOF_FW_BOOT_COMPLETE,
	SOF_FW_CRASHED,
};

/*