162306a36Sopenharmony_ci/* SPDX-License-Identifier: MIT */ 262306a36Sopenharmony_ci/****************************************************************************** 362306a36Sopenharmony_ci * displif.h 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Unified display device I/O interface for Xen guest OSes. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright (C) 2016-2017 EPAM Systems Inc. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * Authors: Oleksandr Andrushchenko <oleksandr_andrushchenko@epam.com> 1062306a36Sopenharmony_ci * Oleksandr Grytsov <oleksandr_grytsov@epam.com> 1162306a36Sopenharmony_ci */ 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci#ifndef __XEN_PUBLIC_IO_DISPLIF_H__ 1462306a36Sopenharmony_ci#define __XEN_PUBLIC_IO_DISPLIF_H__ 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include "ring.h" 1762306a36Sopenharmony_ci#include "../grant_table.h" 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_ci/* 2062306a36Sopenharmony_ci ****************************************************************************** 2162306a36Sopenharmony_ci * Protocol version 2262306a36Sopenharmony_ci ****************************************************************************** 2362306a36Sopenharmony_ci */ 2462306a36Sopenharmony_ci#define XENDISPL_PROTOCOL_VERSION "2" 2562306a36Sopenharmony_ci#define XENDISPL_PROTOCOL_VERSION_INT 2 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci/* 2862306a36Sopenharmony_ci ****************************************************************************** 2962306a36Sopenharmony_ci * Main features provided by the protocol 3062306a36Sopenharmony_ci ****************************************************************************** 3162306a36Sopenharmony_ci * This protocol aims to provide a unified protocol which fits more 3262306a36Sopenharmony_ci * sophisticated use-cases than a framebuffer device can handle. At the 3362306a36Sopenharmony_ci * moment basic functionality is supported with the intention to be extended: 3462306a36Sopenharmony_ci * o multiple dynamically allocated/destroyed framebuffers 3562306a36Sopenharmony_ci * o buffers of arbitrary sizes 3662306a36Sopenharmony_ci * o buffer allocation at either back or front end 3762306a36Sopenharmony_ci * o better configuration options including multiple display support 3862306a36Sopenharmony_ci * 3962306a36Sopenharmony_ci * Note: existing fbif can be used together with displif running at the 4062306a36Sopenharmony_ci * same time, e.g. on Linux one provides framebuffer and another DRM/KMS 4162306a36Sopenharmony_ci * 4262306a36Sopenharmony_ci * Note: display resolution (XenStore's "resolution" property) defines 4362306a36Sopenharmony_ci * visible area of the virtual display. At the same time resolution of 4462306a36Sopenharmony_ci * the display and frame buffers may differ: buffers can be smaller, equal 4562306a36Sopenharmony_ci * or bigger than the visible area. This is to enable use-cases, where backend 4662306a36Sopenharmony_ci * may do some post-processing of the display and frame buffers supplied, 4762306a36Sopenharmony_ci * e.g. those buffers can be just a part of the final composition. 4862306a36Sopenharmony_ci * 4962306a36Sopenharmony_ci ****************************************************************************** 5062306a36Sopenharmony_ci * Direction of improvements 5162306a36Sopenharmony_ci ****************************************************************************** 5262306a36Sopenharmony_ci * Future extensions to the existing protocol may include: 5362306a36Sopenharmony_ci * o display/connector cloning 5462306a36Sopenharmony_ci * o allocation of objects other than display buffers 5562306a36Sopenharmony_ci * o plane/overlay support 5662306a36Sopenharmony_ci * o scaling support 5762306a36Sopenharmony_ci * o rotation support 5862306a36Sopenharmony_ci * 5962306a36Sopenharmony_ci ****************************************************************************** 6062306a36Sopenharmony_ci * Feature and Parameter Negotiation 6162306a36Sopenharmony_ci ****************************************************************************** 6262306a36Sopenharmony_ci * 6362306a36Sopenharmony_ci * Front->back notifications: when enqueuing a new request, sending a 6462306a36Sopenharmony_ci * notification can be made conditional on xendispl_req (i.e., the generic 6562306a36Sopenharmony_ci * hold-off mechanism provided by the ring macros). Backends must set 6662306a36Sopenharmony_ci * xendispl_req appropriately (e.g., using RING_FINAL_CHECK_FOR_REQUESTS()). 6762306a36Sopenharmony_ci * 6862306a36Sopenharmony_ci * Back->front notifications: when enqueuing a new response, sending a 6962306a36Sopenharmony_ci * notification can be made conditional on xendispl_resp (i.e., the generic 7062306a36Sopenharmony_ci * hold-off mechanism provided by the ring macros). Frontends must set 7162306a36Sopenharmony_ci * xendispl_resp appropriately (e.g., using RING_FINAL_CHECK_FOR_RESPONSES()). 7262306a36Sopenharmony_ci * 7362306a36Sopenharmony_ci * The two halves of a para-virtual display driver utilize nodes within 7462306a36Sopenharmony_ci * XenStore to communicate capabilities and to negotiate operating parameters. 7562306a36Sopenharmony_ci * This section enumerates these nodes which reside in the respective front and 7662306a36Sopenharmony_ci * backend portions of XenStore, following the XenBus convention. 7762306a36Sopenharmony_ci * 7862306a36Sopenharmony_ci * All data in XenStore is stored as strings. Nodes specifying numeric 7962306a36Sopenharmony_ci * values are encoded in decimal. Integer value ranges listed below are 8062306a36Sopenharmony_ci * expressed as fixed sized integer types capable of storing the conversion 8162306a36Sopenharmony_ci * of a properly formated node string, without loss of information. 8262306a36Sopenharmony_ci * 8362306a36Sopenharmony_ci ****************************************************************************** 8462306a36Sopenharmony_ci * Example configuration 8562306a36Sopenharmony_ci ****************************************************************************** 8662306a36Sopenharmony_ci * 8762306a36Sopenharmony_ci * Note: depending on the use-case backend can expose more display connectors 8862306a36Sopenharmony_ci * than the underlying HW physically has by employing SW graphics compositors 8962306a36Sopenharmony_ci * 9062306a36Sopenharmony_ci * This is an example of backend and frontend configuration: 9162306a36Sopenharmony_ci * 9262306a36Sopenharmony_ci *--------------------------------- Backend ----------------------------------- 9362306a36Sopenharmony_ci * 9462306a36Sopenharmony_ci * /local/domain/0/backend/vdispl/1/0/frontend-id = "1" 9562306a36Sopenharmony_ci * /local/domain/0/backend/vdispl/1/0/frontend = "/local/domain/1/device/vdispl/0" 9662306a36Sopenharmony_ci * /local/domain/0/backend/vdispl/1/0/state = "4" 9762306a36Sopenharmony_ci * /local/domain/0/backend/vdispl/1/0/versions = "1,2" 9862306a36Sopenharmony_ci * 9962306a36Sopenharmony_ci *--------------------------------- Frontend ---------------------------------- 10062306a36Sopenharmony_ci * 10162306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/backend-id = "0" 10262306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/backend = "/local/domain/0/backend/vdispl/1/0" 10362306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/state = "4" 10462306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/version = "1" 10562306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/be-alloc = "1" 10662306a36Sopenharmony_ci * 10762306a36Sopenharmony_ci *-------------------------- Connector 0 configuration ------------------------ 10862306a36Sopenharmony_ci * 10962306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/0/resolution = "1920x1080" 11062306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/0/req-ring-ref = "2832" 11162306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/0/req-event-channel = "15" 11262306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/0/evt-ring-ref = "387" 11362306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/0/evt-event-channel = "16" 11462306a36Sopenharmony_ci * 11562306a36Sopenharmony_ci *-------------------------- Connector 1 configuration ------------------------ 11662306a36Sopenharmony_ci * 11762306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/1/resolution = "800x600" 11862306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/1/req-ring-ref = "2833" 11962306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/1/req-event-channel = "17" 12062306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/1/evt-ring-ref = "388" 12162306a36Sopenharmony_ci * /local/domain/1/device/vdispl/0/1/evt-event-channel = "18" 12262306a36Sopenharmony_ci * 12362306a36Sopenharmony_ci ****************************************************************************** 12462306a36Sopenharmony_ci * Backend XenBus Nodes 12562306a36Sopenharmony_ci ****************************************************************************** 12662306a36Sopenharmony_ci * 12762306a36Sopenharmony_ci *----------------------------- Protocol version ------------------------------ 12862306a36Sopenharmony_ci * 12962306a36Sopenharmony_ci * versions 13062306a36Sopenharmony_ci * Values: <string> 13162306a36Sopenharmony_ci * 13262306a36Sopenharmony_ci * List of XENDISPL_LIST_SEPARATOR separated protocol versions supported 13362306a36Sopenharmony_ci * by the backend. For example "1,2,3". 13462306a36Sopenharmony_ci * 13562306a36Sopenharmony_ci ****************************************************************************** 13662306a36Sopenharmony_ci * Frontend XenBus Nodes 13762306a36Sopenharmony_ci ****************************************************************************** 13862306a36Sopenharmony_ci * 13962306a36Sopenharmony_ci *-------------------------------- Addressing --------------------------------- 14062306a36Sopenharmony_ci * 14162306a36Sopenharmony_ci * dom-id 14262306a36Sopenharmony_ci * Values: <uint16_t> 14362306a36Sopenharmony_ci * 14462306a36Sopenharmony_ci * Domain identifier. 14562306a36Sopenharmony_ci * 14662306a36Sopenharmony_ci * dev-id 14762306a36Sopenharmony_ci * Values: <uint16_t> 14862306a36Sopenharmony_ci * 14962306a36Sopenharmony_ci * Device identifier. 15062306a36Sopenharmony_ci * 15162306a36Sopenharmony_ci * conn-idx 15262306a36Sopenharmony_ci * Values: <uint8_t> 15362306a36Sopenharmony_ci * 15462306a36Sopenharmony_ci * Zero based contigous index of the connector. 15562306a36Sopenharmony_ci * /local/domain/<dom-id>/device/vdispl/<dev-id>/<conn-idx>/... 15662306a36Sopenharmony_ci * 15762306a36Sopenharmony_ci *----------------------------- Protocol version ------------------------------ 15862306a36Sopenharmony_ci * 15962306a36Sopenharmony_ci * version 16062306a36Sopenharmony_ci * Values: <string> 16162306a36Sopenharmony_ci * 16262306a36Sopenharmony_ci * Protocol version, chosen among the ones supported by the backend. 16362306a36Sopenharmony_ci * 16462306a36Sopenharmony_ci *------------------------- Backend buffer allocation ------------------------- 16562306a36Sopenharmony_ci * 16662306a36Sopenharmony_ci * be-alloc 16762306a36Sopenharmony_ci * Values: "0", "1" 16862306a36Sopenharmony_ci * 16962306a36Sopenharmony_ci * If value is set to "1", then backend can be a buffer provider/allocator 17062306a36Sopenharmony_ci * for this domain during XENDISPL_OP_DBUF_CREATE operation (see below 17162306a36Sopenharmony_ci * for negotiation). 17262306a36Sopenharmony_ci * If value is not "1" or omitted frontend must allocate buffers itself. 17362306a36Sopenharmony_ci * 17462306a36Sopenharmony_ci *----------------------------- Connector settings ---------------------------- 17562306a36Sopenharmony_ci * 17662306a36Sopenharmony_ci * unique-id 17762306a36Sopenharmony_ci * Values: <string> 17862306a36Sopenharmony_ci * 17962306a36Sopenharmony_ci * After device instance initialization each connector is assigned a 18062306a36Sopenharmony_ci * unique ID, so it can be identified by the backend by this ID. 18162306a36Sopenharmony_ci * This can be UUID or such. 18262306a36Sopenharmony_ci * 18362306a36Sopenharmony_ci * resolution 18462306a36Sopenharmony_ci * Values: <width, uint32_t>x<height, uint32_t> 18562306a36Sopenharmony_ci * 18662306a36Sopenharmony_ci * Width and height of the connector in pixels separated by 18762306a36Sopenharmony_ci * XENDISPL_RESOLUTION_SEPARATOR. This defines visible area of the 18862306a36Sopenharmony_ci * display. 18962306a36Sopenharmony_ci * If backend provides extended display identification data (EDID) with 19062306a36Sopenharmony_ci * XENDISPL_OP_GET_EDID request then EDID values must take precedence 19162306a36Sopenharmony_ci * over the resolutions defined here. 19262306a36Sopenharmony_ci * 19362306a36Sopenharmony_ci *------------------ Connector Request Transport Parameters ------------------- 19462306a36Sopenharmony_ci * 19562306a36Sopenharmony_ci * This communication path is used to deliver requests from frontend to backend 19662306a36Sopenharmony_ci * and get the corresponding responses from backend to frontend, 19762306a36Sopenharmony_ci * set up per connector. 19862306a36Sopenharmony_ci * 19962306a36Sopenharmony_ci * req-event-channel 20062306a36Sopenharmony_ci * Values: <uint32_t> 20162306a36Sopenharmony_ci * 20262306a36Sopenharmony_ci * The identifier of the Xen connector's control event channel 20362306a36Sopenharmony_ci * used to signal activity in the ring buffer. 20462306a36Sopenharmony_ci * 20562306a36Sopenharmony_ci * req-ring-ref 20662306a36Sopenharmony_ci * Values: <uint32_t> 20762306a36Sopenharmony_ci * 20862306a36Sopenharmony_ci * The Xen grant reference granting permission for the backend to map 20962306a36Sopenharmony_ci * a sole page of connector's control ring buffer. 21062306a36Sopenharmony_ci * 21162306a36Sopenharmony_ci *------------------- Connector Event Transport Parameters -------------------- 21262306a36Sopenharmony_ci * 21362306a36Sopenharmony_ci * This communication path is used to deliver asynchronous events from backend 21462306a36Sopenharmony_ci * to frontend, set up per connector. 21562306a36Sopenharmony_ci * 21662306a36Sopenharmony_ci * evt-event-channel 21762306a36Sopenharmony_ci * Values: <uint32_t> 21862306a36Sopenharmony_ci * 21962306a36Sopenharmony_ci * The identifier of the Xen connector's event channel 22062306a36Sopenharmony_ci * used to signal activity in the ring buffer. 22162306a36Sopenharmony_ci * 22262306a36Sopenharmony_ci * evt-ring-ref 22362306a36Sopenharmony_ci * Values: <uint32_t> 22462306a36Sopenharmony_ci * 22562306a36Sopenharmony_ci * The Xen grant reference granting permission for the backend to map 22662306a36Sopenharmony_ci * a sole page of connector's event ring buffer. 22762306a36Sopenharmony_ci */ 22862306a36Sopenharmony_ci 22962306a36Sopenharmony_ci/* 23062306a36Sopenharmony_ci ****************************************************************************** 23162306a36Sopenharmony_ci * STATE DIAGRAMS 23262306a36Sopenharmony_ci ****************************************************************************** 23362306a36Sopenharmony_ci * 23462306a36Sopenharmony_ci * Tool stack creates front and back state nodes with initial state 23562306a36Sopenharmony_ci * XenbusStateInitialising. 23662306a36Sopenharmony_ci * Tool stack creates and sets up frontend display configuration 23762306a36Sopenharmony_ci * nodes per domain. 23862306a36Sopenharmony_ci * 23962306a36Sopenharmony_ci *-------------------------------- Normal flow -------------------------------- 24062306a36Sopenharmony_ci * 24162306a36Sopenharmony_ci * Front Back 24262306a36Sopenharmony_ci * ================================= ===================================== 24362306a36Sopenharmony_ci * XenbusStateInitialising XenbusStateInitialising 24462306a36Sopenharmony_ci * o Query backend device identification 24562306a36Sopenharmony_ci * data. 24662306a36Sopenharmony_ci * o Open and validate backend device. 24762306a36Sopenharmony_ci * | 24862306a36Sopenharmony_ci * | 24962306a36Sopenharmony_ci * V 25062306a36Sopenharmony_ci * XenbusStateInitWait 25162306a36Sopenharmony_ci * 25262306a36Sopenharmony_ci * o Query frontend configuration 25362306a36Sopenharmony_ci * o Allocate and initialize 25462306a36Sopenharmony_ci * event channels per configured 25562306a36Sopenharmony_ci * connector. 25662306a36Sopenharmony_ci * o Publish transport parameters 25762306a36Sopenharmony_ci * that will be in effect during 25862306a36Sopenharmony_ci * this connection. 25962306a36Sopenharmony_ci * | 26062306a36Sopenharmony_ci * | 26162306a36Sopenharmony_ci * V 26262306a36Sopenharmony_ci * XenbusStateInitialised 26362306a36Sopenharmony_ci * 26462306a36Sopenharmony_ci * o Query frontend transport parameters. 26562306a36Sopenharmony_ci * o Connect to the event channels. 26662306a36Sopenharmony_ci * | 26762306a36Sopenharmony_ci * | 26862306a36Sopenharmony_ci * V 26962306a36Sopenharmony_ci * XenbusStateConnected 27062306a36Sopenharmony_ci * 27162306a36Sopenharmony_ci * o Create and initialize OS 27262306a36Sopenharmony_ci * virtual display connectors 27362306a36Sopenharmony_ci * as per configuration. 27462306a36Sopenharmony_ci * | 27562306a36Sopenharmony_ci * | 27662306a36Sopenharmony_ci * V 27762306a36Sopenharmony_ci * XenbusStateConnected 27862306a36Sopenharmony_ci * 27962306a36Sopenharmony_ci * XenbusStateUnknown 28062306a36Sopenharmony_ci * XenbusStateClosed 28162306a36Sopenharmony_ci * XenbusStateClosing 28262306a36Sopenharmony_ci * o Remove virtual display device 28362306a36Sopenharmony_ci * o Remove event channels 28462306a36Sopenharmony_ci * | 28562306a36Sopenharmony_ci * | 28662306a36Sopenharmony_ci * V 28762306a36Sopenharmony_ci * XenbusStateClosed 28862306a36Sopenharmony_ci * 28962306a36Sopenharmony_ci *------------------------------- Recovery flow ------------------------------- 29062306a36Sopenharmony_ci * 29162306a36Sopenharmony_ci * In case of frontend unrecoverable errors backend handles that as 29262306a36Sopenharmony_ci * if frontend goes into the XenbusStateClosed state. 29362306a36Sopenharmony_ci * 29462306a36Sopenharmony_ci * In case of backend unrecoverable errors frontend tries removing 29562306a36Sopenharmony_ci * the virtualized device. If this is possible at the moment of error, 29662306a36Sopenharmony_ci * then frontend goes into the XenbusStateInitialising state and is ready for 29762306a36Sopenharmony_ci * new connection with backend. If the virtualized device is still in use and 29862306a36Sopenharmony_ci * cannot be removed, then frontend goes into the XenbusStateReconfiguring state 29962306a36Sopenharmony_ci * until either the virtualized device is removed or backend initiates a new 30062306a36Sopenharmony_ci * connection. On the virtualized device removal frontend goes into the 30162306a36Sopenharmony_ci * XenbusStateInitialising state. 30262306a36Sopenharmony_ci * 30362306a36Sopenharmony_ci * Note on XenbusStateReconfiguring state of the frontend: if backend has 30462306a36Sopenharmony_ci * unrecoverable errors then frontend cannot send requests to the backend 30562306a36Sopenharmony_ci * and thus cannot provide functionality of the virtualized device anymore. 30662306a36Sopenharmony_ci * After backend is back to normal the virtualized device may still hold some 30762306a36Sopenharmony_ci * state: configuration in use, allocated buffers, client application state etc. 30862306a36Sopenharmony_ci * In most cases, this will require frontend to implement complex recovery 30962306a36Sopenharmony_ci * reconnect logic. Instead, by going into XenbusStateReconfiguring state, 31062306a36Sopenharmony_ci * frontend will make sure no new clients of the virtualized device are 31162306a36Sopenharmony_ci * accepted, allow existing client(s) to exit gracefully by signaling error 31262306a36Sopenharmony_ci * state etc. 31362306a36Sopenharmony_ci * Once all the clients are gone frontend can reinitialize the virtualized 31462306a36Sopenharmony_ci * device and get into XenbusStateInitialising state again signaling the 31562306a36Sopenharmony_ci * backend that a new connection can be made. 31662306a36Sopenharmony_ci * 31762306a36Sopenharmony_ci * There are multiple conditions possible under which frontend will go from 31862306a36Sopenharmony_ci * XenbusStateReconfiguring into XenbusStateInitialising, some of them are OS 31962306a36Sopenharmony_ci * specific. For example: 32062306a36Sopenharmony_ci * 1. The underlying OS framework may provide callbacks to signal that the last 32162306a36Sopenharmony_ci * client of the virtualized device has gone and the device can be removed 32262306a36Sopenharmony_ci * 2. Frontend can schedule a deferred work (timer/tasklet/workqueue) 32362306a36Sopenharmony_ci * to periodically check if this is the right time to re-try removal of 32462306a36Sopenharmony_ci * the virtualized device. 32562306a36Sopenharmony_ci * 3. By any other means. 32662306a36Sopenharmony_ci * 32762306a36Sopenharmony_ci ****************************************************************************** 32862306a36Sopenharmony_ci * REQUEST CODES 32962306a36Sopenharmony_ci ****************************************************************************** 33062306a36Sopenharmony_ci * Request codes [0; 15] are reserved and must not be used 33162306a36Sopenharmony_ci */ 33262306a36Sopenharmony_ci 33362306a36Sopenharmony_ci#define XENDISPL_OP_DBUF_CREATE 0x10 33462306a36Sopenharmony_ci#define XENDISPL_OP_DBUF_DESTROY 0x11 33562306a36Sopenharmony_ci#define XENDISPL_OP_FB_ATTACH 0x12 33662306a36Sopenharmony_ci#define XENDISPL_OP_FB_DETACH 0x13 33762306a36Sopenharmony_ci#define XENDISPL_OP_SET_CONFIG 0x14 33862306a36Sopenharmony_ci#define XENDISPL_OP_PG_FLIP 0x15 33962306a36Sopenharmony_ci/* The below command is available in protocol version 2 and above. */ 34062306a36Sopenharmony_ci#define XENDISPL_OP_GET_EDID 0x16 34162306a36Sopenharmony_ci 34262306a36Sopenharmony_ci/* 34362306a36Sopenharmony_ci ****************************************************************************** 34462306a36Sopenharmony_ci * EVENT CODES 34562306a36Sopenharmony_ci ****************************************************************************** 34662306a36Sopenharmony_ci */ 34762306a36Sopenharmony_ci#define XENDISPL_EVT_PG_FLIP 0x00 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_ci/* 35062306a36Sopenharmony_ci ****************************************************************************** 35162306a36Sopenharmony_ci * XENSTORE FIELD AND PATH NAME STRINGS, HELPERS 35262306a36Sopenharmony_ci ****************************************************************************** 35362306a36Sopenharmony_ci */ 35462306a36Sopenharmony_ci#define XENDISPL_DRIVER_NAME "vdispl" 35562306a36Sopenharmony_ci 35662306a36Sopenharmony_ci#define XENDISPL_LIST_SEPARATOR "," 35762306a36Sopenharmony_ci#define XENDISPL_RESOLUTION_SEPARATOR "x" 35862306a36Sopenharmony_ci 35962306a36Sopenharmony_ci#define XENDISPL_FIELD_BE_VERSIONS "versions" 36062306a36Sopenharmony_ci#define XENDISPL_FIELD_FE_VERSION "version" 36162306a36Sopenharmony_ci#define XENDISPL_FIELD_REQ_RING_REF "req-ring-ref" 36262306a36Sopenharmony_ci#define XENDISPL_FIELD_REQ_CHANNEL "req-event-channel" 36362306a36Sopenharmony_ci#define XENDISPL_FIELD_EVT_RING_REF "evt-ring-ref" 36462306a36Sopenharmony_ci#define XENDISPL_FIELD_EVT_CHANNEL "evt-event-channel" 36562306a36Sopenharmony_ci#define XENDISPL_FIELD_RESOLUTION "resolution" 36662306a36Sopenharmony_ci#define XENDISPL_FIELD_BE_ALLOC "be-alloc" 36762306a36Sopenharmony_ci#define XENDISPL_FIELD_UNIQUE_ID "unique-id" 36862306a36Sopenharmony_ci 36962306a36Sopenharmony_ci#define XENDISPL_EDID_BLOCK_SIZE 128 37062306a36Sopenharmony_ci#define XENDISPL_EDID_BLOCK_COUNT 256 37162306a36Sopenharmony_ci#define XENDISPL_EDID_MAX_SIZE (XENDISPL_EDID_BLOCK_SIZE * XENDISPL_EDID_BLOCK_COUNT) 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ci/* 37462306a36Sopenharmony_ci ****************************************************************************** 37562306a36Sopenharmony_ci * STATUS RETURN CODES 37662306a36Sopenharmony_ci ****************************************************************************** 37762306a36Sopenharmony_ci * 37862306a36Sopenharmony_ci * Status return code is zero on success and -XEN_EXX on failure. 37962306a36Sopenharmony_ci * 38062306a36Sopenharmony_ci ****************************************************************************** 38162306a36Sopenharmony_ci * Assumptions 38262306a36Sopenharmony_ci ****************************************************************************** 38362306a36Sopenharmony_ci * o usage of grant reference 0 as invalid grant reference: 38462306a36Sopenharmony_ci * grant reference 0 is valid, but never exposed to a PV driver, 38562306a36Sopenharmony_ci * because of the fact it is already in use/reserved by the PV console. 38662306a36Sopenharmony_ci * o all references in this document to page sizes must be treated 38762306a36Sopenharmony_ci * as pages of size XEN_PAGE_SIZE unless otherwise noted. 38862306a36Sopenharmony_ci * 38962306a36Sopenharmony_ci ****************************************************************************** 39062306a36Sopenharmony_ci * Description of the protocol between frontend and backend driver 39162306a36Sopenharmony_ci ****************************************************************************** 39262306a36Sopenharmony_ci * 39362306a36Sopenharmony_ci * The two halves of a Para-virtual display driver communicate with 39462306a36Sopenharmony_ci * each other using shared pages and event channels. 39562306a36Sopenharmony_ci * Shared page contains a ring with request/response packets. 39662306a36Sopenharmony_ci * 39762306a36Sopenharmony_ci * All reserved fields in the structures below must be 0. 39862306a36Sopenharmony_ci * Display buffers's cookie of value 0 is treated as invalid. 39962306a36Sopenharmony_ci * Framebuffer's cookie of value 0 is treated as invalid. 40062306a36Sopenharmony_ci * 40162306a36Sopenharmony_ci * For all request/response/event packets that use cookies: 40262306a36Sopenharmony_ci * dbuf_cookie - uint64_t, unique to guest domain value used by the backend 40362306a36Sopenharmony_ci * to map remote display buffer to its local one 40462306a36Sopenharmony_ci * fb_cookie - uint64_t, unique to guest domain value used by the backend 40562306a36Sopenharmony_ci * to map remote framebuffer to its local one 40662306a36Sopenharmony_ci * 40762306a36Sopenharmony_ci *---------------------------------- Requests --------------------------------- 40862306a36Sopenharmony_ci * 40962306a36Sopenharmony_ci * All requests/responses, which are not connector specific, must be sent over 41062306a36Sopenharmony_ci * control ring of the connector which has the index value of 0: 41162306a36Sopenharmony_ci * /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref 41262306a36Sopenharmony_ci * 41362306a36Sopenharmony_ci * All request packets have the same length (64 octets) 41462306a36Sopenharmony_ci * All request packets have common header: 41562306a36Sopenharmony_ci * 0 1 2 3 octet 41662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 41762306a36Sopenharmony_ci * | id | operation | reserved | 4 41862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 41962306a36Sopenharmony_ci * | reserved | 8 42062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 42162306a36Sopenharmony_ci * id - uint16_t, private guest value, echoed in response 42262306a36Sopenharmony_ci * operation - uint8_t, operation code, XENDISPL_OP_??? 42362306a36Sopenharmony_ci * 42462306a36Sopenharmony_ci * Request dbuf creation - request creation of a display buffer. 42562306a36Sopenharmony_ci * 0 1 2 3 octet 42662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 42762306a36Sopenharmony_ci * | id |_OP_DBUF_CREATE | reserved | 4 42862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 42962306a36Sopenharmony_ci * | reserved | 8 43062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 43162306a36Sopenharmony_ci * | dbuf_cookie low 32-bit | 12 43262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 43362306a36Sopenharmony_ci * | dbuf_cookie high 32-bit | 16 43462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 43562306a36Sopenharmony_ci * | width | 20 43662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 43762306a36Sopenharmony_ci * | height | 24 43862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 43962306a36Sopenharmony_ci * | bpp | 28 44062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 44162306a36Sopenharmony_ci * | buffer_sz | 32 44262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 44362306a36Sopenharmony_ci * | flags | 36 44462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 44562306a36Sopenharmony_ci * | gref_directory | 40 44662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 44762306a36Sopenharmony_ci * | data_ofs | 44 44862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 44962306a36Sopenharmony_ci * | reserved | 48 45062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 45162306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 45262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 45362306a36Sopenharmony_ci * | reserved | 64 45462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 45562306a36Sopenharmony_ci * 45662306a36Sopenharmony_ci * Must be sent over control ring of the connector which has the index 45762306a36Sopenharmony_ci * value of 0: 45862306a36Sopenharmony_ci * /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref 45962306a36Sopenharmony_ci * All unused bits in flags field must be set to 0. 46062306a36Sopenharmony_ci * 46162306a36Sopenharmony_ci * An attempt to create multiple display buffers with the same dbuf_cookie is 46262306a36Sopenharmony_ci * an error. dbuf_cookie can be re-used after destroying the corresponding 46362306a36Sopenharmony_ci * display buffer. 46462306a36Sopenharmony_ci * 46562306a36Sopenharmony_ci * Width and height of the display buffers can be smaller, equal or bigger 46662306a36Sopenharmony_ci * than the connector's resolution. Depth/pixel format of the individual 46762306a36Sopenharmony_ci * buffers can differ as well. 46862306a36Sopenharmony_ci * 46962306a36Sopenharmony_ci * width - uint32_t, width in pixels 47062306a36Sopenharmony_ci * height - uint32_t, height in pixels 47162306a36Sopenharmony_ci * bpp - uint32_t, bits per pixel 47262306a36Sopenharmony_ci * buffer_sz - uint32_t, buffer size to be allocated, octets 47362306a36Sopenharmony_ci * flags - uint32_t, flags of the operation 47462306a36Sopenharmony_ci * o XENDISPL_DBUF_FLG_REQ_ALLOC - if set, then backend is requested 47562306a36Sopenharmony_ci * to allocate the buffer with the parameters provided in this request. 47662306a36Sopenharmony_ci * Page directory is handled as follows: 47762306a36Sopenharmony_ci * Frontend on request: 47862306a36Sopenharmony_ci * o allocates pages for the directory (gref_directory, 47962306a36Sopenharmony_ci * gref_dir_next_page(s) 48062306a36Sopenharmony_ci * o grants permissions for the pages of the directory to the backend 48162306a36Sopenharmony_ci * o sets gref_dir_next_page fields 48262306a36Sopenharmony_ci * Backend on response: 48362306a36Sopenharmony_ci * o grants permissions for the pages of the buffer allocated to 48462306a36Sopenharmony_ci * the frontend 48562306a36Sopenharmony_ci * o fills in page directory with grant references 48662306a36Sopenharmony_ci * (gref[] in struct xendispl_page_directory) 48762306a36Sopenharmony_ci * gref_directory - grant_ref_t, a reference to the first shared page 48862306a36Sopenharmony_ci * describing shared buffer references. At least one page exists. If shared 48962306a36Sopenharmony_ci * buffer size (buffer_sz) exceeds what can be addressed by this single page, 49062306a36Sopenharmony_ci * then reference to the next page must be supplied (see gref_dir_next_page 49162306a36Sopenharmony_ci * below) 49262306a36Sopenharmony_ci * data_ofs - uint32_t, offset of the data in the buffer, octets 49362306a36Sopenharmony_ci */ 49462306a36Sopenharmony_ci 49562306a36Sopenharmony_ci#define XENDISPL_DBUF_FLG_REQ_ALLOC (1 << 0) 49662306a36Sopenharmony_ci 49762306a36Sopenharmony_cistruct xendispl_dbuf_create_req { 49862306a36Sopenharmony_ci uint64_t dbuf_cookie; 49962306a36Sopenharmony_ci uint32_t width; 50062306a36Sopenharmony_ci uint32_t height; 50162306a36Sopenharmony_ci uint32_t bpp; 50262306a36Sopenharmony_ci uint32_t buffer_sz; 50362306a36Sopenharmony_ci uint32_t flags; 50462306a36Sopenharmony_ci grant_ref_t gref_directory; 50562306a36Sopenharmony_ci uint32_t data_ofs; 50662306a36Sopenharmony_ci}; 50762306a36Sopenharmony_ci 50862306a36Sopenharmony_ci/* 50962306a36Sopenharmony_ci * Shared page for XENDISPL_OP_DBUF_CREATE buffer descriptor (gref_directory in 51062306a36Sopenharmony_ci * the request) employs a list of pages, describing all pages of the shared 51162306a36Sopenharmony_ci * data buffer: 51262306a36Sopenharmony_ci * 0 1 2 3 octet 51362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 51462306a36Sopenharmony_ci * | gref_dir_next_page | 4 51562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 51662306a36Sopenharmony_ci * | gref[0] | 8 51762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 51862306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 51962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 52062306a36Sopenharmony_ci * | gref[i] | i*4+8 52162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 52262306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 52362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 52462306a36Sopenharmony_ci * | gref[N - 1] | N*4+8 52562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 52662306a36Sopenharmony_ci * 52762306a36Sopenharmony_ci * gref_dir_next_page - grant_ref_t, reference to the next page describing 52862306a36Sopenharmony_ci * page directory. Must be 0 if there are no more pages in the list. 52962306a36Sopenharmony_ci * gref[i] - grant_ref_t, reference to a shared page of the buffer 53062306a36Sopenharmony_ci * allocated at XENDISPL_OP_DBUF_CREATE 53162306a36Sopenharmony_ci * 53262306a36Sopenharmony_ci * Number of grant_ref_t entries in the whole page directory is not 53362306a36Sopenharmony_ci * passed, but instead can be calculated as: 53462306a36Sopenharmony_ci * num_grefs_total = (XENDISPL_OP_DBUF_CREATE.buffer_sz + XEN_PAGE_SIZE - 1) / 53562306a36Sopenharmony_ci * XEN_PAGE_SIZE 53662306a36Sopenharmony_ci */ 53762306a36Sopenharmony_ci 53862306a36Sopenharmony_cistruct xendispl_page_directory { 53962306a36Sopenharmony_ci grant_ref_t gref_dir_next_page; 54062306a36Sopenharmony_ci grant_ref_t gref[1]; /* Variable length */ 54162306a36Sopenharmony_ci}; 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ci/* 54462306a36Sopenharmony_ci * Request dbuf destruction - destroy a previously allocated display buffer: 54562306a36Sopenharmony_ci * 0 1 2 3 octet 54662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 54762306a36Sopenharmony_ci * | id |_OP_DBUF_DESTROY| reserved | 4 54862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 54962306a36Sopenharmony_ci * | reserved | 8 55062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 55162306a36Sopenharmony_ci * | dbuf_cookie low 32-bit | 12 55262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 55362306a36Sopenharmony_ci * | dbuf_cookie high 32-bit | 16 55462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 55562306a36Sopenharmony_ci * | reserved | 20 55662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 55762306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 55862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 55962306a36Sopenharmony_ci * | reserved | 64 56062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 56162306a36Sopenharmony_ci * 56262306a36Sopenharmony_ci * Must be sent over control ring of the connector which has the index 56362306a36Sopenharmony_ci * value of 0: 56462306a36Sopenharmony_ci * /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref 56562306a36Sopenharmony_ci */ 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_cistruct xendispl_dbuf_destroy_req { 56862306a36Sopenharmony_ci uint64_t dbuf_cookie; 56962306a36Sopenharmony_ci}; 57062306a36Sopenharmony_ci 57162306a36Sopenharmony_ci/* 57262306a36Sopenharmony_ci * Request framebuffer attachment - request attachment of a framebuffer to 57362306a36Sopenharmony_ci * previously created display buffer. 57462306a36Sopenharmony_ci * 0 1 2 3 octet 57562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 57662306a36Sopenharmony_ci * | id | _OP_FB_ATTACH | reserved | 4 57762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 57862306a36Sopenharmony_ci * | reserved | 8 57962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 58062306a36Sopenharmony_ci * | dbuf_cookie low 32-bit | 12 58162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 58262306a36Sopenharmony_ci * | dbuf_cookie high 32-bit | 16 58362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 58462306a36Sopenharmony_ci * | fb_cookie low 32-bit | 20 58562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 58662306a36Sopenharmony_ci * | fb_cookie high 32-bit | 24 58762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 58862306a36Sopenharmony_ci * | width | 28 58962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 59062306a36Sopenharmony_ci * | height | 32 59162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 59262306a36Sopenharmony_ci * | pixel_format | 36 59362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 59462306a36Sopenharmony_ci * | reserved | 40 59562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 59662306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 59762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 59862306a36Sopenharmony_ci * | reserved | 64 59962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 60062306a36Sopenharmony_ci * 60162306a36Sopenharmony_ci * Must be sent over control ring of the connector which has the index 60262306a36Sopenharmony_ci * value of 0: 60362306a36Sopenharmony_ci * /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref 60462306a36Sopenharmony_ci * Width and height can be smaller, equal or bigger than the connector's 60562306a36Sopenharmony_ci * resolution. 60662306a36Sopenharmony_ci * 60762306a36Sopenharmony_ci * An attempt to create multiple frame buffers with the same fb_cookie is 60862306a36Sopenharmony_ci * an error. fb_cookie can be re-used after destroying the corresponding 60962306a36Sopenharmony_ci * frame buffer. 61062306a36Sopenharmony_ci * 61162306a36Sopenharmony_ci * width - uint32_t, width in pixels 61262306a36Sopenharmony_ci * height - uint32_t, height in pixels 61362306a36Sopenharmony_ci * pixel_format - uint32_t, pixel format of the framebuffer, FOURCC code 61462306a36Sopenharmony_ci */ 61562306a36Sopenharmony_ci 61662306a36Sopenharmony_cistruct xendispl_fb_attach_req { 61762306a36Sopenharmony_ci uint64_t dbuf_cookie; 61862306a36Sopenharmony_ci uint64_t fb_cookie; 61962306a36Sopenharmony_ci uint32_t width; 62062306a36Sopenharmony_ci uint32_t height; 62162306a36Sopenharmony_ci uint32_t pixel_format; 62262306a36Sopenharmony_ci}; 62362306a36Sopenharmony_ci 62462306a36Sopenharmony_ci/* 62562306a36Sopenharmony_ci * Request framebuffer detach - detach a previously 62662306a36Sopenharmony_ci * attached framebuffer from the display buffer in request: 62762306a36Sopenharmony_ci * 0 1 2 3 octet 62862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 62962306a36Sopenharmony_ci * | id | _OP_FB_DETACH | reserved | 4 63062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 63162306a36Sopenharmony_ci * | reserved | 8 63262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 63362306a36Sopenharmony_ci * | fb_cookie low 32-bit | 12 63462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 63562306a36Sopenharmony_ci * | fb_cookie high 32-bit | 16 63662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 63762306a36Sopenharmony_ci * | reserved | 20 63862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 63962306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 64062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 64162306a36Sopenharmony_ci * | reserved | 64 64262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 64362306a36Sopenharmony_ci * 64462306a36Sopenharmony_ci * Must be sent over control ring of the connector which has the index 64562306a36Sopenharmony_ci * value of 0: 64662306a36Sopenharmony_ci * /local/domain/<dom-id>/device/vdispl/<dev-id>/0/req-ring-ref 64762306a36Sopenharmony_ci */ 64862306a36Sopenharmony_ci 64962306a36Sopenharmony_cistruct xendispl_fb_detach_req { 65062306a36Sopenharmony_ci uint64_t fb_cookie; 65162306a36Sopenharmony_ci}; 65262306a36Sopenharmony_ci 65362306a36Sopenharmony_ci/* 65462306a36Sopenharmony_ci * Request configuration set/reset - request to set or reset 65562306a36Sopenharmony_ci * the configuration/mode of the display: 65662306a36Sopenharmony_ci * 0 1 2 3 octet 65762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 65862306a36Sopenharmony_ci * | id | _OP_SET_CONFIG | reserved | 4 65962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 66062306a36Sopenharmony_ci * | reserved | 8 66162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 66262306a36Sopenharmony_ci * | fb_cookie low 32-bit | 12 66362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 66462306a36Sopenharmony_ci * | fb_cookie high 32-bit | 16 66562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 66662306a36Sopenharmony_ci * | x | 20 66762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 66862306a36Sopenharmony_ci * | y | 24 66962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 67062306a36Sopenharmony_ci * | width | 28 67162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 67262306a36Sopenharmony_ci * | height | 32 67362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 67462306a36Sopenharmony_ci * | bpp | 40 67562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 67662306a36Sopenharmony_ci * | reserved | 44 67762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 67862306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 67962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 68062306a36Sopenharmony_ci * | reserved | 64 68162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 68262306a36Sopenharmony_ci * 68362306a36Sopenharmony_ci * Pass all zeros to reset, otherwise command is treated as 68462306a36Sopenharmony_ci * configuration set. 68562306a36Sopenharmony_ci * Framebuffer's cookie defines which framebuffer/dbuf must be 68662306a36Sopenharmony_ci * displayed while enabling display (applying configuration). 68762306a36Sopenharmony_ci * x, y, width and height are bound by the connector's resolution and must not 68862306a36Sopenharmony_ci * exceed it. 68962306a36Sopenharmony_ci * 69062306a36Sopenharmony_ci * x - uint32_t, starting position in pixels by X axis 69162306a36Sopenharmony_ci * y - uint32_t, starting position in pixels by Y axis 69262306a36Sopenharmony_ci * width - uint32_t, width in pixels 69362306a36Sopenharmony_ci * height - uint32_t, height in pixels 69462306a36Sopenharmony_ci * bpp - uint32_t, bits per pixel 69562306a36Sopenharmony_ci */ 69662306a36Sopenharmony_ci 69762306a36Sopenharmony_cistruct xendispl_set_config_req { 69862306a36Sopenharmony_ci uint64_t fb_cookie; 69962306a36Sopenharmony_ci uint32_t x; 70062306a36Sopenharmony_ci uint32_t y; 70162306a36Sopenharmony_ci uint32_t width; 70262306a36Sopenharmony_ci uint32_t height; 70362306a36Sopenharmony_ci uint32_t bpp; 70462306a36Sopenharmony_ci}; 70562306a36Sopenharmony_ci 70662306a36Sopenharmony_ci/* 70762306a36Sopenharmony_ci * Request page flip - request to flip a page identified by the framebuffer 70862306a36Sopenharmony_ci * cookie: 70962306a36Sopenharmony_ci * 0 1 2 3 octet 71062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 71162306a36Sopenharmony_ci * | id | _OP_PG_FLIP | reserved | 4 71262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 71362306a36Sopenharmony_ci * | reserved | 8 71462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 71562306a36Sopenharmony_ci * | fb_cookie low 32-bit | 12 71662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 71762306a36Sopenharmony_ci * | fb_cookie high 32-bit | 16 71862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 71962306a36Sopenharmony_ci * | reserved | 20 72062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 72162306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 72262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 72362306a36Sopenharmony_ci * | reserved | 64 72462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 72562306a36Sopenharmony_ci */ 72662306a36Sopenharmony_ci 72762306a36Sopenharmony_cistruct xendispl_page_flip_req { 72862306a36Sopenharmony_ci uint64_t fb_cookie; 72962306a36Sopenharmony_ci}; 73062306a36Sopenharmony_ci 73162306a36Sopenharmony_ci/* 73262306a36Sopenharmony_ci * Request EDID - request EDID describing current connector: 73362306a36Sopenharmony_ci * 0 1 2 3 octet 73462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 73562306a36Sopenharmony_ci * | id | _OP_GET_EDID | reserved | 4 73662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 73762306a36Sopenharmony_ci * | buffer_sz | 8 73862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 73962306a36Sopenharmony_ci * | gref_directory | 12 74062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 74162306a36Sopenharmony_ci * | reserved | 16 74262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 74362306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 74462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 74562306a36Sopenharmony_ci * | reserved | 64 74662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 74762306a36Sopenharmony_ci * 74862306a36Sopenharmony_ci * Notes: 74962306a36Sopenharmony_ci * - This command is not available in protocol version 1 and should be 75062306a36Sopenharmony_ci * ignored. 75162306a36Sopenharmony_ci * - This request is optional and if not supported then visible area 75262306a36Sopenharmony_ci * is defined by the relevant XenStore's "resolution" property. 75362306a36Sopenharmony_ci * - Shared buffer, allocated for EDID storage, must not be less then 75462306a36Sopenharmony_ci * XENDISPL_EDID_MAX_SIZE octets. 75562306a36Sopenharmony_ci * 75662306a36Sopenharmony_ci * buffer_sz - uint32_t, buffer size to be allocated, octets 75762306a36Sopenharmony_ci * gref_directory - grant_ref_t, a reference to the first shared page 75862306a36Sopenharmony_ci * describing EDID buffer references. See XENDISPL_OP_DBUF_CREATE for 75962306a36Sopenharmony_ci * grant page directory structure (struct xendispl_page_directory). 76062306a36Sopenharmony_ci * 76162306a36Sopenharmony_ci * See response format for this request. 76262306a36Sopenharmony_ci */ 76362306a36Sopenharmony_ci 76462306a36Sopenharmony_cistruct xendispl_get_edid_req { 76562306a36Sopenharmony_ci uint32_t buffer_sz; 76662306a36Sopenharmony_ci grant_ref_t gref_directory; 76762306a36Sopenharmony_ci}; 76862306a36Sopenharmony_ci 76962306a36Sopenharmony_ci/* 77062306a36Sopenharmony_ci *---------------------------------- Responses -------------------------------- 77162306a36Sopenharmony_ci * 77262306a36Sopenharmony_ci * All response packets have the same length (64 octets) 77362306a36Sopenharmony_ci * 77462306a36Sopenharmony_ci * All response packets have common header: 77562306a36Sopenharmony_ci * 0 1 2 3 octet 77662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 77762306a36Sopenharmony_ci * | id | reserved | 4 77862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 77962306a36Sopenharmony_ci * | status | 8 78062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 78162306a36Sopenharmony_ci * | reserved | 12 78262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 78362306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 78462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 78562306a36Sopenharmony_ci * | reserved | 64 78662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 78762306a36Sopenharmony_ci * 78862306a36Sopenharmony_ci * id - uint16_t, private guest value, echoed from request 78962306a36Sopenharmony_ci * status - int32_t, response status, zero on success and -XEN_EXX on failure 79062306a36Sopenharmony_ci * 79162306a36Sopenharmony_ci * 79262306a36Sopenharmony_ci * Get EDID response - response for XENDISPL_OP_GET_EDID: 79362306a36Sopenharmony_ci * 0 1 2 3 octet 79462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 79562306a36Sopenharmony_ci * | id | operation | reserved | 4 79662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 79762306a36Sopenharmony_ci * | status | 8 79862306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 79962306a36Sopenharmony_ci * | edid_sz | 12 80062306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 80162306a36Sopenharmony_ci * | reserved | 16 80262306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 80362306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 80462306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 80562306a36Sopenharmony_ci * | reserved | 64 80662306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 80762306a36Sopenharmony_ci * 80862306a36Sopenharmony_ci * Notes: 80962306a36Sopenharmony_ci * - This response is not available in protocol version 1 and should be 81062306a36Sopenharmony_ci * ignored. 81162306a36Sopenharmony_ci * 81262306a36Sopenharmony_ci * edid_sz - uint32_t, size of the EDID, octets 81362306a36Sopenharmony_ci */ 81462306a36Sopenharmony_ci 81562306a36Sopenharmony_cistruct xendispl_get_edid_resp { 81662306a36Sopenharmony_ci uint32_t edid_sz; 81762306a36Sopenharmony_ci}; 81862306a36Sopenharmony_ci 81962306a36Sopenharmony_ci/* 82062306a36Sopenharmony_ci *----------------------------------- Events ---------------------------------- 82162306a36Sopenharmony_ci * 82262306a36Sopenharmony_ci * Events are sent via a shared page allocated by the front and propagated by 82362306a36Sopenharmony_ci * evt-event-channel/evt-ring-ref XenStore entries 82462306a36Sopenharmony_ci * All event packets have the same length (64 octets) 82562306a36Sopenharmony_ci * All event packets have common header: 82662306a36Sopenharmony_ci * 0 1 2 3 octet 82762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 82862306a36Sopenharmony_ci * | id | type | reserved | 4 82962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 83062306a36Sopenharmony_ci * | reserved | 8 83162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 83262306a36Sopenharmony_ci * 83362306a36Sopenharmony_ci * id - uint16_t, event id, may be used by front 83462306a36Sopenharmony_ci * type - uint8_t, type of the event 83562306a36Sopenharmony_ci * 83662306a36Sopenharmony_ci * 83762306a36Sopenharmony_ci * Page flip complete event - event from back to front on page flip completed: 83862306a36Sopenharmony_ci * 0 1 2 3 octet 83962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 84062306a36Sopenharmony_ci * | id | _EVT_PG_FLIP | reserved | 4 84162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 84262306a36Sopenharmony_ci * | reserved | 8 84362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 84462306a36Sopenharmony_ci * | fb_cookie low 32-bit | 12 84562306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 84662306a36Sopenharmony_ci * | fb_cookie high 32-bit | 16 84762306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 84862306a36Sopenharmony_ci * | reserved | 20 84962306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 85062306a36Sopenharmony_ci * |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/| 85162306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 85262306a36Sopenharmony_ci * | reserved | 64 85362306a36Sopenharmony_ci * +----------------+----------------+----------------+----------------+ 85462306a36Sopenharmony_ci */ 85562306a36Sopenharmony_ci 85662306a36Sopenharmony_cistruct xendispl_pg_flip_evt { 85762306a36Sopenharmony_ci uint64_t fb_cookie; 85862306a36Sopenharmony_ci}; 85962306a36Sopenharmony_ci 86062306a36Sopenharmony_cistruct xendispl_req { 86162306a36Sopenharmony_ci uint16_t id; 86262306a36Sopenharmony_ci uint8_t operation; 86362306a36Sopenharmony_ci uint8_t reserved[5]; 86462306a36Sopenharmony_ci union { 86562306a36Sopenharmony_ci struct xendispl_dbuf_create_req dbuf_create; 86662306a36Sopenharmony_ci struct xendispl_dbuf_destroy_req dbuf_destroy; 86762306a36Sopenharmony_ci struct xendispl_fb_attach_req fb_attach; 86862306a36Sopenharmony_ci struct xendispl_fb_detach_req fb_detach; 86962306a36Sopenharmony_ci struct xendispl_set_config_req set_config; 87062306a36Sopenharmony_ci struct xendispl_page_flip_req pg_flip; 87162306a36Sopenharmony_ci struct xendispl_get_edid_req get_edid; 87262306a36Sopenharmony_ci uint8_t reserved[56]; 87362306a36Sopenharmony_ci } op; 87462306a36Sopenharmony_ci}; 87562306a36Sopenharmony_ci 87662306a36Sopenharmony_cistruct xendispl_resp { 87762306a36Sopenharmony_ci uint16_t id; 87862306a36Sopenharmony_ci uint8_t operation; 87962306a36Sopenharmony_ci uint8_t reserved; 88062306a36Sopenharmony_ci int32_t status; 88162306a36Sopenharmony_ci union { 88262306a36Sopenharmony_ci struct xendispl_get_edid_resp get_edid; 88362306a36Sopenharmony_ci uint8_t reserved1[56]; 88462306a36Sopenharmony_ci } op; 88562306a36Sopenharmony_ci}; 88662306a36Sopenharmony_ci 88762306a36Sopenharmony_cistruct xendispl_evt { 88862306a36Sopenharmony_ci uint16_t id; 88962306a36Sopenharmony_ci uint8_t type; 89062306a36Sopenharmony_ci uint8_t reserved[5]; 89162306a36Sopenharmony_ci union { 89262306a36Sopenharmony_ci struct xendispl_pg_flip_evt pg_flip; 89362306a36Sopenharmony_ci uint8_t reserved[56]; 89462306a36Sopenharmony_ci } op; 89562306a36Sopenharmony_ci}; 89662306a36Sopenharmony_ci 89762306a36Sopenharmony_ciDEFINE_RING_TYPES(xen_displif, struct xendispl_req, struct xendispl_resp); 89862306a36Sopenharmony_ci 89962306a36Sopenharmony_ci/* 90062306a36Sopenharmony_ci ****************************************************************************** 90162306a36Sopenharmony_ci * Back to front events delivery 90262306a36Sopenharmony_ci ****************************************************************************** 90362306a36Sopenharmony_ci * In order to deliver asynchronous events from back to front a shared page is 90462306a36Sopenharmony_ci * allocated by front and its granted reference propagated to back via 90562306a36Sopenharmony_ci * XenStore entries (evt-ring-ref/evt-event-channel). 90662306a36Sopenharmony_ci * This page has a common header used by both front and back to synchronize 90762306a36Sopenharmony_ci * access and control event's ring buffer, while back being a producer of the 90862306a36Sopenharmony_ci * events and front being a consumer. The rest of the page after the header 90962306a36Sopenharmony_ci * is used for event packets. 91062306a36Sopenharmony_ci * 91162306a36Sopenharmony_ci * Upon reception of an event(s) front may confirm its reception 91262306a36Sopenharmony_ci * for either each event, group of events or none. 91362306a36Sopenharmony_ci */ 91462306a36Sopenharmony_ci 91562306a36Sopenharmony_cistruct xendispl_event_page { 91662306a36Sopenharmony_ci uint32_t in_cons; 91762306a36Sopenharmony_ci uint32_t in_prod; 91862306a36Sopenharmony_ci uint8_t reserved[56]; 91962306a36Sopenharmony_ci}; 92062306a36Sopenharmony_ci 92162306a36Sopenharmony_ci#define XENDISPL_EVENT_PAGE_SIZE XEN_PAGE_SIZE 92262306a36Sopenharmony_ci#define XENDISPL_IN_RING_OFFS (sizeof(struct xendispl_event_page)) 92362306a36Sopenharmony_ci#define XENDISPL_IN_RING_SIZE (XENDISPL_EVENT_PAGE_SIZE - XENDISPL_IN_RING_OFFS) 92462306a36Sopenharmony_ci#define XENDISPL_IN_RING_LEN (XENDISPL_IN_RING_SIZE / sizeof(struct xendispl_evt)) 92562306a36Sopenharmony_ci#define XENDISPL_IN_RING(page) \ 92662306a36Sopenharmony_ci ((struct xendispl_evt *)((char *)(page) + XENDISPL_IN_RING_OFFS)) 92762306a36Sopenharmony_ci#define XENDISPL_IN_RING_REF(page, idx) \ 92862306a36Sopenharmony_ci (XENDISPL_IN_RING((page))[(idx) % XENDISPL_IN_RING_LEN]) 92962306a36Sopenharmony_ci 93062306a36Sopenharmony_ci#endif /* __XEN_PUBLIC_IO_DISPLIF_H__ */ 931