aboutsummaryrefslogtreecommitdiffstats
path: root/sound
diff options
authorPeter Ujfalusi <peter.ujfalusi@linux.intel.com>2026-05-20 16:55:14 +0300
committerMark Brown <broonie@kernel.org>2026-05-21 11:25:22 +0100
commitd9265a36f4be6f322814e0eb255e4e29b39dd5cc (patch)
tree9ef31b893f67c679aff5a196d5c14021ef963390 /sound
parent3d1b78a6119f58c22730ae2aff3e6065ca3f043a (diff)
downloadlinux-next-history-d9265a36f4be6f322814e0eb255e4e29b39dd5cc.tar.gz
ASoC: SOF: Validate and correct the core id against the number of cores of the DSP
Generic development topologies can reference core id outside of the range of the number of DSP cores the device might have. Product families have different number of cores, for example: Intel TGL has 4, TGL-H has 2, ADL has 4, ADL-S has 2, etc The development topologies are tuned for the higher end devices and in this case they will fail on DSP with less number of cores. Override the out of range core id from topology to primary core and inform the user about it. Signed-off-by: Peter Ujfalusi <peter.ujfalusi@linux.intel.com> Reviewed-by: Liam Girdwood <liam.r.girdwood@intel.com> Reviewed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Link: https://patch.msgid.link/20260520135514.32720-3-peter.ujfalusi@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
Diffstat (limited to 'sound')
-rw-r--r--sound/soc/sof/ipc3-topology.c10
-rw-r--r--sound/soc/sof/ipc4-topology.c10
-rw-r--r--sound/soc/sof/topology.c9
3 files changed, 26 insertions, 3 deletions
diff --git a/sound/soc/sof/ipc3-topology.c b/sound/soc/sof/ipc3-topology.c
index 8006777f2f64f..4e066bbded917 100644
--- a/sound/soc/sof/ipc3-topology.c
+++ b/sound/soc/sof/ipc3-topology.c
@@ -519,6 +519,7 @@ static int sof_ipc3_widget_setup_comp_mixer(struct snd_sof_widget *swidget)
static int sof_ipc3_widget_setup_comp_pipeline(struct snd_sof_widget *swidget)
{
struct snd_soc_component *scomp = swidget->scomp;
+ struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
struct snd_sof_pipeline *spipe = swidget->spipe;
struct sof_ipc_pipe_new *pipeline;
struct snd_sof_widget *comp_swidget;
@@ -559,8 +560,15 @@ static int sof_ipc3_widget_setup_comp_pipeline(struct snd_sof_widget *swidget)
if (ret < 0)
goto err;
- if (sof_debug_check_flag(SOF_DBG_DISABLE_MULTICORE))
+ if (sof_debug_check_flag(SOF_DBG_DISABLE_MULTICORE)) {
+ pipeline->core = SOF_DSP_PRIMARY_CORE;
+ } else if (pipeline->core > sdev->num_cores - 1) {
+ dev_info(scomp->dev,
+ "out of range core id for %s, moving it %d -> %d\n",
+ swidget->widget->name, pipeline->core,
+ SOF_DSP_PRIMARY_CORE);
pipeline->core = SOF_DSP_PRIMARY_CORE;
+ }
if (sof_debug_check_flag(SOF_DBG_DYNAMIC_PIPELINES_OVERRIDE))
swidget->dynamic_pipeline_widget =
diff --git a/sound/soc/sof/ipc4-topology.c b/sound/soc/sof/ipc4-topology.c
index 94851ad809fc5..e32cf4dee091d 100644
--- a/sound/soc/sof/ipc4-topology.c
+++ b/sound/soc/sof/ipc4-topology.c
@@ -927,6 +927,7 @@ static void sof_ipc4_widget_free_comp_dai(struct snd_sof_widget *swidget)
static int sof_ipc4_widget_setup_comp_pipeline(struct snd_sof_widget *swidget)
{
struct snd_soc_component *scomp = swidget->scomp;
+ struct snd_sof_dev *sdev = snd_soc_component_get_drvdata(scomp);
struct sof_ipc4_pipeline *pipeline;
struct snd_sof_pipeline *spipe = swidget->spipe;
int ret;
@@ -942,8 +943,15 @@ static int sof_ipc4_widget_setup_comp_pipeline(struct snd_sof_widget *swidget)
goto err;
}
- if (sof_debug_check_flag(SOF_DBG_DISABLE_MULTICORE))
+ if (sof_debug_check_flag(SOF_DBG_DISABLE_MULTICORE)) {
+ pipeline->core_id = SOF_DSP_PRIMARY_CORE;
+ } else if (pipeline->core_id > sdev->num_cores - 1) {
+ dev_info(scomp->dev,
+ "out of range core id for %s, moving it %d -> %d\n",
+ swidget->widget->name, pipeline->core_id,
+ SOF_DSP_PRIMARY_CORE);
pipeline->core_id = SOF_DSP_PRIMARY_CORE;
+ }
swidget->core = pipeline->core_id;
spipe->core_mask |= BIT(pipeline->core_id);
diff --git a/sound/soc/sof/topology.c b/sound/soc/sof/topology.c
index 63d582c658915..86cdf7649262b 100644
--- a/sound/soc/sof/topology.c
+++ b/sound/soc/sof/topology.c
@@ -1567,8 +1567,15 @@ static int sof_widget_ready(struct snd_soc_component *scomp, int index,
int core = sof_get_token_value(SOF_TKN_COMP_CORE_ID, swidget->tuples,
swidget->num_tuples);
- if (core >= 0)
+ if (core >= 0) {
+ if (core > sdev->num_cores - 1) {
+ dev_info(scomp->dev,
+ "out of range core id for %s, moving it %d -> %d\n",
+ swidget->widget->name, core, SOF_DSP_PRIMARY_CORE);
+ core = SOF_DSP_PRIMARY_CORE;
+ }
swidget->core = core;
+ }
}
/* bind widget to external event */