xref: /openbmc/linux/include/xen/interface/io/sndif.h (revision fa84cf09)
1 /******************************************************************************
2  * sndif.h
3  *
4  * Unified sound-device I/O interface for Xen guest OSes.
5  *
6  * Permission is hereby granted, free of charge, to any person obtaining a copy
7  * of this software and associated documentation files (the "Software"), to
8  * deal in the Software without restriction, including without limitation the
9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10  * sell copies of the Software, and to permit persons to whom the Software is
11  * furnished to do so, subject to the following conditions:
12  *
13  * The above copyright notice and this permission notice shall be included in
14  * all copies or substantial portions of the Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  *
24  * Copyright (C) 2013-2015 GlobalLogic Inc.
25  * Copyright (C) 2016-2017 EPAM Systems Inc.
26  *
27  * Authors: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
28  *          Oleksandr Grytsov <oleksandr_grytsov@epam.com>
29  *          Oleksandr Dmytryshyn <oleksandr.dmytryshyn@globallogic.com>
30  *          Iurii Konovalenko <iurii.konovalenko@globallogic.com>
31  */
32 
33 #ifndef __XEN_PUBLIC_IO_SNDIF_H__
34 #define __XEN_PUBLIC_IO_SNDIF_H__
35 
36 #include "ring.h"
37 #include "../grant_table.h"
38 
39 /*
40  ******************************************************************************
41  *                           Protocol version
42  ******************************************************************************
43  */
44 #define XENSND_PROTOCOL_VERSION	2
45 
46 /*
47  ******************************************************************************
48  *                  Feature and Parameter Negotiation
49  ******************************************************************************
50  *
51  * Front->back notifications: when enqueuing a new request, sending a
52  * notification can be made conditional on xensnd_req (i.e., the generic
53  * hold-off mechanism provided by the ring macros). Backends must set
54  * xensnd_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()).
55  *
56  * Back->front notifications: when enqueuing a new response, sending a
57  * notification can be made conditional on xensnd_resp (i.e., the generic
58  * hold-off mechanism provided by the ring macros). Frontends must set
59  * xensnd_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()).
60  *
61  * The two halves of a para-virtual sound card driver utilize nodes within
62  * XenStore to communicate capabilities and to negotiate operating parameters.
63  * This section enumerates these nodes which reside in the respective front and
64  * backend portions of XenStore, following the XenBus convention.
65  *
66  * All data in XenStore is stored as strings. Nodes specifying numeric
67  * values are encoded in decimal. Integer value ranges listed below are
68  * expressed as fixed sized integer types capable of storing the conversion
69  * of a properly formated node string, without loss of information.
70  *
71  ******************************************************************************
72  *                        Example configuration
73  ******************************************************************************
74  *
75  * Note: depending on the use-case backend can expose more sound cards and
76  * PCM devices/streams than the underlying HW physically has by employing
77  * SW mixers, configuring virtual sound streams, channels etc.
78  *
79  * This is an example of backend and frontend configuration:
80  *
81  *--------------------------------- Backend -----------------------------------
82  *
83  * /local/domain/0/backend/vsnd/1/0/frontend-id = "1"
84  * /local/domain/0/backend/vsnd/1/0/frontend = "/local/domain/1/device/vsnd/0"
85  * /local/domain/0/backend/vsnd/1/0/state = "4"
86  * /local/domain/0/backend/vsnd/1/0/versions = "1,2"
87  *
88  *--------------------------------- Frontend ----------------------------------
89  *
90  * /local/domain/1/device/vsnd/0/backend-id = "0"
91  * /local/domain/1/device/vsnd/0/backend = "/local/domain/0/backend/vsnd/1/0"
92  * /local/domain/1/device/vsnd/0/state = "4"
93  * /local/domain/1/device/vsnd/0/version = "1"
94  *
95  *----------------------------- Card configuration ----------------------------
96  *
97  * /local/domain/1/device/vsnd/0/short-name = "Card short name"
98  * /local/domain/1/device/vsnd/0/long-name = "Card long name"
99  * /local/domain/1/device/vsnd/0/sample-rates = "8000,32000,44100,48000,96000"
100  * /local/domain/1/device/vsnd/0/sample-formats = "s8,u8,s16_le,s16_be"
101  * /local/domain/1/device/vsnd/0/buffer-size = "262144"
102  *
103  *------------------------------- PCM device 0 --------------------------------
104  *
105  * /local/domain/1/device/vsnd/0/0/name = "General analog"
106  * /local/domain/1/device/vsnd/0/0/channels-max = "5"
107  *
108  *----------------------------- Stream 0, playback ----------------------------
109  *
110  * /local/domain/1/device/vsnd/0/0/0/type = "p"
111  * /local/domain/1/device/vsnd/0/0/0/sample-formats = "s8,u8"
112  * /local/domain/1/device/vsnd/0/0/0/unique-id = "0"
113  *
114  * /local/domain/1/device/vsnd/0/0/0/ring-ref = "386"
115  * /local/domain/1/device/vsnd/0/0/0/event-channel = "15"
116  * /local/domain/1/device/vsnd/0/0/0/evt-ring-ref = "1386"
117  * /local/domain/1/device/vsnd/0/0/0/evt-event-channel = "215"
118  *
119  *------------------------------ Stream 1, capture ----------------------------
120  *
121  * /local/domain/1/device/vsnd/0/0/1/type = "c"
122  * /local/domain/1/device/vsnd/0/0/1/channels-max = "2"
123  * /local/domain/1/device/vsnd/0/0/1/unique-id = "1"
124  *
125  * /local/domain/1/device/vsnd/0/0/1/ring-ref = "384"
126  * /local/domain/1/device/vsnd/0/0/1/event-channel = "13"
127  * /local/domain/1/device/vsnd/0/0/1/evt-ring-ref = "1384"
128  * /local/domain/1/device/vsnd/0/0/1/evt-event-channel = "213"
129  *
130  *------------------------------- PCM device 1 --------------------------------
131  *
132  * /local/domain/1/device/vsnd/0/1/name = "HDMI-0"
133  * /local/domain/1/device/vsnd/0/1/sample-rates = "8000,32000,44100"
134  *
135  *------------------------------ Stream 0, capture ----------------------------
136  *
137  * /local/domain/1/device/vsnd/0/1/0/type = "c"
138  * /local/domain/1/device/vsnd/0/1/0/unique-id = "2"
139  *
140  * /local/domain/1/device/vsnd/0/1/0/ring-ref = "387"
141  * /local/domain/1/device/vsnd/0/1/0/event-channel = "151"
142  * /local/domain/1/device/vsnd/0/1/0/evt-ring-ref = "1387"
143  * /local/domain/1/device/vsnd/0/1/0/evt-event-channel = "351"
144  *
145  *------------------------------- PCM device 2 --------------------------------
146  *
147  * /local/domain/1/device/vsnd/0/2/name = "SPDIF"
148  *
149  *----------------------------- Stream 0, playback ----------------------------
150  *
151  * /local/domain/1/device/vsnd/0/2/0/type = "p"
152  * /local/domain/1/device/vsnd/0/2/0/unique-id = "3"
153  *
154  * /local/domain/1/device/vsnd/0/2/0/ring-ref = "389"
155  * /local/domain/1/device/vsnd/0/2/0/event-channel = "152"
156  * /local/domain/1/device/vsnd/0/2/0/evt-ring-ref = "1389"
157  * /local/domain/1/device/vsnd/0/2/0/evt-event-channel = "452"
158  *
159  ******************************************************************************
160  *                            Backend XenBus Nodes
161  ******************************************************************************
162  *
163  *----------------------------- Protocol version ------------------------------
164  *
165  * versions
166  *      Values:         <string>
167  *
168  *      List of XENSND_LIST_SEPARATOR separated protocol versions supported
169  *      by the backend. For example "1,2,3".
170  *
171  ******************************************************************************
172  *                            Frontend XenBus Nodes
173  ******************************************************************************
174  *
175  *-------------------------------- Addressing ---------------------------------
176  *
177  * dom-id
178  *      Values:         <uint16_t>
179  *
180  *      Domain identifier.
181  *
182  * dev-id
183  *      Values:         <uint16_t>
184  *
185  *      Device identifier.
186  *
187  * pcm-dev-idx
188  *      Values:         <uint8_t>
189  *
190  *      Zero based contigous index of the PCM device.
191  *
192  * stream-idx
193  *      Values:         <uint8_t>
194  *
195  *      Zero based contigous index of the stream of the PCM device.
196  *
197  * The following pattern is used for addressing:
198  *   /local/domain/<dom-id>/device/vsnd/<dev-id>/<pcm-dev-idx>/<stream-idx>/...
199  *
200  *----------------------------- Protocol version ------------------------------
201  *
202  * version
203  *      Values:         <string>
204  *
205  *      Protocol version, chosen among the ones supported by the backend.
206  *
207  *------------------------------- PCM settings --------------------------------
208  *
209  * Every virtualized sound frontend has a set of PCM devices and streams, each
210  * could be individually configured. Part of the PCM configuration can be
211  * defined at higher level of the hierarchy and be fully or partially re-used
212  * by the underlying layers. These configuration values are:
213  *  o number of channels (min/max)
214  *  o supported sample rates
215  *  o supported sample formats.
216  * E.g. one can define these values for the whole card, device or stream.
217  * Every underlying layer in turn can re-define some or all of them to better
218  * fit its needs. For example, card may define number of channels to be
219  * in [1; 8] range, and some particular stream may be limited to [1; 2] only.
220  * The rule is that the underlying layer must be a subset of the upper layer
221  * range.
222  *
223  * channels-min
224  *      Values:         <uint8_t>
225  *
226  *      The minimum amount of channels that is supported, [1; channels-max].
227  *      Optional, if not set or omitted a value of 1 is used.
228  *
229  * channels-max
230  *      Values:         <uint8_t>
231  *
232  *      The maximum amount of channels that is supported.
233  *      Must be at least <channels-min>.
234  *
235  * sample-rates
236  *      Values:         <list of uint32_t>
237  *
238  *      List of supported sample rates separated by XENSND_LIST_SEPARATOR.
239  *      Sample rates are expressed as a list of decimal values w/o any
240  *      ordering requirement.
241  *
242  * sample-formats
243  *      Values:         <list of XENSND_PCM_FORMAT_XXX_STR>
244  *
245  *      List of supported sample formats separated by XENSND_LIST_SEPARATOR.
246  *      Items must not exceed XENSND_SAMPLE_FORMAT_MAX_LEN length.
247  *
248  * buffer-size
249  *      Values:         <uint32_t>
250  *
251  *      The maximum size in octets of the buffer to allocate per stream.
252  *
253  *----------------------- Virtual sound card settings -------------------------
254  * short-name
255  *      Values:         <char[32]>
256  *
257  *      Short name of the virtual sound card. Optional.
258  *
259  * long-name
260  *      Values:         <char[80]>
261  *
262  *      Long name of the virtual sound card. Optional.
263  *
264  *----------------------------- Device settings -------------------------------
265  * name
266  *      Values:         <char[80]>
267  *
268  *      Name of the sound device within the virtual sound card. Optional.
269  *
270  *----------------------------- Stream settings -------------------------------
271  *
272  * type
273  *      Values:         "p", "c"
274  *
275  *      Stream type: "p" - playback stream, "c" - capture stream
276  *
277  *      If both capture and playback are needed then two streams need to be
278  *      defined under the same device.
279  *
280  * unique-id
281  *      Values:         <uint32_t>
282  *
283  *      After stream initialization it is assigned a unique ID (within the front
284  *      driver), so every stream of the frontend can be identified by the
285  *      backend by this ID. This is not equal to stream-idx as the later is
286  *      zero based within the device, but this index is contigous within the
287  *      driver.
288  *
289  *-------------------- Stream Request Transport Parameters --------------------
290  *
291  * event-channel
292  *      Values:         <uint32_t>
293  *
294  *      The identifier of the Xen event channel used to signal activity
295  *      in the ring buffer.
296  *
297  * ring-ref
298  *      Values:         <uint32_t>
299  *
300  *      The Xen grant reference granting permission for the backend to map
301  *      a sole page in a single page sized ring buffer.
302  *
303  *--------------------- Stream Event Transport Parameters ---------------------
304  *
305  * This communication path is used to deliver asynchronous events from backend
306  * to frontend, set up per stream.
307  *
308  * evt-event-channel
309  *      Values:         <uint32_t>
310  *
311  *      The identifier of the Xen event channel used to signal activity
312  *      in the ring buffer.
313  *
314  * evt-ring-ref
315  *      Values:         <uint32_t>
316  *
317  *      The Xen grant reference granting permission for the backend to map
318  *      a sole page in a single page sized ring buffer.
319  *
320  ******************************************************************************
321  *                               STATE DIAGRAMS
322  ******************************************************************************
323  *
324  * Tool stack creates front and back state nodes with initial state
325  * XenbusStateInitialising.
326  * Tool stack creates and sets up frontend sound configuration nodes per domain.
327  *
328  * Front                                Back
329  * =================================    =====================================
330  * XenbusStateInitialising              XenbusStateInitialising
331  *                                       o Query backend device identification
332  *                                         data.
333  *                                       o Open and validate backend device.
334  *                                                      |
335  *                                                      |
336  *                                                      V
337  *                                      XenbusStateInitWait
338  *
339  * o Query frontend configuration
340  * o Allocate and initialize
341  *   event channels per configured
342  *   playback/capture stream.
343  * o Publish transport parameters
344  *   that will be in effect during
345  *   this connection.
346  *              |
347  *              |
348  *              V
349  * XenbusStateInitialised
350  *
351  *                                       o Query frontend transport parameters.
352  *                                       o Connect to the event channels.
353  *                                                      |
354  *                                                      |
355  *                                                      V
356  *                                      XenbusStateConnected
357  *
358  *  o Create and initialize OS
359  *    virtual sound device instances
360  *    as per configuration.
361  *              |
362  *              |
363  *              V
364  * XenbusStateConnected
365  *
366  *                                      XenbusStateUnknown
367  *                                      XenbusStateClosed
368  *                                      XenbusStateClosing
369  * o Remove virtual sound device
370  * o Remove event channels
371  *              |
372  *              |
373  *              V
374  * XenbusStateClosed
375  *
376  *------------------------------- Recovery flow -------------------------------
377  *
378  * In case of frontend unrecoverable errors backend handles that as
379  * if frontend goes into the XenbusStateClosed state.
380  *
381  * In case of backend unrecoverable errors frontend tries removing
382  * the virtualized device. If this is possible at the moment of error,
383  * then frontend goes into the XenbusStateInitialising state and is ready for
384  * new connection with backend. If the virtualized device is still in use and
385  * cannot be removed, then frontend goes into the XenbusStateReconfiguring state
386  * until either the virtualized device removed or backend initiates a new
387  * connection. On the virtualized device removal frontend goes into the
388  * XenbusStateInitialising state.
389  *
390  * Note on XenbusStateReconfiguring state of the frontend: if backend has
391  * unrecoverable errors then frontend cannot send requests to the backend
392  * and thus cannot provide functionality of the virtualized device anymore.
393  * After backend is back to normal the virtualized device may still hold some
394  * state: configuration in use, allocated buffers, client application state etc.
395  * So, in most cases, this will require frontend to implement complex recovery
396  * reconnect logic. Instead, by going into XenbusStateReconfiguring state,
397  * frontend will make sure no new clients of the virtualized device are
398  * accepted, allow existing client(s) to exit gracefully by signaling error
399  * state etc.
400  * Once all the clients are gone frontend can reinitialize the virtualized
401  * device and get into XenbusStateInitialising state again signaling the
402  * backend that a new connection can be made.
403  *
404  * There are multiple conditions possible under which frontend will go from
405  * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS
406  * specific. For example:
407  * 1. The underlying OS framework may provide callbacks to signal that the last
408  *    client of the virtualized device has gone and the device can be removed
409  * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue)
410  *    to periodically check if this is the right time to re-try removal of
411  *    the virtualized device.
412  * 3. By any other means.
413  *
414  ******************************************************************************
415  *                             PCM FORMATS
416  ******************************************************************************
417  *
418  * XENSND_PCM_FORMAT_<format>[_<endian>]
419  *
420  * format: <S/U/F><bits> or <name>
421  *     S - signed, U - unsigned, F - float
422  *     bits - 8, 16, 24, 32
423  *     name - MU_LAW, GSM, etc.
424  *
425  * endian: <LE/BE>, may be absent
426  *     LE - Little endian, BE - Big endian
427  */
428 #define XENSND_PCM_FORMAT_S8		0
429 #define XENSND_PCM_FORMAT_U8		1
430 #define XENSND_PCM_FORMAT_S16_LE	2
431 #define XENSND_PCM_FORMAT_S16_BE	3
432 #define XENSND_PCM_FORMAT_U16_LE	4
433 #define XENSND_PCM_FORMAT_U16_BE	5
434 #define XENSND_PCM_FORMAT_S24_LE	6
435 #define XENSND_PCM_FORMAT_S24_BE	7
436 #define XENSND_PCM_FORMAT_U24_LE	8
437 #define XENSND_PCM_FORMAT_U24_BE	9
438 #define XENSND_PCM_FORMAT_S32_LE	10
439 #define XENSND_PCM_FORMAT_S32_BE	11
440 #define XENSND_PCM_FORMAT_U32_LE	12
441 #define XENSND_PCM_FORMAT_U32_BE	13
442 #define XENSND_PCM_FORMAT_F32_LE	14 /* 4-byte float, IEEE-754 32-bit, */
443 #define XENSND_PCM_FORMAT_F32_BE	15 /* range -1.0 to 1.0              */
444 #define XENSND_PCM_FORMAT_F64_LE	16 /* 8-byte float, IEEE-754 64-bit, */
445 #define XENSND_PCM_FORMAT_F64_BE	17 /* range -1.0 to 1.0              */
446 #define XENSND_PCM_FORMAT_IEC958_SUBFRAME_LE 18
447 #define XENSND_PCM_FORMAT_IEC958_SUBFRAME_BE 19
448 #define XENSND_PCM_FORMAT_MU_LAW	20
449 #define XENSND_PCM_FORMAT_A_LAW		21
450 #define XENSND_PCM_FORMAT_IMA_ADPCM	22
451 #define XENSND_PCM_FORMAT_MPEG		23
452 #define XENSND_PCM_FORMAT_GSM		24
453 
454 /*
455  ******************************************************************************
456  *                             REQUEST CODES
457  ******************************************************************************
458  */
459 #define XENSND_OP_OPEN			0
460 #define XENSND_OP_CLOSE			1
461 #define XENSND_OP_READ			2
462 #define XENSND_OP_WRITE			3
463 #define XENSND_OP_SET_VOLUME		4
464 #define XENSND_OP_GET_VOLUME		5
465 #define XENSND_OP_MUTE			6
466 #define XENSND_OP_UNMUTE		7
467 #define XENSND_OP_TRIGGER		8
468 #define XENSND_OP_HW_PARAM_QUERY	9
469 
470 #define XENSND_OP_TRIGGER_START		0
471 #define XENSND_OP_TRIGGER_PAUSE		1
472 #define XENSND_OP_TRIGGER_STOP		2
473 #define XENSND_OP_TRIGGER_RESUME	3
474 
475 /*
476  ******************************************************************************
477  *                                 EVENT CODES
478  ******************************************************************************
479  */
480 #define XENSND_EVT_CUR_POS		0
481 
482 /*
483  ******************************************************************************
484  *               XENSTORE FIELD AND PATH NAME STRINGS, HELPERS
485  ******************************************************************************
486  */
487 #define XENSND_DRIVER_NAME		"vsnd"
488 
489 #define XENSND_LIST_SEPARATOR		","
490 /* Field names */
491 #define XENSND_FIELD_BE_VERSIONS	"versions"
492 #define XENSND_FIELD_FE_VERSION		"version"
493 #define XENSND_FIELD_VCARD_SHORT_NAME	"short-name"
494 #define XENSND_FIELD_VCARD_LONG_NAME	"long-name"
495 #define XENSND_FIELD_RING_REF		"ring-ref"
496 #define XENSND_FIELD_EVT_CHNL		"event-channel"
497 #define XENSND_FIELD_EVT_RING_REF	"evt-ring-ref"
498 #define XENSND_FIELD_EVT_EVT_CHNL	"evt-event-channel"
499 #define XENSND_FIELD_DEVICE_NAME	"name"
500 #define XENSND_FIELD_TYPE		"type"
501 #define XENSND_FIELD_STREAM_UNIQUE_ID	"unique-id"
502 #define XENSND_FIELD_CHANNELS_MIN	"channels-min"
503 #define XENSND_FIELD_CHANNELS_MAX	"channels-max"
504 #define XENSND_FIELD_SAMPLE_RATES	"sample-rates"
505 #define XENSND_FIELD_SAMPLE_FORMATS	"sample-formats"
506 #define XENSND_FIELD_BUFFER_SIZE	"buffer-size"
507 
508 /* Stream type field values. */
509 #define XENSND_STREAM_TYPE_PLAYBACK	"p"
510 #define XENSND_STREAM_TYPE_CAPTURE	"c"
511 /* Sample rate max string length */
512 #define XENSND_SAMPLE_RATE_MAX_LEN	11
513 /* Sample format field values */
514 #define XENSND_SAMPLE_FORMAT_MAX_LEN	24
515 
516 #define XENSND_PCM_FORMAT_S8_STR	"s8"
517 #define XENSND_PCM_FORMAT_U8_STR	"u8"
518 #define XENSND_PCM_FORMAT_S16_LE_STR	"s16_le"
519 #define XENSND_PCM_FORMAT_S16_BE_STR	"s16_be"
520 #define XENSND_PCM_FORMAT_U16_LE_STR	"u16_le"
521 #define XENSND_PCM_FORMAT_U16_BE_STR	"u16_be"
522 #define XENSND_PCM_FORMAT_S24_LE_STR	"s24_le"
523 #define XENSND_PCM_FORMAT_S24_BE_STR	"s24_be"
524 #define XENSND_PCM_FORMAT_U24_LE_STR	"u24_le"
525 #define XENSND_PCM_FORMAT_U24_BE_STR	"u24_be"
526 #define XENSND_PCM_FORMAT_S32_LE_STR	"s32_le"
527 #define XENSND_PCM_FORMAT_S32_BE_STR	"s32_be"
528 #define XENSND_PCM_FORMAT_U32_LE_STR	"u32_le"
529 #define XENSND_PCM_FORMAT_U32_BE_STR	"u32_be"
530 #define XENSND_PCM_FORMAT_F32_LE_STR	"float_le"
531 #define XENSND_PCM_FORMAT_F32_BE_STR	"float_be"
532 #define XENSND_PCM_FORMAT_F64_LE_STR	"float64_le"
533 #define XENSND_PCM_FORMAT_F64_BE_STR	"float64_be"
534 #define XENSND_PCM_FORMAT_IEC958_SUBFRAME_LE_STR "iec958_subframe_le"
535 #define XENSND_PCM_FORMAT_IEC958_SUBFRAME_BE_STR "iec958_subframe_be"
536 #define XENSND_PCM_FORMAT_MU_LAW_STR	"mu_law"
537 #define XENSND_PCM_FORMAT_A_LAW_STR	"a_law"
538 #define XENSND_PCM_FORMAT_IMA_ADPCM_STR	"ima_adpcm"
539 #define XENSND_PCM_FORMAT_MPEG_STR	"mpeg"
540 #define XENSND_PCM_FORMAT_GSM_STR	"gsm"
541 
542 
543 /*
544  ******************************************************************************
545  *                          STATUS RETURN CODES
546  ******************************************************************************
547  *
548  * Status return code is zero on success and -XEN_EXX on failure.
549  *
550  ******************************************************************************
551  *                              Assumptions
552  ******************************************************************************
553  * o usage of grant reference 0 as invalid grant reference:
554  *   grant reference 0 is valid, but never exposed to a PV driver,
555  *   because of the fact it is already in use/reserved by the PV console.
556  * o all references in this document to page sizes must be treated
557  *   as pages of size XEN_PAGE_SIZE unless otherwise noted.
558  *
559  ******************************************************************************
560  *       Description of the protocol between frontend and backend driver
561  ******************************************************************************
562  *
563  * The two halves of a Para-virtual sound driver communicate with
564  * each other using shared pages and event channels.
565  * Shared page contains a ring with request/response packets.
566  *
567  * Packets, used for input/output operations, e.g. read/write, set/get volume,
568  * etc., provide offset/length fields in order to allow asynchronous protocol
569  * operation with buffer space sharing: part of the buffer allocated at
570  * XENSND_OP_OPEN can be used for audio samples and part, for example,
571  * for volume control.
572  *
573  * All reserved fields in the structures below must be 0.
574  *
575  *---------------------------------- Requests ---------------------------------
576  *
577  * All request packets have the same length (64 octets)
578  * All request packets have common header:
579  *         0                1                 2               3        octet
580  * +----------------+----------------+----------------+----------------+
581  * |               id                |    operation   |    reserved    | 4
582  * +----------------+----------------+----------------+----------------+
583  * |                             reserved                              | 8
584  * +----------------+----------------+----------------+----------------+
585  *   id - uint16_t, private guest value, echoed in response
586  *   operation - uint8_t, operation code, XENSND_OP_???
587  *
588  * For all packets which use offset and length:
589  *   offset - uint32_t, read or write data offset within the shared buffer,
590  *     passed with XENSND_OP_OPEN request, octets,
591  *     [0; XENSND_OP_OPEN.buffer_sz - 1].
592  *   length - uint32_t, read or write data length, octets
593  *
594  * Request open - open a PCM stream for playback or capture:
595  *
596  *         0                1                 2               3        octet
597  * +----------------+----------------+----------------+----------------+
598  * |               id                | XENSND_OP_OPEN |    reserved    | 4
599  * +----------------+----------------+----------------+----------------+
600  * |                             reserved                              | 8
601  * +----------------+----------------+----------------+----------------+
602  * |                             pcm_rate                              | 12
603  * +----------------+----------------+----------------+----------------+
604  * |  pcm_format    |  pcm_channels  |             reserved            | 16
605  * +----------------+----------------+----------------+----------------+
606  * |                             buffer_sz                             | 20
607  * +----------------+----------------+----------------+----------------+
608  * |                           gref_directory                          | 24
609  * +----------------+----------------+----------------+----------------+
610  * |                             period_sz                             | 28
611  * +----------------+----------------+----------------+----------------+
612  * |                             reserved                              | 32
613  * +----------------+----------------+----------------+----------------+
614  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
615  * +----------------+----------------+----------------+----------------+
616  * |                             reserved                              | 64
617  * +----------------+----------------+----------------+----------------+
618  *
619  * pcm_rate - uint32_t, stream data rate, Hz
620  * pcm_format - uint8_t, XENSND_PCM_FORMAT_XXX value
621  * pcm_channels - uint8_t, number of channels of this stream,
622  *   [channels-min; channels-max]
623  * buffer_sz - uint32_t, buffer size to be allocated, octets
624  * period_sz - uint32_t, event period size, octets
625  *   This is the requested value of the period at which frontend would
626  *   like to receive XENSND_EVT_CUR_POS notifications from the backend when
627  *   stream position advances during playback/capture.
628  *   It shows how many octets are expected to be played/captured before
629  *   sending such an event.
630  *   If set to 0 no XENSND_EVT_CUR_POS events are sent by the backend.
631  *
632  * gref_directory - grant_ref_t, a reference to the first shared page
633  *   describing shared buffer references. At least one page exists. If shared
634  *   buffer size  (buffer_sz) exceeds what can be addressed by this single page,
635  *   then reference to the next page must be supplied (see gref_dir_next_page
636  *   below)
637  */
638 
639 struct xensnd_open_req {
640 	uint32_t pcm_rate;
641 	uint8_t pcm_format;
642 	uint8_t pcm_channels;
643 	uint16_t reserved;
644 	uint32_t buffer_sz;
645 	grant_ref_t gref_directory;
646 	uint32_t period_sz;
647 };
648 
649 /*
650  * Shared page for XENSND_OP_OPEN buffer descriptor (gref_directory in the
651  *   request) employs a list of pages, describing all pages of the shared data
652  *   buffer:
653  *         0                1                 2               3        octet
654  * +----------------+----------------+----------------+----------------+
655  * |                        gref_dir_next_page                         | 4
656  * +----------------+----------------+----------------+----------------+
657  * |                              gref[0]                              | 8
658  * +----------------+----------------+----------------+----------------+
659  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
660  * +----------------+----------------+----------------+----------------+
661  * |                              gref[i]                              | i*4+8
662  * +----------------+----------------+----------------+----------------+
663  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
664  * +----------------+----------------+----------------+----------------+
665  * |                             gref[N - 1]                           | N*4+8
666  * +----------------+----------------+----------------+----------------+
667  *
668  * gref_dir_next_page - grant_ref_t, reference to the next page describing
669  *   page directory. Must be 0 if there are no more pages in the list.
670  * gref[i] - grant_ref_t, reference to a shared page of the buffer
671  *   allocated at XENSND_OP_OPEN
672  *
673  * Number of grant_ref_t entries in the whole page directory is not
674  * passed, but instead can be calculated as:
675  *   num_grefs_total = (XENSND_OP_OPEN.buffer_sz + XEN_PAGE_SIZE - 1) /
676  *       XEN_PAGE_SIZE
677  */
678 
679 struct xensnd_page_directory {
680 	grant_ref_t gref_dir_next_page;
681 	grant_ref_t gref[1]; /* Variable length */
682 };
683 
684 /*
685  *  Request close - close an opened pcm stream:
686  *         0                1                 2               3        octet
687  * +----------------+----------------+----------------+----------------+
688  * |               id                | XENSND_OP_CLOSE|    reserved    | 4
689  * +----------------+----------------+----------------+----------------+
690  * |                             reserved                              | 8
691  * +----------------+----------------+----------------+----------------+
692  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
693  * +----------------+----------------+----------------+----------------+
694  * |                             reserved                              | 64
695  * +----------------+----------------+----------------+----------------+
696  *
697  * Request read/write - used for read (for capture) or write (for playback):
698  *         0                1                 2               3        octet
699  * +----------------+----------------+----------------+----------------+
700  * |               id                |   operation    |    reserved    | 4
701  * +----------------+----------------+----------------+----------------+
702  * |                             reserved                              | 8
703  * +----------------+----------------+----------------+----------------+
704  * |                              offset                               | 12
705  * +----------------+----------------+----------------+----------------+
706  * |                              length                               | 16
707  * +----------------+----------------+----------------+----------------+
708  * |                             reserved                              | 20
709  * +----------------+----------------+----------------+----------------+
710  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
711  * +----------------+----------------+----------------+----------------+
712  * |                             reserved                              | 64
713  * +----------------+----------------+----------------+----------------+
714  *
715  * operation - XENSND_OP_READ for read or XENSND_OP_WRITE for write
716  */
717 
718 struct xensnd_rw_req {
719 	uint32_t offset;
720 	uint32_t length;
721 };
722 
723 /*
724  * Request set/get volume - set/get channels' volume of the stream given:
725  *         0                1                 2               3        octet
726  * +----------------+----------------+----------------+----------------+
727  * |               id                |   operation    |    reserved    | 4
728  * +----------------+----------------+----------------+----------------+
729  * |                             reserved                              | 8
730  * +----------------+----------------+----------------+----------------+
731  * |                              offset                               | 12
732  * +----------------+----------------+----------------+----------------+
733  * |                              length                               | 16
734  * +----------------+----------------+----------------+----------------+
735  * |                             reserved                              | 20
736  * +----------------+----------------+----------------+----------------+
737  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
738  * +----------------+----------------+----------------+----------------+
739  * |                             reserved                              | 64
740  * +----------------+----------------+----------------+----------------+
741  *
742  * operation - XENSND_OP_SET_VOLUME for volume set
743  *   or XENSND_OP_GET_VOLUME for volume get
744  * Buffer passed with XENSND_OP_OPEN is used to exchange volume
745  * values:
746  *
747  *         0                1                 2               3        octet
748  * +----------------+----------------+----------------+----------------+
749  * |                             channel[0]                            | 4
750  * +----------------+----------------+----------------+----------------+
751  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
752  * +----------------+----------------+----------------+----------------+
753  * |                             channel[i]                            | i*4
754  * +----------------+----------------+----------------+----------------+
755  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
756  * +----------------+----------------+----------------+----------------+
757  * |                           channel[N - 1]                          | (N-1)*4
758  * +----------------+----------------+----------------+----------------+
759  *
760  * N = XENSND_OP_OPEN.pcm_channels
761  * i - uint8_t, index of a channel
762  * channel[i] - sint32_t, volume of i-th channel
763  * Volume is expressed as a signed value in steps of 0.001 dB,
764  * while 0 being 0 dB.
765  *
766  * Request mute/unmute - mute/unmute stream:
767  *         0                1                 2               3        octet
768  * +----------------+----------------+----------------+----------------+
769  * |               id                |   operation    |    reserved    | 4
770  * +----------------+----------------+----------------+----------------+
771  * |                             reserved                              | 8
772  * +----------------+----------------+----------------+----------------+
773  * |                              offset                               | 12
774  * +----------------+----------------+----------------+----------------+
775  * |                              length                               | 16
776  * +----------------+----------------+----------------+----------------+
777  * |                             reserved                              | 20
778  * +----------------+----------------+----------------+----------------+
779  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
780  * +----------------+----------------+----------------+----------------+
781  * |                             reserved                              | 64
782  * +----------------+----------------+----------------+----------------+
783  *
784  * operation - XENSND_OP_MUTE for mute or XENSND_OP_UNMUTE for unmute
785  * Buffer passed with XENSND_OP_OPEN is used to exchange mute/unmute
786  * values:
787  *
788  *                                   0                                 octet
789  * +----------------+----------------+----------------+----------------+
790  * |                             channel[0]                            | 4
791  * +----------------+----------------+----------------+----------------+
792  * +/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
793  * +----------------+----------------+----------------+----------------+
794  * |                             channel[i]                            | i*4
795  * +----------------+----------------+----------------+----------------+
796  * +/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
797  * +----------------+----------------+----------------+----------------+
798  * |                           channel[N - 1]                          | (N-1)*4
799  * +----------------+----------------+----------------+----------------+
800  *
801  * N = XENSND_OP_OPEN.pcm_channels
802  * i - uint8_t, index of a channel
803  * channel[i] - uint8_t, non-zero if i-th channel needs to be muted/unmuted
804  *
805  *------------------------------------ N.B. -----------------------------------
806  *
807  * The 'struct xensnd_rw_req' is also used for XENSND_OP_SET_VOLUME,
808  * XENSND_OP_GET_VOLUME, XENSND_OP_MUTE, XENSND_OP_UNMUTE.
809  *
810  * Request stream running state change - trigger PCM stream running state
811  * to start, stop, pause or resume:
812  *
813  *         0                1                 2               3        octet
814  * +----------------+----------------+----------------+----------------+
815  * |               id                |   _OP_TRIGGER  |    reserved    | 4
816  * +----------------+----------------+----------------+----------------+
817  * |                             reserved                              | 8
818  * +----------------+----------------+----------------+----------------+
819  * |      type      |                     reserved                     | 12
820  * +----------------+----------------+----------------+----------------+
821  * |                             reserved                              | 16
822  * +----------------+----------------+----------------+----------------+
823  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
824  * +----------------+----------------+----------------+----------------+
825  * |                             reserved                              | 64
826  * +----------------+----------------+----------------+----------------+
827  *
828  * type - uint8_t, XENSND_OP_TRIGGER_XXX value
829  */
830 
831 struct xensnd_trigger_req {
832 	uint8_t type;
833 };
834 
835 /*
836  * Request stream parameter ranges: request intervals and
837  *   masks of supported ranges for stream configuration values.
838  *
839  *   Sound device configuration for a particular stream is a limited subset
840  *   of the multidimensional configuration available on XenStore, e.g.
841  *   once the frame rate has been selected there is a limited supported range
842  *   for sample rates becomes available (which might be the same set configured
843  *   on XenStore or less). For example, selecting 96kHz sample rate may limit
844  *   number of channels available for such configuration from 4 to 2, etc.
845  *   Thus, each call to XENSND_OP_HW_PARAM_QUERY may reduce configuration
846  *   space making it possible to iteratively get the final stream configuration,
847  *   used in XENSND_OP_OPEN request.
848  *
849  *   See response format for this request.
850  *
851  *         0                1                 2               3        octet
852  * +----------------+----------------+----------------+----------------+
853  * |               id                | _HW_PARAM_QUERY|    reserved    | 4
854  * +----------------+----------------+----------------+----------------+
855  * |                             reserved                              | 8
856  * +----------------+----------------+----------------+----------------+
857  * |                     formats mask low 32-bit                       | 12
858  * +----------------+----------------+----------------+----------------+
859  * |                     formats mask high 32-bit                      | 16
860  * +----------------+----------------+----------------+----------------+
861  * |                              min rate                             | 20
862  * +----------------+----------------+----------------+----------------+
863  * |                              max rate                             | 24
864  * +----------------+----------------+----------------+----------------+
865  * |                            min channels                           | 28
866  * +----------------+----------------+----------------+----------------+
867  * |                            max channels                           | 32
868  * +----------------+----------------+----------------+----------------+
869  * |                         min buffer frames                         | 36
870  * +----------------+----------------+----------------+----------------+
871  * |                         max buffer frames                         | 40
872  * +----------------+----------------+----------------+----------------+
873  * |                         min period frames                         | 44
874  * +----------------+----------------+----------------+----------------+
875  * |                         max period frames                         | 48
876  * +----------------+----------------+----------------+----------------+
877  * |                             reserved                              | 52
878  * +----------------+----------------+----------------+----------------+
879  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
880  * +----------------+----------------+----------------+----------------+
881  * |                             reserved                              | 64
882  * +----------------+----------------+----------------+----------------+
883  *
884  * formats - uint64_t, bit mask representing values of the parameter
885  *     made as bitwise OR of (1 << XENSND_PCM_FORMAT_XXX) values
886  *
887  * For interval parameters:
888  *   min - uint32_t, minimum value of the parameter
889  *   max - uint32_t, maximum value of the parameter
890  *
891  * Frame is defined as a product of the number of channels by the
892  * number of octets per one sample.
893  */
894 
895 struct xensnd_query_hw_param {
896 	uint64_t formats;
897 	struct {
898 		uint32_t min;
899 		uint32_t max;
900 	} rates;
901 	struct {
902 		uint32_t min;
903 		uint32_t max;
904 	} channels;
905 	struct {
906 		uint32_t min;
907 		uint32_t max;
908 	} buffer;
909 	struct {
910 		uint32_t min;
911 		uint32_t max;
912 	} period;
913 };
914 
915 /*
916  *---------------------------------- Responses --------------------------------
917  *
918  * All response packets have the same length (64 octets)
919  *
920  * All response packets have common header:
921  *         0                1                 2               3        octet
922  * +----------------+----------------+----------------+----------------+
923  * |               id                |    operation   |    reserved    | 4
924  * +----------------+----------------+----------------+----------------+
925  * |                              status                               | 8
926  * +----------------+----------------+----------------+----------------+
927  *
928  * id - uint16_t, copied from the request
929  * operation - uint8_t, XENSND_OP_* - copied from request
930  * status - int32_t, response status, zero on success and -XEN_EXX on failure
931  *
932  *
933  * HW parameter query response - response for XENSND_OP_HW_PARAM_QUERY:
934  *         0                1                 2               3        octet
935  * +----------------+----------------+----------------+----------------+
936  * |               id                |    operation   |    reserved    | 4
937  * +----------------+----------------+----------------+----------------+
938  * |                              status                               | 8
939  * +----------------+----------------+----------------+----------------+
940  * |                     formats mask low 32-bit                       | 12
941  * +----------------+----------------+----------------+----------------+
942  * |                     formats mask high 32-bit                      | 16
943  * +----------------+----------------+----------------+----------------+
944  * |                              min rate                             | 20
945  * +----------------+----------------+----------------+----------------+
946  * |                              max rate                             | 24
947  * +----------------+----------------+----------------+----------------+
948  * |                            min channels                           | 28
949  * +----------------+----------------+----------------+----------------+
950  * |                            max channels                           | 32
951  * +----------------+----------------+----------------+----------------+
952  * |                         min buffer frames                         | 36
953  * +----------------+----------------+----------------+----------------+
954  * |                         max buffer frames                         | 40
955  * +----------------+----------------+----------------+----------------+
956  * |                         min period frames                         | 44
957  * +----------------+----------------+----------------+----------------+
958  * |                         max period frames                         | 48
959  * +----------------+----------------+----------------+----------------+
960  * |                             reserved                              | 52
961  * +----------------+----------------+----------------+----------------+
962  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
963  * +----------------+----------------+----------------+----------------+
964  * |                             reserved                              | 64
965  * +----------------+----------------+----------------+----------------+
966  *
967  * Meaning of the values in this response is the same as for
968  * XENSND_OP_HW_PARAM_QUERY request.
969  */
970 
971 /*
972  *----------------------------------- Events ----------------------------------
973  *
974  * Events are sent via shared page allocated by the front and propagated by
975  *   evt-event-channel/evt-ring-ref XenStore entries
976  * All event packets have the same length (64 octets)
977  * All event packets have common header:
978  *         0                1                 2               3        octet
979  * +----------------+----------------+----------------+----------------+
980  * |               id                |      type      |   reserved     | 4
981  * +----------------+----------------+----------------+----------------+
982  * |                             reserved                              | 8
983  * +----------------+----------------+----------------+----------------+
984  *
985  * id - uint16_t, event id, may be used by front
986  * type - uint8_t, type of the event
987  *
988  *
989  * Current stream position - event from back to front when stream's
990  *   playback/capture position has advanced:
991  *         0                1                 2               3        octet
992  * +----------------+----------------+----------------+----------------+
993  * |               id                |   _EVT_CUR_POS |   reserved     | 4
994  * +----------------+----------------+----------------+----------------+
995  * |                             reserved                              | 8
996  * +----------------+----------------+----------------+----------------+
997  * |                         position low 32-bit                       | 12
998  * +----------------+----------------+----------------+----------------+
999  * |                         position high 32-bit                      | 16
1000  * +----------------+----------------+----------------+----------------+
1001  * |                             reserved                              | 20
1002  * +----------------+----------------+----------------+----------------+
1003  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
1004  * +----------------+----------------+----------------+----------------+
1005  * |                             reserved                              | 64
1006  * +----------------+----------------+----------------+----------------+
1007  *
1008  * position - current value of stream's playback/capture position, octets
1009  *
1010  */
1011 
1012 struct xensnd_cur_pos_evt {
1013 	uint64_t position;
1014 };
1015 
1016 struct xensnd_req {
1017 	uint16_t id;
1018 	uint8_t operation;
1019 	uint8_t reserved[5];
1020 	union {
1021 		struct xensnd_open_req open;
1022 		struct xensnd_rw_req rw;
1023 		struct xensnd_trigger_req trigger;
1024 		struct xensnd_query_hw_param hw_param;
1025 		uint8_t reserved[56];
1026 	} op;
1027 };
1028 
1029 struct xensnd_resp {
1030 	uint16_t id;
1031 	uint8_t operation;
1032 	uint8_t reserved;
1033 	int32_t status;
1034 	union {
1035 		struct xensnd_query_hw_param hw_param;
1036 		uint8_t reserved1[56];
1037 	} resp;
1038 };
1039 
1040 struct xensnd_evt {
1041 	uint16_t id;
1042 	uint8_t type;
1043 	uint8_t reserved[5];
1044 	union {
1045 		struct xensnd_cur_pos_evt cur_pos;
1046 		uint8_t reserved[56];
1047 	} op;
1048 };
1049 
1050 DEFINE_RING_TYPES(xen_sndif, struct xensnd_req, struct xensnd_resp);
1051 
1052 /*
1053  ******************************************************************************
1054  *                        Back to front events delivery
1055  ******************************************************************************
1056  * In order to deliver asynchronous events from back to front a shared page is
1057  * allocated by front and its granted reference propagated to back via
1058  * XenStore entries (evt-ring-ref/evt-event-channel).
1059  * This page has a common header used by both front and back to synchronize
1060  * access and control event's ring buffer, while back being a producer of the
1061  * events and front being a consumer. The rest of the page after the header
1062  * is used for event packets.
1063  *
1064  * Upon reception of an event(s) front may confirm its reception
1065  * for either each event, group of events or none.
1066  */
1067 
1068 struct xensnd_event_page {
1069 	uint32_t in_cons;
1070 	uint32_t in_prod;
1071 	uint8_t reserved[56];
1072 };
1073 
1074 #define XENSND_EVENT_PAGE_SIZE XEN_PAGE_SIZE
1075 #define XENSND_IN_RING_OFFS (sizeof(struct xensnd_event_page))
1076 #define XENSND_IN_RING_SIZE (XENSND_EVENT_PAGE_SIZE - XENSND_IN_RING_OFFS)
1077 #define XENSND_IN_RING_LEN (XENSND_IN_RING_SIZE / sizeof(struct xensnd_evt))
1078 #define XENSND_IN_RING(page) \
1079 	((struct xensnd_evt *)((char *)(page) + XENSND_IN_RING_OFFS))
1080 #define XENSND_IN_RING_REF(page, idx) \
1081 	(XENSND_IN_RING((page))[(idx) % XENSND_IN_RING_LEN])
1082 
1083 #endif /* __XEN_PUBLIC_IO_SNDIF_H__ */
1084