1278f064eSEduardo Habkost /* SPDX-License-Identifier: BSD-3-Clause */
2278f064eSEduardo Habkost /*
3278f064eSEduardo Habkost  * Copyright (C) 2021 OpenSynergy GmbH
4278f064eSEduardo Habkost  */
5278f064eSEduardo Habkost #ifndef VIRTIO_SND_IF_H
6278f064eSEduardo Habkost #define VIRTIO_SND_IF_H
7278f064eSEduardo Habkost 
8278f064eSEduardo Habkost #include "standard-headers/linux/virtio_types.h"
9278f064eSEduardo Habkost 
10278f064eSEduardo Habkost /*******************************************************************************
11*ab0c7fb2SPaolo Bonzini  * FEATURE BITS
12*ab0c7fb2SPaolo Bonzini  */
13*ab0c7fb2SPaolo Bonzini enum {
14*ab0c7fb2SPaolo Bonzini 	/* device supports control elements */
15*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_F_CTLS = 0
16*ab0c7fb2SPaolo Bonzini };
17*ab0c7fb2SPaolo Bonzini 
18*ab0c7fb2SPaolo Bonzini /*******************************************************************************
19278f064eSEduardo Habkost  * CONFIGURATION SPACE
20278f064eSEduardo Habkost  */
21278f064eSEduardo Habkost struct virtio_snd_config {
22278f064eSEduardo Habkost 	/* # of available physical jacks */
23278f064eSEduardo Habkost 	uint32_t jacks;
24278f064eSEduardo Habkost 	/* # of available PCM streams */
25278f064eSEduardo Habkost 	uint32_t streams;
26278f064eSEduardo Habkost 	/* # of available channel maps */
27278f064eSEduardo Habkost 	uint32_t chmaps;
28*ab0c7fb2SPaolo Bonzini 	/* # of available control elements */
29*ab0c7fb2SPaolo Bonzini 	uint32_t controls;
30278f064eSEduardo Habkost };
31278f064eSEduardo Habkost 
32278f064eSEduardo Habkost enum {
33278f064eSEduardo Habkost 	/* device virtqueue indexes */
34278f064eSEduardo Habkost 	VIRTIO_SND_VQ_CONTROL = 0,
35278f064eSEduardo Habkost 	VIRTIO_SND_VQ_EVENT,
36278f064eSEduardo Habkost 	VIRTIO_SND_VQ_TX,
37278f064eSEduardo Habkost 	VIRTIO_SND_VQ_RX,
38278f064eSEduardo Habkost 	/* # of device virtqueues */
39278f064eSEduardo Habkost 	VIRTIO_SND_VQ_MAX
40278f064eSEduardo Habkost };
41278f064eSEduardo Habkost 
42278f064eSEduardo Habkost /*******************************************************************************
43278f064eSEduardo Habkost  * COMMON DEFINITIONS
44278f064eSEduardo Habkost  */
45278f064eSEduardo Habkost 
46278f064eSEduardo Habkost /* supported dataflow directions */
47278f064eSEduardo Habkost enum {
48278f064eSEduardo Habkost 	VIRTIO_SND_D_OUTPUT = 0,
49278f064eSEduardo Habkost 	VIRTIO_SND_D_INPUT
50278f064eSEduardo Habkost };
51278f064eSEduardo Habkost 
52278f064eSEduardo Habkost enum {
53278f064eSEduardo Habkost 	/* jack control request types */
54278f064eSEduardo Habkost 	VIRTIO_SND_R_JACK_INFO = 1,
55278f064eSEduardo Habkost 	VIRTIO_SND_R_JACK_REMAP,
56278f064eSEduardo Habkost 
57278f064eSEduardo Habkost 	/* PCM control request types */
58278f064eSEduardo Habkost 	VIRTIO_SND_R_PCM_INFO = 0x0100,
59278f064eSEduardo Habkost 	VIRTIO_SND_R_PCM_SET_PARAMS,
60278f064eSEduardo Habkost 	VIRTIO_SND_R_PCM_PREPARE,
61278f064eSEduardo Habkost 	VIRTIO_SND_R_PCM_RELEASE,
62278f064eSEduardo Habkost 	VIRTIO_SND_R_PCM_START,
63278f064eSEduardo Habkost 	VIRTIO_SND_R_PCM_STOP,
64278f064eSEduardo Habkost 
65278f064eSEduardo Habkost 	/* channel map control request types */
66278f064eSEduardo Habkost 	VIRTIO_SND_R_CHMAP_INFO = 0x0200,
67278f064eSEduardo Habkost 
68*ab0c7fb2SPaolo Bonzini 	/* control element request types */
69*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_R_CTL_INFO = 0x0300,
70*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_R_CTL_ENUM_ITEMS,
71*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_R_CTL_READ,
72*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_R_CTL_WRITE,
73*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_R_CTL_TLV_READ,
74*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_R_CTL_TLV_WRITE,
75*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_R_CTL_TLV_COMMAND,
76*ab0c7fb2SPaolo Bonzini 
77278f064eSEduardo Habkost 	/* jack event types */
78278f064eSEduardo Habkost 	VIRTIO_SND_EVT_JACK_CONNECTED = 0x1000,
79278f064eSEduardo Habkost 	VIRTIO_SND_EVT_JACK_DISCONNECTED,
80278f064eSEduardo Habkost 
81278f064eSEduardo Habkost 	/* PCM event types */
82278f064eSEduardo Habkost 	VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED = 0x1100,
83278f064eSEduardo Habkost 	VIRTIO_SND_EVT_PCM_XRUN,
84278f064eSEduardo Habkost 
85*ab0c7fb2SPaolo Bonzini 	/* control element event types */
86*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_EVT_CTL_NOTIFY = 0x1200,
87*ab0c7fb2SPaolo Bonzini 
88278f064eSEduardo Habkost 	/* common status codes */
89278f064eSEduardo Habkost 	VIRTIO_SND_S_OK = 0x8000,
90278f064eSEduardo Habkost 	VIRTIO_SND_S_BAD_MSG,
91278f064eSEduardo Habkost 	VIRTIO_SND_S_NOT_SUPP,
92278f064eSEduardo Habkost 	VIRTIO_SND_S_IO_ERR
93278f064eSEduardo Habkost };
94278f064eSEduardo Habkost 
95278f064eSEduardo Habkost /* common header */
96278f064eSEduardo Habkost struct virtio_snd_hdr {
97278f064eSEduardo Habkost 	uint32_t code;
98278f064eSEduardo Habkost };
99278f064eSEduardo Habkost 
100278f064eSEduardo Habkost /* event notification */
101278f064eSEduardo Habkost struct virtio_snd_event {
102278f064eSEduardo Habkost 	/* VIRTIO_SND_EVT_XXX */
103278f064eSEduardo Habkost 	struct virtio_snd_hdr hdr;
104278f064eSEduardo Habkost 	/* optional event data */
105278f064eSEduardo Habkost 	uint32_t data;
106278f064eSEduardo Habkost };
107278f064eSEduardo Habkost 
108278f064eSEduardo Habkost /* common control request to query an item information */
109278f064eSEduardo Habkost struct virtio_snd_query_info {
110278f064eSEduardo Habkost 	/* VIRTIO_SND_R_XXX_INFO */
111278f064eSEduardo Habkost 	struct virtio_snd_hdr hdr;
112278f064eSEduardo Habkost 	/* item start identifier */
113278f064eSEduardo Habkost 	uint32_t start_id;
114278f064eSEduardo Habkost 	/* item count to query */
115278f064eSEduardo Habkost 	uint32_t count;
116278f064eSEduardo Habkost 	/* item information size in bytes */
117278f064eSEduardo Habkost 	uint32_t size;
118278f064eSEduardo Habkost };
119278f064eSEduardo Habkost 
120278f064eSEduardo Habkost /* common item information header */
121278f064eSEduardo Habkost struct virtio_snd_info {
122278f064eSEduardo Habkost 	/* function group node id (High Definition Audio Specification 7.1.2) */
123278f064eSEduardo Habkost 	uint32_t hda_fn_nid;
124278f064eSEduardo Habkost };
125278f064eSEduardo Habkost 
126278f064eSEduardo Habkost /*******************************************************************************
127278f064eSEduardo Habkost  * JACK CONTROL MESSAGES
128278f064eSEduardo Habkost  */
129278f064eSEduardo Habkost struct virtio_snd_jack_hdr {
130278f064eSEduardo Habkost 	/* VIRTIO_SND_R_JACK_XXX */
131278f064eSEduardo Habkost 	struct virtio_snd_hdr hdr;
132278f064eSEduardo Habkost 	/* 0 ... virtio_snd_config::jacks - 1 */
133278f064eSEduardo Habkost 	uint32_t jack_id;
134278f064eSEduardo Habkost };
135278f064eSEduardo Habkost 
136278f064eSEduardo Habkost /* supported jack features */
137278f064eSEduardo Habkost enum {
138278f064eSEduardo Habkost 	VIRTIO_SND_JACK_F_REMAP = 0
139278f064eSEduardo Habkost };
140278f064eSEduardo Habkost 
141278f064eSEduardo Habkost struct virtio_snd_jack_info {
142278f064eSEduardo Habkost 	/* common header */
143278f064eSEduardo Habkost 	struct virtio_snd_info hdr;
144278f064eSEduardo Habkost 	/* supported feature bit map (1 << VIRTIO_SND_JACK_F_XXX) */
145278f064eSEduardo Habkost 	uint32_t features;
146278f064eSEduardo Habkost 	/* pin configuration (High Definition Audio Specification 7.3.3.31) */
147278f064eSEduardo Habkost 	uint32_t hda_reg_defconf;
148278f064eSEduardo Habkost 	/* pin capabilities (High Definition Audio Specification 7.3.4.9) */
149278f064eSEduardo Habkost 	uint32_t hda_reg_caps;
150278f064eSEduardo Habkost 	/* current jack connection status (0: disconnected, 1: connected) */
151278f064eSEduardo Habkost 	uint8_t connected;
152278f064eSEduardo Habkost 
153278f064eSEduardo Habkost 	uint8_t padding[7];
154278f064eSEduardo Habkost };
155278f064eSEduardo Habkost 
156278f064eSEduardo Habkost /* jack remapping control request */
157278f064eSEduardo Habkost struct virtio_snd_jack_remap {
158278f064eSEduardo Habkost 	/* .code = VIRTIO_SND_R_JACK_REMAP */
159278f064eSEduardo Habkost 	struct virtio_snd_jack_hdr hdr;
160278f064eSEduardo Habkost 	/* selected association number */
161278f064eSEduardo Habkost 	uint32_t association;
162278f064eSEduardo Habkost 	/* selected sequence number */
163278f064eSEduardo Habkost 	uint32_t sequence;
164278f064eSEduardo Habkost };
165278f064eSEduardo Habkost 
166278f064eSEduardo Habkost /*******************************************************************************
167278f064eSEduardo Habkost  * PCM CONTROL MESSAGES
168278f064eSEduardo Habkost  */
169278f064eSEduardo Habkost struct virtio_snd_pcm_hdr {
170278f064eSEduardo Habkost 	/* VIRTIO_SND_R_PCM_XXX */
171278f064eSEduardo Habkost 	struct virtio_snd_hdr hdr;
172278f064eSEduardo Habkost 	/* 0 ... virtio_snd_config::streams - 1 */
173278f064eSEduardo Habkost 	uint32_t stream_id;
174278f064eSEduardo Habkost };
175278f064eSEduardo Habkost 
176278f064eSEduardo Habkost /* supported PCM stream features */
177278f064eSEduardo Habkost enum {
178278f064eSEduardo Habkost 	VIRTIO_SND_PCM_F_SHMEM_HOST = 0,
179278f064eSEduardo Habkost 	VIRTIO_SND_PCM_F_SHMEM_GUEST,
180278f064eSEduardo Habkost 	VIRTIO_SND_PCM_F_MSG_POLLING,
181278f064eSEduardo Habkost 	VIRTIO_SND_PCM_F_EVT_SHMEM_PERIODS,
182278f064eSEduardo Habkost 	VIRTIO_SND_PCM_F_EVT_XRUNS
183278f064eSEduardo Habkost };
184278f064eSEduardo Habkost 
185278f064eSEduardo Habkost /* supported PCM sample formats */
186278f064eSEduardo Habkost enum {
187278f064eSEduardo Habkost 	/* analog formats (width / physical width) */
188278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_IMA_ADPCM = 0,	/*  4 /  4 bits */
189278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_MU_LAW,		/*  8 /  8 bits */
190278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_A_LAW,		/*  8 /  8 bits */
191278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S8,			/*  8 /  8 bits */
192278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U8,			/*  8 /  8 bits */
193278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S16,			/* 16 / 16 bits */
194278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U16,			/* 16 / 16 bits */
195278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S18_3,		/* 18 / 24 bits */
196278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U18_3,		/* 18 / 24 bits */
197278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S20_3,		/* 20 / 24 bits */
198278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U20_3,		/* 20 / 24 bits */
199278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S24_3,		/* 24 / 24 bits */
200278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U24_3,		/* 24 / 24 bits */
201278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S20,			/* 20 / 32 bits */
202278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U20,			/* 20 / 32 bits */
203278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S24,			/* 24 / 32 bits */
204278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U24,			/* 24 / 32 bits */
205278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_S32,			/* 32 / 32 bits */
206278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_U32,			/* 32 / 32 bits */
207278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_FLOAT,		/* 32 / 32 bits */
208278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_FLOAT64,		/* 64 / 64 bits */
209278f064eSEduardo Habkost 	/* digital formats (width / physical width) */
210278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_DSD_U8,		/*  8 /  8 bits */
211278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_DSD_U16,		/* 16 / 16 bits */
212278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_DSD_U32,		/* 32 / 32 bits */
213278f064eSEduardo Habkost 	VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME	/* 32 / 32 bits */
214278f064eSEduardo Habkost };
215278f064eSEduardo Habkost 
216278f064eSEduardo Habkost /* supported PCM frame rates */
217278f064eSEduardo Habkost enum {
218278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_5512 = 0,
219278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_8000,
220278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_11025,
221278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_16000,
222278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_22050,
223278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_32000,
224278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_44100,
225278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_48000,
226278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_64000,
227278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_88200,
228278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_96000,
229278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_176400,
230278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_192000,
231278f064eSEduardo Habkost 	VIRTIO_SND_PCM_RATE_384000
232278f064eSEduardo Habkost };
233278f064eSEduardo Habkost 
234278f064eSEduardo Habkost struct virtio_snd_pcm_info {
235278f064eSEduardo Habkost 	/* common header */
236278f064eSEduardo Habkost 	struct virtio_snd_info hdr;
237278f064eSEduardo Habkost 	/* supported feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */
238278f064eSEduardo Habkost 	uint32_t features;
239278f064eSEduardo Habkost 	/* supported sample format bit map (1 << VIRTIO_SND_PCM_FMT_XXX) */
240278f064eSEduardo Habkost 	uint64_t formats;
241278f064eSEduardo Habkost 	/* supported frame rate bit map (1 << VIRTIO_SND_PCM_RATE_XXX) */
242278f064eSEduardo Habkost 	uint64_t rates;
243278f064eSEduardo Habkost 	/* dataflow direction (VIRTIO_SND_D_XXX) */
244278f064eSEduardo Habkost 	uint8_t direction;
245278f064eSEduardo Habkost 	/* minimum # of supported channels */
246278f064eSEduardo Habkost 	uint8_t channels_min;
247278f064eSEduardo Habkost 	/* maximum # of supported channels */
248278f064eSEduardo Habkost 	uint8_t channels_max;
249278f064eSEduardo Habkost 
250278f064eSEduardo Habkost 	uint8_t padding[5];
251278f064eSEduardo Habkost };
252278f064eSEduardo Habkost 
253278f064eSEduardo Habkost /* set PCM stream format */
254278f064eSEduardo Habkost struct virtio_snd_pcm_set_params {
255278f064eSEduardo Habkost 	/* .code = VIRTIO_SND_R_PCM_SET_PARAMS */
256278f064eSEduardo Habkost 	struct virtio_snd_pcm_hdr hdr;
257278f064eSEduardo Habkost 	/* size of the hardware buffer */
258278f064eSEduardo Habkost 	uint32_t buffer_bytes;
259278f064eSEduardo Habkost 	/* size of the hardware period */
260278f064eSEduardo Habkost 	uint32_t period_bytes;
261278f064eSEduardo Habkost 	/* selected feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */
262278f064eSEduardo Habkost 	uint32_t features;
263278f064eSEduardo Habkost 	/* selected # of channels */
264278f064eSEduardo Habkost 	uint8_t channels;
265278f064eSEduardo Habkost 	/* selected sample format (VIRTIO_SND_PCM_FMT_XXX) */
266278f064eSEduardo Habkost 	uint8_t format;
267278f064eSEduardo Habkost 	/* selected frame rate (VIRTIO_SND_PCM_RATE_XXX) */
268278f064eSEduardo Habkost 	uint8_t rate;
269278f064eSEduardo Habkost 
270278f064eSEduardo Habkost 	uint8_t padding;
271278f064eSEduardo Habkost };
272278f064eSEduardo Habkost 
273278f064eSEduardo Habkost /*******************************************************************************
274278f064eSEduardo Habkost  * PCM I/O MESSAGES
275278f064eSEduardo Habkost  */
276278f064eSEduardo Habkost 
277278f064eSEduardo Habkost /* I/O request header */
278278f064eSEduardo Habkost struct virtio_snd_pcm_xfer {
279278f064eSEduardo Habkost 	/* 0 ... virtio_snd_config::streams - 1 */
280278f064eSEduardo Habkost 	uint32_t stream_id;
281278f064eSEduardo Habkost };
282278f064eSEduardo Habkost 
283278f064eSEduardo Habkost /* I/O request status */
284278f064eSEduardo Habkost struct virtio_snd_pcm_status {
285278f064eSEduardo Habkost 	/* VIRTIO_SND_S_XXX */
286278f064eSEduardo Habkost 	uint32_t status;
287278f064eSEduardo Habkost 	/* current device latency */
288278f064eSEduardo Habkost 	uint32_t latency_bytes;
289278f064eSEduardo Habkost };
290278f064eSEduardo Habkost 
291278f064eSEduardo Habkost /*******************************************************************************
292278f064eSEduardo Habkost  * CHANNEL MAP CONTROL MESSAGES
293278f064eSEduardo Habkost  */
294278f064eSEduardo Habkost struct virtio_snd_chmap_hdr {
295278f064eSEduardo Habkost 	/* VIRTIO_SND_R_CHMAP_XXX */
296278f064eSEduardo Habkost 	struct virtio_snd_hdr hdr;
297278f064eSEduardo Habkost 	/* 0 ... virtio_snd_config::chmaps - 1 */
298278f064eSEduardo Habkost 	uint32_t chmap_id;
299278f064eSEduardo Habkost };
300278f064eSEduardo Habkost 
301278f064eSEduardo Habkost /* standard channel position definition */
302278f064eSEduardo Habkost enum {
303278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_NONE = 0,	/* undefined */
304278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_NA,		/* silent */
305278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_MONO,		/* mono stream */
306278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FL,		/* front left */
307278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FR,		/* front right */
308278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_RL,		/* rear left */
309278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_RR,		/* rear right */
310278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FC,		/* front center */
311278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_LFE,		/* low frequency (LFE) */
312278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_SL,		/* side left */
313278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_SR,		/* side right */
314278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_RC,		/* rear center */
315278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FLC,		/* front left center */
316278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FRC,		/* front right center */
317278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_RLC,		/* rear left center */
318278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_RRC,		/* rear right center */
319278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FLW,		/* front left wide */
320278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FRW,		/* front right wide */
321278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FLH,		/* front left high */
322278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FCH,		/* front center high */
323278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_FRH,		/* front right high */
324278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TC,		/* top center */
325278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TFL,		/* top front left */
326278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TFR,		/* top front right */
327278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TFC,		/* top front center */
328278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TRL,		/* top rear left */
329278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TRR,		/* top rear right */
330278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TRC,		/* top rear center */
331278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TFLC,		/* top front left center */
332278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TFRC,		/* top front right center */
333278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TSL,		/* top side left */
334278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_TSR,		/* top side right */
335278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_LLFE,		/* left LFE */
336278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_RLFE,		/* right LFE */
337278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_BC,		/* bottom center */
338278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_BLC,		/* bottom left center */
339278f064eSEduardo Habkost 	VIRTIO_SND_CHMAP_BRC		/* bottom right center */
340278f064eSEduardo Habkost };
341278f064eSEduardo Habkost 
342278f064eSEduardo Habkost /* maximum possible number of channels */
343278f064eSEduardo Habkost #define VIRTIO_SND_CHMAP_MAX_SIZE	18
344278f064eSEduardo Habkost 
345278f064eSEduardo Habkost struct virtio_snd_chmap_info {
346278f064eSEduardo Habkost 	/* common header */
347278f064eSEduardo Habkost 	struct virtio_snd_info hdr;
348278f064eSEduardo Habkost 	/* dataflow direction (VIRTIO_SND_D_XXX) */
349278f064eSEduardo Habkost 	uint8_t direction;
350278f064eSEduardo Habkost 	/* # of valid channel position values */
351278f064eSEduardo Habkost 	uint8_t channels;
352278f064eSEduardo Habkost 	/* channel position values (VIRTIO_SND_CHMAP_XXX) */
353278f064eSEduardo Habkost 	uint8_t positions[VIRTIO_SND_CHMAP_MAX_SIZE];
354278f064eSEduardo Habkost };
355278f064eSEduardo Habkost 
356*ab0c7fb2SPaolo Bonzini /*******************************************************************************
357*ab0c7fb2SPaolo Bonzini  * CONTROL ELEMENTS MESSAGES
358*ab0c7fb2SPaolo Bonzini  */
359*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_hdr {
360*ab0c7fb2SPaolo Bonzini 	/* VIRTIO_SND_R_CTL_XXX */
361*ab0c7fb2SPaolo Bonzini 	struct virtio_snd_hdr hdr;
362*ab0c7fb2SPaolo Bonzini 	/* 0 ... virtio_snd_config::controls - 1 */
363*ab0c7fb2SPaolo Bonzini 	uint32_t control_id;
364*ab0c7fb2SPaolo Bonzini };
365*ab0c7fb2SPaolo Bonzini 
366*ab0c7fb2SPaolo Bonzini /* supported roles for control elements */
367*ab0c7fb2SPaolo Bonzini enum {
368*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_ROLE_UNDEFINED = 0,
369*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_ROLE_VOLUME,
370*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_ROLE_MUTE,
371*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_ROLE_GAIN
372*ab0c7fb2SPaolo Bonzini };
373*ab0c7fb2SPaolo Bonzini 
374*ab0c7fb2SPaolo Bonzini /* supported value types for control elements */
375*ab0c7fb2SPaolo Bonzini enum {
376*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_TYPE_BOOLEAN = 0,
377*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_TYPE_INTEGER,
378*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_TYPE_INTEGER64,
379*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_TYPE_ENUMERATED,
380*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_TYPE_BYTES,
381*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_TYPE_IEC958
382*ab0c7fb2SPaolo Bonzini };
383*ab0c7fb2SPaolo Bonzini 
384*ab0c7fb2SPaolo Bonzini /* supported access rights for control elements */
385*ab0c7fb2SPaolo Bonzini enum {
386*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_ACCESS_READ = 0,
387*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_ACCESS_WRITE,
388*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_ACCESS_VOLATILE,
389*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_ACCESS_INACTIVE,
390*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_ACCESS_TLV_READ,
391*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_ACCESS_TLV_WRITE,
392*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_ACCESS_TLV_COMMAND
393*ab0c7fb2SPaolo Bonzini };
394*ab0c7fb2SPaolo Bonzini 
395*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_info {
396*ab0c7fb2SPaolo Bonzini 	/* common header */
397*ab0c7fb2SPaolo Bonzini 	struct virtio_snd_info hdr;
398*ab0c7fb2SPaolo Bonzini 	/* element role (VIRTIO_SND_CTL_ROLE_XXX) */
399*ab0c7fb2SPaolo Bonzini 	uint32_t role;
400*ab0c7fb2SPaolo Bonzini 	/* element value type (VIRTIO_SND_CTL_TYPE_XXX) */
401*ab0c7fb2SPaolo Bonzini 	uint32_t type;
402*ab0c7fb2SPaolo Bonzini 	/* element access right bit map (1 << VIRTIO_SND_CTL_ACCESS_XXX) */
403*ab0c7fb2SPaolo Bonzini 	uint32_t access;
404*ab0c7fb2SPaolo Bonzini 	/* # of members in the element value */
405*ab0c7fb2SPaolo Bonzini 	uint32_t count;
406*ab0c7fb2SPaolo Bonzini 	/* index for an element with a non-unique name */
407*ab0c7fb2SPaolo Bonzini 	uint32_t index;
408*ab0c7fb2SPaolo Bonzini 	/* name identifier string for the element */
409*ab0c7fb2SPaolo Bonzini 	uint8_t name[44];
410*ab0c7fb2SPaolo Bonzini 	/* additional information about the element's value */
411*ab0c7fb2SPaolo Bonzini 	union {
412*ab0c7fb2SPaolo Bonzini 		/* VIRTIO_SND_CTL_TYPE_INTEGER */
413*ab0c7fb2SPaolo Bonzini 		struct {
414*ab0c7fb2SPaolo Bonzini 			/* minimum supported value */
415*ab0c7fb2SPaolo Bonzini 			uint32_t min;
416*ab0c7fb2SPaolo Bonzini 			/* maximum supported value */
417*ab0c7fb2SPaolo Bonzini 			uint32_t max;
418*ab0c7fb2SPaolo Bonzini 			/* fixed step size for value (0 = variable size) */
419*ab0c7fb2SPaolo Bonzini 			uint32_t step;
420*ab0c7fb2SPaolo Bonzini 		} integer;
421*ab0c7fb2SPaolo Bonzini 		/* VIRTIO_SND_CTL_TYPE_INTEGER64 */
422*ab0c7fb2SPaolo Bonzini 		struct {
423*ab0c7fb2SPaolo Bonzini 			/* minimum supported value */
424*ab0c7fb2SPaolo Bonzini 			uint64_t min;
425*ab0c7fb2SPaolo Bonzini 			/* maximum supported value */
426*ab0c7fb2SPaolo Bonzini 			uint64_t max;
427*ab0c7fb2SPaolo Bonzini 			/* fixed step size for value (0 = variable size) */
428*ab0c7fb2SPaolo Bonzini 			uint64_t step;
429*ab0c7fb2SPaolo Bonzini 		} integer64;
430*ab0c7fb2SPaolo Bonzini 		/* VIRTIO_SND_CTL_TYPE_ENUMERATED */
431*ab0c7fb2SPaolo Bonzini 		struct {
432*ab0c7fb2SPaolo Bonzini 			/* # of options supported for value */
433*ab0c7fb2SPaolo Bonzini 			uint32_t items;
434*ab0c7fb2SPaolo Bonzini 		} enumerated;
435*ab0c7fb2SPaolo Bonzini 	} value;
436*ab0c7fb2SPaolo Bonzini };
437*ab0c7fb2SPaolo Bonzini 
438*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_enum_item {
439*ab0c7fb2SPaolo Bonzini 	/* option name */
440*ab0c7fb2SPaolo Bonzini 	uint8_t item[64];
441*ab0c7fb2SPaolo Bonzini };
442*ab0c7fb2SPaolo Bonzini 
443*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_iec958 {
444*ab0c7fb2SPaolo Bonzini 	/* AES/IEC958 channel status bits */
445*ab0c7fb2SPaolo Bonzini 	uint8_t status[24];
446*ab0c7fb2SPaolo Bonzini 	/* AES/IEC958 subcode bits */
447*ab0c7fb2SPaolo Bonzini 	uint8_t subcode[147];
448*ab0c7fb2SPaolo Bonzini 	/* nothing */
449*ab0c7fb2SPaolo Bonzini 	uint8_t pad;
450*ab0c7fb2SPaolo Bonzini 	/* AES/IEC958 subframe bits */
451*ab0c7fb2SPaolo Bonzini 	uint8_t dig_subframe[4];
452*ab0c7fb2SPaolo Bonzini };
453*ab0c7fb2SPaolo Bonzini 
454*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_value {
455*ab0c7fb2SPaolo Bonzini 	union {
456*ab0c7fb2SPaolo Bonzini 		/* VIRTIO_SND_CTL_TYPE_BOOLEAN|INTEGER value */
457*ab0c7fb2SPaolo Bonzini 		uint32_t integer[128];
458*ab0c7fb2SPaolo Bonzini 		/* VIRTIO_SND_CTL_TYPE_INTEGER64 value */
459*ab0c7fb2SPaolo Bonzini 		uint64_t integer64[64];
460*ab0c7fb2SPaolo Bonzini 		/* VIRTIO_SND_CTL_TYPE_ENUMERATED value (option indexes) */
461*ab0c7fb2SPaolo Bonzini 		uint32_t enumerated[128];
462*ab0c7fb2SPaolo Bonzini 		/* VIRTIO_SND_CTL_TYPE_BYTES value */
463*ab0c7fb2SPaolo Bonzini 		uint8_t bytes[512];
464*ab0c7fb2SPaolo Bonzini 		/* VIRTIO_SND_CTL_TYPE_IEC958 value */
465*ab0c7fb2SPaolo Bonzini 		struct virtio_snd_ctl_iec958 iec958;
466*ab0c7fb2SPaolo Bonzini 	} value;
467*ab0c7fb2SPaolo Bonzini };
468*ab0c7fb2SPaolo Bonzini 
469*ab0c7fb2SPaolo Bonzini /* supported event reason types */
470*ab0c7fb2SPaolo Bonzini enum {
471*ab0c7fb2SPaolo Bonzini 	/* element's value has changed */
472*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_EVT_MASK_VALUE = 0,
473*ab0c7fb2SPaolo Bonzini 	/* element's information has changed */
474*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_EVT_MASK_INFO,
475*ab0c7fb2SPaolo Bonzini 	/* element's metadata has changed */
476*ab0c7fb2SPaolo Bonzini 	VIRTIO_SND_CTL_EVT_MASK_TLV
477*ab0c7fb2SPaolo Bonzini };
478*ab0c7fb2SPaolo Bonzini 
479*ab0c7fb2SPaolo Bonzini struct virtio_snd_ctl_event {
480*ab0c7fb2SPaolo Bonzini 	/* VIRTIO_SND_EVT_CTL_NOTIFY */
481*ab0c7fb2SPaolo Bonzini 	struct virtio_snd_hdr hdr;
482*ab0c7fb2SPaolo Bonzini 	/* 0 ... virtio_snd_config::controls - 1 */
483*ab0c7fb2SPaolo Bonzini 	uint16_t control_id;
484*ab0c7fb2SPaolo Bonzini 	/* event reason bit map (1 << VIRTIO_SND_CTL_EVT_MASK_XXX) */
485*ab0c7fb2SPaolo Bonzini 	uint16_t mask;
486*ab0c7fb2SPaolo Bonzini };
487*ab0c7fb2SPaolo Bonzini 
488278f064eSEduardo Habkost #endif /* VIRTIO_SND_IF_H */
489