xref: /freebsd/sys/contrib/xen/io/displif.h (revision 3a9fd8242b35884921dfc4e886f284a75870a536)
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