root/include/sound/sof/topology.h
/* 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) 2018 Intel Corporation
 */

#ifndef __INCLUDE_SOUND_SOF_TOPOLOGY_H__
#define __INCLUDE_SOUND_SOF_TOPOLOGY_H__

#include <sound/sof/header.h>

/*
 * Component
 */

/* types of component */
enum sof_comp_type {
        SOF_COMP_NONE = 0,
        SOF_COMP_HOST,
        SOF_COMP_DAI,
        SOF_COMP_SG_HOST,       /**< scatter gather variant */
        SOF_COMP_SG_DAI,        /**< scatter gather variant */
        SOF_COMP_VOLUME,
        SOF_COMP_MIXER,
        SOF_COMP_MUX,
        SOF_COMP_SRC,
        SOF_COMP_DEPRECATED0, /* Formerly SOF_COMP_SPLITTER */
        SOF_COMP_TONE,
        SOF_COMP_DEPRECATED1, /* Formerly SOF_COMP_SWITCH */
        SOF_COMP_BUFFER,
        SOF_COMP_EQ_IIR,
        SOF_COMP_EQ_FIR,
        SOF_COMP_KEYWORD_DETECT,
        SOF_COMP_KPB,                   /* A key phrase buffer component */
        SOF_COMP_SELECTOR,              /**< channel selector component */
        SOF_COMP_DEMUX,
        SOF_COMP_ASRC,          /**< Asynchronous sample rate converter */
        SOF_COMP_DCBLOCK,
        SOF_COMP_SMART_AMP,             /**< smart amplifier component */
        SOF_COMP_MODULE_ADAPTER,                /**< module adapter */
        /* keep FILEREAD/FILEWRITE as the last ones */
        SOF_COMP_FILEREAD = 10000,      /**< host test based file IO */
        SOF_COMP_FILEWRITE = 10001,     /**< host test based file IO */
};

/* XRUN action for component */
#define SOF_XRUN_STOP           1       /**< stop stream */
#define SOF_XRUN_UNDER_ZERO     2       /**< send 0s to sink */
#define SOF_XRUN_OVER_NULL      4       /**< send data to NULL */

/* create new generic component - SOF_IPC_TPLG_COMP_NEW */
struct sof_ipc_comp {
        struct sof_ipc_cmd_hdr hdr;
        uint32_t id;
        uint32_t type;
        uint32_t pipeline_id;
        uint32_t core;

        /* extended data length, 0 if no extended data */
        uint32_t ext_data_length;
} __packed __aligned(4);

/*
 * Component Buffers
 */

/*
 * SOF memory capabilities, add new ones at the end
 */
#define SOF_MEM_CAPS_RAM                BIT(0)
#define SOF_MEM_CAPS_ROM                BIT(1)
#define SOF_MEM_CAPS_EXT                BIT(2) /**< external */
#define SOF_MEM_CAPS_LP                 BIT(3) /**< low power */
#define SOF_MEM_CAPS_HP                 BIT(4) /**< high performance */
#define SOF_MEM_CAPS_DMA                BIT(5) /**< DMA'able */
#define SOF_MEM_CAPS_CACHE              BIT(6) /**< cacheable */
#define SOF_MEM_CAPS_EXEC               BIT(7) /**< executable */
#define SOF_MEM_CAPS_L3                 BIT(8) /**< L3 memory */

/*
 * overrun will cause ring buffer overwrite, instead of XRUN.
 */
#define SOF_BUF_OVERRUN_PERMITTED       BIT(0)

/*
 * underrun will cause readback of 0s, instead of XRUN.
 */
#define SOF_BUF_UNDERRUN_PERMITTED      BIT(1)

/* the UUID size in bytes, shared between FW and host */
#define SOF_UUID_SIZE   16

/* create new component buffer - SOF_IPC_TPLG_BUFFER_NEW */
struct sof_ipc_buffer {
        struct sof_ipc_comp comp;
        uint32_t size;          /**< buffer size in bytes */
        uint32_t caps;          /**< SOF_MEM_CAPS_ */
        uint32_t flags;         /**< SOF_BUF_ flags defined above */
        uint32_t reserved;      /**< reserved for future use */
} __packed __aligned(4);

/* generic component config data - must always be after struct sof_ipc_comp */
struct sof_ipc_comp_config {
        struct sof_ipc_cmd_hdr hdr;
        uint32_t periods_sink;  /**< 0 means variable */
        uint32_t periods_source;/**< 0 means variable */
        uint32_t reserved1;     /**< reserved */
        uint32_t frame_fmt;     /**< SOF_IPC_FRAME_ */
        uint32_t xrun_action;

        /* reserved for future use */
        uint32_t reserved[2];
} __packed __aligned(4);

/* generic host component */
struct sof_ipc_comp_host {
        struct sof_ipc_comp comp;
        struct sof_ipc_comp_config config;
        uint32_t direction;     /**< SOF_IPC_STREAM_ */
        uint32_t no_irq;        /**< don't send periodic IRQ to host/DSP */
        uint32_t dmac_config; /**< DMA engine specific */
} __packed __aligned(4);

/* generic DAI component */
struct sof_ipc_comp_dai {
        struct sof_ipc_comp comp;
        struct sof_ipc_comp_config config;
        uint32_t direction;     /**< SOF_IPC_STREAM_ */
        uint32_t dai_index;     /**< index of this type dai */
        uint32_t type;          /**< DAI type - SOF_DAI_ */
        uint32_t reserved;      /**< reserved */
} __packed __aligned(4);

/* generic mixer component */
struct sof_ipc_comp_mixer {
        struct sof_ipc_comp comp;
        struct sof_ipc_comp_config config;
} __packed __aligned(4);

/* volume ramping types */
enum sof_volume_ramp {
        SOF_VOLUME_LINEAR       = 0,
        SOF_VOLUME_LOG,
        SOF_VOLUME_LINEAR_ZC,
        SOF_VOLUME_LOG_ZC,
        SOF_VOLUME_WINDOWS_FADE,
        SOF_VOLUME_WINDOWS_NO_FADE,
};

/* generic volume component */
struct sof_ipc_comp_volume {
        struct sof_ipc_comp comp;
        struct sof_ipc_comp_config config;
        uint32_t channels;
        uint32_t min_value;
        uint32_t max_value;
        uint32_t ramp;          /**< SOF_VOLUME_ */
        uint32_t initial_ramp;  /**< ramp space in ms */
} __packed __aligned(4);

/* generic SRC component */
struct sof_ipc_comp_src {
        struct sof_ipc_comp comp;
        struct sof_ipc_comp_config config;
        /* either source or sink rate must be non zero */
        uint32_t source_rate;   /**< source rate or 0 for variable */
        uint32_t sink_rate;     /**< sink rate or 0 for variable */
        uint32_t rate_mask;     /**< SOF_RATE_ supported rates */
} __packed __aligned(4);

/* generic ASRC component */
struct sof_ipc_comp_asrc {
        struct sof_ipc_comp comp;
        struct sof_ipc_comp_config config;
        /* either source or sink rate must be non zero */
        uint32_t source_rate;           /**< Define fixed source rate or */
                                        /**< use 0 to indicate need to get */
                                        /**< the rate from stream */
        uint32_t sink_rate;             /**< Define fixed sink rate or */
                                        /**< use 0 to indicate need to get */
                                        /**< the rate from stream */
        uint32_t asynchronous_mode;     /**< synchronous 0, asynchronous 1 */
                                        /**< When 1 the ASRC tracks and */
                                        /**< compensates for drift. */
        uint32_t operation_mode;        /**< push 0, pull 1, In push mode the */
                                        /**< ASRC consumes a defined number */
                                        /**< of frames at input, with varying */
                                        /**< number of frames at output. */
                                        /**< In pull mode the ASRC outputs */
                                        /**< a defined number of frames while */
                                        /**< number of input frames varies. */

        /* reserved for future use */
        uint32_t reserved[4];
} __packed __aligned(4);

/* generic MUX component */
struct sof_ipc_comp_mux {
        struct sof_ipc_comp comp;
        struct sof_ipc_comp_config config;
} __packed __aligned(4);

/* generic tone generator component */
struct sof_ipc_comp_tone {
        struct sof_ipc_comp comp;
        struct sof_ipc_comp_config config;
        int32_t sample_rate;
        int32_t frequency;
        int32_t amplitude;
        int32_t freq_mult;
        int32_t ampl_mult;
        int32_t length;
        int32_t period;
        int32_t repeats;
        int32_t ramp_step;
} __packed __aligned(4);

/** \brief Types of processing components */
enum sof_ipc_process_type {
        SOF_PROCESS_NONE = 0,           /**< None */
        SOF_PROCESS_EQFIR,              /**< Intel FIR */
        SOF_PROCESS_EQIIR,              /**< Intel IIR */
        SOF_PROCESS_KEYWORD_DETECT,     /**< Keyword Detection */
        SOF_PROCESS_KPB,                /**< KeyPhrase Buffer Manager */
        SOF_PROCESS_CHAN_SELECTOR,      /**< Channel Selector */
        SOF_PROCESS_MUX,
        SOF_PROCESS_DEMUX,
        SOF_PROCESS_DCBLOCK,
        SOF_PROCESS_SMART_AMP,  /**< Smart Amplifier */
};

/* generic "effect", "codec" or proprietary processing component */
struct sof_ipc_comp_process {
        struct sof_ipc_comp comp;
        struct sof_ipc_comp_config config;
        uint32_t size;  /**< size of bespoke data section in bytes */
        uint32_t type;  /**< sof_ipc_process_type */

        /* reserved for future use */
        uint32_t reserved[7];

        unsigned char data[];
} __packed __aligned(4);

/* frees components, buffers and pipelines
 * SOF_IPC_TPLG_COMP_FREE, SOF_IPC_TPLG_PIPE_FREE, SOF_IPC_TPLG_BUFFER_FREE
 */
struct sof_ipc_free {
        struct sof_ipc_cmd_hdr hdr;
        uint32_t id;
} __packed __aligned(4);

struct sof_ipc_comp_reply {
        struct sof_ipc_reply rhdr;
        uint32_t id;
        uint32_t offset;
} __packed __aligned(4);

/*
 * Pipeline
 */

/** \brief Types of pipeline scheduling time domains */
enum sof_ipc_pipe_sched_time_domain {
        SOF_TIME_DOMAIN_DMA = 0,        /**< DMA interrupt */
        SOF_TIME_DOMAIN_TIMER,          /**< Timer interrupt */
};

/* new pipeline - SOF_IPC_TPLG_PIPE_NEW */
struct sof_ipc_pipe_new {
        struct sof_ipc_cmd_hdr hdr;
        uint32_t comp_id;       /**< component id for pipeline */
        uint32_t pipeline_id;   /**< pipeline id */
        uint32_t sched_id;      /**< Scheduling component id */
        uint32_t core;          /**< core we run on */
        uint32_t period;        /**< execution period in us*/
        uint32_t priority;      /**< priority level 0 (low) to 10 (max) */
        uint32_t period_mips;   /**< worst case instruction count per period */
        uint32_t frames_per_sched;/**< output frames of pipeline, 0 is variable */
        uint32_t xrun_limit_usecs; /**< report xruns greater than limit */
        uint32_t time_domain;   /**< scheduling time domain */
} __packed __aligned(4);

/* pipeline construction complete - SOF_IPC_TPLG_PIPE_COMPLETE */
struct sof_ipc_pipe_ready {
        struct sof_ipc_cmd_hdr hdr;
        uint32_t comp_id;
} __packed __aligned(4);

struct sof_ipc_pipe_free {
        struct sof_ipc_cmd_hdr hdr;
        uint32_t comp_id;
} __packed __aligned(4);

/* connect two components in pipeline - SOF_IPC_TPLG_COMP_CONNECT */
struct sof_ipc_pipe_comp_connect {
        struct sof_ipc_cmd_hdr hdr;
        uint32_t source_id;
        uint32_t sink_id;
} __packed __aligned(4);

/* external events */
enum sof_event_types {
        SOF_EVENT_NONE = 0,
        SOF_KEYWORD_DETECT_DAPM_EVENT,
};

#endif