1 /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
2 /*
3  * This file is provided under a dual BSD/GPLv2 license.  When using or
4  * redistributing this file, you may do so under either license.
5  *
6  * Copyright(c) 2018 Intel Corporation. All rights reserved.
7  */
8 
9 #ifndef __INCLUDE_SOUND_SOF_CONTROL_H__
10 #define __INCLUDE_SOUND_SOF_CONTROL_H__
11 
12 #include <uapi/sound/sof/header.h>
13 #include <sound/sof/header.h>
14 
15 /*
16  * Component Mixers and Controls
17  */
18 
19 /* channel positions - uses same values as ALSA */
20 enum sof_ipc_chmap {
21 	SOF_CHMAP_UNKNOWN = 0,
22 	SOF_CHMAP_NA,		/**< N/A, silent */
23 	SOF_CHMAP_MONO,		/**< mono stream */
24 	SOF_CHMAP_FL,		/**< front left */
25 	SOF_CHMAP_FR,		/**< front right */
26 	SOF_CHMAP_RL,		/**< rear left */
27 	SOF_CHMAP_RR,		/**< rear right */
28 	SOF_CHMAP_FC,		/**< front centre */
29 	SOF_CHMAP_LFE,		/**< LFE */
30 	SOF_CHMAP_SL,		/**< side left */
31 	SOF_CHMAP_SR,		/**< side right */
32 	SOF_CHMAP_RC,		/**< rear centre */
33 	SOF_CHMAP_FLC,		/**< front left centre */
34 	SOF_CHMAP_FRC,		/**< front right centre */
35 	SOF_CHMAP_RLC,		/**< rear left centre */
36 	SOF_CHMAP_RRC,		/**< rear right centre */
37 	SOF_CHMAP_FLW,		/**< front left wide */
38 	SOF_CHMAP_FRW,		/**< front right wide */
39 	SOF_CHMAP_FLH,		/**< front left high */
40 	SOF_CHMAP_FCH,		/**< front centre high */
41 	SOF_CHMAP_FRH,		/**< front right high */
42 	SOF_CHMAP_TC,		/**< top centre */
43 	SOF_CHMAP_TFL,		/**< top front left */
44 	SOF_CHMAP_TFR,		/**< top front right */
45 	SOF_CHMAP_TFC,		/**< top front centre */
46 	SOF_CHMAP_TRL,		/**< top rear left */
47 	SOF_CHMAP_TRR,		/**< top rear right */
48 	SOF_CHMAP_TRC,		/**< top rear centre */
49 	SOF_CHMAP_TFLC,		/**< top front left centre */
50 	SOF_CHMAP_TFRC,		/**< top front right centre */
51 	SOF_CHMAP_TSL,		/**< top side left */
52 	SOF_CHMAP_TSR,		/**< top side right */
53 	SOF_CHMAP_LLFE,		/**< left LFE */
54 	SOF_CHMAP_RLFE,		/**< right LFE */
55 	SOF_CHMAP_BC,		/**< bottom centre */
56 	SOF_CHMAP_BLC,		/**< bottom left centre */
57 	SOF_CHMAP_BRC,		/**< bottom right centre */
58 	SOF_CHMAP_LAST = SOF_CHMAP_BRC,
59 };
60 
61 /* control data type and direction */
62 enum sof_ipc_ctrl_type {
63 	/*  per channel data - uses struct sof_ipc_ctrl_value_chan */
64 	SOF_CTRL_TYPE_VALUE_CHAN_GET = 0,
65 	SOF_CTRL_TYPE_VALUE_CHAN_SET,
66 	/* component data - uses struct sof_ipc_ctrl_value_comp */
67 	SOF_CTRL_TYPE_VALUE_COMP_GET,
68 	SOF_CTRL_TYPE_VALUE_COMP_SET,
69 	/* bespoke data - uses struct sof_abi_hdr */
70 	SOF_CTRL_TYPE_DATA_GET,
71 	SOF_CTRL_TYPE_DATA_SET,
72 };
73 
74 /* control command type */
75 enum sof_ipc_ctrl_cmd {
76 	SOF_CTRL_CMD_VOLUME = 0, /**< maps to ALSA volume style controls */
77 	SOF_CTRL_CMD_ENUM,	/**< maps to ALSA enum style controls */
78 	SOF_CTRL_CMD_SWITCH,	/**< maps to ALSA switch style controls */
79 	SOF_CTRL_CMD_BINARY,	/**< maps to ALSA binary style controls */
80 };
81 
82 /* generic channel mapped value data */
83 struct sof_ipc_ctrl_value_chan {
84 	uint32_t channel;	/**< channel map - enum sof_ipc_chmap */
85 	uint32_t value;
86 } __packed;
87 
88 /* generic component mapped value data */
89 struct sof_ipc_ctrl_value_comp {
90 	uint32_t index;	/**< component source/sink/control index in control */
91 	union {
92 		uint32_t uvalue;
93 		int32_t svalue;
94 	};
95 } __packed;
96 
97 /* generic control data */
98 struct sof_ipc_ctrl_data {
99 	struct sof_ipc_reply rhdr;
100 	uint32_t comp_id;
101 
102 	/* control access and data type */
103 	uint32_t type;		/**< enum sof_ipc_ctrl_type */
104 	uint32_t cmd;		/**< enum sof_ipc_ctrl_cmd */
105 	uint32_t index;		/**< control index for comps > 1 control */
106 
107 	/* control data - can either be appended or DMAed from host */
108 	struct sof_ipc_host_buffer buffer;
109 	uint32_t num_elems;	/**< in array elems or bytes for data type */
110 	uint32_t elems_remaining;	/**< elems remaining if sent in parts */
111 
112 	uint32_t msg_index;	/**< for large messages sent in parts */
113 
114 	/* reserved for future use */
115 	uint32_t reserved[6];
116 
117 	/* control data - add new types if needed */
118 	union {
119 		/* channel values can be used by volume type controls */
120 		DECLARE_FLEX_ARRAY(struct sof_ipc_ctrl_value_chan, chanv);
121 		/* component values used by routing controls like mux, mixer */
122 		DECLARE_FLEX_ARRAY(struct sof_ipc_ctrl_value_comp, compv);
123 		/* data can be used by binary controls */
124 		DECLARE_FLEX_ARRAY(struct sof_abi_hdr, data);
125 	};
126 } __packed;
127 
128 /** Event type */
129 enum sof_ipc_ctrl_event_type {
130 	SOF_CTRL_EVENT_GENERIC = 0,	/**< generic event */
131 	SOF_CTRL_EVENT_GENERIC_METADATA,	/**< generic event with metadata */
132 	SOF_CTRL_EVENT_KD,	/**< keyword detection event */
133 	SOF_CTRL_EVENT_VAD,	/**< voice activity detection event */
134 };
135 
136 /**
137  * Generic notification data.
138  */
139 struct sof_ipc_comp_event {
140 	struct sof_ipc_reply rhdr;
141 	uint16_t src_comp_type;	/**< COMP_TYPE_ */
142 	uint32_t src_comp_id;	/**< source component id */
143 	uint32_t event_type;	/**< event type - SOF_CTRL_EVENT_* */
144 	uint32_t num_elems;	/**< in array elems or bytes for data type */
145 
146 	/* reserved for future use */
147 	uint32_t reserved[8];
148 
149 	/* control data - add new types if needed */
150 	union {
151 		/* data can be used by binary controls */
152 		struct sof_abi_hdr data[0];
153 		/* event specific values */
154 		uint32_t event_value;
155 	};
156 } __packed;
157 
158 #endif
159