xref: /freebsd/sys/contrib/xen/io/cameraif.h (revision 9f44a47fd07924afc035991af15d84e6585dea4f)
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 = "0"
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 = "0"
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:         "0", "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  */
1375