Linux Audio

Check our new training course

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