ASoC: SOF: Intel: hda: Use cold/purge boot after firmware crash
Merge series from Peter Ujfalusi <peter.ujfalusi@linux.intel.com>: In case of a firmware crash we force the DSP to be powered down and rebooted. To make sure that the next boot is going to be clean, force the boot process to skip the IMR booting and re-download the firmware.
This commit is contained in:
commit
67e1b7700c
@ -617,6 +617,13 @@ static int hda_suspend(struct snd_sof_dev *sdev, bool runtime_suspend)
|
||||
#endif
|
||||
int ret, j;
|
||||
|
||||
/*
|
||||
* The memory used for IMR boot loses its content in deeper than S3 state
|
||||
* We must not try IMR boot on next power up (as it will fail).
|
||||
*/
|
||||
if (sdev->system_suspend_target > SOF_SUSPEND_S3)
|
||||
hda->skip_imr_boot = true;
|
||||
|
||||
hda_sdw_int_enable(sdev, false);
|
||||
|
||||
/* disable IPC interrupts */
|
||||
|
@ -395,8 +395,7 @@ int hda_dsp_cl_boot_firmware(struct snd_sof_dev *sdev)
|
||||
struct snd_dma_buffer dmab;
|
||||
int ret, ret1, i;
|
||||
|
||||
if (sdev->system_suspend_target < SOF_SUSPEND_S4 &&
|
||||
hda->imrboot_supported && !sdev->first_boot) {
|
||||
if (hda->imrboot_supported && !sdev->first_boot && !hda->skip_imr_boot) {
|
||||
dev_dbg(sdev->dev, "IMR restore supported, booting from IMR directly\n");
|
||||
hda->boot_iteration = 0;
|
||||
ret = hda_dsp_boot_imr(sdev);
|
||||
@ -480,11 +479,14 @@ int hda_dsp_cl_boot_firmware(struct snd_sof_dev *sdev)
|
||||
*/
|
||||
hda->boot_iteration = HDA_FW_BOOT_ATTEMPTS;
|
||||
ret = hda_cl_copy_fw(sdev, hext_stream);
|
||||
if (!ret)
|
||||
if (!ret) {
|
||||
dev_dbg(sdev->dev, "Firmware download successful, booting...\n");
|
||||
else
|
||||
hda->skip_imr_boot = false;
|
||||
} else {
|
||||
snd_sof_dsp_dbg_dump(sdev, "Firmware download failed",
|
||||
SOF_DBG_DUMP_PCI | SOF_DBG_DUMP_MBOX);
|
||||
hda->skip_imr_boot = true;
|
||||
}
|
||||
|
||||
cleanup:
|
||||
/*
|
||||
|
@ -419,6 +419,7 @@ enum sof_hda_D0_substate {
|
||||
/* represents DSP HDA controller frontend - i.e. host facing control */
|
||||
struct sof_intel_hda_dev {
|
||||
bool imrboot_supported;
|
||||
bool skip_imr_boot;
|
||||
|
||||
int boot_iteration;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user