Unverified Commit 9ea80748 authored by Ranjani Sridharan's avatar Ranjani Sridharan Committed by Mark Brown
Browse files

ASoC: SOF: add support for dynamic pipelines with multi-core



This patch adds support for dynamic pipelines with multi-core
by using the platform-specific core_get/put() ops to
power up/down a core when a widget is set up/freed.

Along with this, a few redundant functions are removed:
1. sof_pipeline_core_enable() is no longer needed as the
pipeline core will be set up when the pipeline widget
is set up
2. sof_core_enable() is replaced with snd_sof_core_get()
4. core_power_up/down() DSP ops are deprecated and replaced with
core get/put ops.
5. Core power down in sof_widget_unload() during topology
removal is also removed as it is not really needed. For dynamic
pipelines, the cores will be powered off when they are not used.
For static pipelines, the cores will be powered off in the device
remove callback.

Signed-off-by: default avatarRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Reviewed-by: default avatarGuennadi Liakhovetski <guennadi.liakhovetski@linux.intel.com>
Reviewed-by: default avatarPierre-Louis Bossart <pierre-louis.bossart@linux.intel.com>
Signed-off-by: default avatarKai Vehmanen <kai.vehmanen@linux.intel.com>
Link: https://lore.kernel.org/r/20211119192621.4096077-10-kai.vehmanen@linux.intel.com


Signed-off-by: default avatarMark Brown <broonie@kernel.org>
parent d4165199
Loading
Loading
Loading
Loading
+1 −3
Original line number Diff line number Diff line
@@ -101,9 +101,7 @@ const struct snd_sof_dsp_ops sof_apl_ops = {
	/* parse platform specific extended manifest */
	.parse_platform_ext_manifest = hda_dsp_ext_man_get_cavs_config_data,

	/* dsp core power up/down */
	.core_power_up = hda_dsp_enable_core,
	.core_power_down = hda_dsp_core_reset_power_down,
	/* dsp core get/put */
	.core_get = hda_dsp_core_get,

	/* trace callback */
+1 −3
Original line number Diff line number Diff line
@@ -303,9 +303,7 @@ const struct snd_sof_dsp_ops sof_cnl_ops = {
	/* parse platform specific extended manifest */
	.parse_platform_ext_manifest = hda_dsp_ext_man_get_cavs_config_data,

	/* dsp core power up/down */
	.core_power_up = hda_dsp_enable_core,
	.core_power_down = hda_dsp_core_reset_power_down,
	/* dsp core get/put */
	.core_get = hda_dsp_core_get,

	/* firmware run */
+1 −3
Original line number Diff line number Diff line
@@ -97,9 +97,7 @@ const struct snd_sof_dsp_ops sof_icl_ops = {
	/* parse platform specific extended manifest */
	.parse_platform_ext_manifest = hda_dsp_ext_man_get_cavs_config_data,

	/* dsp core power up/down */
	.core_power_up = hda_dsp_enable_core,
	.core_power_down = hda_dsp_core_reset_power_down,
	/* dsp core get/put */
	.core_get = hda_dsp_core_get,

	/* firmware run */
+1 −3
Original line number Diff line number Diff line
@@ -133,9 +133,7 @@ const struct snd_sof_dsp_ops sof_tgl_ops = {
	/* parse platform specific extended manifest */
	.parse_platform_ext_manifest = hda_dsp_ext_man_get_cavs_config_data,

	/* dsp core power up/down */
	.core_power_up = hda_dsp_enable_core,
	.core_power_down = hda_dsp_core_reset_power_down,
	/* dsp core get/put */
	.core_get = tgl_dsp_core_get,
	.core_put = tgl_dsp_core_put,

+1 −31
Original line number Diff line number Diff line
@@ -72,37 +72,7 @@ static inline int snd_sof_dsp_reset(struct snd_sof_dev *sdev)
	return 0;
}

/* dsp core power up/power down */
static inline int snd_sof_dsp_core_power_up(struct snd_sof_dev *sdev,
					    unsigned int core_mask)
{
	int ret = 0;

	core_mask &= ~sdev->enabled_cores_mask;
	if (sof_ops(sdev)->core_power_up && core_mask) {
		ret = sof_ops(sdev)->core_power_up(sdev, core_mask);
		if (!ret)
			sdev->enabled_cores_mask |= core_mask;
	}

	return ret;
}

static inline int snd_sof_dsp_core_power_down(struct snd_sof_dev *sdev,
					      unsigned int core_mask)
{
	int ret = 0;

	core_mask &= sdev->enabled_cores_mask;
	if (sof_ops(sdev)->core_power_down && core_mask) {
		ret = sof_ops(sdev)->core_power_down(sdev, core_mask);
		if (!ret)
			sdev->enabled_cores_mask &= ~core_mask;
	}

	return ret;
}

/* dsp core get/put */
static inline int snd_sof_dsp_core_get(struct snd_sof_dev *sdev, int core)
{
	if (core > sdev->num_cores - 1) {
Loading