Sound Open Firmware
Loading...
Searching...
No Matches
topology.h
Go to the documentation of this file.
1/* SPDX-License-Identifier: BSD-3-Clause
2 *
3 * Copyright(c) 2016 Intel Corporation. All rights reserved.
4 *
5 * Author: Liam Girdwood <liam.r.girdwood@linux.intel.com>
6 * Keyon Jie <yang.jie@linux.intel.com>
7 */
8
9#ifndef __SOF_IPC_TOPOLOGY_H__
10#define __SOF_IPC_TOPOLOGY_H__
11
12#include <sof/audio/buffer.h>
14#include <sof/audio/pipeline.h>
15#include <rtos/alloc.h>
16#include <sof/lib/memory.h>
17#include <sof/list.h>
18#include <sof/platform.h>
19#include <rtos/task.h>
20#include <rtos/sof.h>
21#include <rtos/spinlock.h>
22#include <sof/trace/trace.h>
23#include <sof/ipc/common.h>
24#include <stdbool.h>
25#include <stdint.h>
26
27/* generic IPC pipeline regardless of ABI MAJOR type that is always 4 byte aligned */
28typedef uint32_t ipc_pipe_new;
29typedef uint32_t ipc_pipe_comp_connect;
30typedef uint32_t ipc_comp;
31
32/*
33 * Topology IPC logic uses standard types for abstract IPC features. This means all ABI MAJOR
34 * abstraction is done in the IPC layer only and not in the surrounding infrastructure.
35 */
36#if CONFIG_IPC_MAJOR_3
37#include <ipc/topology.h>
38#define ipc_from_pipe_new(x) ((struct sof_ipc_pipe_new *)x)
39#define ipc_from_pipe_connect(x) ((struct sof_ipc_pipe_comp_connect *)x)
40#define ipc_from_comp_new(x) ((struct sof_ipc_comp *)x)
41#define ipc_from_dai_config(x) ((struct sof_ipc_dai_config *)x)
42#elif CONFIG_IPC_MAJOR_4
43#include <ipc4/pipeline.h>
44#include <ipc4/module.h>
45#include <ipc4/gateway.h>
46#define ipc_from_pipe_new(x) ((struct ipc4_pipeline_create *)x)
47#define ipc_from_pipe_connect(x) ((struct ipc4_module_bind_unbind *)x)
48
49struct ipc_comp_dev;
50const struct comp_driver *ipc4_get_comp_drv(uint32_t module_id);
51struct comp_dev *ipc4_get_comp_dev(uint32_t comp_id);
52int ipc4_add_comp_dev(struct comp_dev *dev);
53#ifdef CONFIG_SOF_USERSPACE_LL
54struct ipc4_message_request;
55struct comp_driver;
56struct comp_dev *comp_new_ipc4_user(struct ipc4_message_request *ipc4,
57 const struct comp_driver *drv);
58#endif
59int ipc4_chain_manager_create(const struct ipc4_chain_dma *cdma);
60int ipc4_chain_dma_state(struct comp_dev *dev, const struct ipc4_chain_dma *cdma);
61int ipc4_create_chain_dma(struct ipc *ipc, struct ipc4_chain_dma *cdma);
62int ipc4_trigger_chain_dma(struct ipc *ipc, struct ipc4_chain_dma *cdma, bool *delay);
63int ipc4_process_on_core(uint32_t core, bool blocking);
64int ipc4_pipeline_complete(struct ipc *ipc, uint32_t comp_id, uint32_t cmd);
65int ipc4_find_dma_config(struct ipc_config_dai *dai, uint8_t *data_buffer, uint32_t size);
66int ipc4_find_all_dma_configs_tlvs_only(struct ipc_config_dai *dai,
67 uint8_t *data_buffer, size_t size);
68int ipc4_pipeline_prepare(struct ipc_comp_dev *ppl_icd, uint32_t cmd);
69int ipc4_pipeline_trigger(struct ipc_comp_dev *ppl_icd, uint32_t cmd, bool *delayed);
70int ipc4_find_dma_config_multiple(struct ipc_config_dai *dai, uint8_t *data_buffer,
71 uint32_t size, uint32_t device_id, int dma_cfg_idx);
72const struct ipc4_pipeline_set_state_data *ipc4_get_pipeline_data_wrapper(void);
73
74#else
75#error "No or invalid IPC MAJOR version selected."
76#endif
77
78#define ipc_to_pipe_new(x) ((ipc_pipe_new *)x)
79#define ipc_to_pipe_connect(x) ((ipc_pipe_comp_connect *)x)
80#define ipc_to_comp_new(x) ((ipc_comp *)x)
81
82struct ipc_msg;
83
84#define COMP_TYPE_ANY 0
85#define COMP_TYPE_COMPONENT 1
86#define COMP_TYPE_BUFFER 2
87#define COMP_TYPE_PIPELINE 3
88
89#define IPC_COMP_ALL 0
90#define IPC_COMP_IGNORE_REMOTE 1
91
92/* IPC generic component device */
94 uint16_t type; /* COMP_TYPE_ */
95 uint16_t core;
96 uint32_t id;
97
98 /* component type data */
99 union {
100 struct comp_dev *cd;
103 };
104
105 /* lists */
106 struct list_item list; /* list in components */
107};
108
115int ipc_comp_new(struct ipc *ipc, ipc_comp *new);
116
123int ipc_comp_free(struct ipc *ipc, uint32_t comp_id);
124
131int ipc_buffer_new(struct ipc *ipc, const struct sof_ipc_buffer *buffer);
132
139int ipc_buffer_free(struct ipc *ipc, uint32_t buffer_id);
140
148
155int ipc_pipeline_free(struct ipc *ipc, uint32_t comp_id);
156
163int ipc_pipeline_complete(struct ipc *ipc, uint32_t comp_id);
164
172
180
188struct ipc_comp_dev *ipc_get_comp_dev(struct ipc *ipc, uint16_t type, uint32_t id);
189
199 uint32_t ppl_id, uint32_t ignore_remote);
208 uint32_t pipeline_id, int dir);
209
215int32_t ipc_comp_pipe_id(const struct ipc_comp_dev *icd);
216
224int ipc_comp_dai_config(struct ipc *ipc, struct ipc_config_dai *common_config,
225 void *spec_config);
226
227/*
228 * Warning: duplicate declaration in component.h
229 */
230int comp_verify_params(struct comp_dev *dev, uint32_t flag,
231 struct sof_ipc_stream_params *params);
232
241int comp_buffer_connect(struct comp_dev *comp, uint32_t comp_core,
242 struct comp_buffer *buffer, uint32_t dir);
243
244#define ipc_get_comp_by_id(ipc, comp_id) ipc_get_comp_dev(ipc, COMP_TYPE_COMPONENT, comp_id)
245#define ipc_get_pipeline_by_id(ipc, ppln_id) ipc_get_comp_dev(ipc, COMP_TYPE_PIPELINE, ppln_id)
246#define ipc_get_buffer_by_id(ipc, buf_id) ipc_get_comp_dev(ipc, COMP_TYPE_BUFFER, buf_id)
247
248#endif
#define list_item(item, type, member)
Definition list.h:80
static uint32_t pipeline_id(struct pipeline *p)
Retrieves pipeline id from pipeline.
Definition pipeline.h:261
Platform API definition.
int ipc_comp_free(struct ipc *ipc, uint32_t comp_id)
Free an IPC component.
int ipc_pipeline_complete(struct ipc *ipc, uint32_t comp_id)
Complete an IPC pipeline.
int ipc_buffer_free(struct ipc *ipc, uint32_t buffer_id)
Free an IPC buffer.
int ipc_pipeline_new(struct ipc *ipc, ipc_pipe_new *pipeline)
Create a new IPC pipeline.
int ipc_buffer_new(struct ipc *ipc, const struct sof_ipc_buffer *buffer)
Create a new IPC buffer.
int ipc_comp_new(struct ipc *ipc, ipc_comp *new)
Create a new IPC component.
int comp_verify_params(struct comp_dev *dev, uint32_t flag, struct sof_ipc_stream_params *params)
int32_t ipc_comp_pipe_id(const struct ipc_comp_dev *icd)
Get pipeline ID from component.
int ipc_comp_dai_config(struct ipc *ipc, struct ipc_config_dai *common_config, void *spec_config)
Configure all DAI components attached to DAI.
int ipc_comp_connect(struct ipc *ipc, ipc_pipe_comp_connect *connect)
Connect components together on a pipeline.
int comp_buffer_connect(struct comp_dev *comp, uint32_t comp_core, struct comp_buffer *buffer, uint32_t dir)
connect component and buffer
uint32_t ipc_comp
Definition topology.h:30
uint32_t ipc_pipe_comp_connect
Definition topology.h:29
struct ipc_comp_dev * ipc_get_comp_by_ppl_id(struct ipc *ipc, uint16_t type, uint32_t ppl_id, uint32_t ignore_remote)
Get component device from pipeline ID and type.
struct ipc_comp_dev * ipc_get_ppl_comp(struct ipc *ipc, uint32_t pipeline_id, int dir)
Get buffer device from pipeline ID.
uint32_t ipc_pipe_new
Definition topology.h:28
int ipc_comp_disconnect(struct ipc *ipc, ipc_pipe_comp_connect *connect)
Disconnect components in a pipeline.
struct ipc_comp_dev * ipc_get_comp_dev(struct ipc *ipc, uint16_t type, uint32_t id)
Get component device from component type and ID.
int ipc_pipeline_free(struct ipc *ipc, uint32_t comp_id)
Free an IPC pipeline.
Definition buffer.h:130
Audio component base device "class".
Definition component.h:645
uint32_t size
component's allocated size
Definition component.h:657
const struct comp_driver * drv
driver
Definition component.h:675
Audio component base driver "class".
Definition component.h:587
Definition dai-zephyr.h:49
Definition topology.h:93
struct list_item list
Definition topology.h:106
uint16_t core
Definition topology.h:95
uint32_t id
Definition topology.h:96
struct comp_buffer * cb
Definition topology.h:101
uint16_t type
Definition topology.h:94
struct pipeline * pipeline
Definition topology.h:102
struct comp_dev * cd
Definition topology.h:100
Definition ipc-config.h:65
Definition msg.h:33
Definition common.h:90
Definition pipeline.h:55
Definition topology.h:107
Definition stream.h:71
uint32_t type
Definition tlv.h:0