root/sound/soc/intel/avs/topology.h
/* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright(c) 2021 Intel Corporation
 *
 * Authors: Cezary Rojewski <cezary.rojewski@intel.com>
 *          Amadeusz Slawinski <amadeuszx.slawinski@linux.intel.com>
 */

#ifndef __SOUND_SOC_INTEL_AVS_TPLG_H
#define __SOUND_SOC_INTEL_AVS_TPLG_H

#include <linux/list.h>
#include "messages.h"

#define INVALID_OBJECT_ID       UINT_MAX

struct snd_soc_component;

struct avs_tplg {
        char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
        u32 version;
        struct snd_soc_component *comp;

        struct avs_tplg_library *libs;
        u32 num_libs;
        struct avs_audio_format *fmts;
        u32 num_fmts;
        struct avs_tplg_modcfg_base *modcfgs_base;
        u32 num_modcfgs_base;
        struct avs_tplg_modcfg_ext *modcfgs_ext;
        u32 num_modcfgs_ext;
        struct avs_tplg_pplcfg *pplcfgs;
        u32 num_pplcfgs;
        struct avs_tplg_binding *bindings;
        u32 num_bindings;
        struct avs_tplg_path_template *condpath_tmpls;
        u32 num_condpath_tmpls;
        struct avs_tplg_init_config *init_configs;
        u32 num_init_configs;
        struct avs_tplg_nhlt_config *nhlt_configs;
        u32 num_nhlt_configs;

        struct list_head path_tmpl_list;
};

struct avs_tplg_library {
        char name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
};

/* Matches header of struct avs_mod_cfg_base. */
struct avs_tplg_modcfg_base {
        u32 cpc;
        u32 ibs;
        u32 obs;
        u32 is_pages;
};

struct avs_tplg_pin_format {
        u32 pin_index;
        u32 iobs;
        struct avs_audio_format *fmt;
};

struct avs_tplg_modcfg_ext {
        guid_t type;

        union {
                struct {
                        u16 num_input_pins;
                        u16 num_output_pins;
                        struct avs_tplg_pin_format *pin_fmts;
                } generic;
                struct {
                        struct avs_audio_format *out_fmt;
                        struct avs_audio_format *blob_fmt; /* optional override */
                        u32 feature_mask;
                        union avs_virtual_index vindex;
                        u32 dma_type;
                        u32 dma_buffer_size;
                } copier;
                struct {
                        struct avs_audio_format *ref_fmt;
                        struct avs_audio_format *out_fmt;
                        u32 wake_tick_period;
                        union avs_virtual_index vindex;
                        u32 dma_type;
                        u32 dma_buffer_size;
                        struct avs_audio_format *blob_fmt; /* optional override */
                } whm;
                struct {
                        u32 out_channel_config;
                        u32 coefficients_select;
                        s32 coefficients[AVS_COEFF_CHANNELS_MAX];
                        u32 channel_map;
                } updown_mix;
                struct {
                        u32 out_freq;
                } src;
                struct {
                        u32 out_freq;
                        u8 mode;
                        u8 disable_jitter_buffer;
                } asrc;
                struct {
                        u32 cpc_lp_mode;
                } wov;
                struct {
                        struct avs_audio_format *ref_fmt;
                        struct avs_audio_format *out_fmt;
                        u32 cpc_lp_mode;
                } aec;
                struct {
                        struct avs_audio_format *ref_fmt;
                        struct avs_audio_format *out_fmt;
                } mux;
                struct {
                        struct avs_audio_format *out_fmt;
                } micsel;
                struct {
                        u32 target_volume;
                        u32 curve_type;
                        u32 curve_duration;
                } peakvol;
        };
};

/* Specifies path behaviour during PCM ->trigger(START) command. */
enum avs_tplg_trigger {
        AVS_TPLG_TRIGGER_AUTO = 0,
};

struct avs_tplg_pplcfg {
        u16 req_size;
        u8 priority;
        bool lp;
        u16 attributes;
        enum avs_tplg_trigger trigger;
};

struct avs_tplg_binding {
        char target_tplg_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
        u32 target_path_tmpl_id;
        u32 target_ppl_id;
        u32 target_mod_id;
        u8 target_mod_pin;
        u32 mod_id;
        u8 mod_pin;
        u8 is_sink;
};

struct avs_tplg_path_template_id {
        u32 id;
        char tplg_name[SNDRV_CTL_ELEM_ID_NAME_MAXLEN];
};

struct avs_tplg_path_template {
        u32 id;

        struct snd_soc_dapm_widget *w;

        /* Conditional path. */
        struct avs_tplg_path_template_id source;
        struct avs_tplg_path_template_id sink;

        struct list_head path_list;

        struct avs_tplg *owner;
        /* Driver path templates management. */
        struct list_head node;
};

struct avs_tplg_init_config {
        u32 id;

        u8 param;
        size_t length;
        void *data;
};

struct avs_tplg_nhlt_config {
        u32 id;
        struct acpi_nhlt_config *blob;
};

struct avs_tplg_path {
        u32 id;

        /* Path format requirements. */
        struct avs_audio_format *fe_fmt;
        struct avs_audio_format *be_fmt;
        /* Condpath path-variant requirements. */
        u32 source_path_id;
        u32 sink_path_id;

        struct list_head ppl_list;

        struct avs_tplg_path_template *owner;
        /* Path template path-variants management. */
        struct list_head node;
};

struct avs_tplg_pipeline {
        u32 id;

        struct avs_tplg_pplcfg *cfg;
        struct avs_tplg_binding **bindings;
        u32 num_bindings;
        struct list_head mod_list;

        struct avs_tplg_path *owner;
        /* Path pipelines management. */
        struct list_head node;
};

struct avs_tplg_module {
        u32 id;

        struct avs_tplg_modcfg_base *cfg_base;
        struct avs_audio_format *in_fmt;
        u8 core_id;
        u8 domain;
        struct avs_tplg_modcfg_ext *cfg_ext;
        u32 ctl_id;
        u32 num_config_ids;
        u32 *config_ids;
        struct avs_tplg_nhlt_config *nhlt_config;

        struct avs_tplg_pipeline *owner;
        /* Pipeline modules management. */
        struct list_head node;
};

struct avs_tplg *avs_tplg_new(struct snd_soc_component *comp);

int avs_load_topology(struct snd_soc_component *comp, const char *filename);
int avs_remove_topology(struct snd_soc_component *comp);

#endif