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