]> www.infradead.org Git - users/hch/configfs.git/commitdiff
ASOC: SOF: Intel: hda-loader: only wait for HDaudio IOC for IPC4 devices
authorPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Tue, 16 Jul 2024 08:45:30 +0000 (10:45 +0200)
committerMark Brown <broonie@kernel.org>
Tue, 16 Jul 2024 13:07:55 +0000 (14:07 +0100)
Multiple users report a regression bisected to commit d5263dbbd8af
("ASoC: SOF: Intel: don't ignore IOC interrupts for non-audio
transfers"). The firmware version is the likely suspect, as these
users relied on SOF 2.0 while Intel only tested with the 2.2 release.

Rather than completely disable the wait_for_completion(), which can
help us gather timing information on the different stages of the boot
process, the simplest course of action is to just disable it for older
IPC versions which are no longer under active development.

Closes: https://github.com/thesofproject/linux/issues/5072
Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218961
Fixes: d5263dbbd8af ("ASoC: SOF: Intel: don't ignore IOC interrupts for non-audio transfers")
Tested-by: Mike Krinkin <krinkin.m.u@gmail.com>
Tested-by: Todd Brandt <todd.e.brandt@linux.intel.com>
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com>
Link: https://patch.msgid.link/20240716084530.300829-1-pierre-louis.bossart@linux.intel.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/intel/hda-loader.c

index b8b914eaf7e0555fdefefb8eeeb7bd2878395659..75f6240cf3e1d3c4ded00423e7d3c3f5775c0092 100644 (file)
@@ -310,15 +310,19 @@ int hda_cl_copy_fw(struct snd_sof_dev *sdev, struct hdac_ext_stream *hext_stream
                return ret;
        }
 
-       /* Wait for completion of transfer */
-       time_left = wait_for_completion_timeout(&hda_stream->ioc,
-                                               msecs_to_jiffies(HDA_CL_DMA_IOC_TIMEOUT_MS));
-
-       if (!time_left) {
-               dev_err(sdev->dev, "Code loader DMA did not complete\n");
-               return -ETIMEDOUT;
+       if (sdev->pdata->ipc_type == SOF_IPC_TYPE_4) {
+               /* Wait for completion of transfer */
+               time_left = wait_for_completion_timeout(&hda_stream->ioc,
+                                                       msecs_to_jiffies(HDA_CL_DMA_IOC_TIMEOUT_MS));
+
+               if (!time_left) {
+                       dev_err(sdev->dev, "Code loader DMA did not complete\n");
+                       return -ETIMEDOUT;
+               }
+               dev_dbg(sdev->dev, "Code loader DMA done\n");
        }
-       dev_dbg(sdev->dev, "Code loader DMA done, waiting for FW_ENTERED status\n");
+
+       dev_dbg(sdev->dev, "waiting for FW_ENTERED status\n");
 
        status = snd_sof_dsp_read_poll_timeout(sdev, HDA_DSP_BAR,
                                        chip->rom_status_reg, reg,