diff mbox series

[v2,1/3] ASoC: SOF: sof-audio: setup sched widgets during pipeline complete step

Message ID 20211123171606.129350-1-kai.vehmanen@linux.intel.com (mailing list archive)
State Accepted
Commit 01429183f479c54c1b5d15453a8ce574ea43e525
Headers show
Series [v2,1/3] ASoC: SOF: sof-audio: setup sched widgets during pipeline complete step | expand

Commit Message

Kai Vehmanen Nov. 23, 2021, 5:16 p.m. UTC
From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>

Older firmware prior to ABI 3.19 has a dependency where the scheduler
widgets need to be setup last. Moving the call to sof_widget_setup()
before the pipeline_complete() call also helps remove the need for the
'reverse' direction when walking through the widget list - this was
only working because of the topology macros but the topology does not
require any order.

Fixes: 5fcdbb2d45df ("ASoC: SOF: Add support for dynamic pipelines")
Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com>
Signed-off-by: Kai Vehmanen <kai.vehmanen@linux.intel.com>
---
 sound/soc/sof/sof-audio.c | 19 +++++++++++++++++--
 1 file changed, 17 insertions(+), 2 deletions(-)


base-commit: 65c16dd2942f4476a3f96a2625b1475c6137c09a

Comments

Mark Brown Nov. 24, 2021, 12:57 p.m. UTC | #1
On Tue, Nov 23, 2021 at 07:16:04PM +0200, Kai Vehmanen wrote:

> Fixes: 5fcdbb2d45df ("ASoC: SOF: Add support for dynamic pipelines")
> Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>

This doesn't actually apply as a fix FWIW, I've queued it for -next.
Kai Vehmanen Nov. 24, 2021, 1:49 p.m. UTC | #2
Hi,

On Wed, 24 Nov 2021, Mark Brown wrote:

> On Tue, Nov 23, 2021 at 07:16:04PM +0200, Kai Vehmanen wrote:
> 
> > Fixes: 5fcdbb2d45df ("ASoC: SOF: Add support for dynamic pipelines")
> > Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> This doesn't actually apply as a fix FWIW, I've queued it for -next.

ack, this won't apply on top of for-5.16. The dependencies around the SOF 
dynamic pipelines (and related code) are unfortunately rather complicated 
with many recent changes. I now sent these on top of for-5.17/65c16dd2942 
as baseline.

Given the limited use of dynamic pipelines in current SOF topologies,
we should be good for 5.16 even if these are left out. The Fixes
tags should still be useful for anyone backporting patches to older
kernels.

Br, Kai
Mark Brown Nov. 24, 2021, 5:36 p.m. UTC | #3
On Tue, 23 Nov 2021 19:16:04 +0200, Kai Vehmanen wrote:
> From: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
> 
> Older firmware prior to ABI 3.19 has a dependency where the scheduler
> widgets need to be setup last. Moving the call to sof_widget_setup()
> before the pipeline_complete() call also helps remove the need for the
> 'reverse' direction when walking through the widget list - this was
> only working because of the topology macros but the topology does not
> require any order.
> 
> [...]

Applied to

   https://git.kernel.org/pub/scm/linux/kernel/git/broonie/sound.git for-next

Thanks!

[1/3] ASoC: SOF: sof-audio: setup sched widgets during pipeline complete step
      commit: 01429183f479c54c1b5d15453a8ce574ea43e525
[2/3] ASoC: SOF: topology: don't use list_for_each_entry_reverse()
      commit: fb71d03b29bcbd8c03798d36e7b2a2297b6dea45
[3/3] ASoC: SOF: handle paused streams during system suspend
      commit: 96da174024b9c63bd5d3358668d0bc12677be877

All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.

You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.

If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.

Please add any relevant lists and maintainers to the CCs when replying
to this mail.

Thanks,
Mark
diff mbox series

Patch

diff --git a/sound/soc/sof/sof-audio.c b/sound/soc/sof/sof-audio.c
index 0f2566f7c094..f4e142ec0fbd 100644
--- a/sound/soc/sof/sof-audio.c
+++ b/sound/soc/sof/sof-audio.c
@@ -637,16 +637,25 @@  const struct sof_ipc_pipe_new *snd_sof_pipeline_find(struct snd_sof_dev *sdev,
 
 int sof_set_up_pipelines(struct snd_sof_dev *sdev, bool verify)
 {
+	struct sof_ipc_fw_version *v = &sdev->fw_ready.version;
 	struct snd_sof_widget *swidget;
 	struct snd_sof_route *sroute;
 	int ret;
 
 	/* restore pipeline components */
-	list_for_each_entry_reverse(swidget, &sdev->widget_list, list) {
+	list_for_each_entry(swidget, &sdev->widget_list, list) {
 		/* only set up the widgets belonging to static pipelines */
 		if (!verify && swidget->dynamic_pipeline_widget)
 			continue;
 
+		/*
+		 * For older firmware, skip scheduler widgets in this loop,
+		 * sof_widget_setup() will be called in the 'complete pipeline' loop
+		 */
+		if (v->abi_version < SOF_ABI_VER(3, 19, 0) &&
+		    swidget->id == snd_soc_dapm_scheduler)
+			continue;
+
 		/* update DAI config. The IPC will be sent in sof_widget_setup() */
 		if (WIDGET_IS_DAI(swidget->id)) {
 			struct snd_sof_dai *dai = swidget->private;
@@ -694,6 +703,12 @@  int sof_set_up_pipelines(struct snd_sof_dev *sdev, bool verify)
 			if (!verify && swidget->dynamic_pipeline_widget)
 				continue;
 
+			if (v->abi_version < SOF_ABI_VER(3, 19, 0)) {
+				ret = sof_widget_setup(sdev, swidget);
+				if (ret < 0)
+					return ret;
+			}
+
 			swidget->complete =
 				snd_sof_complete_pipeline(sdev, swidget);
 			break;
@@ -722,7 +737,7 @@  int sof_tear_down_pipelines(struct snd_sof_dev *sdev, bool verify)
 	 * sroute->setup because during suspend all streams are suspended and during topology
 	 * loading the sound card unavailable to open PCMs.
 	 */
-	list_for_each_entry_reverse(swidget, &sdev->widget_list, list) {
+	list_for_each_entry(swidget, &sdev->widget_list, list) {
 		if (swidget->dynamic_pipeline_widget)
 			continue;