ASoC: SOF: DSP core count handling updates

Peter Ujfalusi <peter.ujfalusi@linux.intel.com> says:

The series address developer facing issues regarding to how the DSP core
count is handled:
IPC4 code ignored the DISABLE_MULTICORE flag, fixed by the first patch.
The second patch does a validation of the core index from topology
against the number of DSP cores available on the booted device, which makes
generic development topologies usable among different DSP variants without
failure.

Link: https://patch.msgid.link/20260520135514.32720-1-peter.ujfalusi@linux.intel.com
This commit is contained in:
Mark Brown 2026-05-21 11:25:24 +01:00
commit bdb78dbd21
No known key found for this signature in database
GPG Key ID: 24D68B725D5487D0
3 changed files with 28 additions and 2 deletions

View File

@ -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 =

View File

@ -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,6 +943,16 @@ static int sof_ipc4_widget_setup_comp_pipeline(struct snd_sof_widget *swidget)
goto err;
}
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);
if (pipeline->direction_valid) {

View File

@ -1574,8 +1574,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 */