The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/xen/interface/io/cameraif.h

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /******************************************************************************
    2  * cameraif.h
    3  *
    4  * Unified camera device I/O interface for Xen guest OSes.
    5  *
    6  * Permission is hereby granted, free of charge, to any person obtaining a copy
    7  * of this software and associated documentation files (the "Software"), to
    8  * deal in the Software without restriction, including without limitation the
    9  * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
   10  * sell copies of the Software, and to permit persons to whom the Software is
   11  * furnished to do so, subject to the following conditions:
   12  *
   13  * The above copyright notice and this permission notice shall be included in
   14  * all copies or substantial portions of the Software.
   15  *
   16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   19  * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
   21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
   22  * DEALINGS IN THE SOFTWARE.
   23  *
   24  * Copyright (C) 2018-2019 EPAM Systems Inc.
   25  *
   26  * Author: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
   27  */
   28 
   29 #ifndef __XEN_PUBLIC_IO_CAMERAIF_H__
   30 #define __XEN_PUBLIC_IO_CAMERAIF_H__
   31 
   32 #include "ring.h"
   33 #include "../grant_table.h"
   34 
   35 /*
   36  ******************************************************************************
   37  *                           Protocol version
   38  ******************************************************************************
   39  */
   40 #define XENCAMERA_PROTOCOL_VERSION     "1"
   41 
   42 /*
   43  ******************************************************************************
   44  *                  Feature and Parameter Negotiation
   45  ******************************************************************************
   46  *
   47  * Front->back notifications: when enqueuing a new request, sending a
   48  * notification can be made conditional on xencamera_req (i.e., the generic
   49  * hold-off mechanism provided by the ring macros). Backends must set
   50  * xencamera_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()).
   51  *
   52  * Back->front notifications: when enqueuing a new response, sending a
   53  * notification can be made conditional on xencamera_resp (i.e., the generic
   54  * hold-off mechanism provided by the ring macros). Frontends must set
   55  * xencamera_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()).
   56  *
   57  * The two halves of a para-virtual camera driver utilize nodes within
   58  * XenStore to communicate capabilities and to negotiate operating parameters.
   59  * This section enumerates these nodes which reside in the respective front and
   60  * backend portions of XenStore, following the XenBus convention.
   61  *
   62  * All data in XenStore is stored as strings. Nodes specifying numeric
   63  * values are encoded in decimal. Integer value ranges listed below are
   64  * expressed as fixed sized integer types capable of storing the conversion
   65  * of a properly formatted node string, without loss of information.
   66  *
   67  ******************************************************************************
   68  *                        Example configuration
   69  ******************************************************************************
   70  *
   71  * This is an example of backend and frontend configuration:
   72  *
   73  *--------------------------------- Backend -----------------------------------
   74  *
   75  * /local/domain/0/backend/vcamera/1/0/frontend-id = "1"
   76  * /local/domain/0/backend/vcamera/1/0/frontend = "/local/domain/1/device/vcamera/0"
   77  * /local/domain/0/backend/vcamera/1/0/state = "4"
   78  * /local/domain/0/backend/vcamera/1/0/versions = "1,2"
   79  *
   80  *--------------------------------- Frontend ----------------------------------
   81  *
   82  * /local/domain/1/device/vcamera/0/backend-id = ""
   83  * /local/domain/1/device/vcamera/0/backend = "/local/domain/0/backend/vcamera/1"
   84  * /local/domain/1/device/vcamera/0/state = "4"
   85  * /local/domain/1/device/vcamera/0/version = "1"
   86  * /local/domain/1/device/vcamera/0/be-alloc = "1"
   87  *
   88  *---------------------------- Device 0 configuration -------------------------
   89  *
   90  * /local/domain/1/device/vcamera/0/max-buffers = "3"
   91  * /local/domain/1/device/vcamera/0/controls = "contrast,hue"
   92  * /local/domain/1/device/vcamera/0/formats/YUYV/640x480/frame-rates = "30/1,15/1"
   93  * /local/domain/1/device/vcamera/0/formats/YUYV/1920x1080/frame-rates = "15/2"
   94  * /local/domain/1/device/vcamera/0/formats/BGRA/640x480/frame-rates = "15/1,15/2"
   95  * /local/domain/1/device/vcamera/0/formats/BGRA/1200x720/frame-rates = "15/2"
   96  * /local/domain/1/device/vcamera/0/unique-id = ""
   97  * /local/domain/1/device/vcamera/0/req-ring-ref = "2832"
   98  * /local/domain/1/device/vcamera/0/req-event-channel = "15"
   99  * /local/domain/1/device/vcamera/0/evt-ring-ref = "387"
  100  * /local/domain/1/device/vcamera/0/evt-event-channel = "16"
  101  *
  102  *---------------------------- Device 1 configuration -------------------------
  103  *
  104  * /local/domain/1/device/vcamera/1/max-buffers = "8"
  105  * /local/domain/1/device/vcamera/1/controls = "brightness,saturation,hue"
  106  * /local/domain/1/device/vcamera/1/formats/YUYV/640x480/frame-rates = "30/1,15/2"
  107  * /local/domain/1/device/vcamera/1/formats/YUYV/1920x1080/frame-rates = "15/2"
  108  * /local/domain/1/device/vcamera/1/unique-id = "1"
  109  * /local/domain/1/device/vcamera/1/req-ring-ref = "2833"
  110  * /local/domain/1/device/vcamera/1/req-event-channel = "17"
  111  * /local/domain/1/device/vcamera/1/evt-ring-ref = "388"
  112  * /local/domain/1/device/vcamera/1/evt-event-channel = "18"
  113  *
  114  ******************************************************************************
  115  *                            Backend XenBus Nodes
  116  ******************************************************************************
  117  *
  118  *----------------------------- Protocol version ------------------------------
  119  *
  120  * versions
  121  *      Values:         <string>
  122  *
  123  *      List of XENCAMERA_LIST_SEPARATOR separated protocol versions supported
  124  *      by the backend. For example "1,2,3".
  125  *
  126  ******************************************************************************
  127  *                            Frontend XenBus Nodes
  128  ******************************************************************************
  129  *
  130  *-------------------------------- Addressing ---------------------------------
  131  *
  132  * dom-id
  133  *      Values:         <uint16_t>
  134  *
  135  *      Domain identifier.
  136  *
  137  * dev-id
  138  *      Values:         <uint16_t>
  139  *
  140  *      Device identifier.
  141  *
  142  *      /local/domain/<dom-id>/device/vcamera/<dev-id>/...
  143  *
  144  *----------------------------- Protocol version ------------------------------
  145  *
  146  * version
  147  *      Values:         <string>
  148  *
  149  *      Protocol version, chosen among the ones supported by the backend.
  150  *
  151  *------------------------- Backend buffer allocation -------------------------
  152  *
  153  * be-alloc
  154  *      Values:         "", "1"
  155  *
  156  *      If value is set to "1", then backend will be the buffer
  157  *      provider/allocator for this domain during XENCAMERA_OP_BUF_CREATE
  158  *      operation.
  159  *      If value is not "1" or omitted frontend must allocate buffers itself.
  160  *
  161  *------------------------------- Camera settings -----------------------------
  162  *
  163  * unique-id
  164  *      Values:         <string>
  165  *
  166  *      After device instance initialization each camera is assigned a
  167  *      unique ID, so it can be identified by the backend by this ID.
  168  *      This can be UUID or such.
  169  *
  170  * max-buffers
  171  *      Values:         <uint8_t>
  172  *
  173  *      Maximum number of camera buffers this frontend may use.
  174  *
  175  * controls
  176  *      Values:         <list of string>
  177  *
  178  *      List of supported camera controls separated by XENCAMERA_LIST_SEPARATOR.
  179  *      Camera controls are expressed as a list of string values w/o any
  180  *      ordering requirement.
  181  *
  182  * formats
  183  *      Values:         <format, char[7]>
  184  *
  185  *      Formats are organized as a set of directories one per each
  186  *      supported pixel format. The name of the directory is the
  187  *      corresponding FOURCC string label. The next level of
  188  *      the directory under <formats> represents supported resolutions.
  189  *      If the format represents a big-endian variant of a little
  190  *      endian format, then the "-BE" suffix must be added. E.g. 'AR15' vs
  191  *      'AR15-BE'.
  192  *      If FOURCC string label has spaces then those are only allowed to
  193  *      be at the end of the label and must be trimmed, for example
  194  *      'Y16' and 'Y16-BE' will be trimmed.
  195  *
  196  * resolution
  197  *      Values:         <width, uint32_t>x<height, uint32_t>
  198  *
  199  *      Resolutions are organized as a set of directories one per each
  200  *      supported resolution under corresponding <formats> directory.
  201  *      The name of the directory is the supported width and height
  202  *      of the camera resolution in pixels.
  203  *
  204  * frame-rates
  205  *      Values:         <numerator, uint32_t>/<denominator, uint32_t>
  206  *
  207  *      List of XENCAMERA_FRAME_RATE_SEPARATOR separated supported frame rates
  208  *      of the camera expressed as numerator and denominator of the
  209  *      corresponding frame rate.
  210  *
  211  *------------------- Camera Request Transport Parameters ---------------------
  212  *
  213  * This communication path is used to deliver requests from frontend to backend
  214  * and get the corresponding responses from backend to frontend,
  215  * set up per virtual camera device.
  216  *
  217  * req-event-channel
  218  *      Values:         <uint32_t>
  219  *
  220  *      The identifier of the Xen camera's control event channel
  221  *      used to signal activity in the ring buffer.
  222  *
  223  * req-ring-ref
  224  *      Values:         <uint32_t>
  225  *
  226  *      The Xen grant reference granting permission for the backend to map
  227  *      a sole page of camera's control ring buffer.
  228  *
  229  *-------------------- Camera Event Transport Parameters ----------------------
  230  *
  231  * This communication path is used to deliver asynchronous events from backend
  232  * to frontend, set up per virtual camera device.
  233  *
  234  * evt-event-channel
  235  *      Values:         <uint32_t>
  236  *
  237  *      The identifier of the Xen camera's event channel
  238  *      used to signal activity in the ring buffer.
  239  *
  240  * evt-ring-ref
  241  *      Values:         <uint32_t>
  242  *
  243  *      The Xen grant reference granting permission for the backend to map
  244  *      a sole page of camera's event ring buffer.
  245  */
  246 
  247 /*
  248  ******************************************************************************
  249  *                               STATE DIAGRAMS
  250  ******************************************************************************
  251  *
  252  * Tool stack creates front and back state nodes with initial state
  253  * XenbusStateInitialising.
  254  * Tool stack creates and sets up frontend camera configuration
  255  * nodes per domain.
  256  *
  257  *-------------------------------- Normal flow --------------------------------
  258  *
  259  * Front                                Back
  260  * =================================    =====================================
  261  * XenbusStateInitialising              XenbusStateInitialising
  262  *                                       o Query backend device identification
  263  *                                         data.
  264  *                                       o Open and validate backend device.
  265  *                                                |
  266  *                                                |
  267  *                                                V
  268  *                                      XenbusStateInitWait
  269  *
  270  * o Query frontend configuration
  271  * o Allocate and initialize
  272  *   event channels per configured
  273  *   camera.
  274  * o Publish transport parameters
  275  *   that will be in effect during
  276  *   this connection.
  277  *              |
  278  *              |
  279  *              V
  280  * XenbusStateInitialised
  281  *
  282  *                                       o Query frontend transport parameters.
  283  *                                       o Connect to the event channels.
  284  *                                                |
  285  *                                                |
  286  *                                                V
  287  *                                      XenbusStateConnected
  288  *
  289  *  o Create and initialize OS
  290  *    virtual camera as per
  291  *    configuration.
  292  *              |
  293  *              |
  294  *              V
  295  * XenbusStateConnected
  296  *
  297  *                                      XenbusStateUnknown
  298  *                                      XenbusStateClosed
  299  *                                      XenbusStateClosing
  300  * o Remove virtual camera device
  301  * o Remove event channels
  302  *              |
  303  *              |
  304  *              V
  305  * XenbusStateClosed
  306  *
  307  *------------------------------- Recovery flow -------------------------------
  308  *
  309  * In case of frontend unrecoverable errors backend handles that as
  310  * if frontend goes into the XenbusStateClosed state.
  311  *
  312  * In case of backend unrecoverable errors frontend tries removing
  313  * the virtualized device. If this is possible at the moment of error,
  314  * then frontend goes into the XenbusStateInitialising state and is ready for
  315  * new connection with backend. If the virtualized device is still in use and
  316  * cannot be removed, then frontend goes into the XenbusStateReconfiguring state
  317  * until either the virtualized device is removed or backend initiates a new
  318  * connection. On the virtualized device removal frontend goes into the
  319  * XenbusStateInitialising state.
  320  *
  321  * Note on XenbusStateReconfiguring state of the frontend: if backend has
  322  * unrecoverable errors then frontend cannot send requests to the backend
  323  * and thus cannot provide functionality of the virtualized device anymore.
  324  * After backend is back to normal the virtualized device may still hold some
  325  * state: configuration in use, allocated buffers, client application state etc.
  326  * In most cases, this will require frontend to implement complex recovery
  327  * reconnect logic. Instead, by going into XenbusStateReconfiguring state,
  328  * frontend will make sure no new clients of the virtualized device are
  329  * accepted, allow existing client(s) to exit gracefully by signaling error
  330  * state etc.
  331  * Once all the clients are gone frontend can reinitialize the virtualized
  332  * device and get into XenbusStateInitialising state again signaling the
  333  * backend that a new connection can be made.
  334  *
  335  * There are multiple conditions possible under which frontend will go from
  336  * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS
  337  * specific. For example:
  338  * 1. The underlying OS framework may provide callbacks to signal that the last
  339  *    client of the virtualized device has gone and the device can be removed
  340  * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue)
  341  *    to periodically check if this is the right time to re-try removal of
  342  *    the virtualized device.
  343  * 3. By any other means.
  344  *
  345  ******************************************************************************
  346  *                             REQUEST CODES
  347  ******************************************************************************
  348  */
  349 #define XENCAMERA_OP_CONFIG_SET        0x00
  350 #define XENCAMERA_OP_CONFIG_GET        0x01
  351 #define XENCAMERA_OP_CONFIG_VALIDATE   0x02
  352 #define XENCAMERA_OP_FRAME_RATE_SET    0x03
  353 #define XENCAMERA_OP_BUF_GET_LAYOUT    0x04
  354 #define XENCAMERA_OP_BUF_REQUEST       0x05
  355 #define XENCAMERA_OP_BUF_CREATE        0x06
  356 #define XENCAMERA_OP_BUF_DESTROY       0x07
  357 #define XENCAMERA_OP_BUF_QUEUE         0x08
  358 #define XENCAMERA_OP_BUF_DEQUEUE       0x09
  359 #define XENCAMERA_OP_CTRL_ENUM         0x0a
  360 #define XENCAMERA_OP_CTRL_SET          0x0b
  361 #define XENCAMERA_OP_CTRL_GET          0x0c
  362 #define XENCAMERA_OP_STREAM_START      0x0d
  363 #define XENCAMERA_OP_STREAM_STOP       0x0e
  364 
  365 #define XENCAMERA_CTRL_BRIGHTNESS      0
  366 #define XENCAMERA_CTRL_CONTRAST        1
  367 #define XENCAMERA_CTRL_SATURATION      2
  368 #define XENCAMERA_CTRL_HUE             3
  369 
  370 /* Number of supported controls. */
  371 #define XENCAMERA_MAX_CTRL             4
  372 
  373 /* Control is read-only. */
  374 #define XENCAMERA_CTRL_FLG_RO          (1 << 0)
  375 /* Control is write-only. */
  376 #define XENCAMERA_CTRL_FLG_WO          (1 << 1)
  377 /* Control's value is volatile. */
  378 #define XENCAMERA_CTRL_FLG_VOLATILE    (1 << 2)
  379 
  380 /* Supported color spaces. */
  381 #define XENCAMERA_COLORSPACE_DEFAULT   0
  382 #define XENCAMERA_COLORSPACE_SMPTE170M 1
  383 #define XENCAMERA_COLORSPACE_REC709    2
  384 #define XENCAMERA_COLORSPACE_SRGB      3
  385 #define XENCAMERA_COLORSPACE_OPRGB     4
  386 #define XENCAMERA_COLORSPACE_BT2020    5
  387 #define XENCAMERA_COLORSPACE_DCI_P3    6
  388 
  389 /* Color space transfer function. */
  390 #define XENCAMERA_XFER_FUNC_DEFAULT    0
  391 #define XENCAMERA_XFER_FUNC_709        1
  392 #define XENCAMERA_XFER_FUNC_SRGB       2
  393 #define XENCAMERA_XFER_FUNC_OPRGB      3
  394 #define XENCAMERA_XFER_FUNC_NONE       4
  395 #define XENCAMERA_XFER_FUNC_DCI_P3     5
  396 #define XENCAMERA_XFER_FUNC_SMPTE2084  6
  397 
  398 /* Color space Y’CbCr encoding. */
  399 #define XENCAMERA_YCBCR_ENC_IGNORE           0
  400 #define XENCAMERA_YCBCR_ENC_601              1
  401 #define XENCAMERA_YCBCR_ENC_709              2
  402 #define XENCAMERA_YCBCR_ENC_XV601            3
  403 #define XENCAMERA_YCBCR_ENC_XV709            4
  404 #define XENCAMERA_YCBCR_ENC_BT2020           5
  405 #define XENCAMERA_YCBCR_ENC_BT2020_CONST_LUM 6
  406 
  407 /* Quantization range. */
  408 #define XENCAMERA_QUANTIZATION_DEFAULT       0
  409 #define XENCAMERA_QUANTIZATION_FULL_RANGE    1
  410 #define XENCAMERA_QUANTIZATION_LIM_RANGE     2
  411 
  412 /*
  413  ******************************************************************************
  414  *                                 EVENT CODES
  415  ******************************************************************************
  416  */
  417 #define XENCAMERA_EVT_FRAME_AVAIL      0x00
  418 #define XENCAMERA_EVT_CTRL_CHANGE      0x01
  419 
  420 /*
  421  ******************************************************************************
  422  *               XENSTORE FIELD AND PATH NAME STRINGS, HELPERS
  423  ******************************************************************************
  424  */
  425 #define XENCAMERA_DRIVER_NAME          "vcamera"
  426 
  427 #define XENCAMERA_LIST_SEPARATOR       ","
  428 #define XENCAMERA_RESOLUTION_SEPARATOR "x"
  429 #define XENCAMERA_FRACTION_SEPARATOR   "/"
  430 
  431 #define XENCAMERA_FIELD_BE_VERSIONS    "versions"
  432 #define XENCAMERA_FIELD_FE_VERSION     "version"
  433 #define XENCAMERA_FIELD_REQ_RING_REF   "req-ring-ref"
  434 #define XENCAMERA_FIELD_REQ_CHANNEL    "req-event-channel"
  435 #define XENCAMERA_FIELD_EVT_RING_REF   "evt-ring-ref"
  436 #define XENCAMERA_FIELD_EVT_CHANNEL    "evt-event-channel"
  437 #define XENCAMERA_FIELD_MAX_BUFFERS    "max-buffers"
  438 #define XENCAMERA_FIELD_CONTROLS       "controls"
  439 #define XENCAMERA_FIELD_FORMATS        "formats"
  440 #define XENCAMERA_FIELD_FRAME_RATES    "frame-rates"
  441 #define XENCAMERA_FIELD_BE_ALLOC       "be-alloc"
  442 #define XENCAMERA_FIELD_UNIQUE_ID      "unique-id"
  443 
  444 #define XENCAMERA_CTRL_BRIGHTNESS_STR  "brightness"
  445 #define XENCAMERA_CTRL_CONTRAST_STR    "contrast"
  446 #define XENCAMERA_CTRL_SATURATION_STR  "saturation"
  447 #define XENCAMERA_CTRL_HUE_STR         "hue"
  448 
  449 #define XENCAMERA_FOURCC_BIGENDIAN_STR "-BE"
  450 
  451 /* Maximum number of buffer planes supported. */
  452 #define XENCAMERA_MAX_PLANE            4
  453 
  454 /*
  455  ******************************************************************************
  456  *                          STATUS RETURN CODES
  457  ******************************************************************************
  458  *
  459  * Status return code is zero on success and -XEN_EXX on failure.
  460  *
  461  ******************************************************************************
  462  *                              Assumptions
  463  ******************************************************************************
  464  *
  465  * - usage of grant reference 0 as invalid grant reference:
  466  *   grant reference 0 is valid, but never exposed to a PV driver,
  467  *   because of the fact it is already in use/reserved by the PV console.
  468  * - all references in this document to page sizes must be treated
  469  *   as pages of size XEN_PAGE_SIZE unless otherwise noted.
  470  * - all FOURCC mappings used for configuration and messaging are
  471  *   Linux V4L2 ones: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/tree/include/uapi/linux/videodev2.h
  472  *   with the following exceptions:
  473  *     - characters are allowed in [0x20; 0x7f] range
  474  *     - when used for XenStore configuration entries the following
  475  *       are not allowed:
  476  *       - '/', '\', ' ' (space), '<', '>', ':', '"', '|', '?', '*'
  477  *       - if trailing spaces are part of the FOURCC code then those must be
  478  *         trimmed
  479  *
  480  *
  481  ******************************************************************************
  482  *       Description of the protocol between frontend and backend driver
  483  ******************************************************************************
  484  *
  485  * The two halves of a Para-virtual camera driver communicate with
  486  * each other using shared pages and event channels.
  487  * Shared page contains a ring with request/response packets.
  488  *
  489  * All reserved fields in the structures below must be 0.
  490  *
  491  * For all request/response/event packets:
  492  *   - frame rate parameter is represented as a pair of 4 octet long
  493  *     numerator and denominator:
  494  *       - frame_rate_numer - uint32_t, numerator of the frame rate
  495  *       - frame_rate_denom - uint32_t, denominator of the frame rate
  496  *     The corresponding frame rate (Hz) is calculated as:
  497  *       frame_rate = frame_rate_numer / frame_rate_denom
  498  *   - buffer index is a zero based index of the buffer. Must be less than
  499  *     the value of XENCAMERA_OP_CONFIG_SET.num_bufs response:
  500  *       - index - uint8_t, index of the buffer.
  501  *
  502  *
  503  *---------------------------------- Requests ---------------------------------
  504  *
  505  * All request packets have the same length (64 octets).
  506  * All request packets have common header:
  507  *         0                1                 2               3        octet
  508  * +----------------+----------------+----------------+----------------+
  509  * |               id                |    operation   |   reserved     | 4
  510  * +----------------+----------------+----------------+----------------+
  511  * |                             reserved                              | 8
  512  * +----------------+----------------+----------------+----------------+
  513  *   id - uint16_t, private guest value, echoed in response.
  514  *   operation - uint8_t, operation code, XENCAMERA_OP_XXX.
  515  *
  516  *
  517  * Request to set/validate the configuration - request to set the
  518  * configuration/mode of the camera (XENCAMERA_OP_CONFIG_SET) or to
  519  * check if the configuration is valid and can be used
  520  * (XENCAMERA_OP_CONFIG_VALIDATE):
  521  *         0                1                 2               3        octet
  522  * +----------------+----------------+----------------+----------------+
  523  * |               id                | _OP_CONFIG_XXX |   reserved     | 4
  524  * +----------------+----------------+----------------+----------------+
  525  * |                             reserved                              | 8
  526  * +----------------+----------------+----------------+----------------+
  527  * |                            pixel format                           | 12
  528  * +----------------+----------------+----------------+----------------+
  529  * |                               width                               | 16
  530  * +----------------+----------------+----------------+----------------+
  531  * |                               height                              | 20
  532  * +----------------+----------------+----------------+----------------+
  533  * |                             reserved                              | 24
  534  * +----------------+----------------+----------------+----------------+
  535  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  536  * +----------------+----------------+----------------+----------------+
  537  * |                             reserved                              | 64
  538  * +----------------+----------------+----------------+----------------+
  539  *
  540  * pixel_format - uint32_t, pixel format to be used, FOURCC code.
  541  * width - uint32_t, width in pixels.
  542  * height - uint32_t, height in pixels.
  543  *
  544  * See response format for this request.
  545  *
  546  * Notes:
  547  *  - the only difference between XENCAMERA_OP_CONFIG_VALIDATE and
  548  *    XENCAMERA_OP_CONFIG_SET is that the former doesn't actually change
  549  *    camera configuration, but queries if the configuration is valid.
  550  *    This can be used while stream is active and/or buffers allocated.
  551  *  - frontend must check the corresponding response in order to see
  552  *    if the values reported back by the backend do match the desired ones
  553  *    and can be accepted.
  554  *  - frontend may send multiple XENCAMERA_OP_CONFIG_SET requests before
  555  *    sending XENCAMERA_OP_STREAM_START request to update or tune the
  556  *    final stream configuration.
  557  *  - configuration cannot be changed during active streaming, e.g.
  558  *    after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP
  559  *    requests.
  560  */
  561 struct xencamera_config_req {
  562     uint32_t pixel_format;
  563     uint32_t width;
  564     uint32_t height;
  565 };
  566 
  567 /*
  568  * Request current configuration of the camera:
  569  *         0                1                 2               3        octet
  570  * +----------------+----------------+----------------+----------------+
  571  * |               id                | _OP_CONFIG_GET |   reserved     | 4
  572  * +----------------+----------------+----------------+----------------+
  573  * |                             reserved                              | 8
  574  * +----------------+----------------+----------------+----------------+
  575  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  576  * +----------------+----------------+----------------+----------------+
  577  * |                             reserved                              | 64
  578  * +----------------+----------------+----------------+----------------+
  579  *
  580  * See response format for this request.
  581  *
  582  *
  583  * Request to set the frame rate of the stream:
  584  *         0                1                 2               3        octet
  585  * +----------------+----------------+----------------+----------------+
  586  * |               id                | _FRAME_RATE_SET|   reserved     | 4
  587  * +----------------+----------------+----------------+----------------+
  588  * |                             reserved                              | 8
  589  * +----------------+----------------+----------------+----------------+
  590  * |                          frame_rate_numer                         | 12
  591  * +----------------+----------------+----------------+----------------+
  592  * |                          frame_rate_denom                         | 16
  593  * +----------------+----------------+----------------+----------------+
  594  * |                             reserved                              | 20
  595  * +----------------+----------------+----------------+----------------+
  596  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  597  * +----------------+----------------+----------------+----------------+
  598  * |                             reserved                              | 64
  599  * +----------------+----------------+----------------+----------------+
  600  *
  601  * frame_rate_numer - uint32_t, numerator of the frame rate.
  602  * frame_rate_denom - uint32_t, denominator of the frame rate.
  603  *
  604  * Notes:
  605  *  - to query the current (actual) frame rate use XENCAMERA_OP_CONFIG_GET
  606  *    request.
  607  *  - this request can be used with camera buffers allocated, but stream
  608  *    stopped, e.g. frontend is allowed to stop the stream with
  609  *    XENCAMERA_OP_STREAM_STOP, hold the buffers allocated (e.g. keep the
  610  *    configuration set with XENCAMERA_OP_CONFIG_SET), change the
  611  *    frame rate of the stream and (re)start the stream again with
  612  *    XENCAMERA_OP_STREAM_START.
  613  *  - frame rate cannot be changed during active streaming, e.g.
  614  *    after XENCAMERA_OP_STREAM_START and before XENCAMERA_OP_STREAM_STOP
  615  *    commands.
  616  */
  617 struct xencamera_frame_rate_req {
  618     uint32_t frame_rate_numer;
  619     uint32_t frame_rate_denom;
  620 };
  621 
  622 /*
  623  * Request camera buffer's layout:
  624  *         0                1                 2               3        octet
  625  * +----------------+----------------+----------------+----------------+
  626  * |               id                | _BUF_GET_LAYOUT|   reserved     | 4
  627  * +----------------+----------------+----------------+----------------+
  628  * |                             reserved                              | 8
  629  * +----------------+----------------+----------------+----------------+
  630  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  631  * +----------------+----------------+----------------+----------------+
  632  * |                             reserved                              | 64
  633  * +----------------+----------------+----------------+----------------+
  634  *
  635  * See response format for this request.
  636  *
  637  *
  638  * Request number of buffers to be used:
  639  *         0                1                 2               3        octet
  640  * +----------------+----------------+----------------+----------------+
  641  * |               id                | _OP_BUF_REQUEST|   reserved     | 4
  642  * +----------------+----------------+----------------+----------------+
  643  * |                             reserved                              | 8
  644  * +----------------+----------------+----------------+----------------+
  645  * |    num_bufs    |                     reserved                     | 12
  646  * +----------------+----------------+----------------+----------------+
  647  * |                             reserved                              | 16
  648  * +----------------+----------------+----------------+----------------+
  649  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  650  * +----------------+----------------+----------------+----------------+
  651  * |                             reserved                              | 64
  652  * +----------------+----------------+----------------+----------------+
  653  *
  654  * num_bufs - uint8_t, desired number of buffers to be used.
  655  *
  656  * If num_bufs is not zero then the backend validates the requested number of
  657  * buffers and responds with the number of buffers allowed for this frontend.
  658  * Frontend is responsible for checking the corresponding response in order to
  659  * see if the values reported back by the backend do match the desired ones
  660  * and can be accepted.
  661  * Frontend is allowed to send multiple XENCAMERA_OP_BUF_REQUEST requests
  662  * before sending XENCAMERA_OP_STREAM_START request to update or tune the
  663  * final configuration.
  664  * Frontend is not allowed to change the camera configuration after this call
  665  * with a non-zero value of num_bufs. If camera reconfiguration is required
  666  * then this request must be sent with num_bufs set to zero and any created
  667  * buffers must be destroyed first.
  668  * Frontend is not allowed to change the number of buffers after the
  669  * streaming has started.
  670  *
  671  * If num_bufs is 0 and streaming has not started yet, then the backend will
  672  * free all previously allocated buffers (if any).
  673  * Trying to call this if streaming is in progress will result in an error.
  674  *
  675  * If camera reconfiguration is required then the streaming must be stopped
  676  * and this request must be sent with num_bufs set to zero and any
  677  * created buffers must be destroyed.
  678  *
  679  * Please note, that the number of buffers in this request must not exceed
  680  * the value configured in XenStore.max-buffers.
  681  *
  682  * See response format for this request.
  683  */
  684 struct xencamera_buf_request {
  685     uint8_t num_bufs;
  686 };
  687 
  688 /*
  689  * Request camera buffer creation:
  690  *         0                1                 2               3        octet
  691  * +----------------+----------------+----------------+----------------+
  692  * |               id                | _OP_BUF_CREATE |   reserved     | 4
  693  * +----------------+----------------+----------------+----------------+
  694  * |                             reserved                              | 8
  695  * +----------------+----------------+----------------+----------------+
  696  * |      index     |                     reserved                     | 12
  697  * +----------------+----------------+----------------+----------------+
  698  * |                           plane_offset[0]                         | 16
  699  * +----------------+----------------+----------------+----------------+
  700  * |                           plane_offset[1]                         | 20
  701  * +----------------+----------------+----------------+----------------+
  702  * |                           plane_offset[2]                         | 24
  703  * +----------------+----------------+----------------+----------------+
  704  * |                           plane_offset[3]                         | 28
  705  * +----------------+----------------+----------------+----------------+
  706  * |                           gref_directory                          | 32
  707  * +----------------+----------------+----------------+----------------+
  708  * |                             reserved                              | 36
  709  * +----------------+----------------+----------------+----------------+
  710  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  711  * +----------------+----------------+----------------+----------------+
  712  * |                             reserved                              | 64
  713  * +----------------+----------------+----------------+----------------+
  714  *
  715  * An attempt to create multiple buffers with the same index is an error.
  716  * index can be re-used after destroying the corresponding camera buffer.
  717  *
  718  * index - uint8_t, index of the buffer to be created in the range
  719  *   from 0 to the num_bufs field returned in response for
  720  *   XENCAMERA_OP_BUF_REQUEST request
  721  * plane_offset - array of uint32_t, offset of the corresponding plane
  722  *   in octets from the buffer start. Number of offsets returned is
  723  *   equal to the value returned in XENCAMERA_OP_BUF_GET_LAYOUT.num_planes.
  724  * gref_directory - grant_ref_t, a reference to the first shared page
  725  *   describing shared buffer references. The size of the buffer is equal to
  726  *   XENCAMERA_OP_BUF_GET_LAYOUT.size response. At least one page exists. If
  727  *   shared buffer size exceeds what can be addressed by this single page,
  728  *   then reference to the next shared page must be supplied (see
  729  *   gref_dir_next_page below).
  730  *
  731  * If XENCAMERA_FIELD_BE_ALLOC configuration entry is set, then backend will
  732  * allocate the buffer with the parameters provided in this request and page
  733  * directory is handled as follows:
  734  *   Frontend on request:
  735  *     - allocates pages for the directory (gref_directory,
  736  *       gref_dir_next_page(s)
  737  *     - grants permissions for the pages of the directory to the backend
  738  *     - sets gref_dir_next_page fields
  739  *   Backend on response:
  740  *     - grants permissions for the pages of the buffer allocated to
  741  *       the frontend
  742  *     - fills in page directory with grant references
  743  *       (gref[] in struct xencamera_page_directory)
  744  */
  745 struct xencamera_buf_create_req {
  746     uint8_t index;
  747     uint8_t reserved[3];
  748     uint32_t plane_offset[XENCAMERA_MAX_PLANE];
  749     grant_ref_t gref_directory;
  750 };
  751 
  752 /*
  753  * Shared page for XENCAMERA_OP_BUF_CREATE buffer descriptor (gref_directory in
  754  * the request) employs a list of pages, describing all pages of the shared
  755  * data buffer:
  756  *         0                1                 2               3        octet
  757  * +----------------+----------------+----------------+----------------+
  758  * |                        gref_dir_next_page                         | 4
  759  * +----------------+----------------+----------------+----------------+
  760  * |                              gref[0]                              | 8
  761  * +----------------+----------------+----------------+----------------+
  762  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  763  * +----------------+----------------+----------------+----------------+
  764  * |                              gref[i]                              | i*4+8
  765  * +----------------+----------------+----------------+----------------+
  766  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  767  * +----------------+----------------+----------------+----------------+
  768  * |                             gref[N - 1]                           | N*4+8
  769  * +----------------+----------------+----------------+----------------+
  770  *
  771  * gref_dir_next_page - grant_ref_t, reference to the next page describing
  772  *   page directory. Must be 0 if there are no more pages in the list.
  773  * gref[i] - grant_ref_t, reference to a shared page of the buffer
  774  *   allocated at XENCAMERA_OP_BUF_CREATE.
  775  *
  776  * Number of grant_ref_t entries in the whole page directory is not
  777  * passed, but instead can be calculated as:
  778  *   num_grefs_total = (XENCAMERA_OP_BUF_REQUEST.size + XEN_PAGE_SIZE - 1) /
  779  *       XEN_PAGE_SIZE
  780  */
  781 struct xencamera_page_directory {
  782     grant_ref_t gref_dir_next_page;
  783     grant_ref_t gref[1]; /* Variable length */
  784 };
  785 
  786 /*
  787  * Request buffer destruction - destroy a previously allocated camera buffer:
  788  *         0                1                 2               3        octet
  789  * +----------------+----------------+----------------+----------------+
  790  * |               id                | _OP_BUF_DESTROY|   reserved     | 4
  791  * +----------------+----------------+----------------+----------------+
  792  * |                             reserved                              | 8
  793  * +----------------+----------------+----------------+----------------+
  794  * |      index     |                     reserved                     | 12
  795  * +----------------+----------------+----------------+----------------+
  796  * |                             reserved                              | 16
  797  * +----------------+----------------+----------------+----------------+
  798  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  799  * +----------------+----------------+----------------+----------------+
  800  * |                             reserved                              | 64
  801  * +----------------+----------------+----------------+----------------+
  802  *
  803  * index - uint8_t, index of the buffer to be destroyed.
  804  *
  805  *
  806  * Request queueing of the buffer for backend use:
  807  *         0                1                 2               3        octet
  808  * +----------------+----------------+----------------+----------------+
  809  * |               id                | _OP_BUF_QUEUE  |   reserved     | 4
  810  * +----------------+----------------+----------------+----------------+
  811  * |                             reserved                              | 8
  812  * +----------------+----------------+----------------+----------------+
  813  * |      index     |                     reserved                     | 12
  814  * +----------------+----------------+----------------+----------------+
  815  * |                             reserved                              | 16
  816  * +----------------+----------------+----------------+----------------+
  817  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  818  * +----------------+----------------+----------------+----------------+
  819  * |                             reserved                              | 64
  820  * +----------------+----------------+----------------+----------------+
  821  *
  822  * Notes:
  823  *  - frontends must not access the buffer content after this request until
  824  *    response to XENCAMERA_OP_BUF_DEQUEUE has been received.
  825  *  - buffers must be queued to the backend before destroying them with
  826  *    XENCAMERA_OP_BUF_DESTROY.
  827  *
  828  * index - uint8_t, index of the buffer to be queued.
  829  *
  830  *
  831  * Request dequeueing of the buffer for frontend use:
  832  *         0                1                 2               3        octet
  833  * +----------------+----------------+----------------+----------------+
  834  * |               id                |_OP_BUF_DEQUEUE |   reserved     | 4
  835  * +----------------+----------------+----------------+----------------+
  836  * |                             reserved                              | 8
  837  * +----------------+----------------+----------------+----------------+
  838  * |      index     |                     reserved                     | 12
  839  * +----------------+----------------+----------------+----------------+
  840  * |                             reserved                              | 16
  841  * +----------------+----------------+----------------+----------------+
  842  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  843  * +----------------+----------------+----------------+----------------+
  844  * |                             reserved                              | 64
  845  * +----------------+----------------+----------------+----------------+
  846  *
  847  * Notes:
  848  *  - frontend is allowed to access the buffer content after the corresponding
  849  *    response to this request.
  850  *
  851  * index - uint8_t, index of the buffer to be queued.
  852  *
  853  *
  854  * Request camera control details:
  855  *         0                1                 2               3        octet
  856  * +----------------+----------------+----------------+----------------+
  857  * |               id                | _OP_CTRL_ENUM  |   reserved     | 4
  858  * +----------------+----------------+----------------+----------------+
  859  * |      index     |                     reserved                     | 8
  860  * +----------------+----------------+----------------+----------------+
  861  * |                             reserved                              | 12
  862  * +----------------+----------------+----------------+----------------+
  863  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  864  * +----------------+----------------+----------------+----------------+
  865  * |                             reserved                              | 64
  866  * +----------------+----------------+----------------+----------------+
  867  *
  868  * See response format for this request.
  869  *
  870  * index - uint8_t, index of the control to be queried.
  871  */
  872 struct xencamera_index {
  873     uint8_t index;
  874 };
  875 
  876 /*
  877  * Request camera control change:
  878  *         0                1                 2               3        octet
  879  * +----------------+----------------+----------------+----------------+
  880  * |               id                |  _OP_SET_CTRL  |   reserved     | 4
  881  * +----------------+----------------+----------------+----------------+
  882  * |       type     |                     reserved                     | 8
  883  * +----------------+----------------+----------------+----------------+
  884  * |                             reserved                              | 12
  885  * +----------------+----------------+----------------+----------------+
  886  * |                             reserved                              | 16
  887  * +----------------+----------------+----------------+----------------+
  888  * |                          value low 32-bit                         | 20
  889  * +----------------+----------------+----------------+----------------+
  890  * |                          value high 32-bit                        | 24
  891  * +----------------+----------------+----------------+----------------+
  892  * |                             reserved                              | 28
  893  * +----------------+----------------+----------------+----------------+
  894  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  895  * +----------------+----------------+----------------+----------------+
  896  * |                             reserved                              | 64
  897  * +----------------+----------------+----------------+----------------+
  898  *
  899  * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX.
  900  * value - int64_t, new value of the control.
  901  */
  902 struct xencamera_ctrl_value {
  903     uint8_t type;
  904     uint8_t reserved[7];
  905     int64_t value;
  906 };
  907 
  908 /*
  909  * Request camera control state:
  910  *         0                1                 2               3        octet
  911  * +----------------+----------------+----------------+----------------+
  912  * |               id                |  _OP_GET_CTRL  |   reserved     | 4
  913  * +----------------+----------------+----------------+----------------+
  914  * |       type     |                     reserved                     | 8
  915  * +----------------+----------------+----------------+----------------+
  916  * |                             reserved                              | 12
  917  * +----------------+----------------+----------------+----------------+
  918  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  919  * +----------------+----------------+----------------+----------------+
  920  * |                             reserved                              | 64
  921  * +----------------+----------------+----------------+----------------+
  922  *
  923  * See response format for this request.
  924  *
  925  * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX.
  926  */
  927 struct xencamera_get_ctrl_req {
  928     uint8_t type;
  929 };
  930 
  931 /*
  932  * Request camera capture stream start:
  933  *         0                1                 2               3        octet
  934  * +----------------+----------------+----------------+----------------+
  935  * |               id                |_OP_STREAM_START|   reserved     | 4
  936  * +----------------+----------------+----------------+----------------+
  937  * |                             reserved                              | 8
  938  * +----------------+----------------+----------------+----------------+
  939  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  940  * +----------------+----------------+----------------+----------------+
  941  * |                             reserved                              | 64
  942  * +----------------+----------------+----------------+----------------+
  943  *
  944  *
  945  * Request camera capture stream stop:
  946  *         0                1                 2               3        octet
  947  * +----------------+----------------+----------------+----------------+
  948  * |               id                |_OP_STREAM_STOP |   reserved     | 4
  949  * +----------------+----------------+----------------+----------------+
  950  * |                             reserved                              | 8
  951  * +----------------+----------------+----------------+----------------+
  952  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
  953  * +----------------+----------------+----------------+----------------+
  954  * |                             reserved                              | 64
  955  * +----------------+----------------+----------------+----------------+
  956  *
  957  *
  958  *---------------------------------- Responses --------------------------------
  959  *
  960  * All response packets have the same length (64 octets).
  961  *
  962  * All response packets have common header:
  963  *         0                1                 2               3        octet
  964  * +----------------+----------------+----------------+----------------+
  965  * |               id                |    operation   |    reserved    | 4
  966  * +----------------+----------------+----------------+----------------+
  967  * |                              status                               | 8
  968  * +----------------+----------------+----------------+----------------+
  969  *
  970  * id - uint16_t, copied from the request.
  971  * operation - uint8_t, XENCAMERA_OP_* - copied from request.
  972  * status - int32_t, response status, zero on success and -XEN_EXX on failure.
  973  *
  974  *
  975  * Configuration response - response for XENCAMERA_OP_CONFIG_SET,
  976  * XENCAMERA_OP_CONFIG_GET and XENCAMERA_OP_CONFIG_VALIDATE requests:
  977  *         0                1                 2               3        octet
  978  * +----------------+----------------+----------------+----------------+
  979  * |               id                | _OP_CONFIG_XXX |    reserved    | 4
  980  * +----------------+----------------+----------------+----------------+
  981  * |                               status                              | 8
  982  * +----------------+----------------+----------------+----------------+
  983  * |                            pixel format                           | 12
  984  * +----------------+----------------+----------------+----------------+
  985  * |                               width                               | 16
  986  * +----------------+----------------+----------------+----------------+
  987  * |                               height                              | 20
  988  * +----------------+----------------+----------------+----------------+
  989  * |                             colorspace                            | 24
  990  * +----------------+----------------+----------------+----------------+
  991  * |                             xfer_func                             | 28
  992  * +----------------+----------------+----------------+----------------+
  993  * |                             ycbcr_enc                             | 32
  994  * +----------------+----------------+----------------+----------------+
  995  * |                            quantization                           | 36
  996  * +----------------+----------------+----------------+----------------+
  997  * |                       displ_asp_ratio_numer                       | 40
  998  * +----------------+----------------+----------------+----------------+
  999  * |                       displ_asp_ratio_denom                       | 44
 1000  * +----------------+----------------+----------------+----------------+
 1001  * |                          frame_rate_numer                         | 48
 1002  * +----------------+----------------+----------------+----------------+
 1003  * |                          frame_rate_denom                         | 52
 1004  * +----------------+----------------+----------------+----------------+
 1005  * |                             reserved                              | 56
 1006  * +----------------+----------------+----------------+----------------+
 1007  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
 1008  * +----------------+----------------+----------------+----------------+
 1009  * |                             reserved                              | 64
 1010  * +----------------+----------------+----------------+----------------+
 1011  *
 1012  * Meaning of the corresponding values in this response is the same as for
 1013  * XENCAMERA_OP_CONFIG_SET and XENCAMERA_OP_FRAME_RATE_SET requests.
 1014  *
 1015  * colorspace - uint32_t, this supplements pixel_format parameter,
 1016  *   one of the XENCAMERA_COLORSPACE_XXX.
 1017  * xfer_func - uint32_t, this supplements colorspace parameter,
 1018  *   one of the XENCAMERA_XFER_FUNC_XXX.
 1019  * ycbcr_enc - uint32_t, this supplements colorspace parameter,
 1020  *   one of the XENCAMERA_YCBCR_ENC_XXX. Please note, that ycbcr_enc is only
 1021  *   valid for YCbCr pixelformats and should be ignored otherwise.
 1022  * quantization - uint32_t, this supplements colorspace parameter,
 1023  *   one of the XENCAMERA_QUANTIZATION_XXX.
 1024  * displ_asp_ratio_numer - uint32_t, numerator of the display aspect ratio.
 1025  * displ_asp_ratio_denom - uint32_t, denominator of the display aspect ratio.
 1026  */
 1027 struct xencamera_config_resp {
 1028     uint32_t pixel_format;
 1029     uint32_t width;
 1030     uint32_t height;
 1031     uint32_t colorspace;
 1032     uint32_t xfer_func;
 1033     uint32_t ycbcr_enc;
 1034     uint32_t quantization;
 1035     uint32_t displ_asp_ratio_numer;
 1036     uint32_t displ_asp_ratio_denom;
 1037     uint32_t frame_rate_numer;
 1038     uint32_t frame_rate_denom;
 1039 };
 1040 
 1041 /*
 1042  * Request buffer response - response for XENCAMERA_OP_BUF_GET_LAYOUT
 1043  * request:
 1044  *         0                1                 2               3        octet
 1045  * +----------------+----------------+----------------+----------------+
 1046  * |               id                |_BUF_GET_LAYOUT |    reserved    | 4
 1047  * +----------------+----------------+----------------+----------------+
 1048  * |                               status                              | 8
 1049  * +----------------+----------------+----------------+----------------+
 1050  * |   num_planes   |                     reserved                     | 12
 1051  * +----------------+----------------+----------------+----------------+
 1052  * |                                size                               | 16
 1053  * +----------------+----------------+----------------+----------------+
 1054  * |                           plane_size[0]                           | 20
 1055  * +----------------+----------------+----------------+----------------+
 1056  * |                           plane_size[1]                           | 24
 1057  * +----------------+----------------+----------------+----------------+
 1058  * |                           plane_size[2]                           | 28
 1059  * +----------------+----------------+----------------+----------------+
 1060  * |                           plane_size[3]                           | 32
 1061  * +----------------+----------------+----------------+----------------+
 1062  * |                          plane_stride[0]                          | 36
 1063  * +----------------+----------------+----------------+----------------+
 1064  * |                          plane_stride[1]                          | 40
 1065  * +----------------+----------------+----------------+----------------+
 1066  * |                          plane_stride[2]                          | 44
 1067  * +----------------+----------------+----------------+----------------+
 1068  * |                          plane_stride[3]                          | 48
 1069  * +----------------+----------------+----------------+----------------+
 1070  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
 1071  * +----------------+----------------+----------------+----------------+
 1072  * |                             reserved                              | 64
 1073  * +----------------+----------------+----------------+----------------+
 1074  *
 1075  * num_planes - uint8_t, number of planes of the buffer.
 1076  * size - uint32_t, overall size of the buffer including sizes of the
 1077  *   individual planes and padding if applicable.
 1078  * plane_size - array of uint32_t, size in octets of the corresponding plane
 1079  *   including padding.
 1080  * plane_stride - array of uint32_t, size in octets occupied by the
 1081  *   corresponding single image line including padding if applicable.
 1082  *
 1083  * Note! The sizes and strides in this response apply to all buffers created
 1084  * with XENCAMERA_OP_BUF_CREATE command, but individual buffers may have
 1085  * different plane offsets, see XENCAMERA_OP_BUF_REQUEST.plane_offset.
 1086  */
 1087 struct xencamera_buf_get_layout_resp {
 1088     uint8_t num_planes;
 1089     uint8_t reserved[3];
 1090     uint32_t size;
 1091     uint32_t plane_size[XENCAMERA_MAX_PLANE];
 1092     uint32_t plane_stride[XENCAMERA_MAX_PLANE];
 1093 };
 1094 
 1095 /*
 1096  * Request buffer response - response for XENCAMERA_OP_BUF_REQUEST
 1097  * request:
 1098  *         0                1                 2               3        octet
 1099  * +----------------+----------------+----------------+----------------+
 1100  * |               id                |_OP_BUF_REQUEST |    reserved    | 4
 1101  * +----------------+----------------+----------------+----------------+
 1102  * |                               status                              | 8
 1103  * +----------------+----------------+----------------+----------------+
 1104  * |   num_buffers  |                     reserved                     | 12
 1105  * +----------------+----------------+----------------+----------------+
 1106  * |                             reserved                              | 16
 1107  * +----------------+----------------+----------------+----------------+
 1108  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
 1109  * +----------------+----------------+----------------+----------------+
 1110  * |                             reserved                              | 64
 1111  * +----------------+----------------+----------------+----------------+
 1112  *
 1113  * num_buffers - uint8_t, number of buffers to be used.
 1114  *
 1115  *
 1116  * Control enumerate response - response for XENCAMERA_OP_CTRL_ENUM:
 1117  *         0                1                 2               3        octet
 1118  * +----------------+----------------+----------------+----------------+
 1119  * |               id                | _OP_CTRL_ENUM  |    reserved    | 4
 1120  * +----------------+----------------+----------------+----------------+
 1121  * |                               status                              | 8
 1122  * +----------------+----------------+----------------+----------------+
 1123  * |     index      |      type      |            reserved             | 12
 1124  * +----------------+----------------+----------------+----------------+
 1125  * |                               flags                               | 16
 1126  * +----------------+----------------+----------------+----------------+
 1127  * |                          min low 32-bits                          | 20
 1128  * +----------------+----------------+----------------+----------------+
 1129  * |                          min high 32-bits                         | 24
 1130  * +----------------+----------------+----------------+----------------+
 1131  * |                          max low 32-bits                          | 28
 1132  * +----------------+----------------+----------------+----------------+
 1133  * |                          max high 32-bits                         | 32
 1134  * +----------------+----------------+----------------+----------------+
 1135  * |                         step low 32-bits                          | 36
 1136  * +----------------+----------------+----------------+----------------+
 1137  * |                         step high 32-bits                         | 40
 1138  * +----------------+----------------+----------------+----------------+
 1139  * |                        def_val low 32-bits                        | 44
 1140  * +----------------+----------------+----------------+----------------+
 1141  * |                        def_val high 32-bits                       | 48
 1142  * +----------------+----------------+----------------+----------------+
 1143  * |                             reserved                              | 52
 1144  * +----------------+----------------+----------------+----------------+
 1145  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
 1146  * +----------------+----------------+----------------+----------------+
 1147  * |                             reserved                              | 64
 1148  * +----------------+----------------+----------------+----------------+
 1149  *
 1150  * index - uint8_t, index of the camera control in response.
 1151  * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX.
 1152  * flags - uint32_t, flags of the control, one of the XENCAMERA_CTRL_FLG_XXX.
 1153  * min - int64_t, minimum value of the control.
 1154  * max - int64_t, maximum value of the control.
 1155  * step - int64_t, minimum size in which control value can be changed.
 1156  * def_val - int64_t, default value of the control.
 1157  */
 1158 struct xencamera_ctrl_enum_resp {
 1159     uint8_t index;
 1160     uint8_t type;
 1161     uint8_t reserved[2];
 1162     uint32_t flags;
 1163     int64_t min;
 1164     int64_t max;
 1165     int64_t step;
 1166     int64_t def_val;
 1167 };
 1168 
 1169 /*
 1170  * Get control response - response for XENCAMERA_OP_CTRL_GET:
 1171  *         0                1                 2               3        octet
 1172  * +----------------+----------------+----------------+----------------+
 1173  * |               id                | _OP_CTRL_GET   |    reserved    | 4
 1174  * +----------------+----------------+----------------+----------------+
 1175  * |                               status                              | 8
 1176  * +----------------+----------------+----------------+----------------+
 1177  * |       type     |                     reserved                     | 12
 1178  * +----------------+----------------+----------------+----------------+
 1179  * |                             reserved                              | 16
 1180  * +----------------+----------------+----------------+----------------+
 1181  * |                             reserved                              | 20
 1182  * +----------------+----------------+----------------+----------------+
 1183  * |                          value low 32-bit                         | 24
 1184  * +----------------+----------------+----------------+----------------+
 1185  * |                          value high 32-bit                        | 28
 1186  * +----------------+----------------+----------------+----------------+
 1187  * |                             reserved                              | 32
 1188  * +----------------+----------------+----------------+----------------+
 1189  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
 1190  * +----------------+----------------+----------------+----------------+
 1191  * |                             reserved                              | 64
 1192  * +----------------+----------------+----------------+----------------+
 1193  *
 1194  * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX.
 1195  * value - int64_t, new value of the control.
 1196  */
 1197 
 1198 /*
 1199  *----------------------------------- Events ----------------------------------
 1200  *
 1201  * Events are sent via a shared page allocated by the front and propagated by
 1202  *   evt-event-channel/evt-ring-ref XenStore entries.
 1203  *
 1204  * All event packets have the same length (64 octets).
 1205  * All event packets have common header:
 1206  *         0                1                 2               3        octet
 1207  * +----------------+----------------+----------------+----------------+
 1208  * |               id                |      type      |   reserved     | 4
 1209  * +----------------+----------------+----------------+----------------+
 1210  * |                             reserved                              | 8
 1211  * +----------------+----------------+----------------+----------------+
 1212  *
 1213  * id - uint16_t, event id, may be used by front.
 1214  * type - uint8_t, type of the event.
 1215  *
 1216  *
 1217  * Frame captured event - event from back to front when a new captured
 1218  * frame is available:
 1219  *         0                1                 2               3        octet
 1220  * +----------------+----------------+----------------+----------------+
 1221  * |               id                |_EVT_FRAME_AVAIL|   reserved     | 4
 1222  * +----------------+----------------+----------------+----------------+
 1223  * |                             reserved                              | 8
 1224  * +----------------+----------------+----------------+----------------+
 1225  * |      index     |                     reserved                     | 12
 1226  * +----------------+----------------+----------------+----------------+
 1227  * |                              used_sz                              | 16
 1228  * +----------------+----------------+----------------+----------------+
 1229  * |                              seq_num                              | 20
 1230  * +----------------+----------------+----------------+----------------+
 1231  * |                             reserved                              | 24
 1232  * +----------------+----------------+----------------+----------------+
 1233  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
 1234  * +----------------+----------------+----------------+----------------+
 1235  * |                             reserved                              | 64
 1236  * +----------------+----------------+----------------+----------------+
 1237  *
 1238  * index - uint8_t, index of the buffer that contains new captured frame,
 1239  *   see XENCAMERA_OP_BUF_CREATE description on the range
 1240  * used_sz - uint32_t, number of octets this frame has. This can be less
 1241  * than the XENCAMERA_OP_BUF_REQUEST.size (response) for compressed formats.
 1242  * seq_num - uint32_t, sequential number of the frame. Must be
 1243  *   monotonically increasing. If skips are detected in seq_num then that
 1244  *   means that the frames in-between were dropped. Note however that not
 1245  *   all video capture hardware is capable of detecting dropped frames.
 1246  *   In that case there will be no skips in the sequence counter.
 1247  */
 1248 struct xencamera_frame_avail_evt {
 1249     uint8_t index;
 1250     uint8_t reserved[3];
 1251     uint32_t used_sz;
 1252     uint32_t seq_num;
 1253 };
 1254 
 1255 /*
 1256  * Control change event- event from back to front when camera control
 1257  * has changed:
 1258  *         0                1                 2               3        octet
 1259  * +----------------+----------------+----------------+----------------+
 1260  * |               id                |_EVT_CTRL_CHANGE|   reserved     | 4
 1261  * +----------------+----------------+----------------+----------------+
 1262  * |       type     |                     reserved                     | 8
 1263  * +----------------+----------------+----------------+----------------+
 1264  * |                             reserved                              | 12
 1265  * +----------------+----------------+----------------+----------------+
 1266  * |                             reserved                              | 16
 1267  * +----------------+----------------+----------------+----------------+
 1268  * |                          value low 32-bit                         | 20
 1269  * +----------------+----------------+----------------+----------------+
 1270  * |                          value high 32-bit                        | 24
 1271  * +----------------+----------------+----------------+----------------+
 1272  * |                             reserved                              | 28
 1273  * +----------------+----------------+----------------+----------------+
 1274  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
 1275  * +----------------+----------------+----------------+----------------+
 1276  * |                             reserved                              | 64
 1277  * +----------------+----------------+----------------+----------------+
 1278  *
 1279  * type - uint8_t, type of the control, one of the XENCAMERA_CTRL_XXX.
 1280  * value - int64_t, new value of the control.
 1281  *
 1282  * Notes:
 1283  *  - this event is not sent for write-only controls
 1284  *  - this event is not sent to the originator of the control change
 1285  *  - this event is not sent when frontend first connects, e.g. initial
 1286  *    control state must be explicitly queried
 1287  */
 1288 
 1289 struct xencamera_req {
 1290     uint16_t id;
 1291     uint8_t operation;
 1292     uint8_t reserved[5];
 1293     union {
 1294         struct xencamera_config_req config;
 1295         struct xencamera_frame_rate_req frame_rate;
 1296         struct xencamera_buf_request buf_request;
 1297         struct xencamera_buf_create_req buf_create;
 1298         struct xencamera_index index;
 1299         struct xencamera_ctrl_value ctrl_value;
 1300         struct xencamera_get_ctrl_req get_ctrl;
 1301         uint8_t reserved[56];
 1302     } req;
 1303 };
 1304 
 1305 struct xencamera_resp {
 1306     uint16_t id;
 1307     uint8_t operation;
 1308     uint8_t reserved;
 1309     int32_t status;
 1310     union {
 1311         struct xencamera_config_resp config;
 1312         struct xencamera_buf_get_layout_resp buf_layout;
 1313         struct xencamera_buf_request buf_request;
 1314         struct xencamera_ctrl_enum_resp ctrl_enum;
 1315         struct xencamera_ctrl_value ctrl_value;
 1316         uint8_t reserved1[56];
 1317     } resp;
 1318 };
 1319 
 1320 struct xencamera_evt {
 1321     uint16_t id;
 1322     uint8_t type;
 1323     uint8_t reserved[5];
 1324     union {
 1325         struct xencamera_frame_avail_evt frame_avail;
 1326         struct xencamera_ctrl_value ctrl_value;
 1327         uint8_t reserved[56];
 1328     } evt;
 1329 };
 1330 
 1331 DEFINE_RING_TYPES(xen_cameraif, struct xencamera_req, struct xencamera_resp);
 1332 
 1333 /*
 1334  ******************************************************************************
 1335  *                        Back to front events delivery
 1336  ******************************************************************************
 1337  * In order to deliver asynchronous events from back to front a shared page is
 1338  * allocated by front and its granted reference propagated to back via
 1339  * XenStore entries (evt-ring-ref/evt-event-channel).
 1340  * This page has a common header used by both front and back to synchronize
 1341  * access and control event's ring buffer, while back being a producer of the
 1342  * events and front being a consumer. The rest of the page after the header
 1343  * is used for event packets.
 1344  *
 1345  * Upon reception of an event(s) front may confirm its reception
 1346  * for either each event, group of events or none.
 1347  */
 1348 
 1349 struct xencamera_event_page {
 1350     uint32_t in_cons;
 1351     uint32_t in_prod;
 1352     uint8_t reserved[56];
 1353 };
 1354 
 1355 #define XENCAMERA_EVENT_PAGE_SIZE 4096
 1356 #define XENCAMERA_IN_RING_OFFS (sizeof(struct xencamera_event_page))
 1357 #define XENCAMERA_IN_RING_SIZE (XENCAMERA_EVENT_PAGE_SIZE - XENCAMERA_IN_RING_OFFS)
 1358 #define XENCAMERA_IN_RING_LEN (XENCAMERA_IN_RING_SIZE / sizeof(struct xencamera_evt))
 1359 #define XENCAMERA_IN_RING(page) \
 1360     ((struct xencamera_evt *)((char *)(page) + XENCAMERA_IN_RING_OFFS))
 1361 #define XENCAMERA_IN_RING_REF(page, idx) \
 1362     (XENCAMERA_IN_RING((page))[(idx) % XENCAMERA_IN_RING_LEN])
 1363 
 1364 #endif /* __XEN_PUBLIC_IO_CAMERAIF_H__ */
 1365 
 1366 /*
 1367  * Local variables:
 1368  * mode: C
 1369  * c-file-style: "BSD"
 1370  * c-basic-offset: 4
 1371  * tab-width: 4
 1372  * indent-tabs-mode: nil
 1373  * End:
 1374  */

Cache object: c4ec2d1e1c3f94b0ec42da198e9a6081


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.