162306a36Sopenharmony_ci/* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * This file is provided under a dual BSD/GPLv2 license.  When using or
462306a36Sopenharmony_ci * redistributing this file, you may do so under either license.
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright(c) 2022 Intel Corporation. All rights reserved.
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#ifndef __INCLUDE_SOUND_SOF_IPC4_TOPOLOGY_H__
1062306a36Sopenharmony_ci#define __INCLUDE_SOUND_SOF_IPC4_TOPOLOGY_H__
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci#include <sound/sof/ipc4/header.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define SOF_IPC4_FW_PAGE_SIZE BIT(12)
1562306a36Sopenharmony_ci#define SOF_IPC4_FW_PAGE(x) ((((x) + BIT(12) - 1) & ~(BIT(12) - 1)) >> 12)
1662306a36Sopenharmony_ci#define SOF_IPC4_FW_ROUNDUP(x) (((x) + BIT(6) - 1) & (~(BIT(6) - 1)))
1762306a36Sopenharmony_ci
1862306a36Sopenharmony_ci#define SOF_IPC4_MODULE_LOAD_TYPE		GENMASK(3, 0)
1962306a36Sopenharmony_ci#define SOF_IPC4_MODULE_AUTO_START		BIT(4)
2062306a36Sopenharmony_ci/*
2162306a36Sopenharmony_ci * Two module schedule domains in fw :
2262306a36Sopenharmony_ci * LL domain - Low latency domain
2362306a36Sopenharmony_ci * DP domain - Data processing domain
2462306a36Sopenharmony_ci * The LL setting should be equal to !DP setting
2562306a36Sopenharmony_ci */
2662306a36Sopenharmony_ci#define SOF_IPC4_MODULE_LL		BIT(5)
2762306a36Sopenharmony_ci#define SOF_IPC4_MODULE_DP		BIT(6)
2862306a36Sopenharmony_ci#define SOF_IPC4_MODULE_LIB_CODE		BIT(7)
2962306a36Sopenharmony_ci#define SOF_IPC4_MODULE_INIT_CONFIG_MASK	GENMASK(11, 8)
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define SOF_IPC4_MODULE_INIT_CONFIG_TYPE_BASE_CFG		0
3262306a36Sopenharmony_ci#define SOF_IPC4_MODULE_INIT_CONFIG_TYPE_BASE_CFG_WITH_EXT	1
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci#define SOF_IPC4_MODULE_INSTANCE_LIST_ITEM_SIZE 12
3562306a36Sopenharmony_ci#define SOF_IPC4_PIPELINE_OBJECT_SIZE 448
3662306a36Sopenharmony_ci#define SOF_IPC4_DATA_QUEUE_OBJECT_SIZE 128
3762306a36Sopenharmony_ci#define SOF_IPC4_LL_TASK_OBJECT_SIZE 72
3862306a36Sopenharmony_ci#define SOF_IPC4_DP_TASK_OBJECT_SIZE 104
3962306a36Sopenharmony_ci#define SOF_IPC4_DP_TASK_LIST_SIZE (12 + 8)
4062306a36Sopenharmony_ci#define SOF_IPC4_LL_TASK_LIST_ITEM_SIZE 12
4162306a36Sopenharmony_ci#define SOF_IPC4_FW_MAX_PAGE_COUNT 20
4262306a36Sopenharmony_ci#define SOF_IPC4_FW_MAX_QUEUE_COUNT 8
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/* Node index and mask applicable for host copier and ALH/HDA type DAI copiers */
4562306a36Sopenharmony_ci#define SOF_IPC4_NODE_INDEX_MASK	0xFF
4662306a36Sopenharmony_ci#define SOF_IPC4_NODE_INDEX(x)	((x) & SOF_IPC4_NODE_INDEX_MASK)
4762306a36Sopenharmony_ci#define SOF_IPC4_NODE_TYPE(x)  ((x) << 8)
4862306a36Sopenharmony_ci
4962306a36Sopenharmony_ci/* Node ID for SSP type DAI copiers */
5062306a36Sopenharmony_ci#define SOF_IPC4_NODE_INDEX_INTEL_SSP(x) (((x) & 0xf) << 4)
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci/* Node ID for DMIC type DAI copiers */
5362306a36Sopenharmony_ci#define SOF_IPC4_NODE_INDEX_INTEL_DMIC(x) ((x) & 0x7)
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci#define SOF_IPC4_GAIN_ALL_CHANNELS_MASK 0xffffffff
5662306a36Sopenharmony_ci#define SOF_IPC4_VOL_ZERO_DB	0x7fffffff
5762306a36Sopenharmony_ci
5862306a36Sopenharmony_ci#define SOF_IPC4_DMA_DEVICE_MAX_COUNT 16
5962306a36Sopenharmony_ci
6062306a36Sopenharmony_ci#define SOF_IPC4_INVALID_NODE_ID	0xffffffff
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci/* FW requires minimum 2ms DMA buffer size */
6362306a36Sopenharmony_ci#define SOF_IPC4_MIN_DMA_BUFFER_SIZE	2
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ci/*
6662306a36Sopenharmony_ci * The base of multi-gateways. Multi-gateways addressing starts from
6762306a36Sopenharmony_ci * ALH_MULTI_GTW_BASE and there are ALH_MULTI_GTW_COUNT multi-sources
6862306a36Sopenharmony_ci * and ALH_MULTI_GTW_COUNT multi-sinks available.
6962306a36Sopenharmony_ci * Addressing is continuous from ALH_MULTI_GTW_BASE to
7062306a36Sopenharmony_ci * ALH_MULTI_GTW_BASE + ALH_MULTI_GTW_COUNT - 1.
7162306a36Sopenharmony_ci */
7262306a36Sopenharmony_ci#define ALH_MULTI_GTW_BASE	0x50
7362306a36Sopenharmony_ci/* A magic number from FW */
7462306a36Sopenharmony_ci#define ALH_MULTI_GTW_COUNT	8
7562306a36Sopenharmony_ci
7662306a36Sopenharmony_cienum sof_ipc4_copier_module_config_params {
7762306a36Sopenharmony_ci/*
7862306a36Sopenharmony_ci * Use LARGE_CONFIG_SET to initialize timestamp event. Ipc mailbox must
7962306a36Sopenharmony_ci * contain properly built CopierConfigTimestampInitData struct.
8062306a36Sopenharmony_ci */
8162306a36Sopenharmony_ci	SOF_IPC4_COPIER_MODULE_CFG_PARAM_TIMESTAMP_INIT = 1,
8262306a36Sopenharmony_ci/*
8362306a36Sopenharmony_ci * Use LARGE_CONFIG_SET to initialize copier sink. Ipc mailbox must contain
8462306a36Sopenharmony_ci * properly built CopierConfigSetSinkFormat struct.
8562306a36Sopenharmony_ci */
8662306a36Sopenharmony_ci	SOF_IPC4_COPIER_MODULE_CFG_PARAM_SET_SINK_FORMAT,
8762306a36Sopenharmony_ci/*
8862306a36Sopenharmony_ci * Use LARGE_CONFIG_SET to initialize and enable on Copier data segment
8962306a36Sopenharmony_ci * event. Ipc mailbox must contain properly built DataSegmentEnabled struct.
9062306a36Sopenharmony_ci */
9162306a36Sopenharmony_ci	SOF_IPC4_COPIER_MODULE_CFG_PARAM_DATA_SEGMENT_ENABLED,
9262306a36Sopenharmony_ci/*
9362306a36Sopenharmony_ci * Use LARGE_CONFIG_GET to retrieve Linear Link Position (LLP) value for non
9462306a36Sopenharmony_ci * HD-A gateways.
9562306a36Sopenharmony_ci */
9662306a36Sopenharmony_ci	SOF_IPC4_COPIER_MODULE_CFG_PARAM_LLP_READING,
9762306a36Sopenharmony_ci/*
9862306a36Sopenharmony_ci * Use LARGE_CONFIG_GET to retrieve Linear Link Position (LLP) value for non
9962306a36Sopenharmony_ci * HD-A gateways and corresponding total processed data
10062306a36Sopenharmony_ci */
10162306a36Sopenharmony_ci	SOF_IPC4_COPIER_MODULE_CFG_PARAM_LLP_READING_EXTENDED,
10262306a36Sopenharmony_ci/*
10362306a36Sopenharmony_ci * Use LARGE_CONFIG_SET to setup attenuation on output pins. Data is just uint32_t.
10462306a36Sopenharmony_ci * note Config is only allowed when output pin is set up for 32bit and source
10562306a36Sopenharmony_ci * is connected to Gateway
10662306a36Sopenharmony_ci */
10762306a36Sopenharmony_ci	SOF_IPC4_COPIER_MODULE_CFG_ATTENUATION,
10862306a36Sopenharmony_ci};
10962306a36Sopenharmony_ci
11062306a36Sopenharmony_cistruct sof_ipc4_copier_config_set_sink_format {
11162306a36Sopenharmony_ci/* Id of sink */
11262306a36Sopenharmony_ci	u32 sink_id;
11362306a36Sopenharmony_ci/*
11462306a36Sopenharmony_ci * Input format used by the source
11562306a36Sopenharmony_ci * attention must be the same as present if already initialized.
11662306a36Sopenharmony_ci */
11762306a36Sopenharmony_ci	struct sof_ipc4_audio_format source_fmt;
11862306a36Sopenharmony_ci/* Output format used by the sink */
11962306a36Sopenharmony_ci	struct sof_ipc4_audio_format sink_fmt;
12062306a36Sopenharmony_ci} __packed __aligned(4);
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ci/**
12362306a36Sopenharmony_ci * struct sof_ipc4_pipeline - pipeline config data
12462306a36Sopenharmony_ci * @priority: Priority of this pipeline
12562306a36Sopenharmony_ci * @lp_mode: Low power mode
12662306a36Sopenharmony_ci * @mem_usage: Memory usage
12762306a36Sopenharmony_ci * @core_id: Target core for the pipeline
12862306a36Sopenharmony_ci * @state: Pipeline state
12962306a36Sopenharmony_ci * @use_chain_dma: flag to indicate if the firmware shall use chained DMA
13062306a36Sopenharmony_ci * @msg: message structure for pipeline
13162306a36Sopenharmony_ci * @skip_during_fe_trigger: skip triggering this pipeline during the FE DAI trigger
13262306a36Sopenharmony_ci */
13362306a36Sopenharmony_cistruct sof_ipc4_pipeline {
13462306a36Sopenharmony_ci	uint32_t priority;
13562306a36Sopenharmony_ci	uint32_t lp_mode;
13662306a36Sopenharmony_ci	uint32_t mem_usage;
13762306a36Sopenharmony_ci	uint32_t core_id;
13862306a36Sopenharmony_ci	int state;
13962306a36Sopenharmony_ci	bool use_chain_dma;
14062306a36Sopenharmony_ci	struct sof_ipc4_msg msg;
14162306a36Sopenharmony_ci	bool skip_during_fe_trigger;
14262306a36Sopenharmony_ci};
14362306a36Sopenharmony_ci
14462306a36Sopenharmony_ci/**
14562306a36Sopenharmony_ci * struct sof_ipc4_multi_pipeline_data - multi pipeline trigger IPC data
14662306a36Sopenharmony_ci * @count: Number of pipelines to be triggered
14762306a36Sopenharmony_ci * @pipeline_instance_ids: Flexible array of IDs of the pipelines to be triggered
14862306a36Sopenharmony_ci */
14962306a36Sopenharmony_cistruct ipc4_pipeline_set_state_data {
15062306a36Sopenharmony_ci	u32 count;
15162306a36Sopenharmony_ci	DECLARE_FLEX_ARRAY(u32, pipeline_instance_ids);
15262306a36Sopenharmony_ci} __packed;
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_ci/**
15562306a36Sopenharmony_ci * struct sof_ipc4_pin_format - Module pin format
15662306a36Sopenharmony_ci * @pin_index: pin index
15762306a36Sopenharmony_ci * @buffer_size: buffer size in bytes
15862306a36Sopenharmony_ci * @audio_fmt: audio format for the pin
15962306a36Sopenharmony_ci *
16062306a36Sopenharmony_ci * This structure can be used for both output or input pins and the pin_index is relative to the
16162306a36Sopenharmony_ci * pin type i.e output/input pin
16262306a36Sopenharmony_ci */
16362306a36Sopenharmony_cistruct sof_ipc4_pin_format {
16462306a36Sopenharmony_ci	u32 pin_index;
16562306a36Sopenharmony_ci	u32 buffer_size;
16662306a36Sopenharmony_ci	struct sof_ipc4_audio_format audio_fmt;
16762306a36Sopenharmony_ci};
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci/**
17062306a36Sopenharmony_ci * struct sof_ipc4_available_audio_format - Available audio formats
17162306a36Sopenharmony_ci * @output_pin_fmts: Available output pin formats
17262306a36Sopenharmony_ci * @input_pin_fmts: Available input pin formats
17362306a36Sopenharmony_ci * @num_input_formats: Number of input pin formats
17462306a36Sopenharmony_ci * @num_output_formats: Number of output pin formats
17562306a36Sopenharmony_ci */
17662306a36Sopenharmony_cistruct sof_ipc4_available_audio_format {
17762306a36Sopenharmony_ci	struct sof_ipc4_pin_format *output_pin_fmts;
17862306a36Sopenharmony_ci	struct sof_ipc4_pin_format *input_pin_fmts;
17962306a36Sopenharmony_ci	u32 num_input_formats;
18062306a36Sopenharmony_ci	u32 num_output_formats;
18162306a36Sopenharmony_ci};
18262306a36Sopenharmony_ci
18362306a36Sopenharmony_ci/**
18462306a36Sopenharmony_ci * struct sof_copier_gateway_cfg - IPC gateway configuration
18562306a36Sopenharmony_ci * @node_id: ID of Gateway Node
18662306a36Sopenharmony_ci * @dma_buffer_size: Preferred Gateway DMA buffer size (in bytes)
18762306a36Sopenharmony_ci * @config_length: Length of gateway node configuration blob specified in #config_data
18862306a36Sopenharmony_ci * config_data: Gateway node configuration blob
18962306a36Sopenharmony_ci */
19062306a36Sopenharmony_cistruct sof_copier_gateway_cfg {
19162306a36Sopenharmony_ci	uint32_t node_id;
19262306a36Sopenharmony_ci	uint32_t dma_buffer_size;
19362306a36Sopenharmony_ci	uint32_t config_length;
19462306a36Sopenharmony_ci	uint32_t config_data[];
19562306a36Sopenharmony_ci};
19662306a36Sopenharmony_ci
19762306a36Sopenharmony_ci/**
19862306a36Sopenharmony_ci * struct sof_ipc4_copier_data - IPC data for copier
19962306a36Sopenharmony_ci * @base_config: Base configuration including input audio format
20062306a36Sopenharmony_ci * @out_format: Output audio format
20162306a36Sopenharmony_ci * @copier_feature_mask: Copier feature mask
20262306a36Sopenharmony_ci * @gtw_cfg: Gateway configuration
20362306a36Sopenharmony_ci */
20462306a36Sopenharmony_cistruct sof_ipc4_copier_data {
20562306a36Sopenharmony_ci	struct sof_ipc4_base_module_cfg base_config;
20662306a36Sopenharmony_ci	struct sof_ipc4_audio_format out_format;
20762306a36Sopenharmony_ci	uint32_t copier_feature_mask;
20862306a36Sopenharmony_ci	struct sof_copier_gateway_cfg gtw_cfg;
20962306a36Sopenharmony_ci};
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_ci/**
21262306a36Sopenharmony_ci * struct sof_ipc4_gtw_attributes: Gateway attributes
21362306a36Sopenharmony_ci * @lp_buffer_alloc: Gateway data requested in low power memory
21462306a36Sopenharmony_ci * @alloc_from_reg_file: Gateway data requested in register file memory
21562306a36Sopenharmony_ci * @rsvd: reserved for future use
21662306a36Sopenharmony_ci */
21762306a36Sopenharmony_cistruct sof_ipc4_gtw_attributes {
21862306a36Sopenharmony_ci	uint32_t lp_buffer_alloc : 1;
21962306a36Sopenharmony_ci	uint32_t alloc_from_reg_file : 1;
22062306a36Sopenharmony_ci	uint32_t rsvd : 30;
22162306a36Sopenharmony_ci};
22262306a36Sopenharmony_ci
22362306a36Sopenharmony_ci/**
22462306a36Sopenharmony_ci * struct sof_ipc4_dma_device_stream_ch_map: abstract representation of
22562306a36Sopenharmony_ci * channel mapping to DMAs
22662306a36Sopenharmony_ci * @device: representation of hardware device address or FIFO
22762306a36Sopenharmony_ci * @channel_mask: channels handled by @device. Channels are expected to be
22862306a36Sopenharmony_ci * contiguous
22962306a36Sopenharmony_ci */
23062306a36Sopenharmony_cistruct sof_ipc4_dma_device_stream_ch_map {
23162306a36Sopenharmony_ci	uint32_t device;
23262306a36Sopenharmony_ci	uint32_t channel_mask;
23362306a36Sopenharmony_ci};
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci/**
23662306a36Sopenharmony_ci * struct sof_ipc4_dma_stream_ch_map: DMA configuration data
23762306a36Sopenharmony_ci * @device_count: Number valid items in mapping array
23862306a36Sopenharmony_ci * @mapping: device address and channel mask
23962306a36Sopenharmony_ci */
24062306a36Sopenharmony_cistruct sof_ipc4_dma_stream_ch_map {
24162306a36Sopenharmony_ci	uint32_t device_count;
24262306a36Sopenharmony_ci	struct sof_ipc4_dma_device_stream_ch_map mapping[SOF_IPC4_DMA_DEVICE_MAX_COUNT];
24362306a36Sopenharmony_ci} __packed;
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci#define SOF_IPC4_DMA_METHOD_HDA   1
24662306a36Sopenharmony_ci#define SOF_IPC4_DMA_METHOD_GPDMA 2 /* defined for consistency but not used */
24762306a36Sopenharmony_ci
24862306a36Sopenharmony_ci/**
24962306a36Sopenharmony_ci * struct sof_ipc4_dma_config: DMA configuration
25062306a36Sopenharmony_ci * @dma_method: HDAudio or GPDMA
25162306a36Sopenharmony_ci * @pre_allocated_by_host: 1 if host driver allocates DMA channels, 0 otherwise
25262306a36Sopenharmony_ci * @dma_channel_id: for HDaudio defined as @stream_id - 1
25362306a36Sopenharmony_ci * @stream_id: HDaudio stream tag
25462306a36Sopenharmony_ci * @dma_stream_channel_map: array of device/channel mappings
25562306a36Sopenharmony_ci * @dma_priv_config_size: currently not used
25662306a36Sopenharmony_ci * @dma_priv_config: currently not used
25762306a36Sopenharmony_ci */
25862306a36Sopenharmony_cistruct sof_ipc4_dma_config {
25962306a36Sopenharmony_ci	uint8_t dma_method;
26062306a36Sopenharmony_ci	uint8_t pre_allocated_by_host;
26162306a36Sopenharmony_ci	uint16_t rsvd;
26262306a36Sopenharmony_ci	uint32_t dma_channel_id;
26362306a36Sopenharmony_ci	uint32_t stream_id;
26462306a36Sopenharmony_ci	struct sof_ipc4_dma_stream_ch_map dma_stream_channel_map;
26562306a36Sopenharmony_ci	uint32_t dma_priv_config_size;
26662306a36Sopenharmony_ci	uint8_t dma_priv_config[];
26762306a36Sopenharmony_ci} __packed;
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci#define SOF_IPC4_GTW_DMA_CONFIG_ID 0x1000
27062306a36Sopenharmony_ci
27162306a36Sopenharmony_ci/**
27262306a36Sopenharmony_ci * struct sof_ipc4_dma_config: DMA configuration
27362306a36Sopenharmony_ci * @type: set to SOF_IPC4_GTW_DMA_CONFIG_ID
27462306a36Sopenharmony_ci * @length: sizeof(struct sof_ipc4_dma_config) + dma_config.dma_priv_config_size
27562306a36Sopenharmony_ci * @dma_config: actual DMA configuration
27662306a36Sopenharmony_ci */
27762306a36Sopenharmony_cistruct sof_ipc4_dma_config_tlv {
27862306a36Sopenharmony_ci	uint32_t type;
27962306a36Sopenharmony_ci	uint32_t length;
28062306a36Sopenharmony_ci	struct sof_ipc4_dma_config dma_config;
28162306a36Sopenharmony_ci} __packed;
28262306a36Sopenharmony_ci
28362306a36Sopenharmony_ci/** struct sof_ipc4_alh_configuration_blob: ALH blob
28462306a36Sopenharmony_ci * @gw_attr: Gateway attributes
28562306a36Sopenharmony_ci * @alh_cfg: ALH configuration data
28662306a36Sopenharmony_ci */
28762306a36Sopenharmony_cistruct sof_ipc4_alh_configuration_blob {
28862306a36Sopenharmony_ci	struct sof_ipc4_gtw_attributes gw_attr;
28962306a36Sopenharmony_ci	struct sof_ipc4_dma_stream_ch_map alh_cfg;
29062306a36Sopenharmony_ci};
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci/**
29362306a36Sopenharmony_ci * struct sof_ipc4_copier - copier config data
29462306a36Sopenharmony_ci * @data: IPC copier data
29562306a36Sopenharmony_ci * @copier_config: Copier + blob
29662306a36Sopenharmony_ci * @ipc_config_size: Size of copier_config
29762306a36Sopenharmony_ci * @available_fmt: Available audio format
29862306a36Sopenharmony_ci * @frame_fmt: frame format
29962306a36Sopenharmony_ci * @msg: message structure for copier
30062306a36Sopenharmony_ci * @gtw_attr: Gateway attributes for copier blob
30162306a36Sopenharmony_ci * @dai_type: DAI type
30262306a36Sopenharmony_ci * @dai_index: DAI index
30362306a36Sopenharmony_ci * @dma_config_tlv: DMA configuration
30462306a36Sopenharmony_ci */
30562306a36Sopenharmony_cistruct sof_ipc4_copier {
30662306a36Sopenharmony_ci	struct sof_ipc4_copier_data data;
30762306a36Sopenharmony_ci	u32 *copier_config;
30862306a36Sopenharmony_ci	uint32_t ipc_config_size;
30962306a36Sopenharmony_ci	void *ipc_config_data;
31062306a36Sopenharmony_ci	struct sof_ipc4_available_audio_format available_fmt;
31162306a36Sopenharmony_ci	u32 frame_fmt;
31262306a36Sopenharmony_ci	struct sof_ipc4_msg msg;
31362306a36Sopenharmony_ci	struct sof_ipc4_gtw_attributes *gtw_attr;
31462306a36Sopenharmony_ci	u32 dai_type;
31562306a36Sopenharmony_ci	int dai_index;
31662306a36Sopenharmony_ci	struct sof_ipc4_dma_config_tlv dma_config_tlv;
31762306a36Sopenharmony_ci};
31862306a36Sopenharmony_ci
31962306a36Sopenharmony_ci/**
32062306a36Sopenharmony_ci * struct sof_ipc4_ctrl_value_chan: generic channel mapped value data
32162306a36Sopenharmony_ci * @channel: Channel ID
32262306a36Sopenharmony_ci * @value: gain value
32362306a36Sopenharmony_ci */
32462306a36Sopenharmony_cistruct sof_ipc4_ctrl_value_chan {
32562306a36Sopenharmony_ci	u32 channel;
32662306a36Sopenharmony_ci	u32 value;
32762306a36Sopenharmony_ci};
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci/**
33062306a36Sopenharmony_ci * struct sof_ipc4_control_data - IPC data for kcontrol IO
33162306a36Sopenharmony_ci * @msg: message structure for kcontrol IO
33262306a36Sopenharmony_ci * @index: pipeline ID
33362306a36Sopenharmony_ci * @chanv: channel ID and value array used by volume type controls
33462306a36Sopenharmony_ci * @data: data for binary kcontrols
33562306a36Sopenharmony_ci */
33662306a36Sopenharmony_cistruct sof_ipc4_control_data {
33762306a36Sopenharmony_ci	struct sof_ipc4_msg msg;
33862306a36Sopenharmony_ci	int index;
33962306a36Sopenharmony_ci
34062306a36Sopenharmony_ci	union {
34162306a36Sopenharmony_ci		DECLARE_FLEX_ARRAY(struct sof_ipc4_ctrl_value_chan, chanv);
34262306a36Sopenharmony_ci		DECLARE_FLEX_ARRAY(struct sof_abi_hdr, data);
34362306a36Sopenharmony_ci	};
34462306a36Sopenharmony_ci};
34562306a36Sopenharmony_ci
34662306a36Sopenharmony_ci/**
34762306a36Sopenharmony_ci * struct sof_ipc4_gain_params - IPC gain parameters
34862306a36Sopenharmony_ci * @channels: Channels
34962306a36Sopenharmony_ci * @init_val: Initial value
35062306a36Sopenharmony_ci * @curve_type: Curve type
35162306a36Sopenharmony_ci * @reserved: reserved for future use
35262306a36Sopenharmony_ci * @curve_duration_l: Curve duration low part
35362306a36Sopenharmony_ci * @curve_duration_h: Curve duration high part
35462306a36Sopenharmony_ci */
35562306a36Sopenharmony_cistruct sof_ipc4_gain_params {
35662306a36Sopenharmony_ci	uint32_t channels;
35762306a36Sopenharmony_ci	uint32_t init_val;
35862306a36Sopenharmony_ci	uint32_t curve_type;
35962306a36Sopenharmony_ci	uint32_t reserved;
36062306a36Sopenharmony_ci	uint32_t curve_duration_l;
36162306a36Sopenharmony_ci	uint32_t curve_duration_h;
36262306a36Sopenharmony_ci} __packed __aligned(4);
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci/**
36562306a36Sopenharmony_ci * struct sof_ipc4_gain_data - IPC gain init blob
36662306a36Sopenharmony_ci * @base_config: IPC base config data
36762306a36Sopenharmony_ci * @params: Initial parameters for the gain module
36862306a36Sopenharmony_ci */
36962306a36Sopenharmony_cistruct sof_ipc4_gain_data {
37062306a36Sopenharmony_ci	struct sof_ipc4_base_module_cfg base_config;
37162306a36Sopenharmony_ci	struct sof_ipc4_gain_params params;
37262306a36Sopenharmony_ci} __packed __aligned(4);
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci/**
37562306a36Sopenharmony_ci * struct sof_ipc4_gain - gain config data
37662306a36Sopenharmony_ci * @data: IPC gain blob
37762306a36Sopenharmony_ci * @available_fmt: Available audio format
37862306a36Sopenharmony_ci * @msg: message structure for gain
37962306a36Sopenharmony_ci */
38062306a36Sopenharmony_cistruct sof_ipc4_gain {
38162306a36Sopenharmony_ci	struct sof_ipc4_gain_data data;
38262306a36Sopenharmony_ci	struct sof_ipc4_available_audio_format available_fmt;
38362306a36Sopenharmony_ci	struct sof_ipc4_msg msg;
38462306a36Sopenharmony_ci};
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ci/**
38762306a36Sopenharmony_ci * struct sof_ipc4_mixer - mixer config data
38862306a36Sopenharmony_ci * @base_config: IPC base config data
38962306a36Sopenharmony_ci * @available_fmt: Available audio format
39062306a36Sopenharmony_ci * @msg: IPC4 message struct containing header and data info
39162306a36Sopenharmony_ci */
39262306a36Sopenharmony_cistruct sof_ipc4_mixer {
39362306a36Sopenharmony_ci	struct sof_ipc4_base_module_cfg base_config;
39462306a36Sopenharmony_ci	struct sof_ipc4_available_audio_format available_fmt;
39562306a36Sopenharmony_ci	struct sof_ipc4_msg msg;
39662306a36Sopenharmony_ci};
39762306a36Sopenharmony_ci
39862306a36Sopenharmony_ci/*
39962306a36Sopenharmony_ci * struct sof_ipc4_src_data - IPC data for SRC
40062306a36Sopenharmony_ci * @base_config: IPC base config data
40162306a36Sopenharmony_ci * @sink_rate: Output rate for sink module
40262306a36Sopenharmony_ci */
40362306a36Sopenharmony_cistruct sof_ipc4_src_data {
40462306a36Sopenharmony_ci	struct sof_ipc4_base_module_cfg base_config;
40562306a36Sopenharmony_ci	uint32_t sink_rate;
40662306a36Sopenharmony_ci} __packed __aligned(4);
40762306a36Sopenharmony_ci
40862306a36Sopenharmony_ci/**
40962306a36Sopenharmony_ci * struct sof_ipc4_src - SRC config data
41062306a36Sopenharmony_ci * @data: IPC base config data
41162306a36Sopenharmony_ci * @available_fmt: Available audio format
41262306a36Sopenharmony_ci * @msg: IPC4 message struct containing header and data info
41362306a36Sopenharmony_ci */
41462306a36Sopenharmony_cistruct sof_ipc4_src {
41562306a36Sopenharmony_ci	struct sof_ipc4_src_data data;
41662306a36Sopenharmony_ci	struct sof_ipc4_available_audio_format available_fmt;
41762306a36Sopenharmony_ci	struct sof_ipc4_msg msg;
41862306a36Sopenharmony_ci};
41962306a36Sopenharmony_ci
42062306a36Sopenharmony_ci/**
42162306a36Sopenharmony_ci * struct sof_ipc4_base_module_cfg_ext - base module config extension containing the pin format
42262306a36Sopenharmony_ci * information for the module. Both @num_input_pin_fmts and @num_output_pin_fmts cannot be 0 for a
42362306a36Sopenharmony_ci * module.
42462306a36Sopenharmony_ci * @num_input_pin_fmts: number of input pin formats in the @pin_formats array
42562306a36Sopenharmony_ci * @num_output_pin_fmts: number of output pin formats in the @pin_formats array
42662306a36Sopenharmony_ci * @reserved: reserved for future use
42762306a36Sopenharmony_ci * @pin_formats: flexible array consisting of @num_input_pin_fmts input pin format items followed
42862306a36Sopenharmony_ci *		 by @num_output_pin_fmts output pin format items
42962306a36Sopenharmony_ci */
43062306a36Sopenharmony_cistruct sof_ipc4_base_module_cfg_ext {
43162306a36Sopenharmony_ci	u16 num_input_pin_fmts;
43262306a36Sopenharmony_ci	u16 num_output_pin_fmts;
43362306a36Sopenharmony_ci	u8 reserved[12];
43462306a36Sopenharmony_ci	DECLARE_FLEX_ARRAY(struct sof_ipc4_pin_format, pin_formats);
43562306a36Sopenharmony_ci} __packed;
43662306a36Sopenharmony_ci
43762306a36Sopenharmony_ci/**
43862306a36Sopenharmony_ci * struct sof_ipc4_process - process config data
43962306a36Sopenharmony_ci * @base_config: IPC base config data
44062306a36Sopenharmony_ci * @base_config_ext: Base config extension data for module init
44162306a36Sopenharmony_ci * @output_format: Output audio format
44262306a36Sopenharmony_ci * @available_fmt: Available audio format
44362306a36Sopenharmony_ci * @ipc_config_data: Process module config data
44462306a36Sopenharmony_ci * @ipc_config_size: Size of process module config data
44562306a36Sopenharmony_ci * @msg: IPC4 message struct containing header and data info
44662306a36Sopenharmony_ci * @base_config_ext_size: Size of the base config extension data in bytes
44762306a36Sopenharmony_ci * @init_config: Module init config type (SOF_IPC4_MODULE_INIT_CONFIG_TYPE_*)
44862306a36Sopenharmony_ci */
44962306a36Sopenharmony_cistruct sof_ipc4_process {
45062306a36Sopenharmony_ci	struct sof_ipc4_base_module_cfg base_config;
45162306a36Sopenharmony_ci	struct sof_ipc4_base_module_cfg_ext *base_config_ext;
45262306a36Sopenharmony_ci	struct sof_ipc4_audio_format output_format;
45362306a36Sopenharmony_ci	struct sof_ipc4_available_audio_format available_fmt;
45462306a36Sopenharmony_ci	void *ipc_config_data;
45562306a36Sopenharmony_ci	uint32_t ipc_config_size;
45662306a36Sopenharmony_ci	struct sof_ipc4_msg msg;
45762306a36Sopenharmony_ci	u32 base_config_ext_size;
45862306a36Sopenharmony_ci	u32 init_config;
45962306a36Sopenharmony_ci};
46062306a36Sopenharmony_ci
46162306a36Sopenharmony_ci#endif
462