#include <linux/bitfield.h>
#include <uapi/sound/sof/tokens.h>
#include <sound/pcm_params.h>
#include <sound/sof/ext_manifest4.h>
#include <sound/intel-nhlt.h>
#include "sof-priv.h"
#include "sof-audio.h"
#include "ipc4-priv.h"
#include "ipc4-topology.h"
#include "ops.h"
static bool ignore_cpc;
module_param_named(ipc4_ignore_cpc, ignore_cpc, bool, 0444);
MODULE_PARM_DESC(…) …;
#define SOF_IPC4_GAIN_PARAM_ID …
#define SOF_IPC4_TPLG_ABI_SIZE …
#define SOF_IPC4_CHAIN_DMA_BUF_SIZE_MS …
static DEFINE_IDA(alh_group_ida);
static DEFINE_IDA(pipeline_ida);
static const struct sof_topology_token ipc4_sched_tokens[] = …;
static const struct sof_topology_token pipeline_tokens[] = …;
static const struct sof_topology_token ipc4_comp_tokens[] = …;
static const struct sof_topology_token ipc4_in_audio_format_tokens[] = …;
static const struct sof_topology_token ipc4_out_audio_format_tokens[] = …;
static const struct sof_topology_token ipc4_copier_deep_buffer_tokens[] = …;
static const struct sof_topology_token ipc4_copier_tokens[] = …;
static const struct sof_topology_token ipc4_audio_fmt_num_tokens[] = …;
static const struct sof_topology_token dai_tokens[] = …;
static const struct sof_topology_token comp_ext_tokens[] = …;
static const struct sof_topology_token gain_tokens[] = …;
static const struct sof_topology_token src_tokens[] = …;
static const struct sof_token_info ipc4_token_list[SOF_TOKEN_COUNT] = …;
struct snd_sof_widget *sof_ipc4_find_swidget_by_ids(struct snd_sof_dev *sdev,
u32 module_id, int instance_id)
{ … }
static void sof_ipc4_dbg_audio_format(struct device *dev, struct sof_ipc4_pin_format *pin_fmt,
int num_formats)
{ … }
static const struct sof_ipc4_audio_format *
sof_ipc4_get_input_pin_audio_fmt(struct snd_sof_widget *swidget, int pin_index)
{ … }
static int sof_ipc4_get_audio_fmt(struct snd_soc_component *scomp,
struct snd_sof_widget *swidget,
struct sof_ipc4_available_audio_format *available_fmt,
struct sof_ipc4_base_module_cfg *module_base_cfg)
{ … }
static void sof_ipc4_free_audio_fmt(struct sof_ipc4_available_audio_format *available_fmt)
{ … }
static void sof_ipc4_widget_free_comp_pipeline(struct snd_sof_widget *swidget)
{ … }
static int sof_ipc4_widget_set_module_info(struct snd_sof_widget *swidget)
{ … }
static int sof_ipc4_widget_setup_msg(struct snd_sof_widget *swidget, struct sof_ipc4_msg *msg)
{ … }
static void sof_ipc4_widget_update_kcontrol_module_id(struct snd_sof_widget *swidget)
{ … }
static int
sof_ipc4_update_card_components_string(struct snd_sof_widget *swidget,
struct snd_sof_pcm *spcm, int dir)
{ … }
static int sof_ipc4_widget_setup_pcm(struct snd_sof_widget *swidget)
{ … }
static void sof_ipc4_widget_free_comp_pcm(struct snd_sof_widget *swidget)
{ … }
static int sof_ipc4_widget_setup_comp_dai(struct snd_sof_widget *swidget)
{ … }
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)
{ … }
static int sof_ipc4_widget_setup_comp_pga(struct snd_sof_widget *swidget)
{ … }
static void sof_ipc4_widget_free_comp_pga(struct snd_sof_widget *swidget)
{ … }
static int sof_ipc4_widget_setup_comp_mixer(struct snd_sof_widget *swidget)
{ … }
static int sof_ipc4_widget_setup_comp_src(struct snd_sof_widget *swidget)
{ … }
static void sof_ipc4_widget_free_comp_src(struct snd_sof_widget *swidget)
{ … }
static void sof_ipc4_widget_free_comp_mixer(struct snd_sof_widget *swidget)
{ … }
static int sof_ipc4_widget_setup_comp_process(struct snd_sof_widget *swidget)
{ … }
static void sof_ipc4_widget_free_comp_process(struct snd_sof_widget *swidget)
{ … }
static void
sof_ipc4_update_resource_usage(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget,
struct sof_ipc4_base_module_cfg *base_config)
{ … }
static int sof_ipc4_widget_assign_instance_id(struct snd_sof_dev *sdev,
struct snd_sof_widget *swidget)
{ … }
static int sof_ipc4_update_hw_params(struct snd_sof_dev *sdev, struct snd_pcm_hw_params *params,
struct sof_ipc4_audio_format *fmt, u32 param_to_update)
{ … }
static bool sof_ipc4_is_single_format(struct snd_sof_dev *sdev,
struct sof_ipc4_pin_format *pin_fmts, u32 pin_fmts_size)
{ … }
static int sof_ipc4_init_output_audio_fmt(struct snd_sof_dev *sdev,
struct sof_ipc4_base_module_cfg *base_config,
struct sof_ipc4_available_audio_format *available_fmt,
u32 out_ref_rate, u32 out_ref_channels,
u32 out_ref_valid_bits)
{ … }
static int sof_ipc4_get_valid_bits(struct snd_sof_dev *sdev, struct snd_pcm_hw_params *params)
{ … }
static int sof_ipc4_init_input_audio_fmt(struct snd_sof_dev *sdev,
struct snd_sof_widget *swidget,
struct sof_ipc4_base_module_cfg *base_config,
struct snd_pcm_hw_params *params,
struct sof_ipc4_available_audio_format *available_fmt)
{ … }
static void sof_ipc4_unprepare_copier_module(struct snd_sof_widget *swidget)
{ … }
#if IS_ENABLED(CONFIG_ACPI) && IS_ENABLED(CONFIG_SND_INTEL_NHLT)
static int snd_sof_get_hw_config_params(struct snd_sof_dev *sdev, struct snd_sof_dai *dai,
int *sample_rate, int *channel_count, int *bit_depth)
{ … }
static int
snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai,
bool single_bitdepth,
struct snd_pcm_hw_params *params, u32 dai_index,
u32 linktype, u8 dir, u32 **dst, u32 *len)
{ … }
#else
static int
snd_sof_get_nhlt_endpoint_data(struct snd_sof_dev *sdev, struct snd_sof_dai *dai,
bool single_bitdepth,
struct snd_pcm_hw_params *params, u32 dai_index,
u32 linktype, u8 dir, u32 **dst, u32 *len)
{
return 0;
}
#endif
bool sof_ipc4_copier_is_single_bitdepth(struct snd_sof_dev *sdev,
struct sof_ipc4_pin_format *pin_fmts,
u32 pin_fmts_size)
{ … }
static int
sof_ipc4_adjust_params_to_dai_format(struct snd_sof_dev *sdev,
struct snd_pcm_hw_params *params,
struct sof_ipc4_pin_format *pin_fmts,
u32 pin_fmts_size)
{ … }
static int
sof_ipc4_prepare_dai_copier(struct snd_sof_dev *sdev, struct snd_sof_dai *dai,
struct snd_pcm_hw_params *params, int dir)
{ … }
static int
sof_ipc4_prepare_copier_module(struct snd_sof_widget *swidget,
struct snd_pcm_hw_params *fe_params,
struct snd_sof_platform_stream_params *platform_params,
struct snd_pcm_hw_params *pipeline_params, int dir)
{ … }
static int sof_ipc4_prepare_gain_module(struct snd_sof_widget *swidget,
struct snd_pcm_hw_params *fe_params,
struct snd_sof_platform_stream_params *platform_params,
struct snd_pcm_hw_params *pipeline_params, int dir)
{ … }
static int sof_ipc4_prepare_mixer_module(struct snd_sof_widget *swidget,
struct snd_pcm_hw_params *fe_params,
struct snd_sof_platform_stream_params *platform_params,
struct snd_pcm_hw_params *pipeline_params, int dir)
{ … }
static int sof_ipc4_prepare_src_module(struct snd_sof_widget *swidget,
struct snd_pcm_hw_params *fe_params,
struct snd_sof_platform_stream_params *platform_params,
struct snd_pcm_hw_params *pipeline_params, int dir)
{ … }
static int
sof_ipc4_process_set_pin_formats(struct snd_sof_widget *swidget, int pin_type)
{ … }
static int sof_ipc4_process_add_base_cfg_extn(struct snd_sof_widget *swidget)
{ … }
static int sof_ipc4_prepare_process_module(struct snd_sof_widget *swidget,
struct snd_pcm_hw_params *fe_params,
struct snd_sof_platform_stream_params *platform_params,
struct snd_pcm_hw_params *pipeline_params, int dir)
{ … }
static int sof_ipc4_control_load_volume(struct snd_sof_dev *sdev, struct snd_sof_control *scontrol)
{ … }
static int sof_ipc4_control_load_enum(struct snd_sof_dev *sdev, struct snd_sof_control *scontrol)
{ … }
static int sof_ipc4_control_load_bytes(struct snd_sof_dev *sdev, struct snd_sof_control *scontrol)
{ … }
static int sof_ipc4_control_setup(struct snd_sof_dev *sdev, struct snd_sof_control *scontrol)
{ … }
static int sof_ipc4_widget_setup(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
{ … }
static int sof_ipc4_widget_free(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget)
{ … }
static int sof_ipc4_get_queue_id(struct snd_sof_widget *src_widget,
struct snd_sof_widget *sink_widget, bool pin_type)
{ … }
static void sof_ipc4_put_queue_id(struct snd_sof_widget *swidget, int queue_id,
bool pin_type)
{ … }
static int sof_ipc4_set_copier_sink_format(struct snd_sof_dev *sdev,
struct snd_sof_widget *src_widget,
struct snd_sof_widget *sink_widget,
struct snd_sof_route *sroute)
{ … }
static int sof_ipc4_route_setup(struct snd_sof_dev *sdev, struct snd_sof_route *sroute)
{ … }
static int sof_ipc4_route_free(struct snd_sof_dev *sdev, struct snd_sof_route *sroute)
{ … }
static int sof_ipc4_dai_config(struct snd_sof_dev *sdev, struct snd_sof_widget *swidget,
unsigned int flags, struct snd_sof_dai_config_data *data)
{ … }
static int sof_ipc4_parse_manifest(struct snd_soc_component *scomp, int index,
struct snd_soc_tplg_manifest *man)
{ … }
static int sof_ipc4_dai_get_param(struct snd_sof_dev *sdev, struct snd_sof_dai *dai, int param_type)
{ … }
static int sof_ipc4_tear_down_all_pipelines(struct snd_sof_dev *sdev, bool verify)
{ … }
static int sof_ipc4_link_setup(struct snd_sof_dev *sdev, struct snd_soc_dai_link *link)
{ … }
static enum sof_tokens copier_token_list[] = …;
static enum sof_tokens pipeline_token_list[] = …;
static enum sof_tokens pga_token_list[] = …;
static enum sof_tokens mixer_token_list[] = …;
static enum sof_tokens src_token_list[] = …;
static enum sof_tokens process_token_list[] = …;
static const struct sof_ipc_tplg_widget_ops tplg_ipc4_widget_ops[SND_SOC_DAPM_TYPE_COUNT] = …;
const struct sof_ipc_tplg_ops ipc4_tplg_ops = …;