ASoC: SOF: IPC4: Introduce topology ops
authorRanjani Sridharan <ranjani.sridharan@linux.intel.com>
Thu, 9 Jun 2022 03:26:22 +0000 (20:26 -0700)
committerMark Brown <broonie@kernel.org>
Fri, 10 Jun 2022 12:31:50 +0000 (13:31 +0100)
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>
sound/soc/sof/Makefile
sound/soc/sof/ipc4-priv.h
sound/soc/sof/ipc4-topology.c [new file with mode: 0644]
sound/soc/sof/ipc4-topology.h [new file with mode: 0644]
sound/soc/sof/ipc4.c

index 92b5e83601be56aec774fa4156f30f2c33abd610..73524fadb3ce7e3f5bf4ae43611a8f099a813bdc 100644 (file)
@@ -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
index 2b71d5675933d749a6535a6e3aab792836f205f3..5388b888fefa8ef9086dd920b71b6a42c08c1c65 100644 (file)
@@ -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
diff --git a/sound/soc/sof/ipc4-topology.c b/sound/soc/sof/ipc4-topology.c
new file mode 100644 (file)
index 0000000..bccf576
--- /dev/null
@@ -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,
+};
diff --git a/sound/soc/sof/ipc4-topology.h b/sound/soc/sof/ipc4-topology.h
new file mode 100644 (file)
index 0000000..0e9be2b
--- /dev/null
@@ -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
index 658802c86685a5c5c32de45b80ffb093b6b7c550..be677a33882deabf64a949650f34c4e0422560f5 100644 (file)
@@ -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,
 };