162306a36Sopenharmony_ci/* SPDX-License-Identifier: MIT */
262306a36Sopenharmony_ci/******************************************************************************
362306a36Sopenharmony_ci * sndif.h
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Unified sound-device I/O interface for Xen guest OSes.
662306a36Sopenharmony_ci *
762306a36Sopenharmony_ci * Copyright (C) 2013-2015 GlobalLogic Inc.
862306a36Sopenharmony_ci * Copyright (C) 2016-2017 EPAM Systems Inc.
962306a36Sopenharmony_ci *
1062306a36Sopenharmony_ci * Authors: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
1162306a36Sopenharmony_ci *          Oleksandr Grytsov <oleksandr_grytsov@epam.com>
1262306a36Sopenharmony_ci *          Oleksandr Dmytryshyn <oleksandr.dmytryshyn@globallogic.com>
1362306a36Sopenharmony_ci *          Iurii Konovalenko <iurii.konovalenko@globallogic.com>
1462306a36Sopenharmony_ci */
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_ci#ifndef __XEN_PUBLIC_IO_SNDIF_H__
1762306a36Sopenharmony_ci#define __XEN_PUBLIC_IO_SNDIF_H__
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include "ring.h"
2062306a36Sopenharmony_ci#include "../grant_table.h"
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci/*
2362306a36Sopenharmony_ci ******************************************************************************
2462306a36Sopenharmony_ci *                           Protocol version
2562306a36Sopenharmony_ci ******************************************************************************
2662306a36Sopenharmony_ci */
2762306a36Sopenharmony_ci#define XENSND_PROTOCOL_VERSION	2
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci/*
3062306a36Sopenharmony_ci ******************************************************************************
3162306a36Sopenharmony_ci *                  Feature and Parameter Negotiation
3262306a36Sopenharmony_ci ******************************************************************************
3362306a36Sopenharmony_ci *
3462306a36Sopenharmony_ci * Front->back notifications: when enqueuing a new request, sending a
3562306a36Sopenharmony_ci * notification can be made conditional on xensnd_req (i.e., the generic
3662306a36Sopenharmony_ci * hold-off mechanism provided by the ring macros). Backends must set
3762306a36Sopenharmony_ci * xensnd_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()).
3862306a36Sopenharmony_ci *
3962306a36Sopenharmony_ci * Back->front notifications: when enqueuing a new response, sending a
4062306a36Sopenharmony_ci * notification can be made conditional on xensnd_resp (i.e., the generic
4162306a36Sopenharmony_ci * hold-off mechanism provided by the ring macros). Frontends must set
4262306a36Sopenharmony_ci * xensnd_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()).
4362306a36Sopenharmony_ci *
4462306a36Sopenharmony_ci * The two halves of a para-virtual sound card driver utilize nodes within
4562306a36Sopenharmony_ci * XenStore to communicate capabilities and to negotiate operating parameters.
4662306a36Sopenharmony_ci * This section enumerates these nodes which reside in the respective front and
4762306a36Sopenharmony_ci * backend portions of XenStore, following the XenBus convention.
4862306a36Sopenharmony_ci *
4962306a36Sopenharmony_ci * All data in XenStore is stored as strings. Nodes specifying numeric
5062306a36Sopenharmony_ci * values are encoded in decimal. Integer value ranges listed below are
5162306a36Sopenharmony_ci * expressed as fixed sized integer types capable of storing the conversion
5262306a36Sopenharmony_ci * of a properly formated node string, without loss of information.
5362306a36Sopenharmony_ci *
5462306a36Sopenharmony_ci ******************************************************************************
5562306a36Sopenharmony_ci *                        Example configuration
5662306a36Sopenharmony_ci ******************************************************************************
5762306a36Sopenharmony_ci *
5862306a36Sopenharmony_ci * Note: depending on the use-case backend can expose more sound cards and
5962306a36Sopenharmony_ci * PCM devices/streams than the underlying HW physically has by employing
6062306a36Sopenharmony_ci * SW mixers, configuring virtual sound streams, channels etc.
6162306a36Sopenharmony_ci *
6262306a36Sopenharmony_ci * This is an example of backend and frontend configuration:
6362306a36Sopenharmony_ci *
6462306a36Sopenharmony_ci *--------------------------------- Backend -----------------------------------
6562306a36Sopenharmony_ci *
6662306a36Sopenharmony_ci * /local/domain/0/backend/vsnd/1/0/frontend-id = "1"
6762306a36Sopenharmony_ci * /local/domain/0/backend/vsnd/1/0/frontend = "/local/domain/1/device/vsnd/0"
6862306a36Sopenharmony_ci * /local/domain/0/backend/vsnd/1/0/state = "4"
6962306a36Sopenharmony_ci * /local/domain/0/backend/vsnd/1/0/versions = "1,2"
7062306a36Sopenharmony_ci *
7162306a36Sopenharmony_ci *--------------------------------- Frontend ----------------------------------
7262306a36Sopenharmony_ci *
7362306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/backend-id = "0"
7462306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/backend = "/local/domain/0/backend/vsnd/1/0"
7562306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/state = "4"
7662306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/version = "1"
7762306a36Sopenharmony_ci *
7862306a36Sopenharmony_ci *----------------------------- Card configuration ----------------------------
7962306a36Sopenharmony_ci *
8062306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/short-name = "Card short name"
8162306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/long-name = "Card long name"
8262306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/sample-rates = "8000,32000,44100,48000,96000"
8362306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/sample-formats = "s8,u8,s16_le,s16_be"
8462306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/buffer-size = "262144"
8562306a36Sopenharmony_ci *
8662306a36Sopenharmony_ci *------------------------------- PCM device 0 --------------------------------
8762306a36Sopenharmony_ci *
8862306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/name = "General analog"
8962306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/channels-max = "5"
9062306a36Sopenharmony_ci *
9162306a36Sopenharmony_ci *----------------------------- Stream 0, playback ----------------------------
9262306a36Sopenharmony_ci *
9362306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/0/type = "p"
9462306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/0/sample-formats = "s8,u8"
9562306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/0/unique-id = "0"
9662306a36Sopenharmony_ci *
9762306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/0/ring-ref = "386"
9862306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/0/event-channel = "15"
9962306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/0/evt-ring-ref = "1386"
10062306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/0/evt-event-channel = "215"
10162306a36Sopenharmony_ci *
10262306a36Sopenharmony_ci *------------------------------ Stream 1, capture ----------------------------
10362306a36Sopenharmony_ci *
10462306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/1/type = "c"
10562306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/1/channels-max = "2"
10662306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/1/unique-id = "1"
10762306a36Sopenharmony_ci *
10862306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/1/ring-ref = "384"
10962306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/1/event-channel = "13"
11062306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/1/evt-ring-ref = "1384"
11162306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/0/1/evt-event-channel = "213"
11262306a36Sopenharmony_ci *
11362306a36Sopenharmony_ci *------------------------------- PCM device 1 --------------------------------
11462306a36Sopenharmony_ci *
11562306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/1/name = "HDMI-0"
11662306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/1/sample-rates = "8000,32000,44100"
11762306a36Sopenharmony_ci *
11862306a36Sopenharmony_ci *------------------------------ Stream 0, capture ----------------------------
11962306a36Sopenharmony_ci *
12062306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/1/0/type = "c"
12162306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/1/0/unique-id = "2"
12262306a36Sopenharmony_ci *
12362306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/1/0/ring-ref = "387"
12462306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/1/0/event-channel = "151"
12562306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/1/0/evt-ring-ref = "1387"
12662306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/1/0/evt-event-channel = "351"
12762306a36Sopenharmony_ci *
12862306a36Sopenharmony_ci *------------------------------- PCM device 2 --------------------------------
12962306a36Sopenharmony_ci *
13062306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/2/name = "SPDIF"
13162306a36Sopenharmony_ci *
13262306a36Sopenharmony_ci *----------------------------- Stream 0, playback ----------------------------
13362306a36Sopenharmony_ci *
13462306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/2/0/type = "p"
13562306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/2/0/unique-id = "3"
13662306a36Sopenharmony_ci *
13762306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/2/0/ring-ref = "389"
13862306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/2/0/event-channel = "152"
13962306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/2/0/evt-ring-ref = "1389"
14062306a36Sopenharmony_ci * /local/domain/1/device/vsnd/0/2/0/evt-event-channel = "452"
14162306a36Sopenharmony_ci *
14262306a36Sopenharmony_ci ******************************************************************************
14362306a36Sopenharmony_ci *                            Backend XenBus Nodes
14462306a36Sopenharmony_ci ******************************************************************************
14562306a36Sopenharmony_ci *
14662306a36Sopenharmony_ci *----------------------------- Protocol version ------------------------------
14762306a36Sopenharmony_ci *
14862306a36Sopenharmony_ci * versions
14962306a36Sopenharmony_ci *      Values:         <string>
15062306a36Sopenharmony_ci *
15162306a36Sopenharmony_ci *      List of XENSND_LIST_SEPARATOR separated protocol versions supported
15262306a36Sopenharmony_ci *      by the backend. For example "1,2,3".
15362306a36Sopenharmony_ci *
15462306a36Sopenharmony_ci ******************************************************************************
15562306a36Sopenharmony_ci *                            Frontend XenBus Nodes
15662306a36Sopenharmony_ci ******************************************************************************
15762306a36Sopenharmony_ci *
15862306a36Sopenharmony_ci *-------------------------------- Addressing ---------------------------------
15962306a36Sopenharmony_ci *
16062306a36Sopenharmony_ci * dom-id
16162306a36Sopenharmony_ci *      Values:         <uint16_t>
16262306a36Sopenharmony_ci *
16362306a36Sopenharmony_ci *      Domain identifier.
16462306a36Sopenharmony_ci *
16562306a36Sopenharmony_ci * dev-id
16662306a36Sopenharmony_ci *      Values:         <uint16_t>
16762306a36Sopenharmony_ci *
16862306a36Sopenharmony_ci *      Device identifier.
16962306a36Sopenharmony_ci *
17062306a36Sopenharmony_ci * pcm-dev-idx
17162306a36Sopenharmony_ci *      Values:         <uint8_t>
17262306a36Sopenharmony_ci *
17362306a36Sopenharmony_ci *      Zero based contigous index of the PCM device.
17462306a36Sopenharmony_ci *
17562306a36Sopenharmony_ci * stream-idx
17662306a36Sopenharmony_ci *      Values:         <uint8_t>
17762306a36Sopenharmony_ci *
17862306a36Sopenharmony_ci *      Zero based contigous index of the stream of the PCM device.
17962306a36Sopenharmony_ci *
18062306a36Sopenharmony_ci * The following pattern is used for addressing:
18162306a36Sopenharmony_ci *   /local/domain/<dom-id>/device/vsnd/<dev-id>/<pcm-dev-idx>/<stream-idx>/...
18262306a36Sopenharmony_ci *
18362306a36Sopenharmony_ci *----------------------------- Protocol version ------------------------------
18462306a36Sopenharmony_ci *
18562306a36Sopenharmony_ci * version
18662306a36Sopenharmony_ci *      Values:         <string>
18762306a36Sopenharmony_ci *
18862306a36Sopenharmony_ci *      Protocol version, chosen among the ones supported by the backend.
18962306a36Sopenharmony_ci *
19062306a36Sopenharmony_ci *------------------------------- PCM settings --------------------------------
19162306a36Sopenharmony_ci *
19262306a36Sopenharmony_ci * Every virtualized sound frontend has a set of PCM devices and streams, each
19362306a36Sopenharmony_ci * could be individually configured. Part of the PCM configuration can be
19462306a36Sopenharmony_ci * defined at higher level of the hierarchy and be fully or partially re-used
19562306a36Sopenharmony_ci * by the underlying layers. These configuration values are:
19662306a36Sopenharmony_ci *  o number of channels (min/max)
19762306a36Sopenharmony_ci *  o supported sample rates
19862306a36Sopenharmony_ci *  o supported sample formats.
19962306a36Sopenharmony_ci * E.g. one can define these values for the whole card, device or stream.
20062306a36Sopenharmony_ci * Every underlying layer in turn can re-define some or all of them to better
20162306a36Sopenharmony_ci * fit its needs. For example, card may define number of channels to be
20262306a36Sopenharmony_ci * in [1; 8] range, and some particular stream may be limited to [1; 2] only.
20362306a36Sopenharmony_ci * The rule is that the underlying layer must be a subset of the upper layer
20462306a36Sopenharmony_ci * range.
20562306a36Sopenharmony_ci *
20662306a36Sopenharmony_ci * channels-min
20762306a36Sopenharmony_ci *      Values:         <uint8_t>
20862306a36Sopenharmony_ci *
20962306a36Sopenharmony_ci *      The minimum amount of channels that is supported, [1; channels-max].
21062306a36Sopenharmony_ci *      Optional, if not set or omitted a value of 1 is used.
21162306a36Sopenharmony_ci *
21262306a36Sopenharmony_ci * channels-max
21362306a36Sopenharmony_ci *      Values:         <uint8_t>
21462306a36Sopenharmony_ci *
21562306a36Sopenharmony_ci *      The maximum amount of channels that is supported.
21662306a36Sopenharmony_ci *      Must be at least <channels-min>.
21762306a36Sopenharmony_ci *
21862306a36Sopenharmony_ci * sample-rates
21962306a36Sopenharmony_ci *      Values:         <list of uint32_t>
22062306a36Sopenharmony_ci *
22162306a36Sopenharmony_ci *      List of supported sample rates separated by XENSND_LIST_SEPARATOR.
22262306a36Sopenharmony_ci *      Sample rates are expressed as a list of decimal values w/o any
22362306a36Sopenharmony_ci *      ordering requirement.
22462306a36Sopenharmony_ci *
22562306a36Sopenharmony_ci * sample-formats
22662306a36Sopenharmony_ci *      Values:         <list of XENSND_PCM_FORMAT_XXX_STR>
22762306a36Sopenharmony_ci *
22862306a36Sopenharmony_ci *      List of supported sample formats separated by XENSND_LIST_SEPARATOR.
22962306a36Sopenharmony_ci *      Items must not exceed XENSND_SAMPLE_FORMAT_MAX_LEN length.
23062306a36Sopenharmony_ci *
23162306a36Sopenharmony_ci * buffer-size
23262306a36Sopenharmony_ci *      Values:         <uint32_t>
23362306a36Sopenharmony_ci *
23462306a36Sopenharmony_ci *      The maximum size in octets of the buffer to allocate per stream.
23562306a36Sopenharmony_ci *
23662306a36Sopenharmony_ci *----------------------- Virtual sound card settings -------------------------
23762306a36Sopenharmony_ci * short-name
23862306a36Sopenharmony_ci *      Values:         <char[32]>
23962306a36Sopenharmony_ci *
24062306a36Sopenharmony_ci *      Short name of the virtual sound card. Optional.
24162306a36Sopenharmony_ci *
24262306a36Sopenharmony_ci * long-name
24362306a36Sopenharmony_ci *      Values:         <char[80]>
24462306a36Sopenharmony_ci *
24562306a36Sopenharmony_ci *      Long name of the virtual sound card. Optional.
24662306a36Sopenharmony_ci *
24762306a36Sopenharmony_ci *----------------------------- Device settings -------------------------------
24862306a36Sopenharmony_ci * name
24962306a36Sopenharmony_ci *      Values:         <char[80]>
25062306a36Sopenharmony_ci *
25162306a36Sopenharmony_ci *      Name of the sound device within the virtual sound card. Optional.
25262306a36Sopenharmony_ci *
25362306a36Sopenharmony_ci *----------------------------- Stream settings -------------------------------
25462306a36Sopenharmony_ci *
25562306a36Sopenharmony_ci * type
25662306a36Sopenharmony_ci *      Values:         "p", "c"
25762306a36Sopenharmony_ci *
25862306a36Sopenharmony_ci *      Stream type: "p" - playback stream, "c" - capture stream
25962306a36Sopenharmony_ci *
26062306a36Sopenharmony_ci *      If both capture and playback are needed then two streams need to be
26162306a36Sopenharmony_ci *      defined under the same device.
26262306a36Sopenharmony_ci *
26362306a36Sopenharmony_ci * unique-id
26462306a36Sopenharmony_ci *      Values:         <string>
26562306a36Sopenharmony_ci *
26662306a36Sopenharmony_ci *      After stream initialization it is assigned a unique ID, so every
26762306a36Sopenharmony_ci *      stream of the frontend can be identified by the backend by this ID.
26862306a36Sopenharmony_ci *      This can be UUID or such.
26962306a36Sopenharmony_ci *
27062306a36Sopenharmony_ci *-------------------- Stream Request Transport Parameters --------------------
27162306a36Sopenharmony_ci *
27262306a36Sopenharmony_ci * event-channel
27362306a36Sopenharmony_ci *      Values:         <uint32_t>
27462306a36Sopenharmony_ci *
27562306a36Sopenharmony_ci *      The identifier of the Xen event channel used to signal activity
27662306a36Sopenharmony_ci *      in the ring buffer.
27762306a36Sopenharmony_ci *
27862306a36Sopenharmony_ci * ring-ref
27962306a36Sopenharmony_ci *      Values:         <uint32_t>
28062306a36Sopenharmony_ci *
28162306a36Sopenharmony_ci *      The Xen grant reference granting permission for the backend to map
28262306a36Sopenharmony_ci *      a sole page in a single page sized ring buffer.
28362306a36Sopenharmony_ci *
28462306a36Sopenharmony_ci *--------------------- Stream Event Transport Parameters ---------------------
28562306a36Sopenharmony_ci *
28662306a36Sopenharmony_ci * This communication path is used to deliver asynchronous events from backend
28762306a36Sopenharmony_ci * to frontend, set up per stream.
28862306a36Sopenharmony_ci *
28962306a36Sopenharmony_ci * evt-event-channel
29062306a36Sopenharmony_ci *      Values:         <uint32_t>
29162306a36Sopenharmony_ci *
29262306a36Sopenharmony_ci *      The identifier of the Xen event channel used to signal activity
29362306a36Sopenharmony_ci *      in the ring buffer.
29462306a36Sopenharmony_ci *
29562306a36Sopenharmony_ci * evt-ring-ref
29662306a36Sopenharmony_ci *      Values:         <uint32_t>
29762306a36Sopenharmony_ci *
29862306a36Sopenharmony_ci *      The Xen grant reference granting permission for the backend to map
29962306a36Sopenharmony_ci *      a sole page in a single page sized ring buffer.
30062306a36Sopenharmony_ci *
30162306a36Sopenharmony_ci ******************************************************************************
30262306a36Sopenharmony_ci *                               STATE DIAGRAMS
30362306a36Sopenharmony_ci ******************************************************************************
30462306a36Sopenharmony_ci *
30562306a36Sopenharmony_ci * Tool stack creates front and back state nodes with initial state
30662306a36Sopenharmony_ci * XenbusStateInitialising.
30762306a36Sopenharmony_ci * Tool stack creates and sets up frontend sound configuration nodes per domain.
30862306a36Sopenharmony_ci *
30962306a36Sopenharmony_ci * Front                                Back
31062306a36Sopenharmony_ci * =================================    =====================================
31162306a36Sopenharmony_ci * XenbusStateInitialising              XenbusStateInitialising
31262306a36Sopenharmony_ci *                                       o Query backend device identification
31362306a36Sopenharmony_ci *                                         data.
31462306a36Sopenharmony_ci *                                       o Open and validate backend device.
31562306a36Sopenharmony_ci *                                                      |
31662306a36Sopenharmony_ci *                                                      |
31762306a36Sopenharmony_ci *                                                      V
31862306a36Sopenharmony_ci *                                      XenbusStateInitWait
31962306a36Sopenharmony_ci *
32062306a36Sopenharmony_ci * o Query frontend configuration
32162306a36Sopenharmony_ci * o Allocate and initialize
32262306a36Sopenharmony_ci *   event channels per configured
32362306a36Sopenharmony_ci *   playback/capture stream.
32462306a36Sopenharmony_ci * o Publish transport parameters
32562306a36Sopenharmony_ci *   that will be in effect during
32662306a36Sopenharmony_ci *   this connection.
32762306a36Sopenharmony_ci *              |
32862306a36Sopenharmony_ci *              |
32962306a36Sopenharmony_ci *              V
33062306a36Sopenharmony_ci * XenbusStateInitialised
33162306a36Sopenharmony_ci *
33262306a36Sopenharmony_ci *                                       o Query frontend transport parameters.
33362306a36Sopenharmony_ci *                                       o Connect to the event channels.
33462306a36Sopenharmony_ci *                                                      |
33562306a36Sopenharmony_ci *                                                      |
33662306a36Sopenharmony_ci *                                                      V
33762306a36Sopenharmony_ci *                                      XenbusStateConnected
33862306a36Sopenharmony_ci *
33962306a36Sopenharmony_ci *  o Create and initialize OS
34062306a36Sopenharmony_ci *    virtual sound device instances
34162306a36Sopenharmony_ci *    as per configuration.
34262306a36Sopenharmony_ci *              |
34362306a36Sopenharmony_ci *              |
34462306a36Sopenharmony_ci *              V
34562306a36Sopenharmony_ci * XenbusStateConnected
34662306a36Sopenharmony_ci *
34762306a36Sopenharmony_ci *                                      XenbusStateUnknown
34862306a36Sopenharmony_ci *                                      XenbusStateClosed
34962306a36Sopenharmony_ci *                                      XenbusStateClosing
35062306a36Sopenharmony_ci * o Remove virtual sound device
35162306a36Sopenharmony_ci * o Remove event channels
35262306a36Sopenharmony_ci *              |
35362306a36Sopenharmony_ci *              |
35462306a36Sopenharmony_ci *              V
35562306a36Sopenharmony_ci * XenbusStateClosed
35662306a36Sopenharmony_ci *
35762306a36Sopenharmony_ci *------------------------------- Recovery flow -------------------------------
35862306a36Sopenharmony_ci *
35962306a36Sopenharmony_ci * In case of frontend unrecoverable errors backend handles that as
36062306a36Sopenharmony_ci * if frontend goes into the XenbusStateClosed state.
36162306a36Sopenharmony_ci *
36262306a36Sopenharmony_ci * In case of backend unrecoverable errors frontend tries removing
36362306a36Sopenharmony_ci * the virtualized device. If this is possible at the moment of error,
36462306a36Sopenharmony_ci * then frontend goes into the XenbusStateInitialising state and is ready for
36562306a36Sopenharmony_ci * new connection with backend. If the virtualized device is still in use and
36662306a36Sopenharmony_ci * cannot be removed, then frontend goes into the XenbusStateReconfiguring state
36762306a36Sopenharmony_ci * until either the virtualized device removed or backend initiates a new
36862306a36Sopenharmony_ci * connection. On the virtualized device removal frontend goes into the
36962306a36Sopenharmony_ci * XenbusStateInitialising state.
37062306a36Sopenharmony_ci *
37162306a36Sopenharmony_ci * Note on XenbusStateReconfiguring state of the frontend: if backend has
37262306a36Sopenharmony_ci * unrecoverable errors then frontend cannot send requests to the backend
37362306a36Sopenharmony_ci * and thus cannot provide functionality of the virtualized device anymore.
37462306a36Sopenharmony_ci * After backend is back to normal the virtualized device may still hold some
37562306a36Sopenharmony_ci * state: configuration in use, allocated buffers, client application state etc.
37662306a36Sopenharmony_ci * So, in most cases, this will require frontend to implement complex recovery
37762306a36Sopenharmony_ci * reconnect logic. Instead, by going into XenbusStateReconfiguring state,
37862306a36Sopenharmony_ci * frontend will make sure no new clients of the virtualized device are
37962306a36Sopenharmony_ci * accepted, allow existing client(s) to exit gracefully by signaling error
38062306a36Sopenharmony_ci * state etc.
38162306a36Sopenharmony_ci * Once all the clients are gone frontend can reinitialize the virtualized
38262306a36Sopenharmony_ci * device and get into XenbusStateInitialising state again signaling the
38362306a36Sopenharmony_ci * backend that a new connection can be made.
38462306a36Sopenharmony_ci *
38562306a36Sopenharmony_ci * There are multiple conditions possible under which frontend will go from
38662306a36Sopenharmony_ci * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS
38762306a36Sopenharmony_ci * specific. For example:
38862306a36Sopenharmony_ci * 1. The underlying OS framework may provide callbacks to signal that the last
38962306a36Sopenharmony_ci *    client of the virtualized device has gone and the device can be removed
39062306a36Sopenharmony_ci * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue)
39162306a36Sopenharmony_ci *    to periodically check if this is the right time to re-try removal of
39262306a36Sopenharmony_ci *    the virtualized device.
39362306a36Sopenharmony_ci * 3. By any other means.
39462306a36Sopenharmony_ci *
39562306a36Sopenharmony_ci ******************************************************************************
39662306a36Sopenharmony_ci *                             PCM FORMATS
39762306a36Sopenharmony_ci ******************************************************************************
39862306a36Sopenharmony_ci *
39962306a36Sopenharmony_ci * XENSND_PCM_FORMAT_<format>[_<endian>]
40062306a36Sopenharmony_ci *
40162306a36Sopenharmony_ci * format: <S/U/F><bits> or <name>
40262306a36Sopenharmony_ci *     S - signed, U - unsigned, F - float
40362306a36Sopenharmony_ci *     bits - 8, 16, 24, 32
40462306a36Sopenharmony_ci *     name - MU_LAW, GSM, etc.
40562306a36Sopenharmony_ci *
40662306a36Sopenharmony_ci * endian: <LE/BE>, may be absent
40762306a36Sopenharmony_ci *     LE - Little endian, BE - Big endian
40862306a36Sopenharmony_ci */
40962306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S8		0
41062306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U8		1
41162306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S16_LE	2
41262306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S16_BE	3
41362306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U16_LE	4
41462306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U16_BE	5
41562306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S24_LE	6
41662306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S24_BE	7
41762306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U24_LE	8
41862306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U24_BE	9
41962306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S32_LE	10
42062306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S32_BE	11
42162306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U32_LE	12
42262306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U32_BE	13
42362306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_F32_LE	14 /* 4-byte float, IEEE-754 32-bit, */
42462306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_F32_BE	15 /* range -1.0 to 1.0              */
42562306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_F64_LE	16 /* 8-byte float, IEEE-754 64-bit, */
42662306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_F64_BE	17 /* range -1.0 to 1.0              */
42762306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_IEC958_SUBFRAME_LE 18
42862306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_IEC958_SUBFRAME_BE 19
42962306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_MU_LAW	20
43062306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_A_LAW		21
43162306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_IMA_ADPCM	22
43262306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_MPEG		23
43362306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_GSM		24
43462306a36Sopenharmony_ci
43562306a36Sopenharmony_ci/*
43662306a36Sopenharmony_ci ******************************************************************************
43762306a36Sopenharmony_ci *                             REQUEST CODES
43862306a36Sopenharmony_ci ******************************************************************************
43962306a36Sopenharmony_ci */
44062306a36Sopenharmony_ci#define XENSND_OP_OPEN			0
44162306a36Sopenharmony_ci#define XENSND_OP_CLOSE			1
44262306a36Sopenharmony_ci#define XENSND_OP_READ			2
44362306a36Sopenharmony_ci#define XENSND_OP_WRITE			3
44462306a36Sopenharmony_ci#define XENSND_OP_SET_VOLUME		4
44562306a36Sopenharmony_ci#define XENSND_OP_GET_VOLUME		5
44662306a36Sopenharmony_ci#define XENSND_OP_MUTE			6
44762306a36Sopenharmony_ci#define XENSND_OP_UNMUTE		7
44862306a36Sopenharmony_ci#define XENSND_OP_TRIGGER		8
44962306a36Sopenharmony_ci#define XENSND_OP_HW_PARAM_QUERY	9
45062306a36Sopenharmony_ci
45162306a36Sopenharmony_ci#define XENSND_OP_TRIGGER_START		0
45262306a36Sopenharmony_ci#define XENSND_OP_TRIGGER_PAUSE		1
45362306a36Sopenharmony_ci#define XENSND_OP_TRIGGER_STOP		2
45462306a36Sopenharmony_ci#define XENSND_OP_TRIGGER_RESUME	3
45562306a36Sopenharmony_ci
45662306a36Sopenharmony_ci/*
45762306a36Sopenharmony_ci ******************************************************************************
45862306a36Sopenharmony_ci *                                 EVENT CODES
45962306a36Sopenharmony_ci ******************************************************************************
46062306a36Sopenharmony_ci */
46162306a36Sopenharmony_ci#define XENSND_EVT_CUR_POS		0
46262306a36Sopenharmony_ci
46362306a36Sopenharmony_ci/*
46462306a36Sopenharmony_ci ******************************************************************************
46562306a36Sopenharmony_ci *               XENSTORE FIELD AND PATH NAME STRINGS, HELPERS
46662306a36Sopenharmony_ci ******************************************************************************
46762306a36Sopenharmony_ci */
46862306a36Sopenharmony_ci#define XENSND_DRIVER_NAME		"vsnd"
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_ci#define XENSND_LIST_SEPARATOR		","
47162306a36Sopenharmony_ci/* Field names */
47262306a36Sopenharmony_ci#define XENSND_FIELD_BE_VERSIONS	"versions"
47362306a36Sopenharmony_ci#define XENSND_FIELD_FE_VERSION		"version"
47462306a36Sopenharmony_ci#define XENSND_FIELD_VCARD_SHORT_NAME	"short-name"
47562306a36Sopenharmony_ci#define XENSND_FIELD_VCARD_LONG_NAME	"long-name"
47662306a36Sopenharmony_ci#define XENSND_FIELD_RING_REF		"ring-ref"
47762306a36Sopenharmony_ci#define XENSND_FIELD_EVT_CHNL		"event-channel"
47862306a36Sopenharmony_ci#define XENSND_FIELD_EVT_RING_REF	"evt-ring-ref"
47962306a36Sopenharmony_ci#define XENSND_FIELD_EVT_EVT_CHNL	"evt-event-channel"
48062306a36Sopenharmony_ci#define XENSND_FIELD_DEVICE_NAME	"name"
48162306a36Sopenharmony_ci#define XENSND_FIELD_TYPE		"type"
48262306a36Sopenharmony_ci#define XENSND_FIELD_STREAM_UNIQUE_ID	"unique-id"
48362306a36Sopenharmony_ci#define XENSND_FIELD_CHANNELS_MIN	"channels-min"
48462306a36Sopenharmony_ci#define XENSND_FIELD_CHANNELS_MAX	"channels-max"
48562306a36Sopenharmony_ci#define XENSND_FIELD_SAMPLE_RATES	"sample-rates"
48662306a36Sopenharmony_ci#define XENSND_FIELD_SAMPLE_FORMATS	"sample-formats"
48762306a36Sopenharmony_ci#define XENSND_FIELD_BUFFER_SIZE	"buffer-size"
48862306a36Sopenharmony_ci
48962306a36Sopenharmony_ci/* Stream type field values. */
49062306a36Sopenharmony_ci#define XENSND_STREAM_TYPE_PLAYBACK	"p"
49162306a36Sopenharmony_ci#define XENSND_STREAM_TYPE_CAPTURE	"c"
49262306a36Sopenharmony_ci/* Sample rate max string length */
49362306a36Sopenharmony_ci#define XENSND_SAMPLE_RATE_MAX_LEN	11
49462306a36Sopenharmony_ci/* Sample format field values */
49562306a36Sopenharmony_ci#define XENSND_SAMPLE_FORMAT_MAX_LEN	24
49662306a36Sopenharmony_ci
49762306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S8_STR	"s8"
49862306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U8_STR	"u8"
49962306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S16_LE_STR	"s16_le"
50062306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S16_BE_STR	"s16_be"
50162306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U16_LE_STR	"u16_le"
50262306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U16_BE_STR	"u16_be"
50362306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S24_LE_STR	"s24_le"
50462306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S24_BE_STR	"s24_be"
50562306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U24_LE_STR	"u24_le"
50662306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U24_BE_STR	"u24_be"
50762306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S32_LE_STR	"s32_le"
50862306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_S32_BE_STR	"s32_be"
50962306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U32_LE_STR	"u32_le"
51062306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_U32_BE_STR	"u32_be"
51162306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_F32_LE_STR	"float_le"
51262306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_F32_BE_STR	"float_be"
51362306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_F64_LE_STR	"float64_le"
51462306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_F64_BE_STR	"float64_be"
51562306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_IEC958_SUBFRAME_LE_STR "iec958_subframe_le"
51662306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_IEC958_SUBFRAME_BE_STR "iec958_subframe_be"
51762306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_MU_LAW_STR	"mu_law"
51862306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_A_LAW_STR	"a_law"
51962306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_IMA_ADPCM_STR	"ima_adpcm"
52062306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_MPEG_STR	"mpeg"
52162306a36Sopenharmony_ci#define XENSND_PCM_FORMAT_GSM_STR	"gsm"
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_ci
52462306a36Sopenharmony_ci/*
52562306a36Sopenharmony_ci ******************************************************************************
52662306a36Sopenharmony_ci *                          STATUS RETURN CODES
52762306a36Sopenharmony_ci ******************************************************************************
52862306a36Sopenharmony_ci *
52962306a36Sopenharmony_ci * Status return code is zero on success and -XEN_EXX on failure.
53062306a36Sopenharmony_ci *
53162306a36Sopenharmony_ci ******************************************************************************
53262306a36Sopenharmony_ci *                              Assumptions
53362306a36Sopenharmony_ci ******************************************************************************
53462306a36Sopenharmony_ci * o usage of grant reference 0 as invalid grant reference:
53562306a36Sopenharmony_ci *   grant reference 0 is valid, but never exposed to a PV driver,
53662306a36Sopenharmony_ci *   because of the fact it is already in use/reserved by the PV console.
53762306a36Sopenharmony_ci * o all references in this document to page sizes must be treated
53862306a36Sopenharmony_ci *   as pages of size XEN_PAGE_SIZE unless otherwise noted.
53962306a36Sopenharmony_ci *
54062306a36Sopenharmony_ci ******************************************************************************
54162306a36Sopenharmony_ci *       Description of the protocol between frontend and backend driver
54262306a36Sopenharmony_ci ******************************************************************************
54362306a36Sopenharmony_ci *
54462306a36Sopenharmony_ci * The two halves of a Para-virtual sound driver communicate with
54562306a36Sopenharmony_ci * each other using shared pages and event channels.
54662306a36Sopenharmony_ci * Shared page contains a ring with request/response packets.
54762306a36Sopenharmony_ci *
54862306a36Sopenharmony_ci * Packets, used for input/output operations, e.g. read/write, set/get volume,
54962306a36Sopenharmony_ci * etc., provide offset/length fields in order to allow asynchronous protocol
55062306a36Sopenharmony_ci * operation with buffer space sharing: part of the buffer allocated at
55162306a36Sopenharmony_ci * XENSND_OP_OPEN can be used for audio samples and part, for example,
55262306a36Sopenharmony_ci * for volume control.
55362306a36Sopenharmony_ci *
55462306a36Sopenharmony_ci * All reserved fields in the structures below must be 0.
55562306a36Sopenharmony_ci *
55662306a36Sopenharmony_ci *---------------------------------- Requests ---------------------------------
55762306a36Sopenharmony_ci *
55862306a36Sopenharmony_ci * All request packets have the same length (64 octets)
55962306a36Sopenharmony_ci * All request packets have common header:
56062306a36Sopenharmony_ci *         0                1                 2               3        octet
56162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
56262306a36Sopenharmony_ci * |               id                |    operation   |    reserved    | 4
56362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
56462306a36Sopenharmony_ci * |                             reserved                              | 8
56562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
56662306a36Sopenharmony_ci *   id - uint16_t, private guest value, echoed in response
56762306a36Sopenharmony_ci *   operation - uint8_t, operation code, XENSND_OP_???
56862306a36Sopenharmony_ci *
56962306a36Sopenharmony_ci * For all packets which use offset and length:
57062306a36Sopenharmony_ci *   offset - uint32_t, read or write data offset within the shared buffer,
57162306a36Sopenharmony_ci *     passed with XENSND_OP_OPEN request, octets,
57262306a36Sopenharmony_ci *     [0; XENSND_OP_OPEN.buffer_sz - 1].
57362306a36Sopenharmony_ci *   length - uint32_t, read or write data length, octets
57462306a36Sopenharmony_ci *
57562306a36Sopenharmony_ci * Request open - open a PCM stream for playback or capture:
57662306a36Sopenharmony_ci *
57762306a36Sopenharmony_ci *         0                1                 2               3        octet
57862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
57962306a36Sopenharmony_ci * |               id                | XENSND_OP_OPEN |    reserved    | 4
58062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
58162306a36Sopenharmony_ci * |                             reserved                              | 8
58262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
58362306a36Sopenharmony_ci * |                             pcm_rate                              | 12
58462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
58562306a36Sopenharmony_ci * |  pcm_format    |  pcm_channels  |             reserved            | 16
58662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
58762306a36Sopenharmony_ci * |                             buffer_sz                             | 20
58862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
58962306a36Sopenharmony_ci * |                           gref_directory                          | 24
59062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
59162306a36Sopenharmony_ci * |                             period_sz                             | 28
59262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
59362306a36Sopenharmony_ci * |                             reserved                              | 32
59462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
59562306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
59662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
59762306a36Sopenharmony_ci * |                             reserved                              | 64
59862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
59962306a36Sopenharmony_ci *
60062306a36Sopenharmony_ci * pcm_rate - uint32_t, stream data rate, Hz
60162306a36Sopenharmony_ci * pcm_format - uint8_t, XENSND_PCM_FORMAT_XXX value
60262306a36Sopenharmony_ci * pcm_channels - uint8_t, number of channels of this stream,
60362306a36Sopenharmony_ci *   [channels-min; channels-max]
60462306a36Sopenharmony_ci * buffer_sz - uint32_t, buffer size to be allocated, octets
60562306a36Sopenharmony_ci * period_sz - uint32_t, event period size, octets
60662306a36Sopenharmony_ci *   This is the requested value of the period at which frontend would
60762306a36Sopenharmony_ci *   like to receive XENSND_EVT_CUR_POS notifications from the backend when
60862306a36Sopenharmony_ci *   stream position advances during playback/capture.
60962306a36Sopenharmony_ci *   It shows how many octets are expected to be played/captured before
61062306a36Sopenharmony_ci *   sending such an event.
61162306a36Sopenharmony_ci *   If set to 0 no XENSND_EVT_CUR_POS events are sent by the backend.
61262306a36Sopenharmony_ci *
61362306a36Sopenharmony_ci * gref_directory - grant_ref_t, a reference to the first shared page
61462306a36Sopenharmony_ci *   describing shared buffer references. At least one page exists. If shared
61562306a36Sopenharmony_ci *   buffer size  (buffer_sz) exceeds what can be addressed by this single page,
61662306a36Sopenharmony_ci *   then reference to the next page must be supplied (see gref_dir_next_page
61762306a36Sopenharmony_ci *   below)
61862306a36Sopenharmony_ci */
61962306a36Sopenharmony_ci
62062306a36Sopenharmony_cistruct xensnd_open_req {
62162306a36Sopenharmony_ci	uint32_t pcm_rate;
62262306a36Sopenharmony_ci	uint8_t pcm_format;
62362306a36Sopenharmony_ci	uint8_t pcm_channels;
62462306a36Sopenharmony_ci	uint16_t reserved;
62562306a36Sopenharmony_ci	uint32_t buffer_sz;
62662306a36Sopenharmony_ci	grant_ref_t gref_directory;
62762306a36Sopenharmony_ci	uint32_t period_sz;
62862306a36Sopenharmony_ci};
62962306a36Sopenharmony_ci
63062306a36Sopenharmony_ci/*
63162306a36Sopenharmony_ci * Shared page for XENSND_OP_OPEN buffer descriptor (gref_directory in the
63262306a36Sopenharmony_ci *   request) employs a list of pages, describing all pages of the shared data
63362306a36Sopenharmony_ci *   buffer:
63462306a36Sopenharmony_ci *         0                1                 2               3        octet
63562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
63662306a36Sopenharmony_ci * |                        gref_dir_next_page                         | 4
63762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
63862306a36Sopenharmony_ci * |                              gref[0]                              | 8
63962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
64062306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
64162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
64262306a36Sopenharmony_ci * |                              gref[i]                              | i*4+8
64362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
64462306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
64562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
64662306a36Sopenharmony_ci * |                             gref[N - 1]                           | N*4+8
64762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
64862306a36Sopenharmony_ci *
64962306a36Sopenharmony_ci * gref_dir_next_page - grant_ref_t, reference to the next page describing
65062306a36Sopenharmony_ci *   page directory. Must be 0 if there are no more pages in the list.
65162306a36Sopenharmony_ci * gref[i] - grant_ref_t, reference to a shared page of the buffer
65262306a36Sopenharmony_ci *   allocated at XENSND_OP_OPEN
65362306a36Sopenharmony_ci *
65462306a36Sopenharmony_ci * Number of grant_ref_t entries in the whole page directory is not
65562306a36Sopenharmony_ci * passed, but instead can be calculated as:
65662306a36Sopenharmony_ci *   num_grefs_total = (XENSND_OP_OPEN.buffer_sz + XEN_PAGE_SIZE - 1) /
65762306a36Sopenharmony_ci *       XEN_PAGE_SIZE
65862306a36Sopenharmony_ci */
65962306a36Sopenharmony_ci
66062306a36Sopenharmony_cistruct xensnd_page_directory {
66162306a36Sopenharmony_ci	grant_ref_t gref_dir_next_page;
66262306a36Sopenharmony_ci	grant_ref_t gref[1]; /* Variable length */
66362306a36Sopenharmony_ci};
66462306a36Sopenharmony_ci
66562306a36Sopenharmony_ci/*
66662306a36Sopenharmony_ci *  Request close - close an opened pcm stream:
66762306a36Sopenharmony_ci *         0                1                 2               3        octet
66862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
66962306a36Sopenharmony_ci * |               id                | XENSND_OP_CLOSE|    reserved    | 4
67062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
67162306a36Sopenharmony_ci * |                             reserved                              | 8
67262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
67362306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
67462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
67562306a36Sopenharmony_ci * |                             reserved                              | 64
67662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
67762306a36Sopenharmony_ci *
67862306a36Sopenharmony_ci * Request read/write - used for read (for capture) or write (for playback):
67962306a36Sopenharmony_ci *         0                1                 2               3        octet
68062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
68162306a36Sopenharmony_ci * |               id                |   operation    |    reserved    | 4
68262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
68362306a36Sopenharmony_ci * |                             reserved                              | 8
68462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
68562306a36Sopenharmony_ci * |                              offset                               | 12
68662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
68762306a36Sopenharmony_ci * |                              length                               | 16
68862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
68962306a36Sopenharmony_ci * |                             reserved                              | 20
69062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
69162306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
69262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
69362306a36Sopenharmony_ci * |                             reserved                              | 64
69462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
69562306a36Sopenharmony_ci *
69662306a36Sopenharmony_ci * operation - XENSND_OP_READ for read or XENSND_OP_WRITE for write
69762306a36Sopenharmony_ci */
69862306a36Sopenharmony_ci
69962306a36Sopenharmony_cistruct xensnd_rw_req {
70062306a36Sopenharmony_ci	uint32_t offset;
70162306a36Sopenharmony_ci	uint32_t length;
70262306a36Sopenharmony_ci};
70362306a36Sopenharmony_ci
70462306a36Sopenharmony_ci/*
70562306a36Sopenharmony_ci * Request set/get volume - set/get channels' volume of the stream given:
70662306a36Sopenharmony_ci *         0                1                 2               3        octet
70762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
70862306a36Sopenharmony_ci * |               id                |   operation    |    reserved    | 4
70962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
71062306a36Sopenharmony_ci * |                             reserved                              | 8
71162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
71262306a36Sopenharmony_ci * |                              offset                               | 12
71362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
71462306a36Sopenharmony_ci * |                              length                               | 16
71562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
71662306a36Sopenharmony_ci * |                             reserved                              | 20
71762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
71862306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
71962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
72062306a36Sopenharmony_ci * |                             reserved                              | 64
72162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
72262306a36Sopenharmony_ci *
72362306a36Sopenharmony_ci * operation - XENSND_OP_SET_VOLUME for volume set
72462306a36Sopenharmony_ci *   or XENSND_OP_GET_VOLUME for volume get
72562306a36Sopenharmony_ci * Buffer passed with XENSND_OP_OPEN is used to exchange volume
72662306a36Sopenharmony_ci * values:
72762306a36Sopenharmony_ci *
72862306a36Sopenharmony_ci *         0                1                 2               3        octet
72962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
73062306a36Sopenharmony_ci * |                             channel[0]                            | 4
73162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
73262306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
73362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
73462306a36Sopenharmony_ci * |                             channel[i]                            | i*4
73562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
73662306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
73762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
73862306a36Sopenharmony_ci * |                           channel[N - 1]                          | (N-1)*4
73962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
74062306a36Sopenharmony_ci *
74162306a36Sopenharmony_ci * N = XENSND_OP_OPEN.pcm_channels
74262306a36Sopenharmony_ci * i - uint8_t, index of a channel
74362306a36Sopenharmony_ci * channel[i] - sint32_t, volume of i-th channel
74462306a36Sopenharmony_ci * Volume is expressed as a signed value in steps of 0.001 dB,
74562306a36Sopenharmony_ci * while 0 being 0 dB.
74662306a36Sopenharmony_ci *
74762306a36Sopenharmony_ci * Request mute/unmute - mute/unmute stream:
74862306a36Sopenharmony_ci *         0                1                 2               3        octet
74962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
75062306a36Sopenharmony_ci * |               id                |   operation    |    reserved    | 4
75162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
75262306a36Sopenharmony_ci * |                             reserved                              | 8
75362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
75462306a36Sopenharmony_ci * |                              offset                               | 12
75562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
75662306a36Sopenharmony_ci * |                              length                               | 16
75762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
75862306a36Sopenharmony_ci * |                             reserved                              | 20
75962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
76062306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
76162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
76262306a36Sopenharmony_ci * |                             reserved                              | 64
76362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
76462306a36Sopenharmony_ci *
76562306a36Sopenharmony_ci * operation - XENSND_OP_MUTE for mute or XENSND_OP_UNMUTE for unmute
76662306a36Sopenharmony_ci * Buffer passed with XENSND_OP_OPEN is used to exchange mute/unmute
76762306a36Sopenharmony_ci * values:
76862306a36Sopenharmony_ci *
76962306a36Sopenharmony_ci *                                   0                                 octet
77062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
77162306a36Sopenharmony_ci * |                             channel[0]                            | 4
77262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
77362306a36Sopenharmony_ci * +/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
77462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
77562306a36Sopenharmony_ci * |                             channel[i]                            | i*4
77662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
77762306a36Sopenharmony_ci * +/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
77862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
77962306a36Sopenharmony_ci * |                           channel[N - 1]                          | (N-1)*4
78062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
78162306a36Sopenharmony_ci *
78262306a36Sopenharmony_ci * N = XENSND_OP_OPEN.pcm_channels
78362306a36Sopenharmony_ci * i - uint8_t, index of a channel
78462306a36Sopenharmony_ci * channel[i] - uint8_t, non-zero if i-th channel needs to be muted/unmuted
78562306a36Sopenharmony_ci *
78662306a36Sopenharmony_ci *------------------------------------ N.B. -----------------------------------
78762306a36Sopenharmony_ci *
78862306a36Sopenharmony_ci * The 'struct xensnd_rw_req' is also used for XENSND_OP_SET_VOLUME,
78962306a36Sopenharmony_ci * XENSND_OP_GET_VOLUME, XENSND_OP_MUTE, XENSND_OP_UNMUTE.
79062306a36Sopenharmony_ci *
79162306a36Sopenharmony_ci * Request stream running state change - trigger PCM stream running state
79262306a36Sopenharmony_ci * to start, stop, pause or resume:
79362306a36Sopenharmony_ci *
79462306a36Sopenharmony_ci *         0                1                 2               3        octet
79562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
79662306a36Sopenharmony_ci * |               id                |   _OP_TRIGGER  |    reserved    | 4
79762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
79862306a36Sopenharmony_ci * |                             reserved                              | 8
79962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
80062306a36Sopenharmony_ci * |      type      |                     reserved                     | 12
80162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
80262306a36Sopenharmony_ci * |                             reserved                              | 16
80362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
80462306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
80562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
80662306a36Sopenharmony_ci * |                             reserved                              | 64
80762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
80862306a36Sopenharmony_ci *
80962306a36Sopenharmony_ci * type - uint8_t, XENSND_OP_TRIGGER_XXX value
81062306a36Sopenharmony_ci */
81162306a36Sopenharmony_ci
81262306a36Sopenharmony_cistruct xensnd_trigger_req {
81362306a36Sopenharmony_ci	uint8_t type;
81462306a36Sopenharmony_ci};
81562306a36Sopenharmony_ci
81662306a36Sopenharmony_ci/*
81762306a36Sopenharmony_ci * Request stream parameter ranges: request intervals and
81862306a36Sopenharmony_ci *   masks of supported ranges for stream configuration values.
81962306a36Sopenharmony_ci *
82062306a36Sopenharmony_ci *   Sound device configuration for a particular stream is a limited subset
82162306a36Sopenharmony_ci *   of the multidimensional configuration available on XenStore, e.g.
82262306a36Sopenharmony_ci *   once the frame rate has been selected there is a limited supported range
82362306a36Sopenharmony_ci *   for sample rates becomes available (which might be the same set configured
82462306a36Sopenharmony_ci *   on XenStore or less). For example, selecting 96kHz sample rate may limit
82562306a36Sopenharmony_ci *   number of channels available for such configuration from 4 to 2, etc.
82662306a36Sopenharmony_ci *   Thus, each call to XENSND_OP_HW_PARAM_QUERY may reduce configuration
82762306a36Sopenharmony_ci *   space making it possible to iteratively get the final stream configuration,
82862306a36Sopenharmony_ci *   used in XENSND_OP_OPEN request.
82962306a36Sopenharmony_ci *
83062306a36Sopenharmony_ci *   See response format for this request.
83162306a36Sopenharmony_ci *
83262306a36Sopenharmony_ci *         0                1                 2               3        octet
83362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
83462306a36Sopenharmony_ci * |               id                | _HW_PARAM_QUERY|    reserved    | 4
83562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
83662306a36Sopenharmony_ci * |                             reserved                              | 8
83762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
83862306a36Sopenharmony_ci * |                     formats mask low 32-bit                       | 12
83962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
84062306a36Sopenharmony_ci * |                     formats mask high 32-bit                      | 16
84162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
84262306a36Sopenharmony_ci * |                              min rate                             | 20
84362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
84462306a36Sopenharmony_ci * |                              max rate                             | 24
84562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
84662306a36Sopenharmony_ci * |                            min channels                           | 28
84762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
84862306a36Sopenharmony_ci * |                            max channels                           | 32
84962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
85062306a36Sopenharmony_ci * |                         min buffer frames                         | 36
85162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
85262306a36Sopenharmony_ci * |                         max buffer frames                         | 40
85362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
85462306a36Sopenharmony_ci * |                         min period frames                         | 44
85562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
85662306a36Sopenharmony_ci * |                         max period frames                         | 48
85762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
85862306a36Sopenharmony_ci * |                             reserved                              | 52
85962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
86062306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
86162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
86262306a36Sopenharmony_ci * |                             reserved                              | 64
86362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
86462306a36Sopenharmony_ci *
86562306a36Sopenharmony_ci * formats - uint64_t, bit mask representing values of the parameter
86662306a36Sopenharmony_ci *     made as bitwise OR of (1 << XENSND_PCM_FORMAT_XXX) values
86762306a36Sopenharmony_ci *
86862306a36Sopenharmony_ci * For interval parameters:
86962306a36Sopenharmony_ci *   min - uint32_t, minimum value of the parameter
87062306a36Sopenharmony_ci *   max - uint32_t, maximum value of the parameter
87162306a36Sopenharmony_ci *
87262306a36Sopenharmony_ci * Frame is defined as a product of the number of channels by the
87362306a36Sopenharmony_ci * number of octets per one sample.
87462306a36Sopenharmony_ci */
87562306a36Sopenharmony_ci
87662306a36Sopenharmony_cistruct xensnd_query_hw_param {
87762306a36Sopenharmony_ci	uint64_t formats;
87862306a36Sopenharmony_ci	struct {
87962306a36Sopenharmony_ci		uint32_t min;
88062306a36Sopenharmony_ci		uint32_t max;
88162306a36Sopenharmony_ci	} rates;
88262306a36Sopenharmony_ci	struct {
88362306a36Sopenharmony_ci		uint32_t min;
88462306a36Sopenharmony_ci		uint32_t max;
88562306a36Sopenharmony_ci	} channels;
88662306a36Sopenharmony_ci	struct {
88762306a36Sopenharmony_ci		uint32_t min;
88862306a36Sopenharmony_ci		uint32_t max;
88962306a36Sopenharmony_ci	} buffer;
89062306a36Sopenharmony_ci	struct {
89162306a36Sopenharmony_ci		uint32_t min;
89262306a36Sopenharmony_ci		uint32_t max;
89362306a36Sopenharmony_ci	} period;
89462306a36Sopenharmony_ci};
89562306a36Sopenharmony_ci
89662306a36Sopenharmony_ci/*
89762306a36Sopenharmony_ci *---------------------------------- Responses --------------------------------
89862306a36Sopenharmony_ci *
89962306a36Sopenharmony_ci * All response packets have the same length (64 octets)
90062306a36Sopenharmony_ci *
90162306a36Sopenharmony_ci * All response packets have common header:
90262306a36Sopenharmony_ci *         0                1                 2               3        octet
90362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
90462306a36Sopenharmony_ci * |               id                |    operation   |    reserved    | 4
90562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
90662306a36Sopenharmony_ci * |                              status                               | 8
90762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
90862306a36Sopenharmony_ci *
90962306a36Sopenharmony_ci * id - uint16_t, copied from the request
91062306a36Sopenharmony_ci * operation - uint8_t, XENSND_OP_* - copied from request
91162306a36Sopenharmony_ci * status - int32_t, response status, zero on success and -XEN_EXX on failure
91262306a36Sopenharmony_ci *
91362306a36Sopenharmony_ci *
91462306a36Sopenharmony_ci * HW parameter query response - response for XENSND_OP_HW_PARAM_QUERY:
91562306a36Sopenharmony_ci *         0                1                 2               3        octet
91662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
91762306a36Sopenharmony_ci * |               id                |    operation   |    reserved    | 4
91862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
91962306a36Sopenharmony_ci * |                              status                               | 8
92062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
92162306a36Sopenharmony_ci * |                     formats mask low 32-bit                       | 12
92262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
92362306a36Sopenharmony_ci * |                     formats mask high 32-bit                      | 16
92462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
92562306a36Sopenharmony_ci * |                              min rate                             | 20
92662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
92762306a36Sopenharmony_ci * |                              max rate                             | 24
92862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
92962306a36Sopenharmony_ci * |                            min channels                           | 28
93062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
93162306a36Sopenharmony_ci * |                            max channels                           | 32
93262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
93362306a36Sopenharmony_ci * |                         min buffer frames                         | 36
93462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
93562306a36Sopenharmony_ci * |                         max buffer frames                         | 40
93662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
93762306a36Sopenharmony_ci * |                         min period frames                         | 44
93862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
93962306a36Sopenharmony_ci * |                         max period frames                         | 48
94062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
94162306a36Sopenharmony_ci * |                             reserved                              | 52
94262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
94362306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
94462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
94562306a36Sopenharmony_ci * |                             reserved                              | 64
94662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
94762306a36Sopenharmony_ci *
94862306a36Sopenharmony_ci * Meaning of the values in this response is the same as for
94962306a36Sopenharmony_ci * XENSND_OP_HW_PARAM_QUERY request.
95062306a36Sopenharmony_ci */
95162306a36Sopenharmony_ci
95262306a36Sopenharmony_ci/*
95362306a36Sopenharmony_ci *----------------------------------- Events ----------------------------------
95462306a36Sopenharmony_ci *
95562306a36Sopenharmony_ci * Events are sent via shared page allocated by the front and propagated by
95662306a36Sopenharmony_ci *   evt-event-channel/evt-ring-ref XenStore entries
95762306a36Sopenharmony_ci * All event packets have the same length (64 octets)
95862306a36Sopenharmony_ci * All event packets have common header:
95962306a36Sopenharmony_ci *         0                1                 2               3        octet
96062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
96162306a36Sopenharmony_ci * |               id                |      type      |   reserved     | 4
96262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
96362306a36Sopenharmony_ci * |                             reserved                              | 8
96462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
96562306a36Sopenharmony_ci *
96662306a36Sopenharmony_ci * id - uint16_t, event id, may be used by front
96762306a36Sopenharmony_ci * type - uint8_t, type of the event
96862306a36Sopenharmony_ci *
96962306a36Sopenharmony_ci *
97062306a36Sopenharmony_ci * Current stream position - event from back to front when stream's
97162306a36Sopenharmony_ci *   playback/capture position has advanced:
97262306a36Sopenharmony_ci *         0                1                 2               3        octet
97362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
97462306a36Sopenharmony_ci * |               id                |   _EVT_CUR_POS |   reserved     | 4
97562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
97662306a36Sopenharmony_ci * |                             reserved                              | 8
97762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
97862306a36Sopenharmony_ci * |                         position low 32-bit                       | 12
97962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
98062306a36Sopenharmony_ci * |                         position high 32-bit                      | 16
98162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
98262306a36Sopenharmony_ci * |                             reserved                              | 20
98362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
98462306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
98562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
98662306a36Sopenharmony_ci * |                             reserved                              | 64
98762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+
98862306a36Sopenharmony_ci *
98962306a36Sopenharmony_ci * position - current value of stream's playback/capture position, octets
99062306a36Sopenharmony_ci *
99162306a36Sopenharmony_ci */
99262306a36Sopenharmony_ci
99362306a36Sopenharmony_cistruct xensnd_cur_pos_evt {
99462306a36Sopenharmony_ci	uint64_t position;
99562306a36Sopenharmony_ci};
99662306a36Sopenharmony_ci
99762306a36Sopenharmony_cistruct xensnd_req {
99862306a36Sopenharmony_ci	uint16_t id;
99962306a36Sopenharmony_ci	uint8_t operation;
100062306a36Sopenharmony_ci	uint8_t reserved[5];
100162306a36Sopenharmony_ci	union {
100262306a36Sopenharmony_ci		struct xensnd_open_req open;
100362306a36Sopenharmony_ci		struct xensnd_rw_req rw;
100462306a36Sopenharmony_ci		struct xensnd_trigger_req trigger;
100562306a36Sopenharmony_ci		struct xensnd_query_hw_param hw_param;
100662306a36Sopenharmony_ci		uint8_t reserved[56];
100762306a36Sopenharmony_ci	} op;
100862306a36Sopenharmony_ci};
100962306a36Sopenharmony_ci
101062306a36Sopenharmony_cistruct xensnd_resp {
101162306a36Sopenharmony_ci	uint16_t id;
101262306a36Sopenharmony_ci	uint8_t operation;
101362306a36Sopenharmony_ci	uint8_t reserved;
101462306a36Sopenharmony_ci	int32_t status;
101562306a36Sopenharmony_ci	union {
101662306a36Sopenharmony_ci		struct xensnd_query_hw_param hw_param;
101762306a36Sopenharmony_ci		uint8_t reserved1[56];
101862306a36Sopenharmony_ci	} resp;
101962306a36Sopenharmony_ci};
102062306a36Sopenharmony_ci
102162306a36Sopenharmony_cistruct xensnd_evt {
102262306a36Sopenharmony_ci	uint16_t id;
102362306a36Sopenharmony_ci	uint8_t type;
102462306a36Sopenharmony_ci	uint8_t reserved[5];
102562306a36Sopenharmony_ci	union {
102662306a36Sopenharmony_ci		struct xensnd_cur_pos_evt cur_pos;
102762306a36Sopenharmony_ci		uint8_t reserved[56];
102862306a36Sopenharmony_ci	} op;
102962306a36Sopenharmony_ci};
103062306a36Sopenharmony_ci
103162306a36Sopenharmony_ciDEFINE_RING_TYPES(xen_sndif, struct xensnd_req, struct xensnd_resp);
103262306a36Sopenharmony_ci
103362306a36Sopenharmony_ci/*
103462306a36Sopenharmony_ci ******************************************************************************
103562306a36Sopenharmony_ci *                        Back to front events delivery
103662306a36Sopenharmony_ci ******************************************************************************
103762306a36Sopenharmony_ci * In order to deliver asynchronous events from back to front a shared page is
103862306a36Sopenharmony_ci * allocated by front and its granted reference propagated to back via
103962306a36Sopenharmony_ci * XenStore entries (evt-ring-ref/evt-event-channel).
104062306a36Sopenharmony_ci * This page has a common header used by both front and back to synchronize
104162306a36Sopenharmony_ci * access and control event's ring buffer, while back being a producer of the
104262306a36Sopenharmony_ci * events and front being a consumer. The rest of the page after the header
104362306a36Sopenharmony_ci * is used for event packets.
104462306a36Sopenharmony_ci *
104562306a36Sopenharmony_ci * Upon reception of an event(s) front may confirm its reception
104662306a36Sopenharmony_ci * for either each event, group of events or none.
104762306a36Sopenharmony_ci */
104862306a36Sopenharmony_ci
104962306a36Sopenharmony_cistruct xensnd_event_page {
105062306a36Sopenharmony_ci	uint32_t in_cons;
105162306a36Sopenharmony_ci	uint32_t in_prod;
105262306a36Sopenharmony_ci	uint8_t reserved[56];
105362306a36Sopenharmony_ci};
105462306a36Sopenharmony_ci
105562306a36Sopenharmony_ci#define XENSND_EVENT_PAGE_SIZE XEN_PAGE_SIZE
105662306a36Sopenharmony_ci#define XENSND_IN_RING_OFFS (sizeof(struct xensnd_event_page))
105762306a36Sopenharmony_ci#define XENSND_IN_RING_SIZE (XENSND_EVENT_PAGE_SIZE - XENSND_IN_RING_OFFS)
105862306a36Sopenharmony_ci#define XENSND_IN_RING_LEN (XENSND_IN_RING_SIZE / sizeof(struct xensnd_evt))
105962306a36Sopenharmony_ci#define XENSND_IN_RING(page) \
106062306a36Sopenharmony_ci	((struct xensnd_evt *)((char *)(page) + XENSND_IN_RING_OFFS))
106162306a36Sopenharmony_ci#define XENSND_IN_RING_REF(page, idx) \
106262306a36Sopenharmony_ci	(XENSND_IN_RING((page))[(idx) % XENSND_IN_RING_LEN])
106362306a36Sopenharmony_ci
106462306a36Sopenharmony_ci#endif /* __XEN_PUBLIC_IO_SNDIF_H__ */
1065