ASoC: SOF: IPC4: Introduce topology ops
Introduce the topology ops for IPC4. Set the widget_ops and token_list for parsing the scheduler type widget. Support for other widget types will be added in the follow up patches. Co-developed-by: Rander Wang <rander.wang@linux.intel.com> Signed-off-by: Rander Wang <rander.wang@linux.intel.com> Co-developed-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Bard Liao <yung-chuan.liao@linux.intel.com> Signed-off-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Reviewed-by: Péter Ujfalusi <peter.ujfalusi@linux.intel.com> Reviewed-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> Reviewed-by: Ranjani Sridharan <ranjani.sridharan@linux.intel.com> Reviewed-by: Paul Olaru <paul.olaru@oss.nxp.com> Link: https://lore.kernel.org/r/20220609032643.916882-3-ranjani.sridharan@linux.intel.com Signed-off-by: Mark Brown <broonie@kernel.org>
This commit is contained in:
Родитель
bd10cd5ec5
Коммит
90e891551f
|
@ -4,7 +4,7 @@ snd-sof-objs := core.o ops.o loader.o ipc.o pcm.o pm.o debug.o topology.o\
|
|||
control.o trace.o iomem-utils.o sof-audio.o stream-ipc.o\
|
||||
ipc3-topology.o ipc3-control.o ipc3.o ipc3-pcm.o ipc3-loader.o\
|
||||
ipc3-dtrace.o\
|
||||
ipc4.o ipc4-loader.o
|
||||
ipc4.o ipc4-loader.o ipc4-topology.o
|
||||
ifneq ($(CONFIG_SND_SOC_SOF_CLIENT),)
|
||||
snd-sof-objs += sof-client.o
|
||||
endif
|
||||
|
|
|
@ -40,5 +40,6 @@ struct sof_ipc4_fw_module {
|
|||
};
|
||||
|
||||
extern const struct sof_ipc_fw_loader_ops ipc4_loader_ops;
|
||||
extern const struct sof_ipc_tplg_ops ipc4_tplg_ops;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,102 @@
|
|||
// SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
|
||||
//
|
||||
// This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
// redistributing this file, you may do so under either license.
|
||||
//
|
||||
// Copyright(c) 2022 Intel Corporation. All rights reserved.
|
||||
//
|
||||
//
|
||||
#include <uapi/sound/sof/tokens.h>
|
||||
#include <sound/pcm_params.h>
|
||||
#include <sound/sof/ext_manifest4.h>
|
||||
#include "sof-priv.h"
|
||||
#include "sof-audio.h"
|
||||
#include "ipc4-priv.h"
|
||||
#include "ipc4-topology.h"
|
||||
#include "ops.h"
|
||||
|
||||
static const struct sof_topology_token ipc4_sched_tokens[] = {
|
||||
{SOF_TKN_SCHED_LP_MODE, SND_SOC_TPLG_TUPLE_TYPE_WORD, get_token_u32,
|
||||
offsetof(struct sof_ipc4_pipeline, lp_mode)}
|
||||
};
|
||||
|
||||
static const struct sof_topology_token pipeline_tokens[] = {
|
||||
{SOF_TKN_SCHED_DYNAMIC_PIPELINE, SND_SOC_TPLG_TUPLE_TYPE_BOOL, get_token_u16,
|
||||
offsetof(struct snd_sof_widget, dynamic_pipeline_widget)},
|
||||
};
|
||||
|
||||
static const struct sof_token_info ipc4_token_list[SOF_TOKEN_COUNT] = {
|
||||
[SOF_PIPELINE_TOKENS] = {"Pipeline tokens", pipeline_tokens, ARRAY_SIZE(pipeline_tokens)},
|
||||
[SOF_SCHED_TOKENS] = {"Scheduler tokens", ipc4_sched_tokens,
|
||||
ARRAY_SIZE(ipc4_sched_tokens)},
|
||||
};
|
||||
|
||||
static void sof_ipc4_widget_free_comp(struct snd_sof_widget *swidget)
|
||||
{
|
||||
kfree(swidget->private);
|
||||
}
|
||||
|
||||
static int sof_ipc4_widget_setup_comp_pipeline(struct snd_sof_widget *swidget)
|
||||
{
|
||||
struct snd_soc_component *scomp = swidget->scomp;
|
||||
struct sof_ipc4_pipeline *pipeline;
|
||||
int ret;
|
||||
|
||||
pipeline = kzalloc(sizeof(*pipeline), GFP_KERNEL);
|
||||
if (!pipeline)
|
||||
return -ENOMEM;
|
||||
|
||||
ret = sof_update_ipc_object(scomp, pipeline, SOF_SCHED_TOKENS, swidget->tuples,
|
||||
swidget->num_tuples, sizeof(*pipeline), 1);
|
||||
if (ret) {
|
||||
dev_err(scomp->dev, "parsing scheduler tokens failed\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* parse one set of pipeline tokens */
|
||||
ret = sof_update_ipc_object(scomp, swidget, SOF_PIPELINE_TOKENS, swidget->tuples,
|
||||
swidget->num_tuples, sizeof(*swidget), 1);
|
||||
if (ret) {
|
||||
dev_err(scomp->dev, "parsing pipeline tokens failed\n");
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* TODO: Get priority from topology */
|
||||
pipeline->priority = 0;
|
||||
|
||||
dev_dbg(scomp->dev, "pipeline '%s': id %d pri %d lp mode %d\n",
|
||||
swidget->widget->name, swidget->pipeline_id,
|
||||
pipeline->priority, pipeline->lp_mode);
|
||||
|
||||
swidget->private = pipeline;
|
||||
|
||||
pipeline->msg.primary = SOF_IPC4_GLB_PIPE_PRIORITY(pipeline->priority);
|
||||
pipeline->msg.primary |= SOF_IPC4_GLB_PIPE_INSTANCE_ID(swidget->pipeline_id);
|
||||
pipeline->msg.primary |= SOF_IPC4_MSG_TYPE_SET(SOF_IPC4_GLB_CREATE_PIPELINE);
|
||||
pipeline->msg.primary |= SOF_IPC4_MSG_DIR(SOF_IPC4_MSG_REQUEST);
|
||||
pipeline->msg.primary |= SOF_IPC4_MSG_TARGET(SOF_IPC4_FW_GEN_MSG);
|
||||
|
||||
pipeline->msg.extension = pipeline->lp_mode;
|
||||
pipeline->state = SOF_IPC4_PIPE_UNINITIALIZED;
|
||||
|
||||
return 0;
|
||||
err:
|
||||
kfree(pipeline);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static enum sof_tokens pipeline_token_list[] = {
|
||||
SOF_SCHED_TOKENS,
|
||||
SOF_PIPELINE_TOKENS,
|
||||
};
|
||||
|
||||
static const struct sof_ipc_tplg_widget_ops tplg_ipc4_widget_ops[SND_SOC_DAPM_TYPE_COUNT] = {
|
||||
[snd_soc_dapm_scheduler] = {sof_ipc4_widget_setup_comp_pipeline, sof_ipc4_widget_free_comp,
|
||||
pipeline_token_list, ARRAY_SIZE(pipeline_token_list), NULL,
|
||||
NULL, NULL},
|
||||
};
|
||||
|
||||
const struct sof_ipc_tplg_ops ipc4_tplg_ops = {
|
||||
.widget = tplg_ipc4_widget_ops,
|
||||
.token_list = ipc4_token_list,
|
||||
};
|
|
@ -0,0 +1,30 @@
|
|||
/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
|
||||
/*
|
||||
* This file is provided under a dual BSD/GPLv2 license. When using or
|
||||
* redistributing this file, you may do so under either license.
|
||||
*
|
||||
* Copyright(c) 2022 Intel Corporation. All rights reserved.
|
||||
*/
|
||||
|
||||
#ifndef __INCLUDE_SOUND_SOF_IPC4_TOPOLOGY_H__
|
||||
#define __INCLUDE_SOUND_SOF_IPC4_TOPOLOGY_H__
|
||||
|
||||
#include <sound/sof/ipc4/header.h>
|
||||
|
||||
/**
|
||||
* struct sof_ipc4_pipeline - pipeline config data
|
||||
* @priority: Priority of this pipeline
|
||||
* @lp_mode: Low power mode
|
||||
* @mem_usage: Memory usage
|
||||
* @state: Pipeline state
|
||||
* @msg: message structure for pipeline
|
||||
*/
|
||||
struct sof_ipc4_pipeline {
|
||||
uint32_t priority;
|
||||
uint32_t lp_mode;
|
||||
uint32_t mem_usage;
|
||||
int state;
|
||||
struct sof_ipc4_msg msg;
|
||||
};
|
||||
|
||||
#endif
|
|
@ -603,4 +603,5 @@ const struct sof_ipc_ops ipc4_ops = {
|
|||
.set_get_data = sof_ipc4_set_get_data,
|
||||
.get_reply = sof_ipc4_get_reply,
|
||||
.fw_loader = &ipc4_loader_ops,
|
||||
.tplg = &ipc4_tplg_ops,
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче