xref: /openbmc/linux/include/xen/interface/io/displif.h (revision 03ab8e6297acd1bc0eedaa050e2a1635c576fd11)
1*9e2b3e83SJuergen Gross /* SPDX-License-Identifier: MIT */
28945c08eSOleksandr Andrushchenko /******************************************************************************
38945c08eSOleksandr Andrushchenko  * displif.h
48945c08eSOleksandr Andrushchenko  *
58945c08eSOleksandr Andrushchenko  * Unified display device I/O interface for Xen guest OSes.
68945c08eSOleksandr Andrushchenko  *
78945c08eSOleksandr Andrushchenko  * Copyright (C) 2016-2017 EPAM Systems Inc.
88945c08eSOleksandr Andrushchenko  *
98945c08eSOleksandr Andrushchenko  * Authors: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com>
108945c08eSOleksandr Andrushchenko  *          Oleksandr Grytsov <oleksandr_grytsov@epam.com>
118945c08eSOleksandr Andrushchenko  */
128945c08eSOleksandr Andrushchenko 
138945c08eSOleksandr Andrushchenko #ifndef __XEN_PUBLIC_IO_DISPLIF_H__
148945c08eSOleksandr Andrushchenko #define __XEN_PUBLIC_IO_DISPLIF_H__
158945c08eSOleksandr Andrushchenko 
168945c08eSOleksandr Andrushchenko #include "ring.h"
178945c08eSOleksandr Andrushchenko #include "../grant_table.h"
188945c08eSOleksandr Andrushchenko 
198945c08eSOleksandr Andrushchenko /*
208945c08eSOleksandr Andrushchenko  ******************************************************************************
218945c08eSOleksandr Andrushchenko  *                           Protocol version
228945c08eSOleksandr Andrushchenko  ******************************************************************************
238945c08eSOleksandr Andrushchenko  */
246f92337bSOleksandr Andrushchenko #define XENDISPL_PROTOCOL_VERSION	"2"
256f92337bSOleksandr Andrushchenko #define XENDISPL_PROTOCOL_VERSION_INT	 2
268945c08eSOleksandr Andrushchenko 
278945c08eSOleksandr Andrushchenko /*
288945c08eSOleksandr Andrushchenko  ******************************************************************************
298945c08eSOleksandr Andrushchenko  *                  Main features provided by the protocol
308945c08eSOleksandr Andrushchenko  ******************************************************************************
318945c08eSOleksandr Andrushchenko  * This protocol aims to provide a unified protocol which fits more
328945c08eSOleksandr Andrushchenko  * sophisticated use-cases than a framebuffer device can handle. At the
338945c08eSOleksandr Andrushchenko  * moment basic functionality is supported with the intention to be extended:
348945c08eSOleksandr Andrushchenko  *  o multiple dynamically allocated/destroyed framebuffers
358945c08eSOleksandr Andrushchenko  *  o buffers of arbitrary sizes
368945c08eSOleksandr Andrushchenko  *  o buffer allocation at either back or front end
378945c08eSOleksandr Andrushchenko  *  o better configuration options including multiple display support
388945c08eSOleksandr Andrushchenko  *
398945c08eSOleksandr Andrushchenko  * Note: existing fbif can be used together with displif running at the
408945c08eSOleksandr Andrushchenko  * same time, e.g. on Linux one provides framebuffer and another DRM/KMS
418945c08eSOleksandr Andrushchenko  *
428945c08eSOleksandr Andrushchenko  * Note: display resolution (XenStore's "resolution" property) defines
438945c08eSOleksandr Andrushchenko  * visible area of the virtual display. At the same time resolution of
448945c08eSOleksandr Andrushchenko  * the display and frame buffers may differ: buffers can be smaller, equal
458945c08eSOleksandr Andrushchenko  * or bigger than the visible area. This is to enable use-cases, where backend
468945c08eSOleksandr Andrushchenko  * may do some post-processing of the display and frame buffers supplied,
478945c08eSOleksandr Andrushchenko  * e.g. those buffers can be just a part of the final composition.
488945c08eSOleksandr Andrushchenko  *
498945c08eSOleksandr Andrushchenko  ******************************************************************************
508945c08eSOleksandr Andrushchenko  *                        Direction of improvements
518945c08eSOleksandr Andrushchenko  ******************************************************************************
528945c08eSOleksandr Andrushchenko  * Future extensions to the existing protocol may include:
538945c08eSOleksandr Andrushchenko  *  o display/connector cloning
548945c08eSOleksandr Andrushchenko  *  o allocation of objects other than display buffers
558945c08eSOleksandr Andrushchenko  *  o plane/overlay support
568945c08eSOleksandr Andrushchenko  *  o scaling support
578945c08eSOleksandr Andrushchenko  *  o rotation support
588945c08eSOleksandr Andrushchenko  *
598945c08eSOleksandr Andrushchenko  ******************************************************************************
608945c08eSOleksandr Andrushchenko  *                  Feature and Parameter Negotiation
618945c08eSOleksandr Andrushchenko  ******************************************************************************
628945c08eSOleksandr Andrushchenko  *
638945c08eSOleksandr Andrushchenko  * Front->back notifications: when enqueuing a new request, sending a
648945c08eSOleksandr Andrushchenko  * notification can be made conditional on xendispl_req (i.e., the generic
658945c08eSOleksandr Andrushchenko  * hold-off mechanism provided by the ring macros). Backends must set
668945c08eSOleksandr Andrushchenko  * xendispl_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()).
678945c08eSOleksandr Andrushchenko  *
688945c08eSOleksandr Andrushchenko  * Back->front notifications: when enqueuing a new response, sending a
698945c08eSOleksandr Andrushchenko  * notification can be made conditional on xendispl_resp (i.e., the generic
708945c08eSOleksandr Andrushchenko  * hold-off mechanism provided by the ring macros). Frontends must set
718945c08eSOleksandr Andrushchenko  * xendispl_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()).
728945c08eSOleksandr Andrushchenko  *
738945c08eSOleksandr Andrushchenko  * The two halves of a para-virtual display driver utilize nodes within
748945c08eSOleksandr Andrushchenko  * XenStore to communicate capabilities and to negotiate operating parameters.
758945c08eSOleksandr Andrushchenko  * This section enumerates these nodes which reside in the respective front and
768945c08eSOleksandr Andrushchenko  * backend portions of XenStore, following the XenBus convention.
778945c08eSOleksandr Andrushchenko  *
788945c08eSOleksandr Andrushchenko  * All data in XenStore is stored as strings. Nodes specifying numeric
798945c08eSOleksandr Andrushchenko  * values are encoded in decimal. Integer value ranges listed below are
808945c08eSOleksandr Andrushchenko  * expressed as fixed sized integer types capable of storing the conversion
818945c08eSOleksandr Andrushchenko  * of a properly formated node string, without loss of information.
828945c08eSOleksandr Andrushchenko  *
838945c08eSOleksandr Andrushchenko  ******************************************************************************
848945c08eSOleksandr Andrushchenko  *                        Example configuration
858945c08eSOleksandr Andrushchenko  ******************************************************************************
868945c08eSOleksandr Andrushchenko  *
878945c08eSOleksandr Andrushchenko  * Note: depending on the use-case backend can expose more display connectors
888945c08eSOleksandr Andrushchenko  * than the underlying HW physically has by employing SW graphics compositors
898945c08eSOleksandr Andrushchenko  *
908945c08eSOleksandr Andrushchenko  * This is an example of backend and frontend configuration:
918945c08eSOleksandr Andrushchenko  *
928945c08eSOleksandr Andrushchenko  *--------------------------------- Backend -----------------------------------
938945c08eSOleksandr Andrushchenko  *
948945c08eSOleksandr Andrushchenko  * /local/domain/0/backend/vdispl/1/0/frontend-id = "1"
958945c08eSOleksandr Andrushchenko  * /local/domain/0/backend/vdispl/1/0/frontend = "/local/domain/1/device/vdispl/0"
968945c08eSOleksandr Andrushchenko  * /local/domain/0/backend/vdispl/1/0/state = "4"
978945c08eSOleksandr Andrushchenko  * /local/domain/0/backend/vdispl/1/0/versions = "1,2"
988945c08eSOleksandr Andrushchenko  *
998945c08eSOleksandr Andrushchenko  *--------------------------------- Frontend ----------------------------------
1008945c08eSOleksandr Andrushchenko  *
1018945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/backend-id = "0"
1028945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/backend = "/local/domain/0/backend/vdispl/1/0"
1038945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/state = "4"
1048945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/version = "1"
1058945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/be-alloc = "1"
1068945c08eSOleksandr Andrushchenko  *
1078945c08eSOleksandr Andrushchenko  *-------------------------- Connector 0 configuration ------------------------
1088945c08eSOleksandr Andrushchenko  *
1098945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/0/resolution = "1920x1080"
1108945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/0/req-ring-ref = "2832"
1118945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/0/req-event-channel = "15"
1128945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/0/evt-ring-ref = "387"
1138945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/0/evt-event-channel = "16"
1148945c08eSOleksandr Andrushchenko  *
1158945c08eSOleksandr Andrushchenko  *-------------------------- Connector 1 configuration ------------------------
1168945c08eSOleksandr Andrushchenko  *
1178945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/1/resolution = "800x600"
1188945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/1/req-ring-ref = "2833"
1198945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/1/req-event-channel = "17"
1208945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/1/evt-ring-ref = "388"
1218945c08eSOleksandr Andrushchenko  * /local/domain/1/device/vdispl/0/1/evt-event-channel = "18"
1228945c08eSOleksandr Andrushchenko  *
1238945c08eSOleksandr Andrushchenko  ******************************************************************************
1248945c08eSOleksandr Andrushchenko  *                            Backend XenBus Nodes
1258945c08eSOleksandr Andrushchenko  ******************************************************************************
1268945c08eSOleksandr Andrushchenko  *
1278945c08eSOleksandr Andrushchenko  *----------------------------- Protocol version ------------------------------
1288945c08eSOleksandr Andrushchenko  *
1298945c08eSOleksandr Andrushchenko  * versions
1308945c08eSOleksandr Andrushchenko  *      Values:         <string>
1318945c08eSOleksandr Andrushchenko  *
1328945c08eSOleksandr Andrushchenko  *      List of XENDISPL_LIST_SEPARATOR separated protocol versions supported
1338945c08eSOleksandr Andrushchenko  *      by the backend. For example "1,2,3".
1348945c08eSOleksandr Andrushchenko  *
1358945c08eSOleksandr Andrushchenko  ******************************************************************************
1368945c08eSOleksandr Andrushchenko  *                            Frontend XenBus Nodes
1378945c08eSOleksandr Andrushchenko  ******************************************************************************
1388945c08eSOleksandr Andrushchenko  *
1398945c08eSOleksandr Andrushchenko  *-------------------------------- Addressing ---------------------------------
1408945c08eSOleksandr Andrushchenko  *
1418945c08eSOleksandr Andrushchenko  * dom-id
1428945c08eSOleksandr Andrushchenko  *      Values:         <uint16_t>
1438945c08eSOleksandr Andrushchenko  *
1448945c08eSOleksandr Andrushchenko  *      Domain identifier.
1458945c08eSOleksandr Andrushchenko  *
1468945c08eSOleksandr Andrushchenko  * dev-id
1478945c08eSOleksandr Andrushchenko  *      Values:         <uint16_t>
1488945c08eSOleksandr Andrushchenko  *
1498945c08eSOleksandr Andrushchenko  *      Device identifier.
1508945c08eSOleksandr Andrushchenko  *
1518945c08eSOleksandr Andrushchenko  * conn-idx
1528945c08eSOleksandr Andrushchenko  *      Values:         <uint8_t>
1538945c08eSOleksandr Andrushchenko  *
1548945c08eSOleksandr Andrushchenko  *      Zero based contigous index of the connector.
1558945c08eSOleksandr Andrushchenko  *      /local/domain/<dom-id>/device/vdispl/<dev-id>/<conn-idx>/...
1568945c08eSOleksandr Andrushchenko  *
1578945c08eSOleksandr Andrushchenko  *----------------------------- Protocol version ------------------------------
1588945c08eSOleksandr Andrushchenko  *
1598945c08eSOleksandr Andrushchenko  * version
1608945c08eSOleksandr Andrushchenko  *      Values:         <string>
1618945c08eSOleksandr Andrushchenko  *
1628945c08eSOleksandr Andrushchenko  *      Protocol version, chosen among the ones supported by the backend.
1638945c08eSOleksandr Andrushchenko  *
1648945c08eSOleksandr Andrushchenko  *------------------------- Backend buffer allocation -------------------------
1658945c08eSOleksandr Andrushchenko  *
1668945c08eSOleksandr Andrushchenko  * be-alloc
1678945c08eSOleksandr Andrushchenko  *      Values:         "0", "1"
1688945c08eSOleksandr Andrushchenko  *
1698945c08eSOleksandr Andrushchenko  *      If value is set to "1", then backend can be a buffer provider/allocator
1708945c08eSOleksandr Andrushchenko  *      for this domain during XENDISPL_OP_DBUF_CREATE operation (see below
1718945c08eSOleksandr Andrushchenko  *      for negotiation).
1728945c08eSOleksandr Andrushchenko  *      If value is not "1" or omitted frontend must allocate buffers itself.
1738945c08eSOleksandr Andrushchenko  *
1748945c08eSOleksandr Andrushchenko  *----------------------------- Connector settings ----------------------------
1758945c08eSOleksandr Andrushchenko  *
176ce63b2c8SOleksandr Andrushchenko  * unique-id
177ce63b2c8SOleksandr Andrushchenko  *      Values:         <string>
178ce63b2c8SOleksandr Andrushchenko  *
179ce63b2c8SOleksandr Andrushchenko  *      After device instance initialization each connector is assigned a
180ce63b2c8SOleksandr Andrushchenko  *      unique ID, so it can be identified by the backend by this ID.
181ce63b2c8SOleksandr Andrushchenko  *      This can be UUID or such.
182ce63b2c8SOleksandr Andrushchenko  *
1838945c08eSOleksandr Andrushchenko  * resolution
1848945c08eSOleksandr Andrushchenko  *      Values:         <width, uint32_t>x<height, uint32_t>
1858945c08eSOleksandr Andrushchenko  *
1868945c08eSOleksandr Andrushchenko  *      Width and height of the connector in pixels separated by
1878945c08eSOleksandr Andrushchenko  *      XENDISPL_RESOLUTION_SEPARATOR. This defines visible area of the
1888945c08eSOleksandr Andrushchenko  *      display.
1896f92337bSOleksandr Andrushchenko  *      If backend provides extended display identification data (EDID) with
1906f92337bSOleksandr Andrushchenko  *      XENDISPL_OP_GET_EDID request then EDID values must take precedence
1916f92337bSOleksandr Andrushchenko  *      over the resolutions defined here.
1928945c08eSOleksandr Andrushchenko  *
1938945c08eSOleksandr Andrushchenko  *------------------ Connector Request Transport Parameters -------------------
1948945c08eSOleksandr Andrushchenko  *
1958945c08eSOleksandr Andrushchenko  * This communication path is used to deliver requests from frontend to backend
1968945c08eSOleksandr Andrushchenko  * and get the corresponding responses from backend to frontend,
1978945c08eSOleksandr Andrushchenko  * set up per connector.
1988945c08eSOleksandr Andrushchenko  *
1998945c08eSOleksandr Andrushchenko  * req-event-channel
2008945c08eSOleksandr Andrushchenko  *      Values:         <uint32_t>
2018945c08eSOleksandr Andrushchenko  *
2028945c08eSOleksandr Andrushchenko  *      The identifier of the Xen connector's control event channel
2038945c08eSOleksandr Andrushchenko  *      used to signal activity in the ring buffer.
2048945c08eSOleksandr Andrushchenko  *
2058945c08eSOleksandr Andrushchenko  * req-ring-ref
2068945c08eSOleksandr Andrushchenko  *      Values:         <uint32_t>
2078945c08eSOleksandr Andrushchenko  *
2088945c08eSOleksandr Andrushchenko  *      The Xen grant reference granting permission for the backend to map
2098945c08eSOleksandr Andrushchenko  *      a sole page of connector's control ring buffer.
2108945c08eSOleksandr Andrushchenko  *
2118945c08eSOleksandr Andrushchenko  *------------------- Connector Event Transport Parameters --------------------
2128945c08eSOleksandr Andrushchenko  *
2138945c08eSOleksandr Andrushchenko  * This communication path is used to deliver asynchronous events from backend
2148945c08eSOleksandr Andrushchenko  * to frontend, set up per connector.
2158945c08eSOleksandr Andrushchenko  *
2168945c08eSOleksandr Andrushchenko  * evt-event-channel
2178945c08eSOleksandr Andrushchenko  *      Values:         <uint32_t>
2188945c08eSOleksandr Andrushchenko  *
2198945c08eSOleksandr Andrushchenko  *      The identifier of the Xen connector's event channel
2208945c08eSOleksandr Andrushchenko  *      used to signal activity in the ring buffer.
2218945c08eSOleksandr Andrushchenko  *
2228945c08eSOleksandr Andrushchenko  * evt-ring-ref
2238945c08eSOleksandr Andrushchenko  *      Values:         <uint32_t>
2248945c08eSOleksandr Andrushchenko  *
2258945c08eSOleksandr Andrushchenko  *      The Xen grant reference granting permission for the backend to map
2268945c08eSOleksandr Andrushchenko  *      a sole page of connector's event ring buffer.
2278945c08eSOleksandr Andrushchenko  */
2288945c08eSOleksandr Andrushchenko 
2298945c08eSOleksandr Andrushchenko /*
2308945c08eSOleksandr Andrushchenko  ******************************************************************************
2318945c08eSOleksandr Andrushchenko  *                               STATE DIAGRAMS
2328945c08eSOleksandr Andrushchenko  ******************************************************************************
2338945c08eSOleksandr Andrushchenko  *
2348945c08eSOleksandr Andrushchenko  * Tool stack creates front and back state nodes with initial state
2358945c08eSOleksandr Andrushchenko  * XenbusStateInitialising.
2368945c08eSOleksandr Andrushchenko  * Tool stack creates and sets up frontend display configuration
2378945c08eSOleksandr Andrushchenko  * nodes per domain.
2388945c08eSOleksandr Andrushchenko  *
2398945c08eSOleksandr Andrushchenko  *-------------------------------- Normal flow --------------------------------
2408945c08eSOleksandr Andrushchenko  *
2418945c08eSOleksandr Andrushchenko  * Front                                Back
2428945c08eSOleksandr Andrushchenko  * =================================    =====================================
2438945c08eSOleksandr Andrushchenko  * XenbusStateInitialising              XenbusStateInitialising
2448945c08eSOleksandr Andrushchenko  *                                       o Query backend device identification
2458945c08eSOleksandr Andrushchenko  *                                         data.
2468945c08eSOleksandr Andrushchenko  *                                       o Open and validate backend device.
2478945c08eSOleksandr Andrushchenko  *                                                |
2488945c08eSOleksandr Andrushchenko  *                                                |
2498945c08eSOleksandr Andrushchenko  *                                                V
2508945c08eSOleksandr Andrushchenko  *                                      XenbusStateInitWait
2518945c08eSOleksandr Andrushchenko  *
2528945c08eSOleksandr Andrushchenko  * o Query frontend configuration
2538945c08eSOleksandr Andrushchenko  * o Allocate and initialize
2548945c08eSOleksandr Andrushchenko  *   event channels per configured
2558945c08eSOleksandr Andrushchenko  *   connector.
2568945c08eSOleksandr Andrushchenko  * o Publish transport parameters
2578945c08eSOleksandr Andrushchenko  *   that will be in effect during
2588945c08eSOleksandr Andrushchenko  *   this connection.
2598945c08eSOleksandr Andrushchenko  *              |
2608945c08eSOleksandr Andrushchenko  *              |
2618945c08eSOleksandr Andrushchenko  *              V
2628945c08eSOleksandr Andrushchenko  * XenbusStateInitialised
2638945c08eSOleksandr Andrushchenko  *
2648945c08eSOleksandr Andrushchenko  *                                       o Query frontend transport parameters.
2658945c08eSOleksandr Andrushchenko  *                                       o Connect to the event channels.
2668945c08eSOleksandr Andrushchenko  *                                                |
2678945c08eSOleksandr Andrushchenko  *                                                |
2688945c08eSOleksandr Andrushchenko  *                                                V
2698945c08eSOleksandr Andrushchenko  *                                      XenbusStateConnected
2708945c08eSOleksandr Andrushchenko  *
2718945c08eSOleksandr Andrushchenko  *  o Create and initialize OS
2728945c08eSOleksandr Andrushchenko  *    virtual display connectors
2738945c08eSOleksandr Andrushchenko  *    as per configuration.
2748945c08eSOleksandr Andrushchenko  *              |
2758945c08eSOleksandr Andrushchenko  *              |
2768945c08eSOleksandr Andrushchenko  *              V
2778945c08eSOleksandr Andrushchenko  * XenbusStateConnected
2788945c08eSOleksandr Andrushchenko  *
2798945c08eSOleksandr Andrushchenko  *                                      XenbusStateUnknown
2808945c08eSOleksandr Andrushchenko  *                                      XenbusStateClosed
2818945c08eSOleksandr Andrushchenko  *                                      XenbusStateClosing
2828945c08eSOleksandr Andrushchenko  * o Remove virtual display device
2838945c08eSOleksandr Andrushchenko  * o Remove event channels
2848945c08eSOleksandr Andrushchenko  *              |
2858945c08eSOleksandr Andrushchenko  *              |
2868945c08eSOleksandr Andrushchenko  *              V
2878945c08eSOleksandr Andrushchenko  * XenbusStateClosed
2888945c08eSOleksandr Andrushchenko  *
2898945c08eSOleksandr Andrushchenko  *------------------------------- Recovery flow -------------------------------
2908945c08eSOleksandr Andrushchenko  *
2918945c08eSOleksandr Andrushchenko  * In case of frontend unrecoverable errors backend handles that as
2928945c08eSOleksandr Andrushchenko  * if frontend goes into the XenbusStateClosed state.
2938945c08eSOleksandr Andrushchenko  *
2948945c08eSOleksandr Andrushchenko  * In case of backend unrecoverable errors frontend tries removing
2958945c08eSOleksandr Andrushchenko  * the virtualized device. If this is possible at the moment of error,
2968945c08eSOleksandr Andrushchenko  * then frontend goes into the XenbusStateInitialising state and is ready for
2978945c08eSOleksandr Andrushchenko  * new connection with backend. If the virtualized device is still in use and
2988945c08eSOleksandr Andrushchenko  * cannot be removed, then frontend goes into the XenbusStateReconfiguring state
2998945c08eSOleksandr Andrushchenko  * until either the virtualized device is removed or backend initiates a new
3008945c08eSOleksandr Andrushchenko  * connection. On the virtualized device removal frontend goes into the
3018945c08eSOleksandr Andrushchenko  * XenbusStateInitialising state.
3028945c08eSOleksandr Andrushchenko  *
3038945c08eSOleksandr Andrushchenko  * Note on XenbusStateReconfiguring state of the frontend: if backend has
3048945c08eSOleksandr Andrushchenko  * unrecoverable errors then frontend cannot send requests to the backend
3058945c08eSOleksandr Andrushchenko  * and thus cannot provide functionality of the virtualized device anymore.
3068945c08eSOleksandr Andrushchenko  * After backend is back to normal the virtualized device may still hold some
3078945c08eSOleksandr Andrushchenko  * state: configuration in use, allocated buffers, client application state etc.
3088945c08eSOleksandr Andrushchenko  * In most cases, this will require frontend to implement complex recovery
3098945c08eSOleksandr Andrushchenko  * reconnect logic. Instead, by going into XenbusStateReconfiguring state,
3108945c08eSOleksandr Andrushchenko  * frontend will make sure no new clients of the virtualized device are
3118945c08eSOleksandr Andrushchenko  * accepted, allow existing client(s) to exit gracefully by signaling error
3128945c08eSOleksandr Andrushchenko  * state etc.
3138945c08eSOleksandr Andrushchenko  * Once all the clients are gone frontend can reinitialize the virtualized
3148945c08eSOleksandr Andrushchenko  * device and get into XenbusStateInitialising state again signaling the
3158945c08eSOleksandr Andrushchenko  * backend that a new connection can be made.
3168945c08eSOleksandr Andrushchenko  *
3178945c08eSOleksandr Andrushchenko  * There are multiple conditions possible under which frontend will go from
3188945c08eSOleksandr Andrushchenko  * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS
3198945c08eSOleksandr Andrushchenko  * specific. For example:
3208945c08eSOleksandr Andrushchenko  * 1. The underlying OS framework may provide callbacks to signal that the last
3218945c08eSOleksandr Andrushchenko  *    client of the virtualized device has gone and the device can be removed
3228945c08eSOleksandr Andrushchenko  * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue)
3238945c08eSOleksandr Andrushchenko  *    to periodically check if this is the right time to re-try removal of
3248945c08eSOleksandr Andrushchenko  *    the virtualized device.
3258945c08eSOleksandr Andrushchenko  * 3. By any other means.
3268945c08eSOleksandr Andrushchenko  *
3278945c08eSOleksandr Andrushchenko  ******************************************************************************
3288945c08eSOleksandr Andrushchenko  *                             REQUEST CODES
3298945c08eSOleksandr Andrushchenko  ******************************************************************************
3308945c08eSOleksandr Andrushchenko  * Request codes [0; 15] are reserved and must not be used
3318945c08eSOleksandr Andrushchenko  */
3328945c08eSOleksandr Andrushchenko 
3338945c08eSOleksandr Andrushchenko #define XENDISPL_OP_DBUF_CREATE		0x10
3348945c08eSOleksandr Andrushchenko #define XENDISPL_OP_DBUF_DESTROY	0x11
3358945c08eSOleksandr Andrushchenko #define XENDISPL_OP_FB_ATTACH		0x12
3368945c08eSOleksandr Andrushchenko #define XENDISPL_OP_FB_DETACH		0x13
3378945c08eSOleksandr Andrushchenko #define XENDISPL_OP_SET_CONFIG		0x14
3388945c08eSOleksandr Andrushchenko #define XENDISPL_OP_PG_FLIP		0x15
3396f92337bSOleksandr Andrushchenko /* The below command is available in protocol version 2 and above. */
3406f92337bSOleksandr Andrushchenko #define XENDISPL_OP_GET_EDID		0x16
3418945c08eSOleksandr Andrushchenko 
3428945c08eSOleksandr Andrushchenko /*
3438945c08eSOleksandr Andrushchenko  ******************************************************************************
3448945c08eSOleksandr Andrushchenko  *                                 EVENT CODES
3458945c08eSOleksandr Andrushchenko  ******************************************************************************
3468945c08eSOleksandr Andrushchenko  */
3478945c08eSOleksandr Andrushchenko #define XENDISPL_EVT_PG_FLIP		0x00
3488945c08eSOleksandr Andrushchenko 
3498945c08eSOleksandr Andrushchenko /*
3508945c08eSOleksandr Andrushchenko  ******************************************************************************
3518945c08eSOleksandr Andrushchenko  *               XENSTORE FIELD AND PATH NAME STRINGS, HELPERS
3528945c08eSOleksandr Andrushchenko  ******************************************************************************
3538945c08eSOleksandr Andrushchenko  */
3548945c08eSOleksandr Andrushchenko #define XENDISPL_DRIVER_NAME		"vdispl"
3558945c08eSOleksandr Andrushchenko 
3568945c08eSOleksandr Andrushchenko #define XENDISPL_LIST_SEPARATOR		","
3578945c08eSOleksandr Andrushchenko #define XENDISPL_RESOLUTION_SEPARATOR	"x"
3588945c08eSOleksandr Andrushchenko 
3598945c08eSOleksandr Andrushchenko #define XENDISPL_FIELD_BE_VERSIONS	"versions"
3608945c08eSOleksandr Andrushchenko #define XENDISPL_FIELD_FE_VERSION	"version"
3618945c08eSOleksandr Andrushchenko #define XENDISPL_FIELD_REQ_RING_REF	"req-ring-ref"
3628945c08eSOleksandr Andrushchenko #define XENDISPL_FIELD_REQ_CHANNEL	"req-event-channel"
3638945c08eSOleksandr Andrushchenko #define XENDISPL_FIELD_EVT_RING_REF	"evt-ring-ref"
3648945c08eSOleksandr Andrushchenko #define XENDISPL_FIELD_EVT_CHANNEL	"evt-event-channel"
3658945c08eSOleksandr Andrushchenko #define XENDISPL_FIELD_RESOLUTION	"resolution"
3668945c08eSOleksandr Andrushchenko #define XENDISPL_FIELD_BE_ALLOC		"be-alloc"
367ce63b2c8SOleksandr Andrushchenko #define XENDISPL_FIELD_UNIQUE_ID	"unique-id"
3688945c08eSOleksandr Andrushchenko 
3696f92337bSOleksandr Andrushchenko #define XENDISPL_EDID_BLOCK_SIZE	128
3706f92337bSOleksandr Andrushchenko #define XENDISPL_EDID_BLOCK_COUNT	256
3716f92337bSOleksandr Andrushchenko #define XENDISPL_EDID_MAX_SIZE		(XENDISPL_EDID_BLOCK_SIZE * XENDISPL_EDID_BLOCK_COUNT)
3726f92337bSOleksandr Andrushchenko 
3738945c08eSOleksandr Andrushchenko /*
3748945c08eSOleksandr Andrushchenko  ******************************************************************************
3758945c08eSOleksandr Andrushchenko  *                          STATUS RETURN CODES
3768945c08eSOleksandr Andrushchenko  ******************************************************************************
3778945c08eSOleksandr Andrushchenko  *
3788945c08eSOleksandr Andrushchenko  * Status return code is zero on success and -XEN_EXX on failure.
3798945c08eSOleksandr Andrushchenko  *
3808945c08eSOleksandr Andrushchenko  ******************************************************************************
3818945c08eSOleksandr Andrushchenko  *                              Assumptions
3828945c08eSOleksandr Andrushchenko  ******************************************************************************
3838945c08eSOleksandr Andrushchenko  * o usage of grant reference 0 as invalid grant reference:
3848945c08eSOleksandr Andrushchenko  *   grant reference 0 is valid, but never exposed to a PV driver,
3858945c08eSOleksandr Andrushchenko  *   because of the fact it is already in use/reserved by the PV console.
3868945c08eSOleksandr Andrushchenko  * o all references in this document to page sizes must be treated
3878945c08eSOleksandr Andrushchenko  *   as pages of size XEN_PAGE_SIZE unless otherwise noted.
3888945c08eSOleksandr Andrushchenko  *
3898945c08eSOleksandr Andrushchenko  ******************************************************************************
3908945c08eSOleksandr Andrushchenko  *       Description of the protocol between frontend and backend driver
3918945c08eSOleksandr Andrushchenko  ******************************************************************************
3928945c08eSOleksandr Andrushchenko  *
3938945c08eSOleksandr Andrushchenko  * The two halves of a Para-virtual display driver communicate with
3948945c08eSOleksandr Andrushchenko  * each other using shared pages and event channels.
3958945c08eSOleksandr Andrushchenko  * Shared page contains a ring with request/response packets.
3968945c08eSOleksandr Andrushchenko  *
3978945c08eSOleksandr Andrushchenko  * All reserved fields in the structures below must be 0.
3988945c08eSOleksandr Andrushchenko  * Display buffers's cookie of value 0 is treated as invalid.
3998945c08eSOleksandr Andrushchenko  * Framebuffer's cookie of value 0 is treated as invalid.
4008945c08eSOleksandr Andrushchenko  *
4018945c08eSOleksandr Andrushchenko  * For all request/response/event packets that use cookies:
4028945c08eSOleksandr Andrushchenko  *   dbuf_cookie - uint64_t, unique to guest domain value used by the backend
4038945c08eSOleksandr Andrushchenko  *     to map remote display buffer to its local one
4048945c08eSOleksandr Andrushchenko  *   fb_cookie - uint64_t, unique to guest domain value used by the backend
4058945c08eSOleksandr Andrushchenko  *     to map remote framebuffer to its local one
4068945c08eSOleksandr Andrushchenko  *
4078945c08eSOleksandr Andrushchenko  *---------------------------------- Requests ---------------------------------
4088945c08eSOleksandr Andrushchenko  *
4098945c08eSOleksandr Andrushchenko  * All requests/responses, which are not connector specific, must be sent over
4108945c08eSOleksandr Andrushchenko  * control ring of the connector which has the index value of 0:
4118945c08eSOleksandr Andrushchenko  *   /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref
4128945c08eSOleksandr Andrushchenko  *
4138945c08eSOleksandr Andrushchenko  * All request packets have the same length (64 octets)
4148945c08eSOleksandr Andrushchenko  * All request packets have common header:
4158945c08eSOleksandr Andrushchenko  *         0                1                 2               3        octet
4168945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4178945c08eSOleksandr Andrushchenko  * |               id                |    operation   |   reserved     | 4
4188945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4198945c08eSOleksandr Andrushchenko  * |                             reserved                              | 8
4208945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4218945c08eSOleksandr Andrushchenko  *   id - uint16_t, private guest value, echoed in response
4228945c08eSOleksandr Andrushchenko  *   operation - uint8_t, operation code, XENDISPL_OP_???
4238945c08eSOleksandr Andrushchenko  *
4248945c08eSOleksandr Andrushchenko  * Request dbuf creation - request creation of a display buffer.
4258945c08eSOleksandr Andrushchenko  *         0                1                 2               3        octet
4268945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4278945c08eSOleksandr Andrushchenko  * |               id                |_OP_DBUF_CREATE |   reserved     | 4
4288945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4298945c08eSOleksandr Andrushchenko  * |                             reserved                              | 8
4308945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4318945c08eSOleksandr Andrushchenko  * |                       dbuf_cookie low 32-bit                      | 12
4328945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4338945c08eSOleksandr Andrushchenko  * |                       dbuf_cookie high 32-bit                     | 16
4348945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4358945c08eSOleksandr Andrushchenko  * |                               width                               | 20
4368945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4378945c08eSOleksandr Andrushchenko  * |                               height                              | 24
4388945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4398945c08eSOleksandr Andrushchenko  * |                                bpp                                | 28
4408945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4418945c08eSOleksandr Andrushchenko  * |                             buffer_sz                             | 32
4428945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4438945c08eSOleksandr Andrushchenko  * |                               flags                               | 36
4448945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4458945c08eSOleksandr Andrushchenko  * |                           gref_directory                          | 40
4468945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4476f92337bSOleksandr Andrushchenko  * |                             data_ofs                              | 44
4486f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4496f92337bSOleksandr Andrushchenko  * |                             reserved                              | 48
4508945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4518945c08eSOleksandr Andrushchenko  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
4528945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4538945c08eSOleksandr Andrushchenko  * |                             reserved                              | 64
4548945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
4558945c08eSOleksandr Andrushchenko  *
4568945c08eSOleksandr Andrushchenko  * Must be sent over control ring of the connector which has the index
4578945c08eSOleksandr Andrushchenko  * value of 0:
4588945c08eSOleksandr Andrushchenko  *   /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref
4598945c08eSOleksandr Andrushchenko  * All unused bits in flags field must be set to 0.
4608945c08eSOleksandr Andrushchenko  *
4618945c08eSOleksandr Andrushchenko  * An attempt to create multiple display buffers with the same dbuf_cookie is
4628945c08eSOleksandr Andrushchenko  * an error. dbuf_cookie can be re-used after destroying the corresponding
4638945c08eSOleksandr Andrushchenko  * display buffer.
4648945c08eSOleksandr Andrushchenko  *
4658945c08eSOleksandr Andrushchenko  * Width and height of the display buffers can be smaller, equal or bigger
4668945c08eSOleksandr Andrushchenko  * than the connector's resolution. Depth/pixel format of the individual
4678945c08eSOleksandr Andrushchenko  * buffers can differ as well.
4688945c08eSOleksandr Andrushchenko  *
4698945c08eSOleksandr Andrushchenko  * width - uint32_t, width in pixels
4708945c08eSOleksandr Andrushchenko  * height - uint32_t, height in pixels
4718945c08eSOleksandr Andrushchenko  * bpp - uint32_t, bits per pixel
4728945c08eSOleksandr Andrushchenko  * buffer_sz - uint32_t, buffer size to be allocated, octets
4738945c08eSOleksandr Andrushchenko  * flags - uint32_t, flags of the operation
4748945c08eSOleksandr Andrushchenko  *   o XENDISPL_DBUF_FLG_REQ_ALLOC - if set, then backend is requested
4758945c08eSOleksandr Andrushchenko  *     to allocate the buffer with the parameters provided in this request.
4768945c08eSOleksandr Andrushchenko  *     Page directory is handled as follows:
4778945c08eSOleksandr Andrushchenko  *       Frontend on request:
4788945c08eSOleksandr Andrushchenko  *         o allocates pages for the directory (gref_directory,
4798945c08eSOleksandr Andrushchenko  *           gref_dir_next_page(s)
4808945c08eSOleksandr Andrushchenko  *         o grants permissions for the pages of the directory to the backend
4818945c08eSOleksandr Andrushchenko  *         o sets gref_dir_next_page fields
4828945c08eSOleksandr Andrushchenko  *       Backend on response:
4838945c08eSOleksandr Andrushchenko  *         o grants permissions for the pages of the buffer allocated to
4848945c08eSOleksandr Andrushchenko  *           the frontend
4858945c08eSOleksandr Andrushchenko  *         o fills in page directory with grant references
4868945c08eSOleksandr Andrushchenko  *           (gref[] in struct xendispl_page_directory)
4878945c08eSOleksandr Andrushchenko  * gref_directory - grant_ref_t, a reference to the first shared page
4888945c08eSOleksandr Andrushchenko  *   describing shared buffer references. At least one page exists. If shared
4898945c08eSOleksandr Andrushchenko  *   buffer size (buffer_sz) exceeds what can be addressed by this single page,
4908945c08eSOleksandr Andrushchenko  *   then reference to the next page must be supplied (see gref_dir_next_page
4918945c08eSOleksandr Andrushchenko  *   below)
4926f92337bSOleksandr Andrushchenko  * data_ofs - uint32_t, offset of the data in the buffer, octets
4938945c08eSOleksandr Andrushchenko  */
4948945c08eSOleksandr Andrushchenko 
4958945c08eSOleksandr Andrushchenko #define XENDISPL_DBUF_FLG_REQ_ALLOC	(1 << 0)
4968945c08eSOleksandr Andrushchenko 
4978945c08eSOleksandr Andrushchenko struct xendispl_dbuf_create_req {
4988945c08eSOleksandr Andrushchenko 	uint64_t dbuf_cookie;
4998945c08eSOleksandr Andrushchenko 	uint32_t width;
5008945c08eSOleksandr Andrushchenko 	uint32_t height;
5018945c08eSOleksandr Andrushchenko 	uint32_t bpp;
5028945c08eSOleksandr Andrushchenko 	uint32_t buffer_sz;
5038945c08eSOleksandr Andrushchenko 	uint32_t flags;
5048945c08eSOleksandr Andrushchenko 	grant_ref_t gref_directory;
5056f92337bSOleksandr Andrushchenko 	uint32_t data_ofs;
5068945c08eSOleksandr Andrushchenko };
5078945c08eSOleksandr Andrushchenko 
5088945c08eSOleksandr Andrushchenko /*
5098945c08eSOleksandr Andrushchenko  * Shared page for XENDISPL_OP_DBUF_CREATE buffer descriptor (gref_directory in
5108945c08eSOleksandr Andrushchenko  * the request) employs a list of pages, describing all pages of the shared
5118945c08eSOleksandr Andrushchenko  * data buffer:
5128945c08eSOleksandr Andrushchenko  *         0                1                 2               3        octet
5138945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5148945c08eSOleksandr Andrushchenko  * |                        gref_dir_next_page                         | 4
5158945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5168945c08eSOleksandr Andrushchenko  * |                              gref[0]                              | 8
5178945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5188945c08eSOleksandr Andrushchenko  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
5198945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5208945c08eSOleksandr Andrushchenko  * |                              gref[i]                              | i*4+8
5218945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5228945c08eSOleksandr Andrushchenko  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
5238945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5248945c08eSOleksandr Andrushchenko  * |                             gref[N - 1]                           | N*4+8
5258945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5268945c08eSOleksandr Andrushchenko  *
5278945c08eSOleksandr Andrushchenko  * gref_dir_next_page - grant_ref_t, reference to the next page describing
5288945c08eSOleksandr Andrushchenko  *   page directory. Must be 0 if there are no more pages in the list.
5298945c08eSOleksandr Andrushchenko  * gref[i] - grant_ref_t, reference to a shared page of the buffer
5308945c08eSOleksandr Andrushchenko  *   allocated at XENDISPL_OP_DBUF_CREATE
5318945c08eSOleksandr Andrushchenko  *
5328945c08eSOleksandr Andrushchenko  * Number of grant_ref_t entries in the whole page directory is not
5338945c08eSOleksandr Andrushchenko  * passed, but instead can be calculated as:
5348945c08eSOleksandr Andrushchenko  *   num_grefs_total = (XENDISPL_OP_DBUF_CREATE.buffer_sz + XEN_PAGE_SIZE - 1) /
5358945c08eSOleksandr Andrushchenko  *       XEN_PAGE_SIZE
5368945c08eSOleksandr Andrushchenko  */
5378945c08eSOleksandr Andrushchenko 
5388945c08eSOleksandr Andrushchenko struct xendispl_page_directory {
5398945c08eSOleksandr Andrushchenko 	grant_ref_t gref_dir_next_page;
5408945c08eSOleksandr Andrushchenko 	grant_ref_t gref[1]; /* Variable length */
5418945c08eSOleksandr Andrushchenko };
5428945c08eSOleksandr Andrushchenko 
5438945c08eSOleksandr Andrushchenko /*
5448945c08eSOleksandr Andrushchenko  * Request dbuf destruction - destroy a previously allocated display buffer:
5458945c08eSOleksandr Andrushchenko  *         0                1                 2               3        octet
5468945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5478945c08eSOleksandr Andrushchenko  * |               id                |_OP_DBUF_DESTROY|   reserved     | 4
5488945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5498945c08eSOleksandr Andrushchenko  * |                             reserved                              | 8
5508945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5518945c08eSOleksandr Andrushchenko  * |                       dbuf_cookie low 32-bit                      | 12
5528945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5538945c08eSOleksandr Andrushchenko  * |                       dbuf_cookie high 32-bit                     | 16
5548945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5558945c08eSOleksandr Andrushchenko  * |                             reserved                              | 20
5568945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5578945c08eSOleksandr Andrushchenko  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
5588945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5598945c08eSOleksandr Andrushchenko  * |                             reserved                              | 64
5608945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5618945c08eSOleksandr Andrushchenko  *
5628945c08eSOleksandr Andrushchenko  * Must be sent over control ring of the connector which has the index
5638945c08eSOleksandr Andrushchenko  * value of 0:
5648945c08eSOleksandr Andrushchenko  *   /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref
5658945c08eSOleksandr Andrushchenko  */
5668945c08eSOleksandr Andrushchenko 
5678945c08eSOleksandr Andrushchenko struct xendispl_dbuf_destroy_req {
5688945c08eSOleksandr Andrushchenko 	uint64_t dbuf_cookie;
5698945c08eSOleksandr Andrushchenko };
5708945c08eSOleksandr Andrushchenko 
5718945c08eSOleksandr Andrushchenko /*
5728945c08eSOleksandr Andrushchenko  * Request framebuffer attachment - request attachment of a framebuffer to
5738945c08eSOleksandr Andrushchenko  * previously created display buffer.
5748945c08eSOleksandr Andrushchenko  *         0                1                 2               3        octet
5758945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5768945c08eSOleksandr Andrushchenko  * |               id                | _OP_FB_ATTACH  |   reserved     | 4
5778945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5788945c08eSOleksandr Andrushchenko  * |                             reserved                              | 8
5798945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5808945c08eSOleksandr Andrushchenko  * |                       dbuf_cookie low 32-bit                      | 12
5818945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5828945c08eSOleksandr Andrushchenko  * |                       dbuf_cookie high 32-bit                     | 16
5838945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5848945c08eSOleksandr Andrushchenko  * |                        fb_cookie low 32-bit                       | 20
5858945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5868945c08eSOleksandr Andrushchenko  * |                        fb_cookie high 32-bit                      | 24
5878945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5888945c08eSOleksandr Andrushchenko  * |                               width                               | 28
5898945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5908945c08eSOleksandr Andrushchenko  * |                               height                              | 32
5918945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5928945c08eSOleksandr Andrushchenko  * |                            pixel_format                           | 36
5938945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5948945c08eSOleksandr Andrushchenko  * |                             reserved                              | 40
5958945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5968945c08eSOleksandr Andrushchenko  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
5978945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
5988945c08eSOleksandr Andrushchenko  * |                             reserved                              | 64
5998945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6008945c08eSOleksandr Andrushchenko  *
6018945c08eSOleksandr Andrushchenko  * Must be sent over control ring of the connector which has the index
6028945c08eSOleksandr Andrushchenko  * value of 0:
6038945c08eSOleksandr Andrushchenko  *   /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref
6048945c08eSOleksandr Andrushchenko  * Width and height can be smaller, equal or bigger than the connector's
6058945c08eSOleksandr Andrushchenko  * resolution.
6068945c08eSOleksandr Andrushchenko  *
6078945c08eSOleksandr Andrushchenko  * An attempt to create multiple frame buffers with the same fb_cookie is
6088945c08eSOleksandr Andrushchenko  * an error. fb_cookie can be re-used after destroying the corresponding
6098945c08eSOleksandr Andrushchenko  * frame buffer.
6108945c08eSOleksandr Andrushchenko  *
6118945c08eSOleksandr Andrushchenko  * width - uint32_t, width in pixels
6128945c08eSOleksandr Andrushchenko  * height - uint32_t, height in pixels
6138945c08eSOleksandr Andrushchenko  * pixel_format - uint32_t, pixel format of the framebuffer, FOURCC code
6148945c08eSOleksandr Andrushchenko  */
6158945c08eSOleksandr Andrushchenko 
6168945c08eSOleksandr Andrushchenko struct xendispl_fb_attach_req {
6178945c08eSOleksandr Andrushchenko 	uint64_t dbuf_cookie;
6188945c08eSOleksandr Andrushchenko 	uint64_t fb_cookie;
6198945c08eSOleksandr Andrushchenko 	uint32_t width;
6208945c08eSOleksandr Andrushchenko 	uint32_t height;
6218945c08eSOleksandr Andrushchenko 	uint32_t pixel_format;
6228945c08eSOleksandr Andrushchenko };
6238945c08eSOleksandr Andrushchenko 
6248945c08eSOleksandr Andrushchenko /*
6258945c08eSOleksandr Andrushchenko  * Request framebuffer detach - detach a previously
6268945c08eSOleksandr Andrushchenko  * attached framebuffer from the display buffer in request:
6278945c08eSOleksandr Andrushchenko  *         0                1                 2               3        octet
6288945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6298945c08eSOleksandr Andrushchenko  * |               id                |  _OP_FB_DETACH |   reserved     | 4
6308945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6318945c08eSOleksandr Andrushchenko  * |                             reserved                              | 8
6328945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6338945c08eSOleksandr Andrushchenko  * |                        fb_cookie low 32-bit                       | 12
6348945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6358945c08eSOleksandr Andrushchenko  * |                        fb_cookie high 32-bit                      | 16
6368945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6378945c08eSOleksandr Andrushchenko  * |                             reserved                              | 20
6388945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6398945c08eSOleksandr Andrushchenko  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
6408945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6418945c08eSOleksandr Andrushchenko  * |                             reserved                              | 64
6428945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6438945c08eSOleksandr Andrushchenko  *
6448945c08eSOleksandr Andrushchenko  * Must be sent over control ring of the connector which has the index
6458945c08eSOleksandr Andrushchenko  * value of 0:
6468945c08eSOleksandr Andrushchenko  *   /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref
6478945c08eSOleksandr Andrushchenko  */
6488945c08eSOleksandr Andrushchenko 
6498945c08eSOleksandr Andrushchenko struct xendispl_fb_detach_req {
6508945c08eSOleksandr Andrushchenko 	uint64_t fb_cookie;
6518945c08eSOleksandr Andrushchenko };
6528945c08eSOleksandr Andrushchenko 
6538945c08eSOleksandr Andrushchenko /*
6548945c08eSOleksandr Andrushchenko  * Request configuration set/reset - request to set or reset
6558945c08eSOleksandr Andrushchenko  * the configuration/mode of the display:
6568945c08eSOleksandr Andrushchenko  *         0                1                 2               3        octet
6578945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6588945c08eSOleksandr Andrushchenko  * |               id                | _OP_SET_CONFIG |   reserved     | 4
6598945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6608945c08eSOleksandr Andrushchenko  * |                             reserved                              | 8
6618945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6628945c08eSOleksandr Andrushchenko  * |                        fb_cookie low 32-bit                       | 12
6638945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6648945c08eSOleksandr Andrushchenko  * |                        fb_cookie high 32-bit                      | 16
6658945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6668945c08eSOleksandr Andrushchenko  * |                                 x                                 | 20
6678945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6688945c08eSOleksandr Andrushchenko  * |                                 y                                 | 24
6698945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6708945c08eSOleksandr Andrushchenko  * |                               width                               | 28
6718945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6728945c08eSOleksandr Andrushchenko  * |                               height                              | 32
6738945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6748945c08eSOleksandr Andrushchenko  * |                                bpp                                | 40
6758945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6768945c08eSOleksandr Andrushchenko  * |                             reserved                              | 44
6778945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6788945c08eSOleksandr Andrushchenko  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
6798945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6808945c08eSOleksandr Andrushchenko  * |                             reserved                              | 64
6818945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
6828945c08eSOleksandr Andrushchenko  *
6838945c08eSOleksandr Andrushchenko  * Pass all zeros to reset, otherwise command is treated as
6848945c08eSOleksandr Andrushchenko  * configuration set.
6858945c08eSOleksandr Andrushchenko  * Framebuffer's cookie defines which framebuffer/dbuf must be
6868945c08eSOleksandr Andrushchenko  * displayed while enabling display (applying configuration).
6878945c08eSOleksandr Andrushchenko  * x, y, width and height are bound by the connector's resolution and must not
6888945c08eSOleksandr Andrushchenko  * exceed it.
6898945c08eSOleksandr Andrushchenko  *
6908945c08eSOleksandr Andrushchenko  * x - uint32_t, starting position in pixels by X axis
6918945c08eSOleksandr Andrushchenko  * y - uint32_t, starting position in pixels by Y axis
6928945c08eSOleksandr Andrushchenko  * width - uint32_t, width in pixels
6938945c08eSOleksandr Andrushchenko  * height - uint32_t, height in pixels
6948945c08eSOleksandr Andrushchenko  * bpp - uint32_t, bits per pixel
6958945c08eSOleksandr Andrushchenko  */
6968945c08eSOleksandr Andrushchenko 
6978945c08eSOleksandr Andrushchenko struct xendispl_set_config_req {
6988945c08eSOleksandr Andrushchenko 	uint64_t fb_cookie;
6998945c08eSOleksandr Andrushchenko 	uint32_t x;
7008945c08eSOleksandr Andrushchenko 	uint32_t y;
7018945c08eSOleksandr Andrushchenko 	uint32_t width;
7028945c08eSOleksandr Andrushchenko 	uint32_t height;
7038945c08eSOleksandr Andrushchenko 	uint32_t bpp;
7048945c08eSOleksandr Andrushchenko };
7058945c08eSOleksandr Andrushchenko 
7068945c08eSOleksandr Andrushchenko /*
7078945c08eSOleksandr Andrushchenko  * Request page flip - request to flip a page identified by the framebuffer
7088945c08eSOleksandr Andrushchenko  * cookie:
7098945c08eSOleksandr Andrushchenko  *         0                1                 2               3        octet
7108945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7118945c08eSOleksandr Andrushchenko  * |               id                | _OP_PG_FLIP    |   reserved     | 4
7128945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7138945c08eSOleksandr Andrushchenko  * |                             reserved                              | 8
7148945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7158945c08eSOleksandr Andrushchenko  * |                        fb_cookie low 32-bit                       | 12
7168945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7178945c08eSOleksandr Andrushchenko  * |                        fb_cookie high 32-bit                      | 16
7188945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7198945c08eSOleksandr Andrushchenko  * |                             reserved                              | 20
7208945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7218945c08eSOleksandr Andrushchenko  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
7228945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7238945c08eSOleksandr Andrushchenko  * |                             reserved                              | 64
7248945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7258945c08eSOleksandr Andrushchenko  */
7268945c08eSOleksandr Andrushchenko 
7278945c08eSOleksandr Andrushchenko struct xendispl_page_flip_req {
7288945c08eSOleksandr Andrushchenko 	uint64_t fb_cookie;
7298945c08eSOleksandr Andrushchenko };
7308945c08eSOleksandr Andrushchenko 
7318945c08eSOleksandr Andrushchenko /*
7326f92337bSOleksandr Andrushchenko  * Request EDID - request EDID describing current connector:
7336f92337bSOleksandr Andrushchenko  *         0                1                 2               3        octet
7346f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7356f92337bSOleksandr Andrushchenko  * |               id                | _OP_GET_EDID   |   reserved     | 4
7366f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7376f92337bSOleksandr Andrushchenko  * |                             buffer_sz                             | 8
7386f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7396f92337bSOleksandr Andrushchenko  * |                          gref_directory                           | 12
7406f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7416f92337bSOleksandr Andrushchenko  * |                             reserved                              | 16
7426f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7436f92337bSOleksandr Andrushchenko  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
7446f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7456f92337bSOleksandr Andrushchenko  * |                             reserved                              | 64
7466f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7476f92337bSOleksandr Andrushchenko  *
7486f92337bSOleksandr Andrushchenko  * Notes:
7496f92337bSOleksandr Andrushchenko  *   - This command is not available in protocol version 1 and should be
7506f92337bSOleksandr Andrushchenko  *     ignored.
7516f92337bSOleksandr Andrushchenko  *   - This request is optional and if not supported then visible area
7526f92337bSOleksandr Andrushchenko  *     is defined by the relevant XenStore's "resolution" property.
7536f92337bSOleksandr Andrushchenko  *   - Shared buffer, allocated for EDID storage, must not be less then
7546f92337bSOleksandr Andrushchenko  *     XENDISPL_EDID_MAX_SIZE octets.
7556f92337bSOleksandr Andrushchenko  *
7566f92337bSOleksandr Andrushchenko  * buffer_sz - uint32_t, buffer size to be allocated, octets
7576f92337bSOleksandr Andrushchenko  * gref_directory - grant_ref_t, a reference to the first shared page
7586f92337bSOleksandr Andrushchenko  *   describing EDID buffer references. See XENDISPL_OP_DBUF_CREATE for
7596f92337bSOleksandr Andrushchenko  *   grant page directory structure (struct xendispl_page_directory).
7606f92337bSOleksandr Andrushchenko  *
7616f92337bSOleksandr Andrushchenko  * See response format for this request.
7626f92337bSOleksandr Andrushchenko  */
7636f92337bSOleksandr Andrushchenko 
7646f92337bSOleksandr Andrushchenko struct xendispl_get_edid_req {
7656f92337bSOleksandr Andrushchenko 	uint32_t buffer_sz;
7666f92337bSOleksandr Andrushchenko 	grant_ref_t gref_directory;
7676f92337bSOleksandr Andrushchenko };
7686f92337bSOleksandr Andrushchenko 
7696f92337bSOleksandr Andrushchenko /*
7708945c08eSOleksandr Andrushchenko  *---------------------------------- Responses --------------------------------
7718945c08eSOleksandr Andrushchenko  *
7728945c08eSOleksandr Andrushchenko  * All response packets have the same length (64 octets)
7738945c08eSOleksandr Andrushchenko  *
7748945c08eSOleksandr Andrushchenko  * All response packets have common header:
7758945c08eSOleksandr Andrushchenko  *         0                1                 2               3        octet
7768945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7778945c08eSOleksandr Andrushchenko  * |               id                |            reserved             | 4
7788945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7798945c08eSOleksandr Andrushchenko  * |                              status                               | 8
7808945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7818945c08eSOleksandr Andrushchenko  * |                             reserved                              | 12
7828945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7838945c08eSOleksandr Andrushchenko  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
7848945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7858945c08eSOleksandr Andrushchenko  * |                             reserved                              | 64
7868945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7878945c08eSOleksandr Andrushchenko  *
7888945c08eSOleksandr Andrushchenko  * id - uint16_t, private guest value, echoed from request
7898945c08eSOleksandr Andrushchenko  * status - int32_t, response status, zero on success and -XEN_EXX on failure
7908945c08eSOleksandr Andrushchenko  *
7916f92337bSOleksandr Andrushchenko  *
7926f92337bSOleksandr Andrushchenko  * Get EDID response - response for XENDISPL_OP_GET_EDID:
7936f92337bSOleksandr Andrushchenko  *         0                1                 2               3        octet
7946f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7956f92337bSOleksandr Andrushchenko  * |               id                |    operation   |    reserved    | 4
7966f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7976f92337bSOleksandr Andrushchenko  * |                              status                               | 8
7986f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
7996f92337bSOleksandr Andrushchenko  * |                             edid_sz                               | 12
8006f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8016f92337bSOleksandr Andrushchenko  * |                             reserved                              | 16
8026f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8036f92337bSOleksandr Andrushchenko  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
8046f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8056f92337bSOleksandr Andrushchenko  * |                             reserved                              | 64
8066f92337bSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8076f92337bSOleksandr Andrushchenko  *
8086f92337bSOleksandr Andrushchenko  * Notes:
8096f92337bSOleksandr Andrushchenko  *   - This response is not available in protocol version 1 and should be
8106f92337bSOleksandr Andrushchenko  *     ignored.
8116f92337bSOleksandr Andrushchenko  *
8126f92337bSOleksandr Andrushchenko  * edid_sz - uint32_t, size of the EDID, octets
8136f92337bSOleksandr Andrushchenko  */
8146f92337bSOleksandr Andrushchenko 
8156f92337bSOleksandr Andrushchenko struct xendispl_get_edid_resp {
8166f92337bSOleksandr Andrushchenko 	uint32_t edid_sz;
8176f92337bSOleksandr Andrushchenko };
8186f92337bSOleksandr Andrushchenko 
8196f92337bSOleksandr Andrushchenko /*
8208945c08eSOleksandr Andrushchenko  *----------------------------------- Events ----------------------------------
8218945c08eSOleksandr Andrushchenko  *
8228945c08eSOleksandr Andrushchenko  * Events are sent via a shared page allocated by the front and propagated by
8238945c08eSOleksandr Andrushchenko  *   evt-event-channel/evt-ring-ref XenStore entries
8248945c08eSOleksandr Andrushchenko  * All event packets have the same length (64 octets)
8258945c08eSOleksandr Andrushchenko  * All event packets have common header:
8268945c08eSOleksandr Andrushchenko  *         0                1                 2               3        octet
8278945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8288945c08eSOleksandr Andrushchenko  * |               id                |      type      |   reserved     | 4
8298945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8308945c08eSOleksandr Andrushchenko  * |                             reserved                              | 8
8318945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8328945c08eSOleksandr Andrushchenko  *
8338945c08eSOleksandr Andrushchenko  * id - uint16_t, event id, may be used by front
8348945c08eSOleksandr Andrushchenko  * type - uint8_t, type of the event
8358945c08eSOleksandr Andrushchenko  *
8368945c08eSOleksandr Andrushchenko  *
8378945c08eSOleksandr Andrushchenko  * Page flip complete event - event from back to front on page flip completed:
8388945c08eSOleksandr Andrushchenko  *         0                1                 2               3        octet
8398945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8408945c08eSOleksandr Andrushchenko  * |               id                |   _EVT_PG_FLIP |   reserved     | 4
8418945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8428945c08eSOleksandr Andrushchenko  * |                             reserved                              | 8
8438945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8448945c08eSOleksandr Andrushchenko  * |                        fb_cookie low 32-bit                       | 12
8458945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8468945c08eSOleksandr Andrushchenko  * |                        fb_cookie high 32-bit                      | 16
8478945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8488945c08eSOleksandr Andrushchenko  * |                             reserved                              | 20
8498945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8508945c08eSOleksandr Andrushchenko  * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
8518945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8528945c08eSOleksandr Andrushchenko  * |                             reserved                              | 64
8538945c08eSOleksandr Andrushchenko  * +----------------+----------------+----------------+----------------+
8548945c08eSOleksandr Andrushchenko  */
8558945c08eSOleksandr Andrushchenko 
8568945c08eSOleksandr Andrushchenko struct xendispl_pg_flip_evt {
8578945c08eSOleksandr Andrushchenko 	uint64_t fb_cookie;
8588945c08eSOleksandr Andrushchenko };
8598945c08eSOleksandr Andrushchenko 
8608945c08eSOleksandr Andrushchenko struct xendispl_req {
8618945c08eSOleksandr Andrushchenko 	uint16_t id;
8628945c08eSOleksandr Andrushchenko 	uint8_t operation;
8638945c08eSOleksandr Andrushchenko 	uint8_t reserved[5];
8648945c08eSOleksandr Andrushchenko 	union {
8658945c08eSOleksandr Andrushchenko 		struct xendispl_dbuf_create_req dbuf_create;
8668945c08eSOleksandr Andrushchenko 		struct xendispl_dbuf_destroy_req dbuf_destroy;
8678945c08eSOleksandr Andrushchenko 		struct xendispl_fb_attach_req fb_attach;
8688945c08eSOleksandr Andrushchenko 		struct xendispl_fb_detach_req fb_detach;
8698945c08eSOleksandr Andrushchenko 		struct xendispl_set_config_req set_config;
8708945c08eSOleksandr Andrushchenko 		struct xendispl_page_flip_req pg_flip;
8716f92337bSOleksandr Andrushchenko 		struct xendispl_get_edid_req get_edid;
8728945c08eSOleksandr Andrushchenko 		uint8_t reserved[56];
8738945c08eSOleksandr Andrushchenko 	} op;
8748945c08eSOleksandr Andrushchenko };
8758945c08eSOleksandr Andrushchenko 
8768945c08eSOleksandr Andrushchenko struct xendispl_resp {
8778945c08eSOleksandr Andrushchenko 	uint16_t id;
8788945c08eSOleksandr Andrushchenko 	uint8_t operation;
8798945c08eSOleksandr Andrushchenko 	uint8_t reserved;
8808945c08eSOleksandr Andrushchenko 	int32_t status;
8816f92337bSOleksandr Andrushchenko 	union {
8826f92337bSOleksandr Andrushchenko 		struct xendispl_get_edid_resp get_edid;
8838945c08eSOleksandr Andrushchenko 		uint8_t reserved1[56];
8846f92337bSOleksandr Andrushchenko 	} op;
8858945c08eSOleksandr Andrushchenko };
8868945c08eSOleksandr Andrushchenko 
8878945c08eSOleksandr Andrushchenko struct xendispl_evt {
8888945c08eSOleksandr Andrushchenko 	uint16_t id;
8898945c08eSOleksandr Andrushchenko 	uint8_t type;
8908945c08eSOleksandr Andrushchenko 	uint8_t reserved[5];
8918945c08eSOleksandr Andrushchenko 	union {
8928945c08eSOleksandr Andrushchenko 		struct xendispl_pg_flip_evt pg_flip;
8938945c08eSOleksandr Andrushchenko 		uint8_t reserved[56];
8948945c08eSOleksandr Andrushchenko 	} op;
8958945c08eSOleksandr Andrushchenko };
8968945c08eSOleksandr Andrushchenko 
8978945c08eSOleksandr Andrushchenko DEFINE_RING_TYPES(xen_displif, struct xendispl_req, struct xendispl_resp);
8988945c08eSOleksandr Andrushchenko 
8998945c08eSOleksandr Andrushchenko /*
9008945c08eSOleksandr Andrushchenko  ******************************************************************************
9018945c08eSOleksandr Andrushchenko  *                        Back to front events delivery
9028945c08eSOleksandr Andrushchenko  ******************************************************************************
9038945c08eSOleksandr Andrushchenko  * In order to deliver asynchronous events from back to front a shared page is
9048945c08eSOleksandr Andrushchenko  * allocated by front and its granted reference propagated to back via
9058945c08eSOleksandr Andrushchenko  * XenStore entries (evt-ring-ref/evt-event-channel).
9068945c08eSOleksandr Andrushchenko  * This page has a common header used by both front and back to synchronize
9078945c08eSOleksandr Andrushchenko  * access and control event's ring buffer, while back being a producer of the
9088945c08eSOleksandr Andrushchenko  * events and front being a consumer. The rest of the page after the header
9098945c08eSOleksandr Andrushchenko  * is used for event packets.
9108945c08eSOleksandr Andrushchenko  *
9118945c08eSOleksandr Andrushchenko  * Upon reception of an event(s) front may confirm its reception
9128945c08eSOleksandr Andrushchenko  * for either each event, group of events or none.
9138945c08eSOleksandr Andrushchenko  */
9148945c08eSOleksandr Andrushchenko 
9158945c08eSOleksandr Andrushchenko struct xendispl_event_page {
9168945c08eSOleksandr Andrushchenko 	uint32_t in_cons;
9178945c08eSOleksandr Andrushchenko 	uint32_t in_prod;
9188945c08eSOleksandr Andrushchenko 	uint8_t reserved[56];
9198945c08eSOleksandr Andrushchenko };
9208945c08eSOleksandr Andrushchenko 
9218945c08eSOleksandr Andrushchenko #define XENDISPL_EVENT_PAGE_SIZE XEN_PAGE_SIZE
9228945c08eSOleksandr Andrushchenko #define XENDISPL_IN_RING_OFFS (sizeof(struct xendispl_event_page))
9238945c08eSOleksandr Andrushchenko #define XENDISPL_IN_RING_SIZE (XENDISPL_EVENT_PAGE_SIZE - XENDISPL_IN_RING_OFFS)
9248945c08eSOleksandr Andrushchenko #define XENDISPL_IN_RING_LEN (XENDISPL_IN_RING_SIZE / sizeof(struct xendispl_evt))
9258945c08eSOleksandr Andrushchenko #define XENDISPL_IN_RING(page) \
9268945c08eSOleksandr Andrushchenko 	((struct xendispl_evt *)((char *)(page) + XENDISPL_IN_RING_OFFS))
9278945c08eSOleksandr Andrushchenko #define XENDISPL_IN_RING_REF(page, idx) \
9288945c08eSOleksandr Andrushchenko 	(XENDISPL_IN_RING((page))[(idx) % XENDISPL_IN_RING_LEN])
9298945c08eSOleksandr Andrushchenko 
9308945c08eSOleksandr Andrushchenko #endif /* __XEN_PUBLIC_IO_DISPLIF_H__ */
931