mirror of
https://github.com/torvalds/linux.git
synced 2026-07-28 10:09:10 +02:00
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:
commit
bdb78dbd21
|
|
@ -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 =
|
||||
|
|
|
|||
|
|
@ -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) {
|
||||
|
|
|
|||
|
|
@ -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 */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user