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