linux/include/xen/interface/io/sndif.h
<<
>>
Prefs
   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__ */
1082