arm64: mte: change ASYNC and SYNC TCF settings into bitfields
[linux-2.6-microblaze.git] / include / uapi / linux / virtio_snd.h
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /*
3  * Copyright (C) 2021 OpenSynergy GmbH
4  */
5 #ifndef VIRTIO_SND_IF_H
6 #define VIRTIO_SND_IF_H
7
8 #include <linux/virtio_types.h>
9
10 /*******************************************************************************
11  * CONFIGURATION SPACE
12  */
13 struct virtio_snd_config {
14         /* # of available physical jacks */
15         __le32 jacks;
16         /* # of available PCM streams */
17         __le32 streams;
18         /* # of available channel maps */
19         __le32 chmaps;
20 };
21
22 enum {
23         /* device virtqueue indexes */
24         VIRTIO_SND_VQ_CONTROL = 0,
25         VIRTIO_SND_VQ_EVENT,
26         VIRTIO_SND_VQ_TX,
27         VIRTIO_SND_VQ_RX,
28         /* # of device virtqueues */
29         VIRTIO_SND_VQ_MAX
30 };
31
32 /*******************************************************************************
33  * COMMON DEFINITIONS
34  */
35
36 /* supported dataflow directions */
37 enum {
38         VIRTIO_SND_D_OUTPUT = 0,
39         VIRTIO_SND_D_INPUT
40 };
41
42 enum {
43         /* jack control request types */
44         VIRTIO_SND_R_JACK_INFO = 1,
45         VIRTIO_SND_R_JACK_REMAP,
46
47         /* PCM control request types */
48         VIRTIO_SND_R_PCM_INFO = 0x0100,
49         VIRTIO_SND_R_PCM_SET_PARAMS,
50         VIRTIO_SND_R_PCM_PREPARE,
51         VIRTIO_SND_R_PCM_RELEASE,
52         VIRTIO_SND_R_PCM_START,
53         VIRTIO_SND_R_PCM_STOP,
54
55         /* channel map control request types */
56         VIRTIO_SND_R_CHMAP_INFO = 0x0200,
57
58         /* jack event types */
59         VIRTIO_SND_EVT_JACK_CONNECTED = 0x1000,
60         VIRTIO_SND_EVT_JACK_DISCONNECTED,
61
62         /* PCM event types */
63         VIRTIO_SND_EVT_PCM_PERIOD_ELAPSED = 0x1100,
64         VIRTIO_SND_EVT_PCM_XRUN,
65
66         /* common status codes */
67         VIRTIO_SND_S_OK = 0x8000,
68         VIRTIO_SND_S_BAD_MSG,
69         VIRTIO_SND_S_NOT_SUPP,
70         VIRTIO_SND_S_IO_ERR
71 };
72
73 /* common header */
74 struct virtio_snd_hdr {
75         __le32 code;
76 };
77
78 /* event notification */
79 struct virtio_snd_event {
80         /* VIRTIO_SND_EVT_XXX */
81         struct virtio_snd_hdr hdr;
82         /* optional event data */
83         __le32 data;
84 };
85
86 /* common control request to query an item information */
87 struct virtio_snd_query_info {
88         /* VIRTIO_SND_R_XXX_INFO */
89         struct virtio_snd_hdr hdr;
90         /* item start identifier */
91         __le32 start_id;
92         /* item count to query */
93         __le32 count;
94         /* item information size in bytes */
95         __le32 size;
96 };
97
98 /* common item information header */
99 struct virtio_snd_info {
100         /* function group node id (High Definition Audio Specification 7.1.2) */
101         __le32 hda_fn_nid;
102 };
103
104 /*******************************************************************************
105  * JACK CONTROL MESSAGES
106  */
107 struct virtio_snd_jack_hdr {
108         /* VIRTIO_SND_R_JACK_XXX */
109         struct virtio_snd_hdr hdr;
110         /* 0 ... virtio_snd_config::jacks - 1 */
111         __le32 jack_id;
112 };
113
114 /* supported jack features */
115 enum {
116         VIRTIO_SND_JACK_F_REMAP = 0
117 };
118
119 struct virtio_snd_jack_info {
120         /* common header */
121         struct virtio_snd_info hdr;
122         /* supported feature bit map (1 << VIRTIO_SND_JACK_F_XXX) */
123         __le32 features;
124         /* pin configuration (High Definition Audio Specification 7.3.3.31) */
125         __le32 hda_reg_defconf;
126         /* pin capabilities (High Definition Audio Specification 7.3.4.9) */
127         __le32 hda_reg_caps;
128         /* current jack connection status (0: disconnected, 1: connected) */
129         __u8 connected;
130
131         __u8 padding[7];
132 };
133
134 /* jack remapping control request */
135 struct virtio_snd_jack_remap {
136         /* .code = VIRTIO_SND_R_JACK_REMAP */
137         struct virtio_snd_jack_hdr hdr;
138         /* selected association number */
139         __le32 association;
140         /* selected sequence number */
141         __le32 sequence;
142 };
143
144 /*******************************************************************************
145  * PCM CONTROL MESSAGES
146  */
147 struct virtio_snd_pcm_hdr {
148         /* VIRTIO_SND_R_PCM_XXX */
149         struct virtio_snd_hdr hdr;
150         /* 0 ... virtio_snd_config::streams - 1 */
151         __le32 stream_id;
152 };
153
154 /* supported PCM stream features */
155 enum {
156         VIRTIO_SND_PCM_F_SHMEM_HOST = 0,
157         VIRTIO_SND_PCM_F_SHMEM_GUEST,
158         VIRTIO_SND_PCM_F_MSG_POLLING,
159         VIRTIO_SND_PCM_F_EVT_SHMEM_PERIODS,
160         VIRTIO_SND_PCM_F_EVT_XRUNS
161 };
162
163 /* supported PCM sample formats */
164 enum {
165         /* analog formats (width / physical width) */
166         VIRTIO_SND_PCM_FMT_IMA_ADPCM = 0,       /*  4 /  4 bits */
167         VIRTIO_SND_PCM_FMT_MU_LAW,              /*  8 /  8 bits */
168         VIRTIO_SND_PCM_FMT_A_LAW,               /*  8 /  8 bits */
169         VIRTIO_SND_PCM_FMT_S8,                  /*  8 /  8 bits */
170         VIRTIO_SND_PCM_FMT_U8,                  /*  8 /  8 bits */
171         VIRTIO_SND_PCM_FMT_S16,                 /* 16 / 16 bits */
172         VIRTIO_SND_PCM_FMT_U16,                 /* 16 / 16 bits */
173         VIRTIO_SND_PCM_FMT_S18_3,               /* 18 / 24 bits */
174         VIRTIO_SND_PCM_FMT_U18_3,               /* 18 / 24 bits */
175         VIRTIO_SND_PCM_FMT_S20_3,               /* 20 / 24 bits */
176         VIRTIO_SND_PCM_FMT_U20_3,               /* 20 / 24 bits */
177         VIRTIO_SND_PCM_FMT_S24_3,               /* 24 / 24 bits */
178         VIRTIO_SND_PCM_FMT_U24_3,               /* 24 / 24 bits */
179         VIRTIO_SND_PCM_FMT_S20,                 /* 20 / 32 bits */
180         VIRTIO_SND_PCM_FMT_U20,                 /* 20 / 32 bits */
181         VIRTIO_SND_PCM_FMT_S24,                 /* 24 / 32 bits */
182         VIRTIO_SND_PCM_FMT_U24,                 /* 24 / 32 bits */
183         VIRTIO_SND_PCM_FMT_S32,                 /* 32 / 32 bits */
184         VIRTIO_SND_PCM_FMT_U32,                 /* 32 / 32 bits */
185         VIRTIO_SND_PCM_FMT_FLOAT,               /* 32 / 32 bits */
186         VIRTIO_SND_PCM_FMT_FLOAT64,             /* 64 / 64 bits */
187         /* digital formats (width / physical width) */
188         VIRTIO_SND_PCM_FMT_DSD_U8,              /*  8 /  8 bits */
189         VIRTIO_SND_PCM_FMT_DSD_U16,             /* 16 / 16 bits */
190         VIRTIO_SND_PCM_FMT_DSD_U32,             /* 32 / 32 bits */
191         VIRTIO_SND_PCM_FMT_IEC958_SUBFRAME      /* 32 / 32 bits */
192 };
193
194 /* supported PCM frame rates */
195 enum {
196         VIRTIO_SND_PCM_RATE_5512 = 0,
197         VIRTIO_SND_PCM_RATE_8000,
198         VIRTIO_SND_PCM_RATE_11025,
199         VIRTIO_SND_PCM_RATE_16000,
200         VIRTIO_SND_PCM_RATE_22050,
201         VIRTIO_SND_PCM_RATE_32000,
202         VIRTIO_SND_PCM_RATE_44100,
203         VIRTIO_SND_PCM_RATE_48000,
204         VIRTIO_SND_PCM_RATE_64000,
205         VIRTIO_SND_PCM_RATE_88200,
206         VIRTIO_SND_PCM_RATE_96000,
207         VIRTIO_SND_PCM_RATE_176400,
208         VIRTIO_SND_PCM_RATE_192000,
209         VIRTIO_SND_PCM_RATE_384000
210 };
211
212 struct virtio_snd_pcm_info {
213         /* common header */
214         struct virtio_snd_info hdr;
215         /* supported feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */
216         __le32 features;
217         /* supported sample format bit map (1 << VIRTIO_SND_PCM_FMT_XXX) */
218         __le64 formats;
219         /* supported frame rate bit map (1 << VIRTIO_SND_PCM_RATE_XXX) */
220         __le64 rates;
221         /* dataflow direction (VIRTIO_SND_D_XXX) */
222         __u8 direction;
223         /* minimum # of supported channels */
224         __u8 channels_min;
225         /* maximum # of supported channels */
226         __u8 channels_max;
227
228         __u8 padding[5];
229 };
230
231 /* set PCM stream format */
232 struct virtio_snd_pcm_set_params {
233         /* .code = VIRTIO_SND_R_PCM_SET_PARAMS */
234         struct virtio_snd_pcm_hdr hdr;
235         /* size of the hardware buffer */
236         __le32 buffer_bytes;
237         /* size of the hardware period */
238         __le32 period_bytes;
239         /* selected feature bit map (1 << VIRTIO_SND_PCM_F_XXX) */
240         __le32 features;
241         /* selected # of channels */
242         __u8 channels;
243         /* selected sample format (VIRTIO_SND_PCM_FMT_XXX) */
244         __u8 format;
245         /* selected frame rate (VIRTIO_SND_PCM_RATE_XXX) */
246         __u8 rate;
247
248         __u8 padding;
249 };
250
251 /*******************************************************************************
252  * PCM I/O MESSAGES
253  */
254
255 /* I/O request header */
256 struct virtio_snd_pcm_xfer {
257         /* 0 ... virtio_snd_config::streams - 1 */
258         __le32 stream_id;
259 };
260
261 /* I/O request status */
262 struct virtio_snd_pcm_status {
263         /* VIRTIO_SND_S_XXX */
264         __le32 status;
265         /* current device latency */
266         __le32 latency_bytes;
267 };
268
269 /*******************************************************************************
270  * CHANNEL MAP CONTROL MESSAGES
271  */
272 struct virtio_snd_chmap_hdr {
273         /* VIRTIO_SND_R_CHMAP_XXX */
274         struct virtio_snd_hdr hdr;
275         /* 0 ... virtio_snd_config::chmaps - 1 */
276         __le32 chmap_id;
277 };
278
279 /* standard channel position definition */
280 enum {
281         VIRTIO_SND_CHMAP_NONE = 0,      /* undefined */
282         VIRTIO_SND_CHMAP_NA,            /* silent */
283         VIRTIO_SND_CHMAP_MONO,          /* mono stream */
284         VIRTIO_SND_CHMAP_FL,            /* front left */
285         VIRTIO_SND_CHMAP_FR,            /* front right */
286         VIRTIO_SND_CHMAP_RL,            /* rear left */
287         VIRTIO_SND_CHMAP_RR,            /* rear right */
288         VIRTIO_SND_CHMAP_FC,            /* front center */
289         VIRTIO_SND_CHMAP_LFE,           /* low frequency (LFE) */
290         VIRTIO_SND_CHMAP_SL,            /* side left */
291         VIRTIO_SND_CHMAP_SR,            /* side right */
292         VIRTIO_SND_CHMAP_RC,            /* rear center */
293         VIRTIO_SND_CHMAP_FLC,           /* front left center */
294         VIRTIO_SND_CHMAP_FRC,           /* front right center */
295         VIRTIO_SND_CHMAP_RLC,           /* rear left center */
296         VIRTIO_SND_CHMAP_RRC,           /* rear right center */
297         VIRTIO_SND_CHMAP_FLW,           /* front left wide */
298         VIRTIO_SND_CHMAP_FRW,           /* front right wide */
299         VIRTIO_SND_CHMAP_FLH,           /* front left high */
300         VIRTIO_SND_CHMAP_FCH,           /* front center high */
301         VIRTIO_SND_CHMAP_FRH,           /* front right high */
302         VIRTIO_SND_CHMAP_TC,            /* top center */
303         VIRTIO_SND_CHMAP_TFL,           /* top front left */
304         VIRTIO_SND_CHMAP_TFR,           /* top front right */
305         VIRTIO_SND_CHMAP_TFC,           /* top front center */
306         VIRTIO_SND_CHMAP_TRL,           /* top rear left */
307         VIRTIO_SND_CHMAP_TRR,           /* top rear right */
308         VIRTIO_SND_CHMAP_TRC,           /* top rear center */
309         VIRTIO_SND_CHMAP_TFLC,          /* top front left center */
310         VIRTIO_SND_CHMAP_TFRC,          /* top front right center */
311         VIRTIO_SND_CHMAP_TSL,           /* top side left */
312         VIRTIO_SND_CHMAP_TSR,           /* top side right */
313         VIRTIO_SND_CHMAP_LLFE,          /* left LFE */
314         VIRTIO_SND_CHMAP_RLFE,          /* right LFE */
315         VIRTIO_SND_CHMAP_BC,            /* bottom center */
316         VIRTIO_SND_CHMAP_BLC,           /* bottom left center */
317         VIRTIO_SND_CHMAP_BRC            /* bottom right center */
318 };
319
320 /* maximum possible number of channels */
321 #define VIRTIO_SND_CHMAP_MAX_SIZE       18
322
323 struct virtio_snd_chmap_info {
324         /* common header */
325         struct virtio_snd_info hdr;
326         /* dataflow direction (VIRTIO_SND_D_XXX) */
327         __u8 direction;
328         /* # of valid channel position values */
329         __u8 channels;
330         /* channel position values (VIRTIO_SND_CHMAP_XXX) */
331         __u8 positions[VIRTIO_SND_CHMAP_MAX_SIZE];
332 };
333
334 #endif /* VIRTIO_SND_IF_H */