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