311 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			311 lines
		
	
	
		
			8.9 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /* 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
 |