xref: /openbmc/linux/include/sound/sof/control.h (revision b264ef79)
1e149ca29SPierre-Louis Bossart /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
253e0c72dSLiam Girdwood /*
353e0c72dSLiam Girdwood  * This file is provided under a dual BSD/GPLv2 license.  When using or
453e0c72dSLiam Girdwood  * redistributing this file, you may do so under either license.
553e0c72dSLiam Girdwood  *
653e0c72dSLiam Girdwood  * Copyright(c) 2018 Intel Corporation. All rights reserved.
753e0c72dSLiam Girdwood  */
853e0c72dSLiam Girdwood 
953e0c72dSLiam Girdwood #ifndef __INCLUDE_SOUND_SOF_CONTROL_H__
1053e0c72dSLiam Girdwood #define __INCLUDE_SOUND_SOF_CONTROL_H__
1153e0c72dSLiam Girdwood 
1253e0c72dSLiam Girdwood #include <uapi/sound/sof/header.h>
1353e0c72dSLiam Girdwood #include <sound/sof/header.h>
1453e0c72dSLiam Girdwood 
1553e0c72dSLiam Girdwood /*
1653e0c72dSLiam Girdwood  * Component Mixers and Controls
1753e0c72dSLiam Girdwood  */
1853e0c72dSLiam Girdwood 
1953e0c72dSLiam Girdwood /* channel positions - uses same values as ALSA */
2053e0c72dSLiam Girdwood enum sof_ipc_chmap {
2153e0c72dSLiam Girdwood 	SOF_CHMAP_UNKNOWN = 0,
2253e0c72dSLiam Girdwood 	SOF_CHMAP_NA,		/**< N/A, silent */
2353e0c72dSLiam Girdwood 	SOF_CHMAP_MONO,		/**< mono stream */
2453e0c72dSLiam Girdwood 	SOF_CHMAP_FL,		/**< front left */
2553e0c72dSLiam Girdwood 	SOF_CHMAP_FR,		/**< front right */
2653e0c72dSLiam Girdwood 	SOF_CHMAP_RL,		/**< rear left */
2753e0c72dSLiam Girdwood 	SOF_CHMAP_RR,		/**< rear right */
2853e0c72dSLiam Girdwood 	SOF_CHMAP_FC,		/**< front centre */
2953e0c72dSLiam Girdwood 	SOF_CHMAP_LFE,		/**< LFE */
3053e0c72dSLiam Girdwood 	SOF_CHMAP_SL,		/**< side left */
3153e0c72dSLiam Girdwood 	SOF_CHMAP_SR,		/**< side right */
3253e0c72dSLiam Girdwood 	SOF_CHMAP_RC,		/**< rear centre */
3353e0c72dSLiam Girdwood 	SOF_CHMAP_FLC,		/**< front left centre */
3453e0c72dSLiam Girdwood 	SOF_CHMAP_FRC,		/**< front right centre */
3553e0c72dSLiam Girdwood 	SOF_CHMAP_RLC,		/**< rear left centre */
3653e0c72dSLiam Girdwood 	SOF_CHMAP_RRC,		/**< rear right centre */
3753e0c72dSLiam Girdwood 	SOF_CHMAP_FLW,		/**< front left wide */
3853e0c72dSLiam Girdwood 	SOF_CHMAP_FRW,		/**< front right wide */
3953e0c72dSLiam Girdwood 	SOF_CHMAP_FLH,		/**< front left high */
4053e0c72dSLiam Girdwood 	SOF_CHMAP_FCH,		/**< front centre high */
4153e0c72dSLiam Girdwood 	SOF_CHMAP_FRH,		/**< front right high */
4253e0c72dSLiam Girdwood 	SOF_CHMAP_TC,		/**< top centre */
4353e0c72dSLiam Girdwood 	SOF_CHMAP_TFL,		/**< top front left */
4453e0c72dSLiam Girdwood 	SOF_CHMAP_TFR,		/**< top front right */
4553e0c72dSLiam Girdwood 	SOF_CHMAP_TFC,		/**< top front centre */
4653e0c72dSLiam Girdwood 	SOF_CHMAP_TRL,		/**< top rear left */
4753e0c72dSLiam Girdwood 	SOF_CHMAP_TRR,		/**< top rear right */
4853e0c72dSLiam Girdwood 	SOF_CHMAP_TRC,		/**< top rear centre */
4953e0c72dSLiam Girdwood 	SOF_CHMAP_TFLC,		/**< top front left centre */
5053e0c72dSLiam Girdwood 	SOF_CHMAP_TFRC,		/**< top front right centre */
5153e0c72dSLiam Girdwood 	SOF_CHMAP_TSL,		/**< top side left */
5253e0c72dSLiam Girdwood 	SOF_CHMAP_TSR,		/**< top side right */
5353e0c72dSLiam Girdwood 	SOF_CHMAP_LLFE,		/**< left LFE */
5453e0c72dSLiam Girdwood 	SOF_CHMAP_RLFE,		/**< right LFE */
5553e0c72dSLiam Girdwood 	SOF_CHMAP_BC,		/**< bottom centre */
5653e0c72dSLiam Girdwood 	SOF_CHMAP_BLC,		/**< bottom left centre */
5753e0c72dSLiam Girdwood 	SOF_CHMAP_BRC,		/**< bottom right centre */
5853e0c72dSLiam Girdwood 	SOF_CHMAP_LAST = SOF_CHMAP_BRC,
5953e0c72dSLiam Girdwood };
6053e0c72dSLiam Girdwood 
6153e0c72dSLiam Girdwood /* control data type and direction */
6253e0c72dSLiam Girdwood enum sof_ipc_ctrl_type {
6353e0c72dSLiam Girdwood 	/*  per channel data - uses struct sof_ipc_ctrl_value_chan */
6453e0c72dSLiam Girdwood 	SOF_CTRL_TYPE_VALUE_CHAN_GET = 0,
6553e0c72dSLiam Girdwood 	SOF_CTRL_TYPE_VALUE_CHAN_SET,
6653e0c72dSLiam Girdwood 	/* component data - uses struct sof_ipc_ctrl_value_comp */
6753e0c72dSLiam Girdwood 	SOF_CTRL_TYPE_VALUE_COMP_GET,
6853e0c72dSLiam Girdwood 	SOF_CTRL_TYPE_VALUE_COMP_SET,
6953e0c72dSLiam Girdwood 	/* bespoke data - uses struct sof_abi_hdr */
7053e0c72dSLiam Girdwood 	SOF_CTRL_TYPE_DATA_GET,
7153e0c72dSLiam Girdwood 	SOF_CTRL_TYPE_DATA_SET,
7253e0c72dSLiam Girdwood };
7353e0c72dSLiam Girdwood 
7453e0c72dSLiam Girdwood /* control command type */
7553e0c72dSLiam Girdwood enum sof_ipc_ctrl_cmd {
7653e0c72dSLiam Girdwood 	SOF_CTRL_CMD_VOLUME = 0, /**< maps to ALSA volume style controls */
7753e0c72dSLiam Girdwood 	SOF_CTRL_CMD_ENUM,	/**< maps to ALSA enum style controls */
7853e0c72dSLiam Girdwood 	SOF_CTRL_CMD_SWITCH,	/**< maps to ALSA switch style controls */
7953e0c72dSLiam Girdwood 	SOF_CTRL_CMD_BINARY,	/**< maps to ALSA binary style controls */
8053e0c72dSLiam Girdwood };
8153e0c72dSLiam Girdwood 
8253e0c72dSLiam Girdwood /* generic channel mapped value data */
8353e0c72dSLiam Girdwood struct sof_ipc_ctrl_value_chan {
8453e0c72dSLiam Girdwood 	uint32_t channel;	/**< channel map - enum sof_ipc_chmap */
8553e0c72dSLiam Girdwood 	uint32_t value;
8653e0c72dSLiam Girdwood } __packed;
8753e0c72dSLiam Girdwood 
8853e0c72dSLiam Girdwood /* generic component mapped value data */
8953e0c72dSLiam Girdwood struct sof_ipc_ctrl_value_comp {
9053e0c72dSLiam Girdwood 	uint32_t index;	/**< component source/sink/control index in control */
9153e0c72dSLiam Girdwood 	union {
9253e0c72dSLiam Girdwood 		uint32_t uvalue;
9353e0c72dSLiam Girdwood 		int32_t svalue;
9453e0c72dSLiam Girdwood 	};
9553e0c72dSLiam Girdwood } __packed;
9653e0c72dSLiam Girdwood 
9753e0c72dSLiam Girdwood /* generic control data */
9853e0c72dSLiam Girdwood struct sof_ipc_ctrl_data {
9953e0c72dSLiam Girdwood 	struct sof_ipc_reply rhdr;
10053e0c72dSLiam Girdwood 	uint32_t comp_id;
10153e0c72dSLiam Girdwood 
10253e0c72dSLiam Girdwood 	/* control access and data type */
10353e0c72dSLiam Girdwood 	uint32_t type;		/**< enum sof_ipc_ctrl_type */
10453e0c72dSLiam Girdwood 	uint32_t cmd;		/**< enum sof_ipc_ctrl_cmd */
10553e0c72dSLiam Girdwood 	uint32_t index;		/**< control index for comps > 1 control */
10653e0c72dSLiam Girdwood 
10753e0c72dSLiam Girdwood 	/* control data - can either be appended or DMAed from host */
10853e0c72dSLiam Girdwood 	struct sof_ipc_host_buffer buffer;
10953e0c72dSLiam Girdwood 	uint32_t num_elems;	/**< in array elems or bytes for data type */
11053e0c72dSLiam Girdwood 	uint32_t elems_remaining;	/**< elems remaining if sent in parts */
11153e0c72dSLiam Girdwood 
11253e0c72dSLiam Girdwood 	uint32_t msg_index;	/**< for large messages sent in parts */
11353e0c72dSLiam Girdwood 
11453e0c72dSLiam Girdwood 	/* reserved for future use */
11553e0c72dSLiam Girdwood 	uint32_t reserved[6];
11653e0c72dSLiam Girdwood 
11753e0c72dSLiam Girdwood 	/* control data - add new types if needed */
11853e0c72dSLiam Girdwood 	union {
11953e0c72dSLiam Girdwood 		/* channel values can be used by volume type controls */
120*b264ef79SGustavo A. R. Silva 		DECLARE_FLEX_ARRAY(struct sof_ipc_ctrl_value_chan, chanv);
12153e0c72dSLiam Girdwood 		/* component values used by routing controls like mux, mixer */
122*b264ef79SGustavo A. R. Silva 		DECLARE_FLEX_ARRAY(struct sof_ipc_ctrl_value_comp, compv);
12353e0c72dSLiam Girdwood 		/* data can be used by binary controls */
124*b264ef79SGustavo A. R. Silva 		DECLARE_FLEX_ARRAY(struct sof_abi_hdr, data);
12553e0c72dSLiam Girdwood 	};
12653e0c72dSLiam Girdwood } __packed;
12753e0c72dSLiam Girdwood 
12853e0c72dSLiam Girdwood /** Event type */
12953e0c72dSLiam Girdwood enum sof_ipc_ctrl_event_type {
13053e0c72dSLiam Girdwood 	SOF_CTRL_EVENT_GENERIC = 0,	/**< generic event */
13153e0c72dSLiam Girdwood 	SOF_CTRL_EVENT_GENERIC_METADATA,	/**< generic event with metadata */
13253e0c72dSLiam Girdwood 	SOF_CTRL_EVENT_KD,	/**< keyword detection event */
13353e0c72dSLiam Girdwood 	SOF_CTRL_EVENT_VAD,	/**< voice activity detection event */
13453e0c72dSLiam Girdwood };
13553e0c72dSLiam Girdwood 
13653e0c72dSLiam Girdwood /**
13753e0c72dSLiam Girdwood  * Generic notification data.
13853e0c72dSLiam Girdwood  */
13953e0c72dSLiam Girdwood struct sof_ipc_comp_event {
14053e0c72dSLiam Girdwood 	struct sof_ipc_reply rhdr;
14153e0c72dSLiam Girdwood 	uint16_t src_comp_type;	/**< COMP_TYPE_ */
14253e0c72dSLiam Girdwood 	uint32_t src_comp_id;	/**< source component id */
14353e0c72dSLiam Girdwood 	uint32_t event_type;	/**< event type - SOF_CTRL_EVENT_* */
14453e0c72dSLiam Girdwood 	uint32_t num_elems;	/**< in array elems or bytes for data type */
14553e0c72dSLiam Girdwood 
14653e0c72dSLiam Girdwood 	/* reserved for future use */
14753e0c72dSLiam Girdwood 	uint32_t reserved[8];
14853e0c72dSLiam Girdwood 
14953e0c72dSLiam Girdwood 	/* control data - add new types if needed */
15053e0c72dSLiam Girdwood 	union {
15153e0c72dSLiam Girdwood 		/* data can be used by binary controls */
15253e0c72dSLiam Girdwood 		struct sof_abi_hdr data[0];
15353e0c72dSLiam Girdwood 		/* event specific values */
15453e0c72dSLiam Girdwood 		uint32_t event_value;
15553e0c72dSLiam Girdwood 	};
15653e0c72dSLiam Girdwood } __packed;
15753e0c72dSLiam Girdwood 
15853e0c72dSLiam Girdwood #endif
159