xref: /freebsd/sys/contrib/xen/io/cameraif.h (revision 3a9fd824)
13a9fd824SRoger Pau Monné /******************************************************************************
23a9fd824SRoger Pau Monné  * cameraif.h
33a9fd824SRoger Pau Monné  *
43a9fd824SRoger Pau Monné  * Unified camera device I/O interface for Xen guest OSes.
53a9fd824SRoger Pau Monné  *
63a9fd824SRoger Pau Monné  * Permission is hereby granted, free of charge, to any person obtaining a copy
73a9fd824SRoger Pau Monné  * of this software and associated documentation files (the "Software"), to
83a9fd824SRoger Pau Monné  * deal in the Software without restriction, including without limitation the
93a9fd824SRoger Pau Monné  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
103a9fd824SRoger Pau Monné  * sell copies of the Software, and to permit persons to whom the Software is
113a9fd824SRoger Pau Monné  * furnished to do so, subject to the following conditions:
123a9fd824SRoger Pau Monné  *
133a9fd824SRoger Pau Monné  * The above copyright notice and this permission notice shall be included in
143a9fd824SRoger Pau Monné  * all copies or substantial portions of the Software.
153a9fd824SRoger Pau Monné  *
163a9fd824SRoger Pau Monné  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
173a9fd824SRoger Pau Monné  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
183a9fd824SRoger Pau Monné  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
193a9fd824SRoger Pau Monné  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
203a9fd824SRoger Pau Monné  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
213a9fd824SRoger Pau Monné  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
223a9fd824SRoger Pau Monné  * DEALINGS IN THE SOFTWARE.
233a9fd824SRoger Pau Monné  *
243a9fd824SRoger Pau Monné  * Copyright (C) 2018-2019 EPAM Systems Inc.
253a9fd824SRoger Pau Monné  *
263a9fd824SRoger Pau Monné  * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
273a9fd824SRoger Pau Monné  */
283a9fd824SRoger Pau Monné 
293a9fd824SRoger Pau Monné #ifndef __XEN_PUBLIC_IO_CAMERAIF_H__
303a9fd824SRoger Pau Monné #define __XEN_PUBLIC_IO_CAMERAIF_H__
313a9fd824SRoger Pau Monné 
323a9fd824SRoger Pau Monné #include "ring.h"
333a9fd824SRoger Pau Monné #include "../grant_table.h"
343a9fd824SRoger Pau Monné 
353a9fd824SRoger Pau Monné /*
363a9fd824SRoger Pau Monné  ******************************************************************************
373a9fd824SRoger Pau Monné  *                           Protocol version
383a9fd824SRoger Pau Monné  ******************************************************************************
393a9fd824SRoger Pau Monné  */
403a9fd824SRoger Pau Monné #define XENCAMERA_PROTOCOL_VERSION     "1"
413a9fd824SRoger Pau Monné 
423a9fd824SRoger Pau Monné /*
433a9fd824SRoger Pau Monné  ******************************************************************************
443a9fd824SRoger Pau Monné  *                  Feature and Parameter Negotiation
453a9fd824SRoger Pau Monné  ******************************************************************************
463a9fd824SRoger Pau Monné  *
473a9fd824SRoger Pau Monné  * Front->back notifications: when enqueuing a new request, sending a
483a9fd824SRoger Pau Monné  * notification can be made conditional on xencamera_req (i.e., the generic
493a9fd824SRoger Pau Monné  * hold-off mechanism provided by the ring macros). Backends must set
503a9fd824SRoger Pau Monné  * xencamera_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()).
513a9fd824SRoger Pau Monné  *
523a9fd824SRoger Pau Monné  * Back->front notifications: when enqueuing a new response, sending a
533a9fd824SRoger Pau Monné  * notification can be made conditional on xencamera_resp (i.e., the generic
543a9fd824SRoger Pau Monné  * hold-off mechanism provided by the ring macros). Frontends must set
553a9fd824SRoger Pau Monné  * xencamera_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()).
563a9fd824SRoger Pau Monné  *
573a9fd824SRoger Pau Monné  * The two halves of a para-virtual camera driver utilize nodes within
583a9fd824SRoger Pau Monné  * XenStore to communicate capabilities and to negotiate operating parameters.
593a9fd824SRoger Pau Monné  * This section enumerates these nodes which reside in the respective front and
603a9fd824SRoger Pau Monné  * backend portions of XenStore, following the XenBus convention.
613a9fd824SRoger Pau Monné  *
623a9fd824SRoger Pau Monné  * All data in XenStore is stored as strings. Nodes specifying numeric
633a9fd824SRoger Pau Monné  * values are encoded in decimal. Integer value ranges listed below are
643a9fd824SRoger Pau Monné  * expressed as fixed sized integer types capable of storing the conversion
653a9fd824SRoger Pau Monné  * of a properly formatted node string, without loss of information.
663a9fd824SRoger Pau Monné  *
673a9fd824SRoger Pau Monné  ******************************************************************************
683a9fd824SRoger Pau Monné  *                        Example configuration
693a9fd824SRoger Pau Monné  ******************************************************************************
703a9fd824SRoger Pau Monné  *
713a9fd824SRoger Pau Monné  * This is an example of backend and frontend configuration:
723a9fd824SRoger Pau Monné  *
733a9fd824SRoger Pau Monné  *--------------------------------- Backend -----------------------------------
743a9fd824SRoger Pau Monné  *
753a9fd824SRoger Pau Monné  * /local/domain/0/backend/vcamera/1/0/frontend-id = "1"
763a9fd824SRoger Pau Monné  * /local/domain/0/backend/vcamera/1/0/frontend = "/local/domain/1/device/vcamera/0"
773a9fd824SRoger Pau Monné  * /local/domain/0/backend/vcamera/1/0/state = "4"
783a9fd824SRoger Pau Monné  * /local/domain/0/backend/vcamera/1/0/versions = "1,2"
793a9fd824SRoger Pau Monné  *
803a9fd824SRoger Pau Monné  *--------------------------------- Frontend ----------------------------------
813a9fd824SRoger Pau Monné  *
823a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/backend-id = "0"
833a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/backend = "/local/domain/0/backend/vcamera/1"
843a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/state = "4"
853a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/version = "1"
863a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/be-alloc = "1"
873a9fd824SRoger Pau Monné  *
883a9fd824SRoger Pau Monné  *---------------------------- Device 0 configuration -------------------------
893a9fd824SRoger Pau Monné  *
903a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/max-buffers = "3"
913a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/controls = "contrast,hue"
923a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/formats/YUYV/640x480/frame-rates = "30/1,15/1"
933a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/formats/YUYV/1920x1080/frame-rates = "15/2"
943a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/formats/BGRA/640x480/frame-rates = "15/1,15/2"
953a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/formats/BGRA/1200x720/frame-rates = "15/2"
963a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/unique-id = "0"
973a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/req-ring-ref = "2832"
983a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/req-event-channel = "15"
993a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/evt-ring-ref = "387"
1003a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/0/evt-event-channel = "16"
1013a9fd824SRoger Pau Monné  *
1023a9fd824SRoger Pau Monné  *---------------------------- Device 1 configuration -------------------------
1033a9fd824SRoger Pau Monné  *
1043a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/1/max-buffers = "8"
1053a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/1/controls = "brightness,saturation,hue"
1063a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/1/formats/YUYV/640x480/frame-rates = "30/1,15/2"
1073a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/1/formats/YUYV/1920x1080/frame-rates = "15/2"
1083a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/1/unique-id = "1"
1093a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/1/req-ring-ref = "2833"
1103a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/1/req-event-channel = "17"
1113a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/1/evt-ring-ref = "388"
1123a9fd824SRoger Pau Monné  * /local/domain/1/device/vcamera/1/evt-event-channel = "18"
1133a9fd824SRoger Pau Monné  *
1143a9fd824SRoger Pau Monné  ******************************************************************************
1153a9fd824SRoger Pau Monné  *                            Backend XenBus Nodes
1163a9fd824SRoger Pau Monné  ******************************************************************************
1173a9fd824SRoger Pau Monné  *
1183a9fd824SRoger Pau Monné  *----------------------------- Protocol version ------------------------------
1193a9fd824SRoger Pau Monné  *
1203a9fd824SRoger Pau Monné  * versions
1213a9fd824SRoger Pau Monné  *      Values:         <string>
1223a9fd824SRoger Pau Monné  *
1233a9fd824SRoger Pau Monné  *      List of XENCAMERA_LIST_SEPARATOR separated protocol versions supported
1243a9fd824SRoger Pau Monné  *      by the backend. For example "1,2,3".
1253a9fd824SRoger Pau Monné  *
1263a9fd824SRoger Pau Monné  ******************************************************************************
1273a9fd824SRoger Pau Monné  *                            Frontend XenBus Nodes
1283a9fd824SRoger Pau Monné  ******************************************************************************
1293a9fd824SRoger Pau Monné  *
1303a9fd824SRoger Pau Monné  *-------------------------------- Addressing ---------------------------------
1313a9fd824SRoger Pau Monné  *
1323a9fd824SRoger Pau Monné  * dom-id
1333a9fd824SRoger Pau Monné  *      Values:         <uint16_t>
1343a9fd824SRoger Pau Monné  *
1353a9fd824SRoger Pau Monné  *      Domain identifier.
1363a9fd824SRoger Pau Monné  *
1373a9fd824SRoger Pau Monné  * dev-id
1383a9fd824SRoger Pau Monné  *      Values:         <uint16_t>
1393a9fd824SRoger Pau Monné  *
1403a9fd824SRoger Pau Monné  *      Device identifier.
1413a9fd824SRoger Pau Monné  *
1423a9fd824SRoger Pau Monné  *      /local/domain/<dom-id>/device/vcamera/<dev-id>/...
1433a9fd824SRoger Pau Monné  *
1443a9fd824SRoger Pau Monné  *----------------------------- Protocol version ------------------------------
1453a9fd824SRoger Pau Monné  *
1463a9fd824SRoger Pau Monné  * version
1473a9fd824SRoger Pau Monné  *      Values:         <string>
1483a9fd824SRoger Pau Monné  *
1493a9fd824SRoger Pau Monné  *      Protocol version, chosen among the ones supported by the backend.
1503a9fd824SRoger Pau Monné  *
1513a9fd824SRoger Pau Monné  *------------------------- Backend buffer allocation -------------------------
1523a9fd824SRoger Pau Monné  *
1533a9fd824SRoger Pau Monné  * be-alloc
1543a9fd824SRoger Pau Monné  *      Values:         "0", "1"
1553a9fd824SRoger Pau Monné  *
1563a9fd824SRoger Pau Monné  *      If value is set to "1", then backend will be the buffer
1573a9fd824SRoger Pau Monné  *      provider/allocator for this domain during XENCAMERA_OP_BUF_CREATE
1583a9fd824SRoger Pau Monné  *      operation.
1593a9fd824SRoger Pau Monné  *      If value is not "1" or omitted frontend must allocate buffers itself.
1603a9fd824SRoger Pau Monné  *
1613a9fd824SRoger Pau Monné  *------------------------------- Camera settings -----------------------------
1623a9fd824SRoger Pau Monné  *
1633a9fd824SRoger Pau Monné  * unique-id
1643a9fd824SRoger Pau Monné  *      Values:         <string>
1653a9fd824SRoger Pau Monné  *
1663a9fd824SRoger Pau Monné  *      After device instance initialization each camera is assigned a
1673a9fd824SRoger Pau Monné  *      unique ID, so it can be identified by the backend by this ID.
1683a9fd824SRoger Pau Monné  *      This can be UUID or such.
1693a9fd824SRoger Pau Monné  *
1703a9fd824SRoger Pau Monné  * max-buffers
1713a9fd824SRoger Pau Monné  *      Values:         <uint8_t>
1723a9fd824SRoger Pau Monné  *
1733a9fd824SRoger Pau Monné  *      Maximum number of camera buffers this frontend may use.
1743a9fd824SRoger Pau Monné  *
1753a9fd824SRoger Pau Monné  * controls
1763a9fd824SRoger Pau Monné  *      Values:         <list of string>
1773a9fd824SRoger Pau Monné  *
1783a9fd824SRoger Pau Monné  *      List of supported camera controls separated by XENCAMERA_LIST_SEPARATOR.
1793a9fd824SRoger Pau Monné  *      Camera controls are expressed as a list of string values w/o any
1803a9fd824SRoger Pau Monné  *      ordering requirement.
1813a9fd824SRoger Pau Monné  *
1823a9fd824SRoger Pau Monné  * formats
1833a9fd824SRoger Pau Monné  *      Values:         <format, char[7]>
1843a9fd824SRoger Pau Monné  *
1853a9fd824SRoger Pau Monné  *      Formats are organized as a set of directories one per each
1863a9fd824SRoger Pau Monné  *      supported pixel format. The name of the directory is the
1873a9fd824SRoger Pau Monné  *      corresponding FOURCC string label. The next level of
1883a9fd824SRoger Pau Monné  *      the directory under <formats> represents supported resolutions.
1893a9fd824SRoger Pau Monné  *      If the format represents a big-endian variant of a little
1903a9fd824SRoger Pau Monné  *      endian format, then the "-BE" suffix must be added. E.g. 'AR15' vs
1913a9fd824SRoger Pau Monné  *      'AR15-BE'.
1923a9fd824SRoger Pau Monné  *      If FOURCC string label has spaces then those are only allowed to
1933a9fd824SRoger Pau Monné  *      be at the end of the label and must be trimmed, for example
1943a9fd824SRoger Pau Monné  *      'Y16' and 'Y16-BE' will be trimmed.
1953a9fd824SRoger Pau Monné  *
1963a9fd824SRoger Pau Monné  * resolution
1973a9fd824SRoger Pau Monné  *      Values:         <width, uint32_t>x<height, uint32_t>
1983a9fd824SRoger Pau Monné  *
1993a9fd824SRoger Pau Monné  *      Resolutions are organized as a set of directories one per each
2003a9fd824SRoger Pau Monné  *      supported resolution under corresponding <formats> directory.
2013a9fd824SRoger Pau Monné  *      The name of the directory is the supported width and height
2023a9fd824SRoger Pau Monné  *      of the camera resolution in pixels.
2033a9fd824SRoger Pau Monné  *
2043a9fd824SRoger Pau Monné  * frame-rates
2053a9fd824SRoger Pau Monné  *      Values:         <numerator, uint32_t>/<denominator, uint32_t>
2063a9fd824SRoger Pau Monné  *
2073a9fd824SRoger Pau Monné  *      List of XENCAMERA_FRAME_RATE_SEPARATOR separated supported frame rates
2083a9fd824SRoger Pau Monné  *      of the camera expressed as numerator and denominator of the
2093a9fd824SRoger Pau Monné  *      corresponding frame rate.
2103a9fd824SRoger Pau Monné  *
2113a9fd824SRoger Pau Monné  *------------------- Camera Request Transport Parameters ---------------------
2123a9fd824SRoger Pau Monné  *
2133a9fd824SRoger Pau Monné  * This communication path is used to deliver requests from frontend to backend
2143a9fd824SRoger Pau Monné  * and get the corresponding responses from backend to frontend,
2153a9fd824SRoger Pau Monné  * set up per virtual camera device.
2163a9fd824SRoger Pau Monné  *
2173a9fd824SRoger Pau Monné  * req-event-channel
2183a9fd824SRoger Pau Monné  *      Values:         <uint32_t>
2193a9fd824SRoger Pau Monné  *
2203a9fd824SRoger Pau Monné  *      The identifier of the Xen camera's control event channel
2213a9fd824SRoger Pau Monné  *      used to signal activity in the ring buffer.
2223a9fd824SRoger Pau Monné  *
2233a9fd824SRoger Pau Monné  * req-ring-ref
2243a9fd824SRoger Pau Monné  *      Values:         <uint32_t>
2253a9fd824SRoger Pau Monné  *
2263a9fd824SRoger Pau Monné  *      The Xen grant reference granting permission for the backend to map
2273a9fd824SRoger Pau Monné  *      a sole page of camera's control ring buffer.
2283a9fd824SRoger Pau Monné  *
2293a9fd824SRoger Pau Monné  *-------------------- Camera Event Transport Parameters ----------------------
2303a9fd824SRoger Pau Monné  *
2313a9fd824SRoger Pau Monné  * This communication path is used to deliver asynchronous events from backend
2323a9fd824SRoger Pau Monné  * to frontend, set up per virtual camera device.
2333a9fd824SRoger Pau Monné  *
2343a9fd824SRoger Pau Monné  * evt-event-channel
2353a9fd824SRoger Pau Monné  *      Values:         <uint32_t>
2363a9fd824SRoger Pau Monné  *
2373a9fd824SRoger Pau Monné  *      The identifier of the Xen camera's event channel
2383a9fd824SRoger Pau Monné  *      used to signal activity in the ring buffer.
2393a9fd824SRoger Pau Monné  *
2403a9fd824SRoger Pau Monné  * evt-ring-ref
2413a9fd824SRoger Pau Monné  *      Values:         <uint32_t>
2423a9fd824SRoger Pau Monné  *
2433a9fd824SRoger Pau Monné  *      The Xen grant reference granting permission for the backend to map
2443a9fd824SRoger Pau Monné  *      a sole page of camera's event ring buffer.
2453a9fd824SRoger Pau Monné  */
2463a9fd824SRoger Pau Monné 
2473a9fd824SRoger Pau Monné /*
2483a9fd824SRoger Pau Monné  ******************************************************************************
2493a9fd824SRoger Pau Monné  *                               STATE DIAGRAMS
2503a9fd824SRoger Pau Monné  ******************************************************************************
2513a9fd824SRoger Pau Monné  *
2523a9fd824SRoger Pau Monné  * Tool stack creates front and back state nodes with initial state
2533a9fd824SRoger Pau Monné  * XenbusStateInitialising.
2543a9fd824SRoger Pau Monné  * Tool stack creates and sets up frontend camera configuration
2553a9fd824SRoger Pau Monné  * nodes per domain.
2563a9fd824SRoger Pau Monné  *
2573a9fd824SRoger Pau Monné  *-------------------------------- Normal flow --------------------------------
2583a9fd824SRoger Pau Monné  *
2593a9fd824SRoger Pau Monné  * Front                                Back
2603a9fd824SRoger Pau Monné  * =================================    =====================================
2613a9fd824SRoger Pau Monné  * XenbusStateInitialising              XenbusStateInitialising
2623a9fd824SRoger Pau Monné  *                                       o Query backend device identification
2633a9fd824SRoger Pau Monné  *                                         data.
2643a9fd824SRoger Pau Monné  *                                       o Open and validate backend device.
2653a9fd824SRoger Pau Monné  *                                                |
2663a9fd824SRoger Pau Monné  *                                                |
2673a9fd824SRoger Pau Monné  *                                                V
2683a9fd824SRoger Pau Monné  *                                      XenbusStateInitWait
2693a9fd824SRoger Pau Monné  *
2703a9fd824SRoger Pau Monné  * o Query frontend configuration
2713a9fd824SRoger Pau Monné  * o Allocate and initialize
2723a9fd824SRoger Pau Monné  *   event channels per configured
2733a9fd824SRoger Pau Monné  *   camera.
2743a9fd824SRoger Pau Monné  * o Publish transport parameters
2753a9fd824SRoger Pau Monné  *   that will be in effect during
2763a9fd824SRoger Pau Monné  *   this connection.
2773a9fd824SRoger Pau Monné  *              |
2783a9fd824SRoger Pau Monné  *              |
2793a9fd824SRoger Pau Monné  *              V
2803a9fd824SRoger Pau Monné  * XenbusStateInitialised
2813a9fd824SRoger Pau Monné  *
2823a9fd824SRoger Pau Monné  *                                       o Query frontend transport parameters.
2833a9fd824SRoger Pau Monné  *                                       o Connect to the event channels.
2843a9fd824SRoger Pau Monné  *                                                |
2853a9fd824SRoger Pau Monné  *                                                |
2863a9fd824SRoger Pau Monné  *                                                V
2873a9fd824SRoger Pau Monné  *                                      XenbusStateConnected
2883a9fd824SRoger Pau Monné  *
2893a9fd824SRoger Pau Monné  *  o Create and initialize OS
2903a9fd824SRoger Pau Monné  *    virtual camera as per
2913a9fd824SRoger Pau Monné  *    configuration.
2923a9fd824SRoger Pau Monné  *              |
2933a9fd824SRoger Pau Monné  *              |
2943a9fd824SRoger Pau Monné  *              V
2953a9fd824SRoger Pau Monné  * XenbusStateConnected
2963a9fd824SRoger Pau Monné  *
2973a9fd824SRoger Pau Monné  *                                      XenbusStateUnknown
2983a9fd824SRoger Pau Monné  *                                      XenbusStateClosed
2993a9fd824SRoger Pau Monné  *                                      XenbusStateClosing
3003a9fd824SRoger Pau Monné  * o Remove virtual camera device
3013a9fd824SRoger Pau Monné  * o Remove event channels
3023a9fd824SRoger Pau Monné  *              |
3033a9fd824SRoger Pau Monné  *              |
3043a9fd824SRoger Pau Monné  *              V
3053a9fd824SRoger Pau Monné  * XenbusStateClosed
3063a9fd824SRoger Pau Monné  *
3073a9fd824SRoger Pau Monné  *------------------------------- Recovery flow -------------------------------
3083a9fd824SRoger Pau Monné  *
3093a9fd824SRoger Pau Monné  * In case of frontend unrecoverable errors backend handles that as
3103a9fd824SRoger Pau Monné  * if frontend goes into the XenbusStateClosed state.
3113a9fd824SRoger Pau Monné  *
3123a9fd824SRoger Pau Monné  * In case of backend unrecoverable errors frontend tries removing
3133a9fd824SRoger Pau Monné  * the virtualized device. If this is possible at the moment of error,
3143a9fd824SRoger Pau Monné  * then frontend goes into the XenbusStateInitialising state and is ready for
3153a9fd824SRoger Pau Monné  * new connection with backend. If the virtualized device is still in use and
3163a9fd824SRoger Pau Monné  * cannot be removed, then frontend goes into the XenbusStateReconfiguring state
3173a9fd824SRoger Pau Monné  * until either the virtualized device is removed or backend initiates a new
3183a9fd824SRoger Pau Monné  * connection. On the virtualized device removal frontend goes into the
3193a9fd824SRoger Pau Monné  * XenbusStateInitialising state.
3203a9fd824SRoger Pau Monné  *
3213a9fd824SRoger Pau Monné  * Note on XenbusStateReconfiguring state of the frontend: if backend has
3223a9fd824SRoger Pau Monné  * unrecoverable errors then frontend cannot send requests to the backend
3233a9fd824SRoger Pau Monné  * and thus cannot provide functionality of the virtualized device anymore.
3243a9fd824SRoger Pau Monné  * After backend is back to normal the virtualized device may still hold some
3253a9fd824SRoger Pau Monné  * state: configuration in use, allocated buffers, client application state etc.
3263a9fd824SRoger Pau Monné  * In most cases, this will require frontend to implement complex recovery
3273a9fd824SRoger Pau Monné  * reconnect logic. Instead, by going into XenbusStateReconfiguring state,
3283a9fd824SRoger Pau Monné  * frontend will make sure no new clients of the virtualized device are
3293a9fd824SRoger Pau Monné  * accepted, allow existing client(s) to exit gracefully by signaling error
3303a9fd824SRoger Pau Monné  * state etc.
3313a9fd824SRoger Pau Monné  * Once all the clients are gone frontend can reinitialize the virtualized
3323a9fd824SRoger Pau Monné  * device and get into XenbusStateInitialising state again signaling the
3333a9fd824SRoger Pau Monné  * backend that a new connection can be made.
3343a9fd824SRoger Pau Monné  *
3353a9fd824SRoger Pau Monné  * There are multiple conditions possible under which frontend will go from
3363a9fd824SRoger Pau Monné  * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS
3373a9fd824SRoger Pau Monné  * specific. For example:
3383a9fd824SRoger Pau Monné  * 1. The underlying OS framework may provide callbacks to signal that the last
3393a9fd824SRoger Pau Monné  *    client of the virtualized device has gone and the device can be removed
3403a9fd824SRoger Pau Monné  * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue)
3413a9fd824SRoger Pau Monné  *    to periodically check if this is the right time to re-try removal of
3423a9fd824SRoger Pau Monné  *    the virtualized device.
3433a9fd824SRoger Pau Monné  * 3. By any other means.
3443a9fd824SRoger Pau Monné  *
3453a9fd824SRoger Pau Monné  ******************************************************************************
3463a9fd824SRoger Pau Monné  *                             REQUEST CODES
3473a9fd824SRoger Pau Monné  ******************************************************************************
3483a9fd824SRoger Pau Monné  */
3493a9fd824SRoger Pau Monné #define XENCAMERA_OP_CONFIG_SET        0x00
3503a9fd824SRoger Pau Monné #define XENCAMERA_OP_CONFIG_GET        0x01
3513a9fd824SRoger Pau Monné #define XENCAMERA_OP_CONFIG_VALIDATE   0x02
3523a9fd824SRoger Pau Monné #define XENCAMERA_OP_FRAME_RATE_SET    0x03
3533a9fd824SRoger Pau Monné #define XENCAMERA_OP_BUF_GET_LAYOUT    0x04
3543a9fd824SRoger Pau Monné #define XENCAMERA_OP_BUF_REQUEST       0x05
3553a9fd824SRoger Pau Monné #define XENCAMERA_OP_BUF_CREATE        0x06
3563a9fd824SRoger Pau Monné #define XENCAMERA_OP_BUF_DESTROY       0x07
3573a9fd824SRoger Pau Monné #define XENCAMERA_OP_BUF_QUEUE         0x08
3583a9fd824SRoger Pau Monné #define XENCAMERA_OP_BUF_DEQUEUE       0x09
3593a9fd824SRoger Pau Monné #define XENCAMERA_OP_CTRL_ENUM         0x0a
3603a9fd824SRoger Pau Monné #define XENCAMERA_OP_CTRL_SET          0x0b
3613a9fd824SRoger Pau Monné #define XENCAMERA_OP_CTRL_GET          0x0c
3623a9fd824SRoger Pau Monné #define XENCAMERA_OP_STREAM_START      0x0d
3633a9fd824SRoger Pau Monné #define XENCAMERA_OP_STREAM_STOP       0x0e
3643a9fd824SRoger Pau Monné 
3653a9fd824SRoger Pau Monné #define XENCAMERA_CTRL_BRIGHTNESS      0
3663a9fd824SRoger Pau Monné #define XENCAMERA_CTRL_CONTRAST        1
3673a9fd824SRoger Pau Monné #define XENCAMERA_CTRL_SATURATION      2
3683a9fd824SRoger Pau Monné #define XENCAMERA_CTRL_HUE             3
3693a9fd824SRoger Pau Monné 
3703a9fd824SRoger Pau Monné /* Number of supported controls. */
3713a9fd824SRoger Pau Monné #define XENCAMERA_MAX_CTRL             4
3723a9fd824SRoger Pau Monné 
3733a9fd824SRoger Pau Monné /* Control is read-only. */
3743a9fd824SRoger Pau Monné #define XENCAMERA_CTRL_FLG_RO          (1 << 0)
3753a9fd824SRoger Pau Monné /* Control is write-only. */
3763a9fd824SRoger Pau Monné #define XENCAMERA_CTRL_FLG_WO          (1 << 1)
3773a9fd824SRoger Pau Monné /* Control's value is volatile. */
3783a9fd824SRoger Pau Monné #define XENCAMERA_CTRL_FLG_VOLATILE    (1 << 2)
3793a9fd824SRoger Pau Monné 
3803a9fd824SRoger Pau Monné /* Supported color spaces. */
3813a9fd824SRoger Pau Monné #define XENCAMERA_COLORSPACE_DEFAULT   0
3823a9fd824SRoger Pau Monné #define XENCAMERA_COLORSPACE_SMPTE170M 1
3833a9fd824SRoger Pau Monné #define XENCAMERA_COLORSPACE_REC709    2
3843a9fd824SRoger Pau Monné #define XENCAMERA_COLORSPACE_SRGB      3
3853a9fd824SRoger Pau Monné #define XENCAMERA_COLORSPACE_OPRGB     4
3863a9fd824SRoger Pau Monné #define XENCAMERA_COLORSPACE_BT2020    5
3873a9fd824SRoger Pau Monné #define XENCAMERA_COLORSPACE_DCI_P3    6
3883a9fd824SRoger Pau Monné 
3893a9fd824SRoger Pau Monné /* Color space transfer function. */
3903a9fd824SRoger Pau Monné #define XENCAMERA_XFER_FUNC_DEFAULT    0
3913a9fd824SRoger Pau Monné #define XENCAMERA_XFER_FUNC_709        1
3923a9fd824SRoger Pau Monné #define XENCAMERA_XFER_FUNC_SRGB       2
3933a9fd824SRoger Pau Monné #define XENCAMERA_XFER_FUNC_OPRGB      3
3943a9fd824SRoger Pau Monné #define XENCAMERA_XFER_FUNC_NONE       4
3953a9fd824SRoger Pau Monné #define XENCAMERA_XFER_FUNC_DCI_P3     5
3963a9fd824SRoger Pau Monné #define XENCAMERA_XFER_FUNC_SMPTE2084  6
3973a9fd824SRoger Pau Monné 
3983a9fd824SRoger Pau Monné /* Color space Y’CbCr encoding. */
3993a9fd824SRoger Pau Monné #define XENCAMERA_YCBCR_ENC_IGNORE           0
4003a9fd824SRoger Pau Monné #define XENCAMERA_YCBCR_ENC_601              1
4013a9fd824SRoger Pau Monné #define XENCAMERA_YCBCR_ENC_709              2
4023a9fd824SRoger Pau Monné #define XENCAMERA_YCBCR_ENC_XV601            3
4033a9fd824SRoger Pau Monné #define XENCAMERA_YCBCR_ENC_XV709            4
4043a9fd824SRoger Pau Monné #define XENCAMERA_YCBCR_ENC_BT2020           5
4053a9fd824SRoger Pau Monné #define XENCAMERA_YCBCR_ENC_BT2020_CONST_LUM 6
4063a9fd824SRoger Pau Monné 
4073a9fd824SRoger Pau Monné /* Quantization range. */
4083a9fd824SRoger Pau Monné #define XENCAMERA_QUANTIZATION_DEFAULT       0
4093a9fd824SRoger Pau Monné #define XENCAMERA_QUANTIZATION_FULL_RANGE    1
4103a9fd824SRoger Pau Monné #define XENCAMERA_QUANTIZATION_LIM_RANGE     2
4113a9fd824SRoger Pau Monné 
4123a9fd824SRoger Pau Monné /*
4133a9fd824SRoger Pau Monné  ******************************************************************************
4143a9fd824SRoger Pau Monné  *                                 EVENT CODES
4153a9fd824SRoger Pau Monné  ******************************************************************************
4163a9fd824SRoger Pau Monné  */
4173a9fd824SRoger Pau Monné #define XENCAMERA_EVT_FRAME_AVAIL      0x00
4183a9fd824SRoger Pau Monné #define XENCAMERA_EVT_CTRL_CHANGE      0x01
4193a9fd824SRoger Pau Monné 
4203a9fd824SRoger Pau Monné /*
4213a9fd824SRoger Pau Monné  ******************************************************************************
4223a9fd824SRoger Pau Monné  *               XENSTORE FIELD AND PATH NAME STRINGS, HELPERS
4233a9fd824SRoger Pau Monné  ******************************************************************************
4243a9fd824SRoger Pau Monné  */
4253a9fd824SRoger Pau Monné #define XENCAMERA_DRIVER_NAME          "vcamera"
4263a9fd824SRoger Pau Monné 
4273a9fd824SRoger Pau Monné #define XENCAMERA_LIST_SEPARATOR       ","
4283a9fd824SRoger Pau Monné #define XENCAMERA_RESOLUTION_SEPARATOR "x"
4293a9fd824SRoger Pau Monné #define XENCAMERA_FRACTION_SEPARATOR   "/"
4303a9fd824SRoger Pau Monné 
4313a9fd824SRoger Pau Monné #define XENCAMERA_FIELD_BE_VERSIONS    "versions"
4323a9fd824SRoger Pau Monné #define XENCAMERA_FIELD_FE_VERSION     "version"
4333a9fd824SRoger Pau Monné #define XENCAMERA_FIELD_REQ_RING_REF   "req-ring-ref"
4343a9fd824SRoger Pau Monné #define XENCAMERA_FIELD_REQ_CHANNEL    "req-event-channel"
4353a9fd824SRoger Pau Monné #define XENCAMERA_FIELD_EVT_RING_REF   "evt-ring-ref"
4363a9fd824SRoger Pau Monné #define XENCAMERA_FIELD_EVT_CHANNEL    "evt-event-channel"
4373a9fd824SRoger Pau Monné #define XENCAMERA_FIELD_MAX_BUFFERS    "max-buffers"
4383a9fd824SRoger Pau Monné #define XENCAMERA_FIELD_CONTROLS       "controls"
4393a9fd824SRoger Pau Monné #define XENCAMERA_FIELD_FORMATS        "formats"
4403a9fd824SRoger Pau Monné #define XENCAMERA_FIELD_FRAME_RATES    "frame-rates"
4413a9fd824SRoger Pau Monné #define XENCAMERA_FIELD_BE_ALLOC       "be-alloc"
4423a9fd824SRoger Pau Monné #define XENCAMERA_FIELD_UNIQUE_ID      "unique-id"
4433a9fd824SRoger Pau Monné 
4443a9fd824SRoger Pau Monné #define XENCAMERA_CTRL_BRIGHTNESS_STR  "brightness"
4453a9fd824SRoger Pau Monné #define XENCAMERA_CTRL_CONTRAST_STR    "contrast"
4463a9fd824SRoger Pau Monné #define XENCAMERA_CTRL_SATURATION_STR  "saturation"
4473a9fd824SRoger Pau Monné #define XENCAMERA_CTRL_HUE_STR         "hue"
4483a9fd824SRoger Pau Monné 
4493a9fd824SRoger Pau Monné #define XENCAMERA_FOURCC_BIGENDIAN_STR "-BE"
4503a9fd824SRoger Pau Monné 
4513a9fd824SRoger Pau Monné /* Maximum number of buffer planes supported. */
4523a9fd824SRoger Pau Monné #define XENCAMERA_MAX_PLANE            4
4533a9fd824SRoger Pau Monné 
4543a9fd824SRoger Pau Monné /*
4553a9fd824SRoger Pau Monné  ******************************************************************************
4563a9fd824SRoger Pau Monné  *                          STATUS RETURN CODES
4573a9fd824SRoger Pau Monné  ******************************************************************************
4583a9fd824SRoger Pau Monné  *
4593a9fd824SRoger Pau Monné  * Status return code is zero on success and -XEN_EXX on failure.
4603a9fd824SRoger Pau Monné  *
4613a9fd824SRoger Pau Monné  ******************************************************************************
4623a9fd824SRoger Pau Monné  *                              Assumptions
4633a9fd824SRoger Pau Monné  ******************************************************************************
4643a9fd824SRoger Pau Monné  *
4653a9fd824SRoger Pau Monné  * - usage of grant reference 0 as invalid grant reference:
4663a9fd824SRoger Pau Monné  *   grant reference 0 is valid, but never exposed to a PV driver,
4673a9fd824SRoger Pau Monné  *   because of the fact it is already in use/reserved by the PV console.
4683a9fd824SRoger Pau Monné  * - all references in this document to page sizes must be treated
4693a9fd824SRoger Pau Monné  *   as pages of size XEN_PAGE_SIZE unless otherwise noted.
4703a9fd824SRoger Pau Monné  * - all FOURCC mappings used for configuration and messaging are
4713a9fd824SRoger Pau Monné  *   Linux V4L2 ones: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/videodev2.h
4723a9fd824SRoger Pau Monné  *   with the following exceptions:
4733a9fd824SRoger Pau Monné  *     - characters are allowed in [0x20; 0x7f] range
4743a9fd824SRoger Pau Monné  *     - when used for XenStore configuration entries the following
4753a9fd824SRoger Pau Monné  *       are not allowed:
4763a9fd824SRoger Pau Monné  *       - '/', '\', ' ' (space), '<', '>', ':', '"', '|', '?', '*'
4773a9fd824SRoger Pau Monné  *       - if trailing spaces are part of the FOURCC code then those must be
4783a9fd824SRoger Pau Monné  *         trimmed
4793a9fd824SRoger Pau Monné  *
4803a9fd824SRoger Pau Monné  *
4813a9fd824SRoger Pau Monné  ******************************************************************************
4823a9fd824SRoger Pau Monné  *       Description of the protocol between frontend and backend driver
4833a9fd824SRoger Pau Monné  ******************************************************************************
4843a9fd824SRoger Pau Monné  *
4853a9fd824SRoger Pau Monné  * The two halves of a Para-virtual camera driver communicate with
4863a9fd824SRoger Pau Monné  * each other using shared pages and event channels.
4873a9fd824SRoger Pau Monné  * Shared page contains a ring with request/response packets.
4883a9fd824SRoger Pau Monné  *
4893a9fd824SRoger Pau Monné  * All reserved fields in the structures below must be 0.
4903a9fd824SRoger Pau Monné  *
4913a9fd824SRoger Pau Monné  * For all request/response/event packets:
4923a9fd824SRoger Pau Monné  *   - frame rate parameter is represented as a pair of 4 octet long
4933a9fd824SRoger Pau Monné  *     numerator and denominator:
4943a9fd824SRoger Pau Monné  *       - frame_rate_numer - uint32_t, numerator of the frame rate
4953a9fd824SRoger Pau Monné  *       - frame_rate_denom - uint32_t, denominator of the frame rate
4963a9fd824SRoger Pau Monné  *     The corresponding frame rate (Hz) is calculated as:
4973a9fd824SRoger Pau Monné  *       frame_rate = frame_rate_numer / frame_rate_denom
4983a9fd824SRoger Pau Monné  *   - buffer index is a zero based index of the buffer. Must be less than
4993a9fd824SRoger Pau Monné  *     the value of XENCAMERA_OP_CONFIG_SET.num_bufs response:
5003a9fd824SRoger Pau Monné  *       - index - uint8_t, index of the buffer.
5013a9fd824SRoger Pau Monné  *
5023a9fd824SRoger Pau Monné  *
5033a9fd824SRoger Pau Monné  *---------------------------------- Requests ---------------------------------
5043a9fd824SRoger Pau Monné  *
5053a9fd824SRoger Pau Monné  * All request packets have the same length (64 octets).
5063a9fd824SRoger Pau Monné  * All request packets have common header:
5073a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
5083a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5093a9fd824SRoger Pau Monné  * |               id                |    operation   |   reserved     | 4
5103a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5113a9fd824SRoger Pau Monné  * |                             reserved                              | 8
5123a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5133a9fd824SRoger Pau Monné  *   id - uint16_t, private guest value, echoed in response.
5143a9fd824SRoger Pau Monné  *   operation - uint8_t, operation code, XENCAMERA_OP_XXX.
5153a9fd824SRoger Pau Monné  *
5163a9fd824SRoger Pau Monné  *
5173a9fd824SRoger Pau Monné  * Request to set/validate the configuration - request to set the
5183a9fd824SRoger Pau Monné  * configuration/mode of the camera (XENCAMERA_OP_CONFIG_SET) or to
5193a9fd824SRoger Pau Monné  * check if the configuration is valid and can be used
5203a9fd824SRoger Pau Monné  * (XENCAMERA_OP_CONFIG_VALIDATE):
5213a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
5223a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5233a9fd824SRoger Pau Monné  * |               id                | _OP_CONFIG_XXX |   reserved     | 4
5243a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5253a9fd824SRoger Pau Monné  * |                             reserved                              | 8
5263a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5273a9fd824SRoger Pau Monné  * |                            pixel format                           | 12
5283a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5293a9fd824SRoger Pau Monné  * |                               width                               | 16
5303a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5313a9fd824SRoger Pau Monné  * |                               height                              | 20
5323a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5333a9fd824SRoger Pau Monné  * |                             reserved                              | 24
5343a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5353a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
5363a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5373a9fd824SRoger Pau Monné  * |                             reserved                              | 64
5383a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5393a9fd824SRoger Pau Monné  *
5403a9fd824SRoger Pau Monné  * pixel_format - uint32_t, pixel format to be used, FOURCC code.
5413a9fd824SRoger Pau Monné  * width - uint32_t, width in pixels.
5423a9fd824SRoger Pau Monné  * height - uint32_t, height in pixels.
5433a9fd824SRoger Pau Monné  *
5443a9fd824SRoger Pau Monné  * See response format for this request.
5453a9fd824SRoger Pau Monné  *
5463a9fd824SRoger Pau Monné  * Notes:
5473a9fd824SRoger Pau Monné  *  - the only difference between XENCAMERA_OP_CONFIG_VALIDATE and
5483a9fd824SRoger Pau Monné  *    XENCAMERA_OP_CONFIG_SET is that the former doesn't actually change
5493a9fd824SRoger Pau Monné  *    camera configuration, but queries if the configuration is valid.
5503a9fd824SRoger Pau Monné  *    This can be used while stream is active and/or buffers allocated.
5513a9fd824SRoger Pau Monné  *  - frontend must check the corresponding response in order to see
5523a9fd824SRoger Pau Monné  *    if the values reported back by the backend do match the desired ones
5533a9fd824SRoger Pau Monné  *    and can be accepted.
5543a9fd824SRoger Pau Monné  *  - frontend may send multiple XENCAMERA_OP_CONFIG_SET requests before
5553a9fd824SRoger Pau Monné  *    sending XENCAMERA_OP_STREAM_START request to update or tune the
5563a9fd824SRoger Pau Monné  *    final stream configuration.
5573a9fd824SRoger Pau Monné  *  - configuration cannot be changed during active streaming, e.g.
5583a9fd824SRoger Pau Monné  *    after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP
5593a9fd824SRoger Pau Monné  *    requests.
5603a9fd824SRoger Pau Monné  */
5613a9fd824SRoger Pau Monné struct xencamera_config_req {
5623a9fd824SRoger Pau Monné     uint32_t pixel_format;
5633a9fd824SRoger Pau Monné     uint32_t width;
5643a9fd824SRoger Pau Monné     uint32_t height;
5653a9fd824SRoger Pau Monné };
5663a9fd824SRoger Pau Monné 
5673a9fd824SRoger Pau Monné /*
5683a9fd824SRoger Pau Monné  * Request current configuration of the camera:
5693a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
5703a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5713a9fd824SRoger Pau Monné  * |               id                | _OP_CONFIG_GET |   reserved     | 4
5723a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5733a9fd824SRoger Pau Monné  * |                             reserved                              | 8
5743a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5753a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
5763a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5773a9fd824SRoger Pau Monné  * |                             reserved                              | 64
5783a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5793a9fd824SRoger Pau Monné  *
5803a9fd824SRoger Pau Monné  * See response format for this request.
5813a9fd824SRoger Pau Monné  *
5823a9fd824SRoger Pau Monné  *
5833a9fd824SRoger Pau Monné  * Request to set the frame rate of the stream:
5843a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
5853a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5863a9fd824SRoger Pau Monné  * |               id                | _FRAME_RATE_SET|   reserved     | 4
5873a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5883a9fd824SRoger Pau Monné  * |                             reserved                              | 8
5893a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5903a9fd824SRoger Pau Monné  * |                          frame_rate_numer                         | 12
5913a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5923a9fd824SRoger Pau Monné  * |                          frame_rate_denom                         | 16
5933a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5943a9fd824SRoger Pau Monné  * |                             reserved                              | 20
5953a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5963a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
5973a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
5983a9fd824SRoger Pau Monné  * |                             reserved                              | 64
5993a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6003a9fd824SRoger Pau Monné  *
6013a9fd824SRoger Pau Monné  * frame_rate_numer - uint32_t, numerator of the frame rate.
6023a9fd824SRoger Pau Monné  * frame_rate_denom - uint32_t, denominator of the frame rate.
6033a9fd824SRoger Pau Monné  *
6043a9fd824SRoger Pau Monné  * Notes:
6053a9fd824SRoger Pau Monné  *  - to query the current (actual) frame rate use XENCAMERA_OP_CONFIG_GET
6063a9fd824SRoger Pau Monné  *    request.
6073a9fd824SRoger Pau Monné  *  - this request can be used with camera buffers allocated, but stream
6083a9fd824SRoger Pau Monné  *    stopped, e.g. frontend is allowed to stop the stream with
6093a9fd824SRoger Pau Monné  *    XENCAMERA_OP_STREAM_STOP, hold the buffers allocated (e.g. keep the
6103a9fd824SRoger Pau Monné  *    configuration set with XENCAMERA_OP_CONFIG_SET), change the
6113a9fd824SRoger Pau Monné  *    frame rate of the stream and (re)start the stream again with
6123a9fd824SRoger Pau Monné  *    XENCAMERA_OP_STREAM_START.
6133a9fd824SRoger Pau Monné  *  - frame rate cannot be changed during active streaming, e.g.
6143a9fd824SRoger Pau Monné  *    after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP
6153a9fd824SRoger Pau Monné  *    commands.
6163a9fd824SRoger Pau Monné  */
6173a9fd824SRoger Pau Monné struct xencamera_frame_rate_req {
6183a9fd824SRoger Pau Monné     uint32_t frame_rate_numer;
6193a9fd824SRoger Pau Monné     uint32_t frame_rate_denom;
6203a9fd824SRoger Pau Monné };
6213a9fd824SRoger Pau Monné 
6223a9fd824SRoger Pau Monné /*
6233a9fd824SRoger Pau Monné  * Request camera buffer's layout:
6243a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
6253a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6263a9fd824SRoger Pau Monné  * |               id                | _BUF_GET_LAYOUT|   reserved     | 4
6273a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6283a9fd824SRoger Pau Monné  * |                             reserved                              | 8
6293a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6303a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
6313a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6323a9fd824SRoger Pau Monné  * |                             reserved                              | 64
6333a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6343a9fd824SRoger Pau Monné  *
6353a9fd824SRoger Pau Monné  * See response format for this request.
6363a9fd824SRoger Pau Monné  *
6373a9fd824SRoger Pau Monné  *
6383a9fd824SRoger Pau Monné  * Request number of buffers to be used:
6393a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
6403a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6413a9fd824SRoger Pau Monné  * |               id                | _OP_BUF_REQUEST|   reserved     | 4
6423a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6433a9fd824SRoger Pau Monné  * |                             reserved                              | 8
6443a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6453a9fd824SRoger Pau Monné  * |    num_bufs    |                     reserved                     | 12
6463a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6473a9fd824SRoger Pau Monné  * |                             reserved                              | 16
6483a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6493a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
6503a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6513a9fd824SRoger Pau Monné  * |                             reserved                              | 64
6523a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6533a9fd824SRoger Pau Monné  *
6543a9fd824SRoger Pau Monné  * num_bufs - uint8_t, desired number of buffers to be used.
6553a9fd824SRoger Pau Monné  *
6563a9fd824SRoger Pau Monné  * If num_bufs is not zero then the backend validates the requested number of
6573a9fd824SRoger Pau Monné  * buffers and responds with the number of buffers allowed for this frontend.
6583a9fd824SRoger Pau Monné  * Frontend is responsible for checking the corresponding response in order to
6593a9fd824SRoger Pau Monné  * see if the values reported back by the backend do match the desired ones
6603a9fd824SRoger Pau Monné  * and can be accepted.
6613a9fd824SRoger Pau Monné  * Frontend is allowed to send multiple XENCAMERA_OP_BUF_REQUEST requests
6623a9fd824SRoger Pau Monné  * before sending XENCAMERA_OP_STREAM_START request to update or tune the
6633a9fd824SRoger Pau Monné  * final configuration.
6643a9fd824SRoger Pau Monné  * Frontend is not allowed to change the camera configuration after this call
6653a9fd824SRoger Pau Monné  * with a non-zero value of num_bufs. If camera reconfiguration is required
6663a9fd824SRoger Pau Monné  * then this request must be sent with num_bufs set to zero and any created
6673a9fd824SRoger Pau Monné  * buffers must be destroyed first.
6683a9fd824SRoger Pau Monné  * Frontend is not allowed to change the number of buffers after the
6693a9fd824SRoger Pau Monné  * streaming has started.
6703a9fd824SRoger Pau Monné  *
6713a9fd824SRoger Pau Monné  * If num_bufs is 0 and streaming has not started yet, then the backend will
6723a9fd824SRoger Pau Monné  * free all previously allocated buffers (if any).
6733a9fd824SRoger Pau Monné  * Trying to call this if streaming is in progress will result in an error.
6743a9fd824SRoger Pau Monné  *
6753a9fd824SRoger Pau Monné  * If camera reconfiguration is required then the streaming must be stopped
6763a9fd824SRoger Pau Monné  * and this request must be sent with num_bufs set to zero and any
6773a9fd824SRoger Pau Monné  * created buffers must be destroyed.
6783a9fd824SRoger Pau Monné  *
6793a9fd824SRoger Pau Monné  * Please note, that the number of buffers in this request must not exceed
6803a9fd824SRoger Pau Monné  * the value configured in XenStore.max-buffers.
6813a9fd824SRoger Pau Monné  *
6823a9fd824SRoger Pau Monné  * See response format for this request.
6833a9fd824SRoger Pau Monné  */
6843a9fd824SRoger Pau Monné struct xencamera_buf_request {
6853a9fd824SRoger Pau Monné     uint8_t num_bufs;
6863a9fd824SRoger Pau Monné };
6873a9fd824SRoger Pau Monné 
6883a9fd824SRoger Pau Monné /*
6893a9fd824SRoger Pau Monné  * Request camera buffer creation:
6903a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
6913a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6923a9fd824SRoger Pau Monné  * |               id                | _OP_BUF_CREATE |   reserved     | 4
6933a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6943a9fd824SRoger Pau Monné  * |                             reserved                              | 8
6953a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6963a9fd824SRoger Pau Monné  * |      index     |                     reserved                     | 12
6973a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
6983a9fd824SRoger Pau Monné  * |                           plane_offset[0]                         | 16
6993a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7003a9fd824SRoger Pau Monné  * |                           plane_offset[1]                         | 20
7013a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7023a9fd824SRoger Pau Monné  * |                           plane_offset[2]                         | 24
7033a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7043a9fd824SRoger Pau Monné  * |                           plane_offset[3]                         | 28
7053a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7063a9fd824SRoger Pau Monné  * |                           gref_directory                          | 32
7073a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7083a9fd824SRoger Pau Monné  * |                             reserved                              | 36
7093a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7103a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
7113a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7123a9fd824SRoger Pau Monné  * |                             reserved                              | 64
7133a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7143a9fd824SRoger Pau Monné  *
7153a9fd824SRoger Pau Monné  * An attempt to create multiple buffers with the same index is an error.
7163a9fd824SRoger Pau Monné  * index can be re-used after destroying the corresponding camera buffer.
7173a9fd824SRoger Pau Monné  *
7183a9fd824SRoger Pau Monné  * index - uint8_t, index of the buffer to be created in the range
7193a9fd824SRoger Pau Monné  *   from 0 to the num_bufs field returned in response for
7203a9fd824SRoger Pau Monné  *   XENCAMERA_OP_BUF_REQUEST request
7213a9fd824SRoger Pau Monné  * plane_offset - array of uint32_t, offset of the corresponding plane
7223a9fd824SRoger Pau Monné  *   in octets from the buffer start. Number of offsets returned is
7233a9fd824SRoger Pau Monné  *   equal to the value returned in XENCAMERA_OP_BUF_GET_LAYOUT.num_planes.
7243a9fd824SRoger Pau Monné  * gref_directory - grant_ref_t, a reference to the first shared page
7253a9fd824SRoger Pau Monné  *   describing shared buffer references. The size of the buffer is equal to
7263a9fd824SRoger Pau Monné  *   XENCAMERA_OP_BUF_GET_LAYOUT.size response. At least one page exists. If
7273a9fd824SRoger Pau Monné  *   shared buffer size exceeds what can be addressed by this single page,
7283a9fd824SRoger Pau Monné  *   then reference to the next shared page must be supplied (see
7293a9fd824SRoger Pau Monné  *   gref_dir_next_page below).
7303a9fd824SRoger Pau Monné  *
7313a9fd824SRoger Pau Monné  * If XENCAMERA_FIELD_BE_ALLOC configuration entry is set, then backend will
7323a9fd824SRoger Pau Monné  * allocate the buffer with the parameters provided in this request and page
7333a9fd824SRoger Pau Monné  * directory is handled as follows:
7343a9fd824SRoger Pau Monné  *   Frontend on request:
7353a9fd824SRoger Pau Monné  *     - allocates pages for the directory (gref_directory,
7363a9fd824SRoger Pau Monné  *       gref_dir_next_page(s)
7373a9fd824SRoger Pau Monné  *     - grants permissions for the pages of the directory to the backend
7383a9fd824SRoger Pau Monné  *     - sets gref_dir_next_page fields
7393a9fd824SRoger Pau Monné  *   Backend on response:
7403a9fd824SRoger Pau Monné  *     - grants permissions for the pages of the buffer allocated to
7413a9fd824SRoger Pau Monné  *       the frontend
7423a9fd824SRoger Pau Monné  *     - fills in page directory with grant references
7433a9fd824SRoger Pau Monné  *       (gref[] in struct xencamera_page_directory)
7443a9fd824SRoger Pau Monné  */
7453a9fd824SRoger Pau Monné struct xencamera_buf_create_req {
7463a9fd824SRoger Pau Monné     uint8_t index;
7473a9fd824SRoger Pau Monné     uint8_t reserved[3];
7483a9fd824SRoger Pau Monné     uint32_t plane_offset[XENCAMERA_MAX_PLANE];
7493a9fd824SRoger Pau Monné     grant_ref_t gref_directory;
7503a9fd824SRoger Pau Monné };
7513a9fd824SRoger Pau Monné 
7523a9fd824SRoger Pau Monné /*
7533a9fd824SRoger Pau Monné  * Shared page for XENCAMERA_OP_BUF_CREATE buffer descriptor (gref_directory in
7543a9fd824SRoger Pau Monné  * the request) employs a list of pages, describing all pages of the shared
7553a9fd824SRoger Pau Monné  * data buffer:
7563a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
7573a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7583a9fd824SRoger Pau Monné  * |                        gref_dir_next_page                         | 4
7593a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7603a9fd824SRoger Pau Monné  * |                              gref[0]                              | 8
7613a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7623a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
7633a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7643a9fd824SRoger Pau Monné  * |                              gref[i]                              | i*4+8
7653a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7663a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
7673a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7683a9fd824SRoger Pau Monné  * |                             gref[N - 1]                           | N*4+8
7693a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7703a9fd824SRoger Pau Monné  *
7713a9fd824SRoger Pau Monné  * gref_dir_next_page - grant_ref_t, reference to the next page describing
7723a9fd824SRoger Pau Monné  *   page directory. Must be 0 if there are no more pages in the list.
7733a9fd824SRoger Pau Monné  * gref[i] - grant_ref_t, reference to a shared page of the buffer
7743a9fd824SRoger Pau Monné  *   allocated at XENCAMERA_OP_BUF_CREATE.
7753a9fd824SRoger Pau Monné  *
7763a9fd824SRoger Pau Monné  * Number of grant_ref_t entries in the whole page directory is not
7773a9fd824SRoger Pau Monné  * passed, but instead can be calculated as:
7783a9fd824SRoger Pau Monné  *   num_grefs_total = (XENCAMERA_OP_BUF_REQUEST.size + XEN_PAGE_SIZE - 1) /
7793a9fd824SRoger Pau Monné  *       XEN_PAGE_SIZE
7803a9fd824SRoger Pau Monné  */
7813a9fd824SRoger Pau Monné struct xencamera_page_directory {
7823a9fd824SRoger Pau Monné     grant_ref_t gref_dir_next_page;
7833a9fd824SRoger Pau Monné     grant_ref_t gref[1]; /* Variable length */
7843a9fd824SRoger Pau Monné };
7853a9fd824SRoger Pau Monné 
7863a9fd824SRoger Pau Monné /*
7873a9fd824SRoger Pau Monné  * Request buffer destruction - destroy a previously allocated camera buffer:
7883a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
7893a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7903a9fd824SRoger Pau Monné  * |               id                | _OP_BUF_DESTROY|   reserved     | 4
7913a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7923a9fd824SRoger Pau Monné  * |                             reserved                              | 8
7933a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7943a9fd824SRoger Pau Monné  * |      index     |                     reserved                     | 12
7953a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7963a9fd824SRoger Pau Monné  * |                             reserved                              | 16
7973a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
7983a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
7993a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8003a9fd824SRoger Pau Monné  * |                             reserved                              | 64
8013a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8023a9fd824SRoger Pau Monné  *
8033a9fd824SRoger Pau Monné  * index - uint8_t, index of the buffer to be destroyed.
8043a9fd824SRoger Pau Monné  *
8053a9fd824SRoger Pau Monné  *
8063a9fd824SRoger Pau Monné  * Request queueing of the buffer for backend use:
8073a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
8083a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8093a9fd824SRoger Pau Monné  * |               id                | _OP_BUF_QUEUE  |   reserved     | 4
8103a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8113a9fd824SRoger Pau Monné  * |                             reserved                              | 8
8123a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8133a9fd824SRoger Pau Monné  * |      index     |                     reserved                     | 12
8143a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8153a9fd824SRoger Pau Monné  * |                             reserved                              | 16
8163a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8173a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
8183a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8193a9fd824SRoger Pau Monné  * |                             reserved                              | 64
8203a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8213a9fd824SRoger Pau Monné  *
8223a9fd824SRoger Pau Monné  * Notes:
8233a9fd824SRoger Pau Monné  *  - frontends must not access the buffer content after this request until
8243a9fd824SRoger Pau Monné  *    response to XENCAMERA_OP_BUF_DEQUEUE has been received.
8253a9fd824SRoger Pau Monné  *  - buffers must be queued to the backend before destroying them with
8263a9fd824SRoger Pau Monné  *    XENCAMERA_OP_BUF_DESTROY.
8273a9fd824SRoger Pau Monné  *
8283a9fd824SRoger Pau Monné  * index - uint8_t, index of the buffer to be queued.
8293a9fd824SRoger Pau Monné  *
8303a9fd824SRoger Pau Monné  *
8313a9fd824SRoger Pau Monné  * Request dequeueing of the buffer for frontend use:
8323a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
8333a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8343a9fd824SRoger Pau Monné  * |               id                |_OP_BUF_DEQUEUE |   reserved     | 4
8353a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8363a9fd824SRoger Pau Monné  * |                             reserved                              | 8
8373a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8383a9fd824SRoger Pau Monné  * |      index     |                     reserved                     | 12
8393a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8403a9fd824SRoger Pau Monné  * |                             reserved                              | 16
8413a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8423a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
8433a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8443a9fd824SRoger Pau Monné  * |                             reserved                              | 64
8453a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8463a9fd824SRoger Pau Monné  *
8473a9fd824SRoger Pau Monné  * Notes:
8483a9fd824SRoger Pau Monné  *  - frontend is allowed to access the buffer content after the corresponding
8493a9fd824SRoger Pau Monné  *    response to this request.
8503a9fd824SRoger Pau Monné  *
8513a9fd824SRoger Pau Monné  * index - uint8_t, index of the buffer to be queued.
8523a9fd824SRoger Pau Monné  *
8533a9fd824SRoger Pau Monné  *
8543a9fd824SRoger Pau Monné  * Request camera control details:
8553a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
8563a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8573a9fd824SRoger Pau Monné  * |               id                | _OP_CTRL_ENUM  |   reserved     | 4
8583a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8593a9fd824SRoger Pau Monné  * |      index     |                     reserved                     | 8
8603a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8613a9fd824SRoger Pau Monné  * |                             reserved                              | 12
8623a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8633a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
8643a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8653a9fd824SRoger Pau Monné  * |                             reserved                              | 64
8663a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8673a9fd824SRoger Pau Monné  *
8683a9fd824SRoger Pau Monné  * See response format for this request.
8693a9fd824SRoger Pau Monné  *
8703a9fd824SRoger Pau Monné  * index - uint8_t, index of the control to be queried.
8713a9fd824SRoger Pau Monné  */
8723a9fd824SRoger Pau Monné struct xencamera_index {
8733a9fd824SRoger Pau Monné     uint8_t index;
8743a9fd824SRoger Pau Monné };
8753a9fd824SRoger Pau Monné 
8763a9fd824SRoger Pau Monné /*
8773a9fd824SRoger Pau Monné  * Request camera control change:
8783a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
8793a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8803a9fd824SRoger Pau Monné  * |               id                |  _OP_SET_CTRL  |   reserved     | 4
8813a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8823a9fd824SRoger Pau Monné  * |       type     |                     reserved                     | 8
8833a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8843a9fd824SRoger Pau Monné  * |                             reserved                              | 12
8853a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8863a9fd824SRoger Pau Monné  * |                             reserved                              | 16
8873a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8883a9fd824SRoger Pau Monné  * |                          value low 32-bit                         | 20
8893a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8903a9fd824SRoger Pau Monné  * |                          value high 32-bit                        | 24
8913a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8923a9fd824SRoger Pau Monné  * |                             reserved                              | 28
8933a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8943a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
8953a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8963a9fd824SRoger Pau Monné  * |                             reserved                              | 64
8973a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
8983a9fd824SRoger Pau Monné  *
8993a9fd824SRoger Pau Monné  * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX.
9003a9fd824SRoger Pau Monné  * value - int64_t, new value of the control.
9013a9fd824SRoger Pau Monné  */
9023a9fd824SRoger Pau Monné struct xencamera_ctrl_value {
9033a9fd824SRoger Pau Monné     uint8_t type;
9043a9fd824SRoger Pau Monné     uint8_t reserved[7];
9053a9fd824SRoger Pau Monné     int64_t value;
9063a9fd824SRoger Pau Monné };
9073a9fd824SRoger Pau Monné 
9083a9fd824SRoger Pau Monné /*
9093a9fd824SRoger Pau Monné  * Request camera control state:
9103a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
9113a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9123a9fd824SRoger Pau Monné  * |               id                |  _OP_GET_CTRL  |   reserved     | 4
9133a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9143a9fd824SRoger Pau Monné  * |       type     |                     reserved                     | 8
9153a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9163a9fd824SRoger Pau Monné  * |                             reserved                              | 12
9173a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9183a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
9193a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9203a9fd824SRoger Pau Monné  * |                             reserved                              | 64
9213a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9223a9fd824SRoger Pau Monné  *
9233a9fd824SRoger Pau Monné  * See response format for this request.
9243a9fd824SRoger Pau Monné  *
9253a9fd824SRoger Pau Monné  * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX.
9263a9fd824SRoger Pau Monné  */
9273a9fd824SRoger Pau Monné struct xencamera_get_ctrl_req {
9283a9fd824SRoger Pau Monné     uint8_t type;
9293a9fd824SRoger Pau Monné };
9303a9fd824SRoger Pau Monné 
9313a9fd824SRoger Pau Monné /*
9323a9fd824SRoger Pau Monné  * Request camera capture stream start:
9333a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
9343a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9353a9fd824SRoger Pau Monné  * |               id                |_OP_STREAM_START|   reserved     | 4
9363a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9373a9fd824SRoger Pau Monné  * |                             reserved                              | 8
9383a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9393a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
9403a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9413a9fd824SRoger Pau Monné  * |                             reserved                              | 64
9423a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9433a9fd824SRoger Pau Monné  *
9443a9fd824SRoger Pau Monné  *
9453a9fd824SRoger Pau Monné  * Request camera capture stream stop:
9463a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
9473a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9483a9fd824SRoger Pau Monné  * |               id                |_OP_STREAM_STOP |   reserved     | 4
9493a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9503a9fd824SRoger Pau Monné  * |                             reserved                              | 8
9513a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9523a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
9533a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9543a9fd824SRoger Pau Monné  * |                             reserved                              | 64
9553a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9563a9fd824SRoger Pau Monné  *
9573a9fd824SRoger Pau Monné  *
9583a9fd824SRoger Pau Monné  *---------------------------------- Responses --------------------------------
9593a9fd824SRoger Pau Monné  *
9603a9fd824SRoger Pau Monné  * All response packets have the same length (64 octets).
9613a9fd824SRoger Pau Monné  *
9623a9fd824SRoger Pau Monné  * All response packets have common header:
9633a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
9643a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9653a9fd824SRoger Pau Monné  * |               id                |    operation   |    reserved    | 4
9663a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9673a9fd824SRoger Pau Monné  * |                              status                               | 8
9683a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9693a9fd824SRoger Pau Monné  *
9703a9fd824SRoger Pau Monné  * id - uint16_t, copied from the request.
9713a9fd824SRoger Pau Monné  * operation - uint8_t, XENCAMERA_OP_* - copied from request.
9723a9fd824SRoger Pau Monné  * status - int32_t, response status, zero on success and -XEN_EXX on failure.
9733a9fd824SRoger Pau Monné  *
9743a9fd824SRoger Pau Monné  *
9753a9fd824SRoger Pau Monné  * Configuration response - response for XENCAMERA_OP_CONFIG_SET,
9763a9fd824SRoger Pau Monné  * XENCAMERA_OP_CONFIG_GET and XENCAMERA_OP_CONFIG_VALIDATE requests:
9773a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
9783a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9793a9fd824SRoger Pau Monné  * |               id                | _OP_CONFIG_XXX |    reserved    | 4
9803a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9813a9fd824SRoger Pau Monné  * |                               status                              | 8
9823a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9833a9fd824SRoger Pau Monné  * |                            pixel format                           | 12
9843a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9853a9fd824SRoger Pau Monné  * |                               width                               | 16
9863a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9873a9fd824SRoger Pau Monné  * |                               height                              | 20
9883a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9893a9fd824SRoger Pau Monné  * |                             colorspace                            | 24
9903a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9913a9fd824SRoger Pau Monné  * |                             xfer_func                             | 28
9923a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9933a9fd824SRoger Pau Monné  * |                             ycbcr_enc                             | 32
9943a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9953a9fd824SRoger Pau Monné  * |                            quantization                           | 36
9963a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9973a9fd824SRoger Pau Monné  * |                       displ_asp_ratio_numer                       | 40
9983a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
9993a9fd824SRoger Pau Monné  * |                       displ_asp_ratio_denom                       | 44
10003a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10013a9fd824SRoger Pau Monné  * |                          frame_rate_numer                         | 48
10023a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10033a9fd824SRoger Pau Monné  * |                          frame_rate_denom                         | 52
10043a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10053a9fd824SRoger Pau Monné  * |                             reserved                              | 56
10063a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10073a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
10083a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10093a9fd824SRoger Pau Monné  * |                             reserved                              | 64
10103a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10113a9fd824SRoger Pau Monné  *
10123a9fd824SRoger Pau Monné  * Meaning of the corresponding values in this response is the same as for
10133a9fd824SRoger Pau Monné  * XENCAMERA_OP_CONFIG_SET and XENCAMERA_OP_FRAME_RATE_SET requests.
10143a9fd824SRoger Pau Monné  *
10153a9fd824SRoger Pau Monné  * colorspace - uint32_t, this supplements pixel_format parameter,
10163a9fd824SRoger Pau Monné  *   one of the XENCAMERA_COLORSPACE_XXX.
10173a9fd824SRoger Pau Monné  * xfer_func - uint32_t, this supplements colorspace parameter,
10183a9fd824SRoger Pau Monné  *   one of the XENCAMERA_XFER_FUNC_XXX.
10193a9fd824SRoger Pau Monné  * ycbcr_enc - uint32_t, this supplements colorspace parameter,
10203a9fd824SRoger Pau Monné  *   one of the XENCAMERA_YCBCR_ENC_XXX. Please note, that ycbcr_enc is only
10213a9fd824SRoger Pau Monné  *   valid for YCbCr pixelformats and should be ignored otherwise.
10223a9fd824SRoger Pau Monné  * quantization - uint32_t, this supplements colorspace parameter,
10233a9fd824SRoger Pau Monné  *   one of the XENCAMERA_QUANTIZATION_XXX.
10243a9fd824SRoger Pau Monné  * displ_asp_ratio_numer - uint32_t, numerator of the display aspect ratio.
10253a9fd824SRoger Pau Monné  * displ_asp_ratio_denom - uint32_t, denominator of the display aspect ratio.
10263a9fd824SRoger Pau Monné  */
10273a9fd824SRoger Pau Monné struct xencamera_config_resp {
10283a9fd824SRoger Pau Monné     uint32_t pixel_format;
10293a9fd824SRoger Pau Monné     uint32_t width;
10303a9fd824SRoger Pau Monné     uint32_t height;
10313a9fd824SRoger Pau Monné     uint32_t colorspace;
10323a9fd824SRoger Pau Monné     uint32_t xfer_func;
10333a9fd824SRoger Pau Monné     uint32_t ycbcr_enc;
10343a9fd824SRoger Pau Monné     uint32_t quantization;
10353a9fd824SRoger Pau Monné     uint32_t displ_asp_ratio_numer;
10363a9fd824SRoger Pau Monné     uint32_t displ_asp_ratio_denom;
10373a9fd824SRoger Pau Monné     uint32_t frame_rate_numer;
10383a9fd824SRoger Pau Monné     uint32_t frame_rate_denom;
10393a9fd824SRoger Pau Monné };
10403a9fd824SRoger Pau Monné 
10413a9fd824SRoger Pau Monné /*
10423a9fd824SRoger Pau Monné  * Request buffer response - response for XENCAMERA_OP_BUF_GET_LAYOUT
10433a9fd824SRoger Pau Monné  * request:
10443a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
10453a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10463a9fd824SRoger Pau Monné  * |               id                |_BUF_GET_LAYOUT |    reserved    | 4
10473a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10483a9fd824SRoger Pau Monné  * |                               status                              | 8
10493a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10503a9fd824SRoger Pau Monné  * |   num_planes   |                     reserved                     | 12
10513a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10523a9fd824SRoger Pau Monné  * |                                size                               | 16
10533a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10543a9fd824SRoger Pau Monné  * |                           plane_size[0]                           | 20
10553a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10563a9fd824SRoger Pau Monné  * |                           plane_size[1]                           | 24
10573a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10583a9fd824SRoger Pau Monné  * |                           plane_size[2]                           | 28
10593a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10603a9fd824SRoger Pau Monné  * |                           plane_size[3]                           | 32
10613a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10623a9fd824SRoger Pau Monné  * |                          plane_stride[0]                          | 36
10633a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10643a9fd824SRoger Pau Monné  * |                          plane_stride[1]                          | 40
10653a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10663a9fd824SRoger Pau Monné  * |                          plane_stride[2]                          | 44
10673a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10683a9fd824SRoger Pau Monné  * |                          plane_stride[3]                          | 48
10693a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10703a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
10713a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10723a9fd824SRoger Pau Monné  * |                             reserved                              | 64
10733a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
10743a9fd824SRoger Pau Monné  *
10753a9fd824SRoger Pau Monné  * num_planes - uint8_t, number of planes of the buffer.
10763a9fd824SRoger Pau Monné  * size - uint32_t, overall size of the buffer including sizes of the
10773a9fd824SRoger Pau Monné  *   individual planes and padding if applicable.
10783a9fd824SRoger Pau Monné  * plane_size - array of uint32_t, size in octets of the corresponding plane
10793a9fd824SRoger Pau Monné  *   including padding.
10803a9fd824SRoger Pau Monné  * plane_stride - array of uint32_t, size in octets occupied by the
10813a9fd824SRoger Pau Monné  *   corresponding single image line including padding if applicable.
10823a9fd824SRoger Pau Monné  *
10833a9fd824SRoger Pau Monné  * Note! The sizes and strides in this response apply to all buffers created
10843a9fd824SRoger Pau Monné  * with XENCAMERA_OP_BUF_CREATE command, but individual buffers may have
10853a9fd824SRoger Pau Monné  * different plane offsets, see XENCAMERA_OP_BUF_REQUEST.plane_offset.
10863a9fd824SRoger Pau Monné  */
10873a9fd824SRoger Pau Monné struct xencamera_buf_get_layout_resp {
10883a9fd824SRoger Pau Monné     uint8_t num_planes;
10893a9fd824SRoger Pau Monné     uint8_t reserved[3];
10903a9fd824SRoger Pau Monné     uint32_t size;
10913a9fd824SRoger Pau Monné     uint32_t plane_size[XENCAMERA_MAX_PLANE];
10923a9fd824SRoger Pau Monné     uint32_t plane_stride[XENCAMERA_MAX_PLANE];
10933a9fd824SRoger Pau Monné };
10943a9fd824SRoger Pau Monné 
10953a9fd824SRoger Pau Monné /*
10963a9fd824SRoger Pau Monné  * Request buffer response - response for XENCAMERA_OP_BUF_REQUEST
10973a9fd824SRoger Pau Monné  * request:
10983a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
10993a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11003a9fd824SRoger Pau Monné  * |               id                |_OP_BUF_REQUEST |    reserved    | 4
11013a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11023a9fd824SRoger Pau Monné  * |                               status                              | 8
11033a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11043a9fd824SRoger Pau Monné  * |   num_buffers  |                     reserved                     | 12
11053a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11063a9fd824SRoger Pau Monné  * |                             reserved                              | 16
11073a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11083a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
11093a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11103a9fd824SRoger Pau Monné  * |                             reserved                              | 64
11113a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11123a9fd824SRoger Pau Monné  *
11133a9fd824SRoger Pau Monné  * num_buffers - uint8_t, number of buffers to be used.
11143a9fd824SRoger Pau Monné  *
11153a9fd824SRoger Pau Monné  *
11163a9fd824SRoger Pau Monné  * Control enumerate response - response for XENCAMERA_OP_CTRL_ENUM:
11173a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
11183a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11193a9fd824SRoger Pau Monné  * |               id                | _OP_CTRL_ENUM  |    reserved    | 4
11203a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11213a9fd824SRoger Pau Monné  * |                               status                              | 8
11223a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11233a9fd824SRoger Pau Monné  * |     index      |      type      |            reserved             | 12
11243a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11253a9fd824SRoger Pau Monné  * |                               flags                               | 16
11263a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11273a9fd824SRoger Pau Monné  * |                          min low 32-bits                          | 20
11283a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11293a9fd824SRoger Pau Monné  * |                          min high 32-bits                         | 24
11303a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11313a9fd824SRoger Pau Monné  * |                          max low 32-bits                          | 28
11323a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11333a9fd824SRoger Pau Monné  * |                          max high 32-bits                         | 32
11343a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11353a9fd824SRoger Pau Monné  * |                         step low 32-bits                          | 36
11363a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11373a9fd824SRoger Pau Monné  * |                         step high 32-bits                         | 40
11383a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11393a9fd824SRoger Pau Monné  * |                        def_val low 32-bits                        | 44
11403a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11413a9fd824SRoger Pau Monné  * |                        def_val high 32-bits                       | 48
11423a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11433a9fd824SRoger Pau Monné  * |                             reserved                              | 52
11443a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11453a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
11463a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11473a9fd824SRoger Pau Monné  * |                             reserved                              | 64
11483a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11493a9fd824SRoger Pau Monné  *
11503a9fd824SRoger Pau Monné  * index - uint8_t, index of the camera control in response.
11513a9fd824SRoger Pau Monné  * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX.
11523a9fd824SRoger Pau Monné  * flags - uint32_t, flags of the control, one of the XENCAMERA_CTRL_FLG_XXX.
11533a9fd824SRoger Pau Monné  * min - int64_t, minimum value of the control.
11543a9fd824SRoger Pau Monné  * max - int64_t, maximum value of the control.
11553a9fd824SRoger Pau Monné  * step - int64_t, minimum size in which control value can be changed.
11563a9fd824SRoger Pau Monné  * def_val - int64_t, default value of the control.
11573a9fd824SRoger Pau Monné  */
11583a9fd824SRoger Pau Monné struct xencamera_ctrl_enum_resp {
11593a9fd824SRoger Pau Monné     uint8_t index;
11603a9fd824SRoger Pau Monné     uint8_t type;
11613a9fd824SRoger Pau Monné     uint8_t reserved[2];
11623a9fd824SRoger Pau Monné     uint32_t flags;
11633a9fd824SRoger Pau Monné     int64_t min;
11643a9fd824SRoger Pau Monné     int64_t max;
11653a9fd824SRoger Pau Monné     int64_t step;
11663a9fd824SRoger Pau Monné     int64_t def_val;
11673a9fd824SRoger Pau Monné };
11683a9fd824SRoger Pau Monné 
11693a9fd824SRoger Pau Monné /*
11703a9fd824SRoger Pau Monné  * Get control response - response for XENCAMERA_OP_CTRL_GET:
11713a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
11723a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11733a9fd824SRoger Pau Monné  * |               id                | _OP_CTRL_GET   |    reserved    | 4
11743a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11753a9fd824SRoger Pau Monné  * |                               status                              | 8
11763a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11773a9fd824SRoger Pau Monné  * |       type     |                     reserved                     | 12
11783a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11793a9fd824SRoger Pau Monné  * |                             reserved                              | 16
11803a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11813a9fd824SRoger Pau Monné  * |                             reserved                              | 20
11823a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11833a9fd824SRoger Pau Monné  * |                          value low 32-bit                         | 24
11843a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11853a9fd824SRoger Pau Monné  * |                          value high 32-bit                        | 28
11863a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11873a9fd824SRoger Pau Monné  * |                             reserved                              | 32
11883a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11893a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
11903a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11913a9fd824SRoger Pau Monné  * |                             reserved                              | 64
11923a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
11933a9fd824SRoger Pau Monné  *
11943a9fd824SRoger Pau Monné  * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX.
11953a9fd824SRoger Pau Monné  * value - int64_t, new value of the control.
11963a9fd824SRoger Pau Monné  */
11973a9fd824SRoger Pau Monné 
11983a9fd824SRoger Pau Monné /*
11993a9fd824SRoger Pau Monné  *----------------------------------- Events ----------------------------------
12003a9fd824SRoger Pau Monné  *
12013a9fd824SRoger Pau Monné  * Events are sent via a shared page allocated by the front and propagated by
12023a9fd824SRoger Pau Monné  *   evt-event-channel/evt-ring-ref XenStore entries.
12033a9fd824SRoger Pau Monné  *
12043a9fd824SRoger Pau Monné  * All event packets have the same length (64 octets).
12053a9fd824SRoger Pau Monné  * All event packets have common header:
12063a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
12073a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12083a9fd824SRoger Pau Monné  * |               id                |      type      |   reserved     | 4
12093a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12103a9fd824SRoger Pau Monné  * |                             reserved                              | 8
12113a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12123a9fd824SRoger Pau Monné  *
12133a9fd824SRoger Pau Monné  * id - uint16_t, event id, may be used by front.
12143a9fd824SRoger Pau Monné  * type - uint8_t, type of the event.
12153a9fd824SRoger Pau Monné  *
12163a9fd824SRoger Pau Monné  *
12173a9fd824SRoger Pau Monné  * Frame captured event - event from back to front when a new captured
12183a9fd824SRoger Pau Monné  * frame is available:
12193a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
12203a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12213a9fd824SRoger Pau Monné  * |               id                |_EVT_FRAME_AVAIL|   reserved     | 4
12223a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12233a9fd824SRoger Pau Monné  * |                             reserved                              | 8
12243a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12253a9fd824SRoger Pau Monné  * |      index     |                     reserved                     | 12
12263a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12273a9fd824SRoger Pau Monné  * |                              used_sz                              | 16
12283a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12293a9fd824SRoger Pau Monné  * |                              seq_num                              | 20
12303a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12313a9fd824SRoger Pau Monné  * |                             reserved                              | 24
12323a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12333a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
12343a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12353a9fd824SRoger Pau Monné  * |                             reserved                              | 64
12363a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12373a9fd824SRoger Pau Monné  *
12383a9fd824SRoger Pau Monné  * index - uint8_t, index of the buffer that contains new captured frame,
12393a9fd824SRoger Pau Monné  *   see XENCAMERA_OP_BUF_CREATE description on the range
12403a9fd824SRoger Pau Monné  * used_sz - uint32_t, number of octets this frame has. This can be less
12413a9fd824SRoger Pau Monné  * than the XENCAMERA_OP_BUF_REQUEST.size (response) for compressed formats.
12423a9fd824SRoger Pau Monné  * seq_num - uint32_t, sequential number of the frame. Must be
12433a9fd824SRoger Pau Monné  *   monotonically increasing. If skips are detected in seq_num then that
12443a9fd824SRoger Pau Monné  *   means that the frames in-between were dropped. Note however that not
12453a9fd824SRoger Pau Monné  *   all video capture hardware is capable of detecting dropped frames.
12463a9fd824SRoger Pau Monné  *   In that case there will be no skips in the sequence counter.
12473a9fd824SRoger Pau Monné  */
12483a9fd824SRoger Pau Monné struct xencamera_frame_avail_evt {
12493a9fd824SRoger Pau Monné     uint8_t index;
12503a9fd824SRoger Pau Monné     uint8_t reserved[3];
12513a9fd824SRoger Pau Monné     uint32_t used_sz;
12523a9fd824SRoger Pau Monné     uint32_t seq_num;
12533a9fd824SRoger Pau Monné };
12543a9fd824SRoger Pau Monné 
12553a9fd824SRoger Pau Monné /*
12563a9fd824SRoger Pau Monné  * Control change event- event from back to front when camera control
12573a9fd824SRoger Pau Monné  * has changed:
12583a9fd824SRoger Pau Monné  *         0                1                 2               3        octet
12593a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12603a9fd824SRoger Pau Monné  * |               id                |_EVT_CTRL_CHANGE|   reserved     | 4
12613a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12623a9fd824SRoger Pau Monné  * |       type     |                     reserved                     | 8
12633a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12643a9fd824SRoger Pau Monné  * |                             reserved                              | 12
12653a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12663a9fd824SRoger Pau Monné  * |                             reserved                              | 16
12673a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12683a9fd824SRoger Pau Monné  * |                          value low 32-bit                         | 20
12693a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12703a9fd824SRoger Pau Monné  * |                          value high 32-bit                        | 24
12713a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12723a9fd824SRoger Pau Monné  * |                             reserved                              | 28
12733a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12743a9fd824SRoger Pau Monné  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
12753a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12763a9fd824SRoger Pau Monné  * |                             reserved                              | 64
12773a9fd824SRoger Pau Monné  * +----------------+----------------+----------------+----------------+
12783a9fd824SRoger Pau Monné  *
12793a9fd824SRoger Pau Monné  * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX.
12803a9fd824SRoger Pau Monné  * value - int64_t, new value of the control.
12813a9fd824SRoger Pau Monné  *
12823a9fd824SRoger Pau Monné  * Notes:
12833a9fd824SRoger Pau Monné  *  - this event is not sent for write-only controls
12843a9fd824SRoger Pau Monné  *  - this event is not sent to the originator of the control change
12853a9fd824SRoger Pau Monné  *  - this event is not sent when frontend first connects, e.g. initial
12863a9fd824SRoger Pau Monné  *    control state must be explicitly queried
12873a9fd824SRoger Pau Monné  */
12883a9fd824SRoger Pau Monné 
12893a9fd824SRoger Pau Monné struct xencamera_req {
12903a9fd824SRoger Pau Monné     uint16_t id;
12913a9fd824SRoger Pau Monné     uint8_t operation;
12923a9fd824SRoger Pau Monné     uint8_t reserved[5];
12933a9fd824SRoger Pau Monné     union {
12943a9fd824SRoger Pau Monné         struct xencamera_config_req config;
12953a9fd824SRoger Pau Monné         struct xencamera_frame_rate_req frame_rate;
12963a9fd824SRoger Pau Monné         struct xencamera_buf_request buf_request;
12973a9fd824SRoger Pau Monné         struct xencamera_buf_create_req buf_create;
12983a9fd824SRoger Pau Monné         struct xencamera_index index;
12993a9fd824SRoger Pau Monné         struct xencamera_ctrl_value ctrl_value;
13003a9fd824SRoger Pau Monné         struct xencamera_get_ctrl_req get_ctrl;
13013a9fd824SRoger Pau Monné         uint8_t reserved[56];
13023a9fd824SRoger Pau Monné     } req;
13033a9fd824SRoger Pau Monné };
13043a9fd824SRoger Pau Monné 
13053a9fd824SRoger Pau Monné struct xencamera_resp {
13063a9fd824SRoger Pau Monné     uint16_t id;
13073a9fd824SRoger Pau Monné     uint8_t operation;
13083a9fd824SRoger Pau Monné     uint8_t reserved;
13093a9fd824SRoger Pau Monné     int32_t status;
13103a9fd824SRoger Pau Monné     union {
13113a9fd824SRoger Pau Monné         struct xencamera_config_resp config;
13123a9fd824SRoger Pau Monné         struct xencamera_buf_get_layout_resp buf_layout;
13133a9fd824SRoger Pau Monné         struct xencamera_buf_request buf_request;
13143a9fd824SRoger Pau Monné         struct xencamera_ctrl_enum_resp ctrl_enum;
13153a9fd824SRoger Pau Monné         struct xencamera_ctrl_value ctrl_value;
13163a9fd824SRoger Pau Monné         uint8_t reserved1[56];
13173a9fd824SRoger Pau Monné     } resp;
13183a9fd824SRoger Pau Monné };
13193a9fd824SRoger Pau Monné 
13203a9fd824SRoger Pau Monné struct xencamera_evt {
13213a9fd824SRoger Pau Monné     uint16_t id;
13223a9fd824SRoger Pau Monné     uint8_t type;
13233a9fd824SRoger Pau Monné     uint8_t reserved[5];
13243a9fd824SRoger Pau Monné     union {
13253a9fd824SRoger Pau Monné         struct xencamera_frame_avail_evt frame_avail;
13263a9fd824SRoger Pau Monné         struct xencamera_ctrl_value ctrl_value;
13273a9fd824SRoger Pau Monné         uint8_t reserved[56];
13283a9fd824SRoger Pau Monné     } evt;
13293a9fd824SRoger Pau Monné };
13303a9fd824SRoger Pau Monné 
13313a9fd824SRoger Pau Monné DEFINE_RING_TYPES(xen_cameraif, struct xencamera_req, struct xencamera_resp);
13323a9fd824SRoger Pau Monné 
13333a9fd824SRoger Pau Monné /*
13343a9fd824SRoger Pau Monné  ******************************************************************************
13353a9fd824SRoger Pau Monné  *                        Back to front events delivery
13363a9fd824SRoger Pau Monné  ******************************************************************************
13373a9fd824SRoger Pau Monné  * In order to deliver asynchronous events from back to front a shared page is
13383a9fd824SRoger Pau Monné  * allocated by front and its granted reference propagated to back via
13393a9fd824SRoger Pau Monné  * XenStore entries (evt-ring-ref/evt-event-channel).
13403a9fd824SRoger Pau Monné  * This page has a common header used by both front and back to synchronize
13413a9fd824SRoger Pau Monné  * access and control event's ring buffer, while back being a producer of the
13423a9fd824SRoger Pau Monné  * events and front being a consumer. The rest of the page after the header
13433a9fd824SRoger Pau Monné  * is used for event packets.
13443a9fd824SRoger Pau Monné  *
13453a9fd824SRoger Pau Monné  * Upon reception of an event(s) front may confirm its reception
13463a9fd824SRoger Pau Monné  * for either each event, group of events or none.
13473a9fd824SRoger Pau Monné  */
13483a9fd824SRoger Pau Monné 
13493a9fd824SRoger Pau Monné struct xencamera_event_page {
13503a9fd824SRoger Pau Monné     uint32_t in_cons;
13513a9fd824SRoger Pau Monné     uint32_t in_prod;
13523a9fd824SRoger Pau Monné     uint8_t reserved[56];
13533a9fd824SRoger Pau Monné };
13543a9fd824SRoger Pau Monné 
13553a9fd824SRoger Pau Monné #define XENCAMERA_EVENT_PAGE_SIZE 4096
13563a9fd824SRoger Pau Monné #define XENCAMERA_IN_RING_OFFS (sizeof(struct xencamera_event_page))
13573a9fd824SRoger Pau Monné #define XENCAMERA_IN_RING_SIZE (XENCAMERA_EVENT_PAGE_SIZE - XENCAMERA_IN_RING_OFFS)
13583a9fd824SRoger Pau Monné #define XENCAMERA_IN_RING_LEN (XENCAMERA_IN_RING_SIZE / sizeof(struct xencamera_evt))
13593a9fd824SRoger Pau Monné #define XENCAMERA_IN_RING(page) \
13603a9fd824SRoger Pau Monné     ((struct xencamera_evt *)((char *)(page) + XENCAMERA_IN_RING_OFFS))
13613a9fd824SRoger Pau Monné #define XENCAMERA_IN_RING_REF(page, idx) \
13623a9fd824SRoger Pau Monné     (XENCAMERA_IN_RING((page))[(idx) % XENCAMERA_IN_RING_LEN])
13633a9fd824SRoger Pau Monné 
13643a9fd824SRoger Pau Monné #endif /* __XEN_PUBLIC_IO_CAMERAIF_H__ */
13653a9fd824SRoger Pau Monné 
13663a9fd824SRoger Pau Monné /*
13673a9fd824SRoger Pau Monné  * Local variables:
13683a9fd824SRoger Pau Monné  * mode: C
13693a9fd824SRoger Pau Monné  * c-file-style: "BSD"
13703a9fd824SRoger Pau Monné  * c-basic-offset: 4
13713a9fd824SRoger Pau Monné  * tab-width: 4
13723a9fd824SRoger Pau Monné  * indent-tabs-mode: nil
13733a9fd824SRoger Pau Monné  * End:
13743a9fd824SRoger Pau Monné  */
1375