1*3a9fd824SRoger Pau Monné /****************************************************************************** 2*3a9fd824SRoger Pau Monné * displif.h 3*3a9fd824SRoger Pau Monné * 4*3a9fd824SRoger Pau Monné * Unified display device I/O interface for Xen guest OSes. 5*3a9fd824SRoger Pau Monné * 6*3a9fd824SRoger Pau Monné * Permission is hereby granted, free of charge, to any person obtaining a copy 7*3a9fd824SRoger Pau Monné * of this software and associated documentation files (the "Software"), to 8*3a9fd824SRoger Pau Monné * deal in the Software without restriction, including without limitation the 9*3a9fd824SRoger Pau Monné * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or 10*3a9fd824SRoger Pau Monné * sell copies of the Software, and to permit persons to whom the Software is 11*3a9fd824SRoger Pau Monné * furnished to do so, subject to the following conditions: 12*3a9fd824SRoger Pau Monné * 13*3a9fd824SRoger Pau Monné * The above copyright notice and this permission notice shall be included in 14*3a9fd824SRoger Pau Monné * all copies or substantial portions of the Software. 15*3a9fd824SRoger Pau Monné * 16*3a9fd824SRoger Pau Monné * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17*3a9fd824SRoger Pau Monné * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18*3a9fd824SRoger Pau Monné * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19*3a9fd824SRoger Pau Monné * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20*3a9fd824SRoger Pau Monné * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21*3a9fd824SRoger Pau Monné * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22*3a9fd824SRoger Pau Monné * DEALINGS IN THE SOFTWARE. 23*3a9fd824SRoger Pau Monné * 24*3a9fd824SRoger Pau Monné * Copyright (C) 2016-2017 EPAM Systems Inc. 25*3a9fd824SRoger Pau Monné * 26*3a9fd824SRoger Pau Monné * Authors: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> 27*3a9fd824SRoger Pau Monné * Oleksandr Grytsov <oleksandr_grytsov@epam.com> 28*3a9fd824SRoger Pau Monné */ 29*3a9fd824SRoger Pau Monné 30*3a9fd824SRoger Pau Monné #ifndef __XEN_PUBLIC_IO_DISPLIF_H__ 31*3a9fd824SRoger Pau Monné #define __XEN_PUBLIC_IO_DISPLIF_H__ 32*3a9fd824SRoger Pau Monné 33*3a9fd824SRoger Pau Monné #include "ring.h" 34*3a9fd824SRoger Pau Monné #include "../grant_table.h" 35*3a9fd824SRoger Pau Monné 36*3a9fd824SRoger Pau Monné /* 37*3a9fd824SRoger Pau Monné ****************************************************************************** 38*3a9fd824SRoger Pau Monné * Protocol version 39*3a9fd824SRoger Pau Monné ****************************************************************************** 40*3a9fd824SRoger Pau Monné */ 41*3a9fd824SRoger Pau Monné #define XENDISPL_PROTOCOL_VERSION "2" 42*3a9fd824SRoger Pau Monné #define XENDISPL_PROTOCOL_VERSION_INT 2 43*3a9fd824SRoger Pau Monné 44*3a9fd824SRoger Pau Monné /* 45*3a9fd824SRoger Pau Monné ****************************************************************************** 46*3a9fd824SRoger Pau Monné * Main features provided by the protocol 47*3a9fd824SRoger Pau Monné ****************************************************************************** 48*3a9fd824SRoger Pau Monné * This protocol aims to provide a unified protocol which fits more 49*3a9fd824SRoger Pau Monné * sophisticated use-cases than a framebuffer device can handle. At the 50*3a9fd824SRoger Pau Monné * moment basic functionality is supported with the intention to be extended: 51*3a9fd824SRoger Pau Monné * o multiple dynamically allocated/destroyed framebuffers 52*3a9fd824SRoger Pau Monné * o buffers of arbitrary sizes 53*3a9fd824SRoger Pau Monné * o buffer allocation at either back or front end 54*3a9fd824SRoger Pau Monné * o better configuration options including multiple display support 55*3a9fd824SRoger Pau Monné * 56*3a9fd824SRoger Pau Monné * Note: existing fbif can be used together with displif running at the 57*3a9fd824SRoger Pau Monné * same time, e.g. on Linux one provides framebuffer and another DRM/KMS 58*3a9fd824SRoger Pau Monné * 59*3a9fd824SRoger Pau Monné * Note: display resolution (XenStore's "resolution" property) defines 60*3a9fd824SRoger Pau Monné * visible area of the virtual display. At the same time resolution of 61*3a9fd824SRoger Pau Monné * the display and frame buffers may differ: buffers can be smaller, equal 62*3a9fd824SRoger Pau Monné * or bigger than the visible area. This is to enable use-cases, where backend 63*3a9fd824SRoger Pau Monné * may do some post-processing of the display and frame buffers supplied, 64*3a9fd824SRoger Pau Monné * e.g. those buffers can be just a part of the final composition. 65*3a9fd824SRoger Pau Monné * 66*3a9fd824SRoger Pau Monné ****************************************************************************** 67*3a9fd824SRoger Pau Monné * Direction of improvements 68*3a9fd824SRoger Pau Monné ****************************************************************************** 69*3a9fd824SRoger Pau Monné * Future extensions to the existing protocol may include: 70*3a9fd824SRoger Pau Monné * o display/connector cloning 71*3a9fd824SRoger Pau Monné * o allocation of objects other than display buffers 72*3a9fd824SRoger Pau Monné * o plane/overlay support 73*3a9fd824SRoger Pau Monné * o scaling support 74*3a9fd824SRoger Pau Monné * o rotation support 75*3a9fd824SRoger Pau Monné * 76*3a9fd824SRoger Pau Monné ****************************************************************************** 77*3a9fd824SRoger Pau Monné * Feature and Parameter Negotiation 78*3a9fd824SRoger Pau Monné ****************************************************************************** 79*3a9fd824SRoger Pau Monné * 80*3a9fd824SRoger Pau Monné * Front->back notifications: when enqueuing a new request, sending a 81*3a9fd824SRoger Pau Monné * notification can be made conditional on xendispl_req (i.e., the generic 82*3a9fd824SRoger Pau Monné * hold-off mechanism provided by the ring macros). Backends must set 83*3a9fd824SRoger Pau Monné * xendispl_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). 84*3a9fd824SRoger Pau Monné * 85*3a9fd824SRoger Pau Monné * Back->front notifications: when enqueuing a new response, sending a 86*3a9fd824SRoger Pau Monné * notification can be made conditional on xendispl_resp (i.e., the generic 87*3a9fd824SRoger Pau Monné * hold-off mechanism provided by the ring macros). Frontends must set 88*3a9fd824SRoger Pau Monné * xendispl_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). 89*3a9fd824SRoger Pau Monné * 90*3a9fd824SRoger Pau Monné * The two halves of a para-virtual display driver utilize nodes within 91*3a9fd824SRoger Pau Monné * XenStore to communicate capabilities and to negotiate operating parameters. 92*3a9fd824SRoger Pau Monné * This section enumerates these nodes which reside in the respective front and 93*3a9fd824SRoger Pau Monné * backend portions of XenStore, following the XenBus convention. 94*3a9fd824SRoger Pau Monné * 95*3a9fd824SRoger Pau Monné * All data in XenStore is stored as strings. Nodes specifying numeric 96*3a9fd824SRoger Pau Monné * values are encoded in decimal. Integer value ranges listed below are 97*3a9fd824SRoger Pau Monné * expressed as fixed sized integer types capable of storing the conversion 98*3a9fd824SRoger Pau Monné * of a properly formated node string, without loss of information. 99*3a9fd824SRoger Pau Monné * 100*3a9fd824SRoger Pau Monné ****************************************************************************** 101*3a9fd824SRoger Pau Monné * Example configuration 102*3a9fd824SRoger Pau Monné ****************************************************************************** 103*3a9fd824SRoger Pau Monné * 104*3a9fd824SRoger Pau Monné * Note: depending on the use-case backend can expose more display connectors 105*3a9fd824SRoger Pau Monné * than the underlying HW physically has by employing SW graphics compositors 106*3a9fd824SRoger Pau Monné * 107*3a9fd824SRoger Pau Monné * This is an example of backend and frontend configuration: 108*3a9fd824SRoger Pau Monné * 109*3a9fd824SRoger Pau Monné *--------------------------------- Backend ----------------------------------- 110*3a9fd824SRoger Pau Monné * 111*3a9fd824SRoger Pau Monné * /local/domain/0/backend/vdispl/1/0/frontend-id = "1" 112*3a9fd824SRoger Pau Monné * /local/domain/0/backend/vdispl/1/0/frontend = "/local/domain/1/device/vdispl/0" 113*3a9fd824SRoger Pau Monné * /local/domain/0/backend/vdispl/1/0/state = "4" 114*3a9fd824SRoger Pau Monné * /local/domain/0/backend/vdispl/1/0/versions = "1,2" 115*3a9fd824SRoger Pau Monné * 116*3a9fd824SRoger Pau Monné *--------------------------------- Frontend ---------------------------------- 117*3a9fd824SRoger Pau Monné * 118*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/backend-id = "0" 119*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/backend = "/local/domain/0/backend/vdispl/1/0" 120*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/state = "4" 121*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/version = "1" 122*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/be-alloc = "1" 123*3a9fd824SRoger Pau Monné * 124*3a9fd824SRoger Pau Monné *-------------------------- Connector 0 configuration ------------------------ 125*3a9fd824SRoger Pau Monné * 126*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/0/resolution = "1920x1080" 127*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/0/req-ring-ref = "2832" 128*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/0/req-event-channel = "15" 129*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/0/evt-ring-ref = "387" 130*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/0/evt-event-channel = "16" 131*3a9fd824SRoger Pau Monné * 132*3a9fd824SRoger Pau Monné *-------------------------- Connector 1 configuration ------------------------ 133*3a9fd824SRoger Pau Monné * 134*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/1/resolution = "800x600" 135*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/1/req-ring-ref = "2833" 136*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/1/req-event-channel = "17" 137*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/1/evt-ring-ref = "388" 138*3a9fd824SRoger Pau Monné * /local/domain/1/device/vdispl/0/1/evt-event-channel = "18" 139*3a9fd824SRoger Pau Monné * 140*3a9fd824SRoger Pau Monné ****************************************************************************** 141*3a9fd824SRoger Pau Monné * Backend XenBus Nodes 142*3a9fd824SRoger Pau Monné ****************************************************************************** 143*3a9fd824SRoger Pau Monné * 144*3a9fd824SRoger Pau Monné *----------------------------- Protocol version ------------------------------ 145*3a9fd824SRoger Pau Monné * 146*3a9fd824SRoger Pau Monné * versions 147*3a9fd824SRoger Pau Monné * Values: <string> 148*3a9fd824SRoger Pau Monné * 149*3a9fd824SRoger Pau Monné * List of XENDISPL_LIST_SEPARATOR separated protocol versions supported 150*3a9fd824SRoger Pau Monné * by the backend. For example "1,2,3". 151*3a9fd824SRoger Pau Monné * 152*3a9fd824SRoger Pau Monné ****************************************************************************** 153*3a9fd824SRoger Pau Monné * Frontend XenBus Nodes 154*3a9fd824SRoger Pau Monné ****************************************************************************** 155*3a9fd824SRoger Pau Monné * 156*3a9fd824SRoger Pau Monné *-------------------------------- Addressing --------------------------------- 157*3a9fd824SRoger Pau Monné * 158*3a9fd824SRoger Pau Monné * dom-id 159*3a9fd824SRoger Pau Monné * Values: <uint16_t> 160*3a9fd824SRoger Pau Monné * 161*3a9fd824SRoger Pau Monné * Domain identifier. 162*3a9fd824SRoger Pau Monné * 163*3a9fd824SRoger Pau Monné * dev-id 164*3a9fd824SRoger Pau Monné * Values: <uint16_t> 165*3a9fd824SRoger Pau Monné * 166*3a9fd824SRoger Pau Monné * Device identifier. 167*3a9fd824SRoger Pau Monné * 168*3a9fd824SRoger Pau Monné * conn-idx 169*3a9fd824SRoger Pau Monné * Values: <uint8_t> 170*3a9fd824SRoger Pau Monné * 171*3a9fd824SRoger Pau Monné * Zero based contigous index of the connector. 172*3a9fd824SRoger Pau Monné * /local/domain/<dom-id>/device/vdispl/<dev-id>/<conn-idx>/... 173*3a9fd824SRoger Pau Monné * 174*3a9fd824SRoger Pau Monné *----------------------------- Protocol version ------------------------------ 175*3a9fd824SRoger Pau Monné * 176*3a9fd824SRoger Pau Monné * version 177*3a9fd824SRoger Pau Monné * Values: <string> 178*3a9fd824SRoger Pau Monné * 179*3a9fd824SRoger Pau Monné * Protocol version, chosen among the ones supported by the backend. 180*3a9fd824SRoger Pau Monné * 181*3a9fd824SRoger Pau Monné *------------------------- Backend buffer allocation ------------------------- 182*3a9fd824SRoger Pau Monné * 183*3a9fd824SRoger Pau Monné * be-alloc 184*3a9fd824SRoger Pau Monné * Values: "0", "1" 185*3a9fd824SRoger Pau Monné * 186*3a9fd824SRoger Pau Monné * If value is set to "1", then backend can be a buffer provider/allocator 187*3a9fd824SRoger Pau Monné * for this domain during XENDISPL_OP_DBUF_CREATE operation (see below 188*3a9fd824SRoger Pau Monné * for negotiation). 189*3a9fd824SRoger Pau Monné * If value is not "1" or omitted frontend must allocate buffers itself. 190*3a9fd824SRoger Pau Monné * 191*3a9fd824SRoger Pau Monné *----------------------------- Connector settings ---------------------------- 192*3a9fd824SRoger Pau Monné * 193*3a9fd824SRoger Pau Monné * unique-id 194*3a9fd824SRoger Pau Monné * Values: <string> 195*3a9fd824SRoger Pau Monné * 196*3a9fd824SRoger Pau Monné * After device instance initialization each connector is assigned a 197*3a9fd824SRoger Pau Monné * unique ID, so it can be identified by the backend by this ID. 198*3a9fd824SRoger Pau Monné * This can be UUID or such. 199*3a9fd824SRoger Pau Monné * 200*3a9fd824SRoger Pau Monné * resolution 201*3a9fd824SRoger Pau Monné * Values: <width, uint32_t>x<height, uint32_t> 202*3a9fd824SRoger Pau Monné * 203*3a9fd824SRoger Pau Monné * Width and height of the connector in pixels separated by 204*3a9fd824SRoger Pau Monné * XENDISPL_RESOLUTION_SEPARATOR. This defines visible area of the 205*3a9fd824SRoger Pau Monné * display. 206*3a9fd824SRoger Pau Monné * If backend provides extended display identification data (EDID) with 207*3a9fd824SRoger Pau Monné * XENDISPL_OP_GET_EDID request then EDID values must take precedence 208*3a9fd824SRoger Pau Monné * over the resolutions defined here. 209*3a9fd824SRoger Pau Monné * 210*3a9fd824SRoger Pau Monné *------------------ Connector Request Transport Parameters ------------------- 211*3a9fd824SRoger Pau Monné * 212*3a9fd824SRoger Pau Monné * This communication path is used to deliver requests from frontend to backend 213*3a9fd824SRoger Pau Monné * and get the corresponding responses from backend to frontend, 214*3a9fd824SRoger Pau Monné * set up per connector. 215*3a9fd824SRoger Pau Monné * 216*3a9fd824SRoger Pau Monné * req-event-channel 217*3a9fd824SRoger Pau Monné * Values: <uint32_t> 218*3a9fd824SRoger Pau Monné * 219*3a9fd824SRoger Pau Monné * The identifier of the Xen connector's control event channel 220*3a9fd824SRoger Pau Monné * used to signal activity in the ring buffer. 221*3a9fd824SRoger Pau Monné * 222*3a9fd824SRoger Pau Monné * req-ring-ref 223*3a9fd824SRoger Pau Monné * Values: <uint32_t> 224*3a9fd824SRoger Pau Monné * 225*3a9fd824SRoger Pau Monné * The Xen grant reference granting permission for the backend to map 226*3a9fd824SRoger Pau Monné * a sole page of connector's control ring buffer. 227*3a9fd824SRoger Pau Monné * 228*3a9fd824SRoger Pau Monné *------------------- Connector Event Transport Parameters -------------------- 229*3a9fd824SRoger Pau Monné * 230*3a9fd824SRoger Pau Monné * This communication path is used to deliver asynchronous events from backend 231*3a9fd824SRoger Pau Monné * to frontend, set up per connector. 232*3a9fd824SRoger Pau Monné * 233*3a9fd824SRoger Pau Monné * evt-event-channel 234*3a9fd824SRoger Pau Monné * Values: <uint32_t> 235*3a9fd824SRoger Pau Monné * 236*3a9fd824SRoger Pau Monné * The identifier of the Xen connector's event channel 237*3a9fd824SRoger Pau Monné * used to signal activity in the ring buffer. 238*3a9fd824SRoger Pau Monné * 239*3a9fd824SRoger Pau Monné * evt-ring-ref 240*3a9fd824SRoger Pau Monné * Values: <uint32_t> 241*3a9fd824SRoger Pau Monné * 242*3a9fd824SRoger Pau Monné * The Xen grant reference granting permission for the backend to map 243*3a9fd824SRoger Pau Monné * a sole page of connector's event ring buffer. 244*3a9fd824SRoger Pau Monné */ 245*3a9fd824SRoger Pau Monné 246*3a9fd824SRoger Pau Monné /* 247*3a9fd824SRoger Pau Monné ****************************************************************************** 248*3a9fd824SRoger Pau Monné * STATE DIAGRAMS 249*3a9fd824SRoger Pau Monné ****************************************************************************** 250*3a9fd824SRoger Pau Monné * 251*3a9fd824SRoger Pau Monné * Tool stack creates front and back state nodes with initial state 252*3a9fd824SRoger Pau Monné * XenbusStateInitialising. 253*3a9fd824SRoger Pau Monné * Tool stack creates and sets up frontend display configuration 254*3a9fd824SRoger Pau Monné * nodes per domain. 255*3a9fd824SRoger Pau Monné * 256*3a9fd824SRoger Pau Monné *-------------------------------- Normal flow -------------------------------- 257*3a9fd824SRoger Pau Monné * 258*3a9fd824SRoger Pau Monné * Front Back 259*3a9fd824SRoger Pau Monné * ================================= ===================================== 260*3a9fd824SRoger Pau Monné * XenbusStateInitialising XenbusStateInitialising 261*3a9fd824SRoger Pau Monné * o Query backend device identification 262*3a9fd824SRoger Pau Monné * data. 263*3a9fd824SRoger Pau Monné * o Open and validate backend device. 264*3a9fd824SRoger Pau Monné * | 265*3a9fd824SRoger Pau Monné * | 266*3a9fd824SRoger Pau Monné * V 267*3a9fd824SRoger Pau Monné * XenbusStateInitWait 268*3a9fd824SRoger Pau Monné * 269*3a9fd824SRoger Pau Monné * o Query frontend configuration 270*3a9fd824SRoger Pau Monné * o Allocate and initialize 271*3a9fd824SRoger Pau Monné * event channels per configured 272*3a9fd824SRoger Pau Monné * connector. 273*3a9fd824SRoger Pau Monné * o Publish transport parameters 274*3a9fd824SRoger Pau Monné * that will be in effect during 275*3a9fd824SRoger Pau Monné * this connection. 276*3a9fd824SRoger Pau Monné * | 277*3a9fd824SRoger Pau Monné * | 278*3a9fd824SRoger Pau Monné * V 279*3a9fd824SRoger Pau Monné * XenbusStateInitialised 280*3a9fd824SRoger Pau Monné * 281*3a9fd824SRoger Pau Monné * o Query frontend transport parameters. 282*3a9fd824SRoger Pau Monné * o Connect to the event channels. 283*3a9fd824SRoger Pau Monné * | 284*3a9fd824SRoger Pau Monné * | 285*3a9fd824SRoger Pau Monné * V 286*3a9fd824SRoger Pau Monné * XenbusStateConnected 287*3a9fd824SRoger Pau Monné * 288*3a9fd824SRoger Pau Monné * o Create and initialize OS 289*3a9fd824SRoger Pau Monné * virtual display connectors 290*3a9fd824SRoger Pau Monné * as per configuration. 291*3a9fd824SRoger Pau Monné * | 292*3a9fd824SRoger Pau Monné * | 293*3a9fd824SRoger Pau Monné * V 294*3a9fd824SRoger Pau Monné * XenbusStateConnected 295*3a9fd824SRoger Pau Monné * 296*3a9fd824SRoger Pau Monné * XenbusStateUnknown 297*3a9fd824SRoger Pau Monné * XenbusStateClosed 298*3a9fd824SRoger Pau Monné * XenbusStateClosing 299*3a9fd824SRoger Pau Monné * o Remove virtual display device 300*3a9fd824SRoger Pau Monné * o Remove event channels 301*3a9fd824SRoger Pau Monné * | 302*3a9fd824SRoger Pau Monné * | 303*3a9fd824SRoger Pau Monné * V 304*3a9fd824SRoger Pau Monné * XenbusStateClosed 305*3a9fd824SRoger Pau Monné * 306*3a9fd824SRoger Pau Monné *------------------------------- Recovery flow ------------------------------- 307*3a9fd824SRoger Pau Monné * 308*3a9fd824SRoger Pau Monné * In case of frontend unrecoverable errors backend handles that as 309*3a9fd824SRoger Pau Monné * if frontend goes into the XenbusStateClosed state. 310*3a9fd824SRoger Pau Monné * 311*3a9fd824SRoger Pau Monné * In case of backend unrecoverable errors frontend tries removing 312*3a9fd824SRoger Pau Monné * the virtualized device. If this is possible at the moment of error, 313*3a9fd824SRoger Pau Monné * then frontend goes into the XenbusStateInitialising state and is ready for 314*3a9fd824SRoger Pau Monné * new connection with backend. If the virtualized device is still in use and 315*3a9fd824SRoger Pau Monné * cannot be removed, then frontend goes into the XenbusStateReconfiguring state 316*3a9fd824SRoger Pau Monné * until either the virtualized device is removed or backend initiates a new 317*3a9fd824SRoger Pau Monné * connection. On the virtualized device removal frontend goes into the 318*3a9fd824SRoger Pau Monné * XenbusStateInitialising state. 319*3a9fd824SRoger Pau Monné * 320*3a9fd824SRoger Pau Monné * Note on XenbusStateReconfiguring state of the frontend: if backend has 321*3a9fd824SRoger Pau Monné * unrecoverable errors then frontend cannot send requests to the backend 322*3a9fd824SRoger Pau Monné * and thus cannot provide functionality of the virtualized device anymore. 323*3a9fd824SRoger Pau Monné * After backend is back to normal the virtualized device may still hold some 324*3a9fd824SRoger Pau Monné * state: configuration in use, allocated buffers, client application state etc. 325*3a9fd824SRoger Pau Monné * In most cases, this will require frontend to implement complex recovery 326*3a9fd824SRoger Pau Monné * reconnect logic. Instead, by going into XenbusStateReconfiguring state, 327*3a9fd824SRoger Pau Monné * frontend will make sure no new clients of the virtualized device are 328*3a9fd824SRoger Pau Monné * accepted, allow existing client(s) to exit gracefully by signaling error 329*3a9fd824SRoger Pau Monné * state etc. 330*3a9fd824SRoger Pau Monné * Once all the clients are gone frontend can reinitialize the virtualized 331*3a9fd824SRoger Pau Monné * device and get into XenbusStateInitialising state again signaling the 332*3a9fd824SRoger Pau Monné * backend that a new connection can be made. 333*3a9fd824SRoger Pau Monné * 334*3a9fd824SRoger Pau Monné * There are multiple conditions possible under which frontend will go from 335*3a9fd824SRoger Pau Monné * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS 336*3a9fd824SRoger Pau Monné * specific. For example: 337*3a9fd824SRoger Pau Monné * 1. The underlying OS framework may provide callbacks to signal that the last 338*3a9fd824SRoger Pau Monné * client of the virtualized device has gone and the device can be removed 339*3a9fd824SRoger Pau Monné * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue) 340*3a9fd824SRoger Pau Monné * to periodically check if this is the right time to re-try removal of 341*3a9fd824SRoger Pau Monné * the virtualized device. 342*3a9fd824SRoger Pau Monné * 3. By any other means. 343*3a9fd824SRoger Pau Monné * 344*3a9fd824SRoger Pau Monné ****************************************************************************** 345*3a9fd824SRoger Pau Monné * REQUEST CODES 346*3a9fd824SRoger Pau Monné ****************************************************************************** 347*3a9fd824SRoger Pau Monné * Request codes [0; 15] are reserved and must not be used 348*3a9fd824SRoger Pau Monné */ 349*3a9fd824SRoger Pau Monné 350*3a9fd824SRoger Pau Monné #define XENDISPL_OP_DBUF_CREATE 0x10 351*3a9fd824SRoger Pau Monné #define XENDISPL_OP_DBUF_DESTROY 0x11 352*3a9fd824SRoger Pau Monné #define XENDISPL_OP_FB_ATTACH 0x12 353*3a9fd824SRoger Pau Monné #define XENDISPL_OP_FB_DETACH 0x13 354*3a9fd824SRoger Pau Monné #define XENDISPL_OP_SET_CONFIG 0x14 355*3a9fd824SRoger Pau Monné #define XENDISPL_OP_PG_FLIP 0x15 356*3a9fd824SRoger Pau Monné /* The below command is available in protocol version 2 and above. */ 357*3a9fd824SRoger Pau Monné #define XENDISPL_OP_GET_EDID 0x16 358*3a9fd824SRoger Pau Monné 359*3a9fd824SRoger Pau Monné /* 360*3a9fd824SRoger Pau Monné ****************************************************************************** 361*3a9fd824SRoger Pau Monné * EVENT CODES 362*3a9fd824SRoger Pau Monné ****************************************************************************** 363*3a9fd824SRoger Pau Monné */ 364*3a9fd824SRoger Pau Monné #define XENDISPL_EVT_PG_FLIP 0x00 365*3a9fd824SRoger Pau Monné 366*3a9fd824SRoger Pau Monné /* 367*3a9fd824SRoger Pau Monné ****************************************************************************** 368*3a9fd824SRoger Pau Monné * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS 369*3a9fd824SRoger Pau Monné ****************************************************************************** 370*3a9fd824SRoger Pau Monné */ 371*3a9fd824SRoger Pau Monné #define XENDISPL_DRIVER_NAME "vdispl" 372*3a9fd824SRoger Pau Monné 373*3a9fd824SRoger Pau Monné #define XENDISPL_LIST_SEPARATOR "," 374*3a9fd824SRoger Pau Monné #define XENDISPL_RESOLUTION_SEPARATOR "x" 375*3a9fd824SRoger Pau Monné 376*3a9fd824SRoger Pau Monné #define XENDISPL_FIELD_BE_VERSIONS "versions" 377*3a9fd824SRoger Pau Monné #define XENDISPL_FIELD_FE_VERSION "version" 378*3a9fd824SRoger Pau Monné #define XENDISPL_FIELD_REQ_RING_REF "req-ring-ref" 379*3a9fd824SRoger Pau Monné #define XENDISPL_FIELD_REQ_CHANNEL "req-event-channel" 380*3a9fd824SRoger Pau Monné #define XENDISPL_FIELD_EVT_RING_REF "evt-ring-ref" 381*3a9fd824SRoger Pau Monné #define XENDISPL_FIELD_EVT_CHANNEL "evt-event-channel" 382*3a9fd824SRoger Pau Monné #define XENDISPL_FIELD_RESOLUTION "resolution" 383*3a9fd824SRoger Pau Monné #define XENDISPL_FIELD_BE_ALLOC "be-alloc" 384*3a9fd824SRoger Pau Monné #define XENDISPL_FIELD_UNIQUE_ID "unique-id" 385*3a9fd824SRoger Pau Monné 386*3a9fd824SRoger Pau Monné #define XENDISPL_EDID_BLOCK_SIZE 128 387*3a9fd824SRoger Pau Monné #define XENDISPL_EDID_BLOCK_COUNT 256 388*3a9fd824SRoger Pau Monné #define XENDISPL_EDID_MAX_SIZE (XENDISPL_EDID_BLOCK_SIZE * XENDISPL_EDID_BLOCK_COUNT) 389*3a9fd824SRoger Pau Monné 390*3a9fd824SRoger Pau Monné /* 391*3a9fd824SRoger Pau Monné ****************************************************************************** 392*3a9fd824SRoger Pau Monné * STATUS RETURN CODES 393*3a9fd824SRoger Pau Monné ****************************************************************************** 394*3a9fd824SRoger Pau Monné * 395*3a9fd824SRoger Pau Monné * Status return code is zero on success and -XEN_EXX on failure. 396*3a9fd824SRoger Pau Monné * 397*3a9fd824SRoger Pau Monné ****************************************************************************** 398*3a9fd824SRoger Pau Monné * Assumptions 399*3a9fd824SRoger Pau Monné ****************************************************************************** 400*3a9fd824SRoger Pau Monné * o usage of grant reference 0 as invalid grant reference: 401*3a9fd824SRoger Pau Monné * grant reference 0 is valid, but never exposed to a PV driver, 402*3a9fd824SRoger Pau Monné * because of the fact it is already in use/reserved by the PV console. 403*3a9fd824SRoger Pau Monné * o all references in this document to page sizes must be treated 404*3a9fd824SRoger Pau Monné * as pages of size XEN_PAGE_SIZE unless otherwise noted. 405*3a9fd824SRoger Pau Monné * 406*3a9fd824SRoger Pau Monné ****************************************************************************** 407*3a9fd824SRoger Pau Monné * Description of the protocol between frontend and backend driver 408*3a9fd824SRoger Pau Monné ****************************************************************************** 409*3a9fd824SRoger Pau Monné * 410*3a9fd824SRoger Pau Monné * The two halves of a Para-virtual display driver communicate with 411*3a9fd824SRoger Pau Monné * each other using shared pages and event channels. 412*3a9fd824SRoger Pau Monné * Shared page contains a ring with request/response packets. 413*3a9fd824SRoger Pau Monné * 414*3a9fd824SRoger Pau Monné * All reserved fields in the structures below must be 0. 415*3a9fd824SRoger Pau Monné * Display buffers's cookie of value 0 is treated as invalid. 416*3a9fd824SRoger Pau Monné * Framebuffer's cookie of value 0 is treated as invalid. 417*3a9fd824SRoger Pau Monné * 418*3a9fd824SRoger Pau Monné * For all request/response/event packets that use cookies: 419*3a9fd824SRoger Pau Monné * dbuf_cookie - uint64_t, unique to guest domain value used by the backend 420*3a9fd824SRoger Pau Monné * to map remote display buffer to its local one 421*3a9fd824SRoger Pau Monné * fb_cookie - uint64_t, unique to guest domain value used by the backend 422*3a9fd824SRoger Pau Monné * to map remote framebuffer to its local one 423*3a9fd824SRoger Pau Monné * 424*3a9fd824SRoger Pau Monné *---------------------------------- Requests --------------------------------- 425*3a9fd824SRoger Pau Monné * 426*3a9fd824SRoger Pau Monné * All requests/responses, which are not connector specific, must be sent over 427*3a9fd824SRoger Pau Monné * control ring of the connector which has the index value of 0: 428*3a9fd824SRoger Pau Monné * /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref 429*3a9fd824SRoger Pau Monné * 430*3a9fd824SRoger Pau Monné * All request packets have the same length (64 octets) 431*3a9fd824SRoger Pau Monné * All request packets have common header: 432*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 433*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 434*3a9fd824SRoger Pau Monné * | id | operation | reserved | 4 435*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 436*3a9fd824SRoger Pau Monné * | reserved | 8 437*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 438*3a9fd824SRoger Pau Monné * id - uint16_t, private guest value, echoed in response 439*3a9fd824SRoger Pau Monné * operation - uint8_t, operation code, XENDISPL_OP_??? 440*3a9fd824SRoger Pau Monné * 441*3a9fd824SRoger Pau Monné * Request dbuf creation - request creation of a display buffer. 442*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 443*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 444*3a9fd824SRoger Pau Monné * | id |_OP_DBUF_CREATE | reserved | 4 445*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 446*3a9fd824SRoger Pau Monné * | reserved | 8 447*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 448*3a9fd824SRoger Pau Monné * | dbuf_cookie low 32-bit | 12 449*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 450*3a9fd824SRoger Pau Monné * | dbuf_cookie high 32-bit | 16 451*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 452*3a9fd824SRoger Pau Monné * | width | 20 453*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 454*3a9fd824SRoger Pau Monné * | height | 24 455*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 456*3a9fd824SRoger Pau Monné * | bpp | 28 457*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 458*3a9fd824SRoger Pau Monné * | buffer_sz | 32 459*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 460*3a9fd824SRoger Pau Monné * | flags | 36 461*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 462*3a9fd824SRoger Pau Monné * | gref_directory | 40 463*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 464*3a9fd824SRoger Pau Monné * | data_ofs | 44 465*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 466*3a9fd824SRoger Pau Monné * | reserved | 48 467*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 468*3a9fd824SRoger Pau Monné * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 469*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 470*3a9fd824SRoger Pau Monné * | reserved | 64 471*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 472*3a9fd824SRoger Pau Monné * 473*3a9fd824SRoger Pau Monné * Must be sent over control ring of the connector which has the index 474*3a9fd824SRoger Pau Monné * value of 0: 475*3a9fd824SRoger Pau Monné * /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref 476*3a9fd824SRoger Pau Monné * All unused bits in flags field must be set to 0. 477*3a9fd824SRoger Pau Monné * 478*3a9fd824SRoger Pau Monné * An attempt to create multiple display buffers with the same dbuf_cookie is 479*3a9fd824SRoger Pau Monné * an error. dbuf_cookie can be re-used after destroying the corresponding 480*3a9fd824SRoger Pau Monné * display buffer. 481*3a9fd824SRoger Pau Monné * 482*3a9fd824SRoger Pau Monné * Width and height of the display buffers can be smaller, equal or bigger 483*3a9fd824SRoger Pau Monné * than the connector's resolution. Depth/pixel format of the individual 484*3a9fd824SRoger Pau Monné * buffers can differ as well. 485*3a9fd824SRoger Pau Monné * 486*3a9fd824SRoger Pau Monné * width - uint32_t, width in pixels 487*3a9fd824SRoger Pau Monné * height - uint32_t, height in pixels 488*3a9fd824SRoger Pau Monné * bpp - uint32_t, bits per pixel 489*3a9fd824SRoger Pau Monné * buffer_sz - uint32_t, buffer size to be allocated, octets 490*3a9fd824SRoger Pau Monné * flags - uint32_t, flags of the operation 491*3a9fd824SRoger Pau Monné * o XENDISPL_DBUF_FLG_REQ_ALLOC - if set, then backend is requested 492*3a9fd824SRoger Pau Monné * to allocate the buffer with the parameters provided in this request. 493*3a9fd824SRoger Pau Monné * Page directory is handled as follows: 494*3a9fd824SRoger Pau Monné * Frontend on request: 495*3a9fd824SRoger Pau Monné * o allocates pages for the directory (gref_directory, 496*3a9fd824SRoger Pau Monné * gref_dir_next_page(s) 497*3a9fd824SRoger Pau Monné * o grants permissions for the pages of the directory to the backend 498*3a9fd824SRoger Pau Monné * o sets gref_dir_next_page fields 499*3a9fd824SRoger Pau Monné * Backend on response: 500*3a9fd824SRoger Pau Monné * o grants permissions for the pages of the buffer allocated to 501*3a9fd824SRoger Pau Monné * the frontend 502*3a9fd824SRoger Pau Monné * o fills in page directory with grant references 503*3a9fd824SRoger Pau Monné * (gref[] in struct xendispl_page_directory) 504*3a9fd824SRoger Pau Monné * gref_directory - grant_ref_t, a reference to the first shared page 505*3a9fd824SRoger Pau Monné * describing shared buffer references. At least one page exists. If shared 506*3a9fd824SRoger Pau Monné * buffer size (buffer_sz) exceeds what can be addressed by this single page, 507*3a9fd824SRoger Pau Monné * then reference to the next page must be supplied (see gref_dir_next_page 508*3a9fd824SRoger Pau Monné * below) 509*3a9fd824SRoger Pau Monné * data_ofs - uint32_t, offset of the data in the buffer, octets 510*3a9fd824SRoger Pau Monné */ 511*3a9fd824SRoger Pau Monné 512*3a9fd824SRoger Pau Monné #define XENDISPL_DBUF_FLG_REQ_ALLOC (1 << 0) 513*3a9fd824SRoger Pau Monné 514*3a9fd824SRoger Pau Monné struct xendispl_dbuf_create_req { 515*3a9fd824SRoger Pau Monné uint64_t dbuf_cookie; 516*3a9fd824SRoger Pau Monné uint32_t width; 517*3a9fd824SRoger Pau Monné uint32_t height; 518*3a9fd824SRoger Pau Monné uint32_t bpp; 519*3a9fd824SRoger Pau Monné uint32_t buffer_sz; 520*3a9fd824SRoger Pau Monné uint32_t flags; 521*3a9fd824SRoger Pau Monné grant_ref_t gref_directory; 522*3a9fd824SRoger Pau Monné uint32_t data_ofs; 523*3a9fd824SRoger Pau Monné }; 524*3a9fd824SRoger Pau Monné 525*3a9fd824SRoger Pau Monné /* 526*3a9fd824SRoger Pau Monné * Shared page for XENDISPL_OP_DBUF_CREATE buffer descriptor (gref_directory in 527*3a9fd824SRoger Pau Monné * the request) employs a list of pages, describing all pages of the shared 528*3a9fd824SRoger Pau Monné * data buffer: 529*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 530*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 531*3a9fd824SRoger Pau Monné * | gref_dir_next_page | 4 532*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 533*3a9fd824SRoger Pau Monné * | gref[0] | 8 534*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 535*3a9fd824SRoger Pau Monné * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 536*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 537*3a9fd824SRoger Pau Monné * | gref[i] | i*4+8 538*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 539*3a9fd824SRoger Pau Monné * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 540*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 541*3a9fd824SRoger Pau Monné * | gref[N - 1] | N*4+8 542*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 543*3a9fd824SRoger Pau Monné * 544*3a9fd824SRoger Pau Monné * gref_dir_next_page - grant_ref_t, reference to the next page describing 545*3a9fd824SRoger Pau Monné * page directory. Must be 0 if there are no more pages in the list. 546*3a9fd824SRoger Pau Monné * gref[i] - grant_ref_t, reference to a shared page of the buffer 547*3a9fd824SRoger Pau Monné * allocated at XENDISPL_OP_DBUF_CREATE 548*3a9fd824SRoger Pau Monné * 549*3a9fd824SRoger Pau Monné * Number of grant_ref_t entries in the whole page directory is not 550*3a9fd824SRoger Pau Monné * passed, but instead can be calculated as: 551*3a9fd824SRoger Pau Monné * num_grefs_total = (XENDISPL_OP_DBUF_CREATE.buffer_sz + XEN_PAGE_SIZE - 1) / 552*3a9fd824SRoger Pau Monné * XEN_PAGE_SIZE 553*3a9fd824SRoger Pau Monné */ 554*3a9fd824SRoger Pau Monné 555*3a9fd824SRoger Pau Monné struct xendispl_page_directory { 556*3a9fd824SRoger Pau Monné grant_ref_t gref_dir_next_page; 557*3a9fd824SRoger Pau Monné grant_ref_t gref[1]; /* Variable length */ 558*3a9fd824SRoger Pau Monné }; 559*3a9fd824SRoger Pau Monné 560*3a9fd824SRoger Pau Monné /* 561*3a9fd824SRoger Pau Monné * Request dbuf destruction - destroy a previously allocated display buffer: 562*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 563*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 564*3a9fd824SRoger Pau Monné * | id |_OP_DBUF_DESTROY| reserved | 4 565*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 566*3a9fd824SRoger Pau Monné * | reserved | 8 567*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 568*3a9fd824SRoger Pau Monné * | dbuf_cookie low 32-bit | 12 569*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 570*3a9fd824SRoger Pau Monné * | dbuf_cookie high 32-bit | 16 571*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 572*3a9fd824SRoger Pau Monné * | reserved | 20 573*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 574*3a9fd824SRoger Pau Monné * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 575*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 576*3a9fd824SRoger Pau Monné * | reserved | 64 577*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 578*3a9fd824SRoger Pau Monné * 579*3a9fd824SRoger Pau Monné * Must be sent over control ring of the connector which has the index 580*3a9fd824SRoger Pau Monné * value of 0: 581*3a9fd824SRoger Pau Monné * /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref 582*3a9fd824SRoger Pau Monné */ 583*3a9fd824SRoger Pau Monné 584*3a9fd824SRoger Pau Monné struct xendispl_dbuf_destroy_req { 585*3a9fd824SRoger Pau Monné uint64_t dbuf_cookie; 586*3a9fd824SRoger Pau Monné }; 587*3a9fd824SRoger Pau Monné 588*3a9fd824SRoger Pau Monné /* 589*3a9fd824SRoger Pau Monné * Request framebuffer attachment - request attachment of a framebuffer to 590*3a9fd824SRoger Pau Monné * previously created display buffer. 591*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 592*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 593*3a9fd824SRoger Pau Monné * | id | _OP_FB_ATTACH | reserved | 4 594*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 595*3a9fd824SRoger Pau Monné * | reserved | 8 596*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 597*3a9fd824SRoger Pau Monné * | dbuf_cookie low 32-bit | 12 598*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 599*3a9fd824SRoger Pau Monné * | dbuf_cookie high 32-bit | 16 600*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 601*3a9fd824SRoger Pau Monné * | fb_cookie low 32-bit | 20 602*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 603*3a9fd824SRoger Pau Monné * | fb_cookie high 32-bit | 24 604*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 605*3a9fd824SRoger Pau Monné * | width | 28 606*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 607*3a9fd824SRoger Pau Monné * | height | 32 608*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 609*3a9fd824SRoger Pau Monné * | pixel_format | 36 610*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 611*3a9fd824SRoger Pau Monné * | reserved | 40 612*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 613*3a9fd824SRoger Pau Monné * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 614*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 615*3a9fd824SRoger Pau Monné * | reserved | 64 616*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 617*3a9fd824SRoger Pau Monné * 618*3a9fd824SRoger Pau Monné * Must be sent over control ring of the connector which has the index 619*3a9fd824SRoger Pau Monné * value of 0: 620*3a9fd824SRoger Pau Monné * /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref 621*3a9fd824SRoger Pau Monné * Width and height can be smaller, equal or bigger than the connector's 622*3a9fd824SRoger Pau Monné * resolution. 623*3a9fd824SRoger Pau Monné * 624*3a9fd824SRoger Pau Monné * An attempt to create multiple frame buffers with the same fb_cookie is 625*3a9fd824SRoger Pau Monné * an error. fb_cookie can be re-used after destroying the corresponding 626*3a9fd824SRoger Pau Monné * frame buffer. 627*3a9fd824SRoger Pau Monné * 628*3a9fd824SRoger Pau Monné * width - uint32_t, width in pixels 629*3a9fd824SRoger Pau Monné * height - uint32_t, height in pixels 630*3a9fd824SRoger Pau Monné * pixel_format - uint32_t, pixel format of the framebuffer, FOURCC code 631*3a9fd824SRoger Pau Monné */ 632*3a9fd824SRoger Pau Monné 633*3a9fd824SRoger Pau Monné struct xendispl_fb_attach_req { 634*3a9fd824SRoger Pau Monné uint64_t dbuf_cookie; 635*3a9fd824SRoger Pau Monné uint64_t fb_cookie; 636*3a9fd824SRoger Pau Monné uint32_t width; 637*3a9fd824SRoger Pau Monné uint32_t height; 638*3a9fd824SRoger Pau Monné uint32_t pixel_format; 639*3a9fd824SRoger Pau Monné }; 640*3a9fd824SRoger Pau Monné 641*3a9fd824SRoger Pau Monné /* 642*3a9fd824SRoger Pau Monné * Request framebuffer detach - detach a previously 643*3a9fd824SRoger Pau Monné * attached framebuffer from the display buffer in request: 644*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 645*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 646*3a9fd824SRoger Pau Monné * | id | _OP_FB_DETACH | reserved | 4 647*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 648*3a9fd824SRoger Pau Monné * | reserved | 8 649*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 650*3a9fd824SRoger Pau Monné * | fb_cookie low 32-bit | 12 651*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 652*3a9fd824SRoger Pau Monné * | fb_cookie high 32-bit | 16 653*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 654*3a9fd824SRoger Pau Monné * | reserved | 20 655*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 656*3a9fd824SRoger Pau Monné * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 657*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 658*3a9fd824SRoger Pau Monné * | reserved | 64 659*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 660*3a9fd824SRoger Pau Monné * 661*3a9fd824SRoger Pau Monné * Must be sent over control ring of the connector which has the index 662*3a9fd824SRoger Pau Monné * value of 0: 663*3a9fd824SRoger Pau Monné * /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref 664*3a9fd824SRoger Pau Monné */ 665*3a9fd824SRoger Pau Monné 666*3a9fd824SRoger Pau Monné struct xendispl_fb_detach_req { 667*3a9fd824SRoger Pau Monné uint64_t fb_cookie; 668*3a9fd824SRoger Pau Monné }; 669*3a9fd824SRoger Pau Monné 670*3a9fd824SRoger Pau Monné /* 671*3a9fd824SRoger Pau Monné * Request configuration set/reset - request to set or reset 672*3a9fd824SRoger Pau Monné * the configuration/mode of the display: 673*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 674*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 675*3a9fd824SRoger Pau Monné * | id | _OP_SET_CONFIG | reserved | 4 676*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 677*3a9fd824SRoger Pau Monné * | reserved | 8 678*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 679*3a9fd824SRoger Pau Monné * | fb_cookie low 32-bit | 12 680*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 681*3a9fd824SRoger Pau Monné * | fb_cookie high 32-bit | 16 682*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 683*3a9fd824SRoger Pau Monné * | x | 20 684*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 685*3a9fd824SRoger Pau Monné * | y | 24 686*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 687*3a9fd824SRoger Pau Monné * | width | 28 688*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 689*3a9fd824SRoger Pau Monné * | height | 32 690*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 691*3a9fd824SRoger Pau Monné * | bpp | 40 692*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 693*3a9fd824SRoger Pau Monné * | reserved | 44 694*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 695*3a9fd824SRoger Pau Monné * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 696*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 697*3a9fd824SRoger Pau Monné * | reserved | 64 698*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 699*3a9fd824SRoger Pau Monné * 700*3a9fd824SRoger Pau Monné * Pass all zeros to reset, otherwise command is treated as 701*3a9fd824SRoger Pau Monné * configuration set. 702*3a9fd824SRoger Pau Monné * Framebuffer's cookie defines which framebuffer/dbuf must be 703*3a9fd824SRoger Pau Monné * displayed while enabling display (applying configuration). 704*3a9fd824SRoger Pau Monné * x, y, width and height are bound by the connector's resolution and must not 705*3a9fd824SRoger Pau Monné * exceed it. 706*3a9fd824SRoger Pau Monné * 707*3a9fd824SRoger Pau Monné * x - uint32_t, starting position in pixels by X axis 708*3a9fd824SRoger Pau Monné * y - uint32_t, starting position in pixels by Y axis 709*3a9fd824SRoger Pau Monné * width - uint32_t, width in pixels 710*3a9fd824SRoger Pau Monné * height - uint32_t, height in pixels 711*3a9fd824SRoger Pau Monné * bpp - uint32_t, bits per pixel 712*3a9fd824SRoger Pau Monné */ 713*3a9fd824SRoger Pau Monné 714*3a9fd824SRoger Pau Monné struct xendispl_set_config_req { 715*3a9fd824SRoger Pau Monné uint64_t fb_cookie; 716*3a9fd824SRoger Pau Monné uint32_t x; 717*3a9fd824SRoger Pau Monné uint32_t y; 718*3a9fd824SRoger Pau Monné uint32_t width; 719*3a9fd824SRoger Pau Monné uint32_t height; 720*3a9fd824SRoger Pau Monné uint32_t bpp; 721*3a9fd824SRoger Pau Monné }; 722*3a9fd824SRoger Pau Monné 723*3a9fd824SRoger Pau Monné /* 724*3a9fd824SRoger Pau Monné * Request page flip - request to flip a page identified by the framebuffer 725*3a9fd824SRoger Pau Monné * cookie: 726*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 727*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 728*3a9fd824SRoger Pau Monné * | id | _OP_PG_FLIP | reserved | 4 729*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 730*3a9fd824SRoger Pau Monné * | reserved | 8 731*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 732*3a9fd824SRoger Pau Monné * | fb_cookie low 32-bit | 12 733*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 734*3a9fd824SRoger Pau Monné * | fb_cookie high 32-bit | 16 735*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 736*3a9fd824SRoger Pau Monné * | reserved | 20 737*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 738*3a9fd824SRoger Pau Monné * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 739*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 740*3a9fd824SRoger Pau Monné * | reserved | 64 741*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 742*3a9fd824SRoger Pau Monné */ 743*3a9fd824SRoger Pau Monné 744*3a9fd824SRoger Pau Monné struct xendispl_page_flip_req { 745*3a9fd824SRoger Pau Monné uint64_t fb_cookie; 746*3a9fd824SRoger Pau Monné }; 747*3a9fd824SRoger Pau Monné 748*3a9fd824SRoger Pau Monné /* 749*3a9fd824SRoger Pau Monné * Request EDID - request EDID describing current connector: 750*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 751*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 752*3a9fd824SRoger Pau Monné * | id | _OP_GET_EDID | reserved | 4 753*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 754*3a9fd824SRoger Pau Monné * | buffer_sz | 8 755*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 756*3a9fd824SRoger Pau Monné * | gref_directory | 12 757*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 758*3a9fd824SRoger Pau Monné * | reserved | 16 759*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 760*3a9fd824SRoger Pau Monné * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 761*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 762*3a9fd824SRoger Pau Monné * | reserved | 64 763*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 764*3a9fd824SRoger Pau Monné * 765*3a9fd824SRoger Pau Monné * Notes: 766*3a9fd824SRoger Pau Monné * - This command is not available in protocol version 1 and should be 767*3a9fd824SRoger Pau Monné * ignored. 768*3a9fd824SRoger Pau Monné * - This request is optional and if not supported then visible area 769*3a9fd824SRoger Pau Monné * is defined by the relevant XenStore's "resolution" property. 770*3a9fd824SRoger Pau Monné * - Shared buffer, allocated for EDID storage, must not be less then 771*3a9fd824SRoger Pau Monné * XENDISPL_EDID_MAX_SIZE octets. 772*3a9fd824SRoger Pau Monné * 773*3a9fd824SRoger Pau Monné * buffer_sz - uint32_t, buffer size to be allocated, octets 774*3a9fd824SRoger Pau Monné * gref_directory - grant_ref_t, a reference to the first shared page 775*3a9fd824SRoger Pau Monné * describing EDID buffer references. See XENDISPL_OP_DBUF_CREATE for 776*3a9fd824SRoger Pau Monné * grant page directory structure (struct xendispl_page_directory). 777*3a9fd824SRoger Pau Monné * 778*3a9fd824SRoger Pau Monné * See response format for this request. 779*3a9fd824SRoger Pau Monné */ 780*3a9fd824SRoger Pau Monné 781*3a9fd824SRoger Pau Monné struct xendispl_get_edid_req { 782*3a9fd824SRoger Pau Monné uint32_t buffer_sz; 783*3a9fd824SRoger Pau Monné grant_ref_t gref_directory; 784*3a9fd824SRoger Pau Monné }; 785*3a9fd824SRoger Pau Monné 786*3a9fd824SRoger Pau Monné /* 787*3a9fd824SRoger Pau Monné *---------------------------------- Responses -------------------------------- 788*3a9fd824SRoger Pau Monné * 789*3a9fd824SRoger Pau Monné * All response packets have the same length (64 octets) 790*3a9fd824SRoger Pau Monné * 791*3a9fd824SRoger Pau Monné * All response packets have common header: 792*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 793*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 794*3a9fd824SRoger Pau Monné * | id | reserved | 4 795*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 796*3a9fd824SRoger Pau Monné * | status | 8 797*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 798*3a9fd824SRoger Pau Monné * | reserved | 12 799*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 800*3a9fd824SRoger Pau Monné * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 801*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 802*3a9fd824SRoger Pau Monné * | reserved | 64 803*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 804*3a9fd824SRoger Pau Monné * 805*3a9fd824SRoger Pau Monné * id - uint16_t, private guest value, echoed from request 806*3a9fd824SRoger Pau Monné * status - int32_t, response status, zero on success and -XEN_EXX on failure 807*3a9fd824SRoger Pau Monné * 808*3a9fd824SRoger Pau Monné * 809*3a9fd824SRoger Pau Monné * Get EDID response - response for XENDISPL_OP_GET_EDID: 810*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 811*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 812*3a9fd824SRoger Pau Monné * | id | operation | reserved | 4 813*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 814*3a9fd824SRoger Pau Monné * | status | 8 815*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 816*3a9fd824SRoger Pau Monné * | edid_sz | 12 817*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 818*3a9fd824SRoger Pau Monné * | reserved | 16 819*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 820*3a9fd824SRoger Pau Monné * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 821*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 822*3a9fd824SRoger Pau Monné * | reserved | 64 823*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 824*3a9fd824SRoger Pau Monné * 825*3a9fd824SRoger Pau Monné * Notes: 826*3a9fd824SRoger Pau Monné * - This response is not available in protocol version 1 and should be 827*3a9fd824SRoger Pau Monné * ignored. 828*3a9fd824SRoger Pau Monné * 829*3a9fd824SRoger Pau Monné * edid_sz - uint32_t, size of the EDID, octets 830*3a9fd824SRoger Pau Monné */ 831*3a9fd824SRoger Pau Monné 832*3a9fd824SRoger Pau Monné struct xendispl_get_edid_resp { 833*3a9fd824SRoger Pau Monné uint32_t edid_sz; 834*3a9fd824SRoger Pau Monné }; 835*3a9fd824SRoger Pau Monné 836*3a9fd824SRoger Pau Monné /* 837*3a9fd824SRoger Pau Monné *----------------------------------- Events ---------------------------------- 838*3a9fd824SRoger Pau Monné * 839*3a9fd824SRoger Pau Monné * Events are sent via a shared page allocated by the front and propagated by 840*3a9fd824SRoger Pau Monné * evt-event-channel/evt-ring-ref XenStore entries 841*3a9fd824SRoger Pau Monné * All event packets have the same length (64 octets) 842*3a9fd824SRoger Pau Monné * All event packets have common header: 843*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 844*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 845*3a9fd824SRoger Pau Monné * | id | type | reserved | 4 846*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 847*3a9fd824SRoger Pau Monné * | reserved | 8 848*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 849*3a9fd824SRoger Pau Monné * 850*3a9fd824SRoger Pau Monné * id - uint16_t, event id, may be used by front 851*3a9fd824SRoger Pau Monné * type - uint8_t, type of the event 852*3a9fd824SRoger Pau Monné * 853*3a9fd824SRoger Pau Monné * 854*3a9fd824SRoger Pau Monné * Page flip complete event - event from back to front on page flip completed: 855*3a9fd824SRoger Pau Monné * 0 1 2 3 octet 856*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 857*3a9fd824SRoger Pau Monné * | id | _EVT_PG_FLIP | reserved | 4 858*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 859*3a9fd824SRoger Pau Monné * | reserved | 8 860*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 861*3a9fd824SRoger Pau Monné * | fb_cookie low 32-bit | 12 862*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 863*3a9fd824SRoger Pau Monné * | fb_cookie high 32-bit | 16 864*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 865*3a9fd824SRoger Pau Monné * | reserved | 20 866*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 867*3a9fd824SRoger Pau Monné * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 868*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 869*3a9fd824SRoger Pau Monné * | reserved | 64 870*3a9fd824SRoger Pau Monné * +----------------+----------------+----------------+----------------+ 871*3a9fd824SRoger Pau Monné */ 872*3a9fd824SRoger Pau Monné 873*3a9fd824SRoger Pau Monné struct xendispl_pg_flip_evt { 874*3a9fd824SRoger Pau Monné uint64_t fb_cookie; 875*3a9fd824SRoger Pau Monné }; 876*3a9fd824SRoger Pau Monné 877*3a9fd824SRoger Pau Monné struct xendispl_req { 878*3a9fd824SRoger Pau Monné uint16_t id; 879*3a9fd824SRoger Pau Monné uint8_t operation; 880*3a9fd824SRoger Pau Monné uint8_t reserved[5]; 881*3a9fd824SRoger Pau Monné union { 882*3a9fd824SRoger Pau Monné struct xendispl_dbuf_create_req dbuf_create; 883*3a9fd824SRoger Pau Monné struct xendispl_dbuf_destroy_req dbuf_destroy; 884*3a9fd824SRoger Pau Monné struct xendispl_fb_attach_req fb_attach; 885*3a9fd824SRoger Pau Monné struct xendispl_fb_detach_req fb_detach; 886*3a9fd824SRoger Pau Monné struct xendispl_set_config_req set_config; 887*3a9fd824SRoger Pau Monné struct xendispl_page_flip_req pg_flip; 888*3a9fd824SRoger Pau Monné struct xendispl_get_edid_req get_edid; 889*3a9fd824SRoger Pau Monné uint8_t reserved[56]; 890*3a9fd824SRoger Pau Monné } op; 891*3a9fd824SRoger Pau Monné }; 892*3a9fd824SRoger Pau Monné 893*3a9fd824SRoger Pau Monné struct xendispl_resp { 894*3a9fd824SRoger Pau Monné uint16_t id; 895*3a9fd824SRoger Pau Monné uint8_t operation; 896*3a9fd824SRoger Pau Monné uint8_t reserved; 897*3a9fd824SRoger Pau Monné int32_t status; 898*3a9fd824SRoger Pau Monné union { 899*3a9fd824SRoger Pau Monné struct xendispl_get_edid_resp get_edid; 900*3a9fd824SRoger Pau Monné uint8_t reserved1[56]; 901*3a9fd824SRoger Pau Monné } op; 902*3a9fd824SRoger Pau Monné }; 903*3a9fd824SRoger Pau Monné 904*3a9fd824SRoger Pau Monné struct xendispl_evt { 905*3a9fd824SRoger Pau Monné uint16_t id; 906*3a9fd824SRoger Pau Monné uint8_t type; 907*3a9fd824SRoger Pau Monné uint8_t reserved[5]; 908*3a9fd824SRoger Pau Monné union { 909*3a9fd824SRoger Pau Monné struct xendispl_pg_flip_evt pg_flip; 910*3a9fd824SRoger Pau Monné uint8_t reserved[56]; 911*3a9fd824SRoger Pau Monné } op; 912*3a9fd824SRoger Pau Monné }; 913*3a9fd824SRoger Pau Monné 914*3a9fd824SRoger Pau Monné DEFINE_RING_TYPES(xen_displif, struct xendispl_req, struct xendispl_resp); 915*3a9fd824SRoger Pau Monné 916*3a9fd824SRoger Pau Monné /* 917*3a9fd824SRoger Pau Monné ****************************************************************************** 918*3a9fd824SRoger Pau Monné * Back to front events delivery 919*3a9fd824SRoger Pau Monné ****************************************************************************** 920*3a9fd824SRoger Pau Monné * In order to deliver asynchronous events from back to front a shared page is 921*3a9fd824SRoger Pau Monné * allocated by front and its granted reference propagated to back via 922*3a9fd824SRoger Pau Monné * XenStore entries (evt-ring-ref/evt-event-channel). 923*3a9fd824SRoger Pau Monné * This page has a common header used by both front and back to synchronize 924*3a9fd824SRoger Pau Monné * access and control event's ring buffer, while back being a producer of the 925*3a9fd824SRoger Pau Monné * events and front being a consumer. The rest of the page after the header 926*3a9fd824SRoger Pau Monné * is used for event packets. 927*3a9fd824SRoger Pau Monné * 928*3a9fd824SRoger Pau Monné * Upon reception of an event(s) front may confirm its reception 929*3a9fd824SRoger Pau Monné * for either each event, group of events or none. 930*3a9fd824SRoger Pau Monné */ 931*3a9fd824SRoger Pau Monné 932*3a9fd824SRoger Pau Monné struct xendispl_event_page { 933*3a9fd824SRoger Pau Monné uint32_t in_cons; 934*3a9fd824SRoger Pau Monné uint32_t in_prod; 935*3a9fd824SRoger Pau Monné uint8_t reserved[56]; 936*3a9fd824SRoger Pau Monné }; 937*3a9fd824SRoger Pau Monné 938*3a9fd824SRoger Pau Monné #define XENDISPL_EVENT_PAGE_SIZE 4096 939*3a9fd824SRoger Pau Monné #define XENDISPL_IN_RING_OFFS (sizeof(struct xendispl_event_page)) 940*3a9fd824SRoger Pau Monné #define XENDISPL_IN_RING_SIZE (XENDISPL_EVENT_PAGE_SIZE - XENDISPL_IN_RING_OFFS) 941*3a9fd824SRoger Pau Monné #define XENDISPL_IN_RING_LEN (XENDISPL_IN_RING_SIZE / sizeof(struct xendispl_evt)) 942*3a9fd824SRoger Pau Monné #define XENDISPL_IN_RING(page) \ 943*3a9fd824SRoger Pau Monné ((struct xendispl_evt *)((char *)(page) + XENDISPL_IN_RING_OFFS)) 944*3a9fd824SRoger Pau Monné #define XENDISPL_IN_RING_REF(page, idx) \ 945*3a9fd824SRoger Pau Monné (XENDISPL_IN_RING((page))[(idx) % XENDISPL_IN_RING_LEN]) 946*3a9fd824SRoger Pau Monné 947*3a9fd824SRoger Pau Monné #endif /* __XEN_PUBLIC_IO_DISPLIF_H__ */ 948*3a9fd824SRoger Pau Monné 949*3a9fd824SRoger Pau Monné /* 950*3a9fd824SRoger Pau Monné * Local variables: 951*3a9fd824SRoger Pau Monné * mode: C 952*3a9fd824SRoger Pau Monné * c-file-style: "BSD" 953*3a9fd824SRoger Pau Monné * c-basic-offset: 4 954*3a9fd824SRoger Pau Monné * tab-width: 4 955*3a9fd824SRoger Pau Monné * indent-tabs-mode: nil 956*3a9fd824SRoger Pau Monné * End: 957*3a9fd824SRoger Pau Monné */ 958