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