[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH v3] displif: add ABI for para-virtual display



On Wed, Feb 15, 2017 at 09:33:41AM +0200, Oleksandr Andrushchenko wrote:
> On 02/14/2017 10:27 PM, Konrad Rzeszutek Wilk wrote:
> > On Mon, Feb 13, 2017 at 10:50:49AM +0200, Oleksandr Andrushchenko wrote:
> > > Hi, Konrad!
> > > 
> > > Thank you for reviewing this.
> > > 
> > > On 02/10/2017 11:27 PM, Konrad Rzeszutek Wilk wrote:
> > > > On Fri, Feb 10, 2017 at 09:29:58AM +0200, Oleksandr Andrushchenko wrote:
> > > > > From: Oleksandr Andrushchenko <oleksandr_andrushchenko@xxxxxxxx>
> > > > > 
> > > > > This is the ABI for the two halves of a para-virtualized
> > > > > display driver.
> > > > > 
> > > > > This protocol aims to provide a unified protocol which fits more
> > > > > sophisticated use-cases than a framebuffer device can handle. At the
> > > > > moment basic functionality is supported with the intention to extend:
> > > > >     o multiple dynamically allocated/destroyed framebuffers
> > > > >     o buffers of arbitrary sizes
> > > > >     o better configuration options including multiple display support
> > > > > 
> > > > > Note: existing fbif can be used together with displif running at the
> > > > > same time, e.g. on Linux one provides framebuffer and another DRM/KMS
> > > > > 
> > > > > Future extensions to the existing protocol may include:
> > > > >     o allow display/connector cloning
> > > > >     o allow allocating objects other than display buffers
> > > > >     o add planes/overlays support
> > > > >     o support scaling
> > > > >     o support rotation
> > > > > 
> > > > > ==================================================
> > > > > Rationale for introducing this protocol instead of
> > > > > using the existing fbif:
> > > > > ==================================================
> > > > > 
> > > > > 1. In/out event sizes
> > > > >     o fbif - 40 octets
> > > > >     o displif - 40 octets
> > > > > This is only the initial version of the displif protocol
> > > > > which means that there could be requests which will not fit
> > > > > (WRT introducing some GPU related functionality
> > > > > later on). In that case we cannot alter fbif sizes as we need to
> > > > > be backward compatible an will be forced to handle those
> > > > > apart of fbif.
> > > > > 
> > > > > 2. Shared page
> > > > > Displif doesn't use anything like struct xenfb_page, but
> > > > > DEFINE_RING_TYPES(xen_displif, struct xendispl_req, struct
> > > > > xendispl_resp) which is a better and more common way.
> > > > > Output events use a shared page which only has in_cons and in_prod
> > > > > and all the rest is used for incoming events. Here struct xenfb_page
> > > > > could probably be used as is despite the fact that it only has a half
> > > > > of a page for incoming events which is only 50 events. (consider
> > > > > something like 60Hz display)
> > > > > 
> > > > > 3. Amount of changes.
> > > > > fbif only provides XENFB_TYPE_UPDATE and XENFB_TYPE_RESIZE
> > > > > events, so it looks like it is easier to get fb support into displif
> > > > .. would it make sense to reserve some of those values (2, 3)
> > > > in the XENDISPL_OP_ values? So that if this happens there is a nice
> > > > fit in there? Thought looking at the structure there is no easy
> > > > way to 'overlay' the xenfb_out_event structure as it is missing the 
> > > > 'id'.
> > > > 
> > > > I guess one can get creative.
> > > > 
> > > > Or you could swap positions of 'id' and 'type'? And then it would fit 
> > > > much
> > > > nicer?
> > > yeap, in order no one needs to be creative, why not
> > > explicitly define those?
> > > Anyways, it won't be possible to simply lay the structures from
> > > fbif on top of displif (different structure, size, workflow etc.),
> > > what is more that would give some room to find workarounds, rather than
> > > have well defined solution. BTW, there was an attempt [1] to update
> > > fbdev to meet modern application needs. If we decide to add FBDEV
> > > functionality into this protocol, then I can re-use already
> > > proven to work solution from [1] into DISPLIF, but defining
> > > structures and events to fit the current protocol.
> > I was thinking that since the size of the structure is 64bytes
> > you have enough space to jam in the old structures too.
> yes, I understand your intention
> > 
> > Naturally the driver would need adjustments as it offsets
> > of where this goes are all wrong.
> exactly
> > 
> > > What do you think?
> so, what is the decision? Options:
> 1) Leave the protocol as is, if need be it can be extended later
> 2) Implement something similar to [1]
> 3) Give room for workarounds and reserve XENDISPL_OP_XXX for
> what current fbif uses

I would do 3) so that it becomes easier to migrate the old code over.

> > > > > than vice versa. displif at the moment has 6 requests and 1 event,
> > > > > multiple connector support, etc.
> > > > > 
> > > > > Changes since v2:
> > > > >    * updated XenStore configuration template/pattern
> > > > >    * added "Recovery flow" to state diagram description
> > > > >    * renamed gref_directory_start to gref_directory
> > > > >    * added missing "versions" and "version" string constants
> > > > > 
> > > > > Changes since v1:
> > > > >    * fixed xendispl_event_page padding size
> > > > >    * added versioning support
> > > > >    * explicitly define value types for XenStore fields
> > > > >    * text decoration re-work
> > > > >    * added offsets to ASCII box notation
> > > > > 
> > > > > Changes since initial:
> > > > >    * DRM changed to DISPL, protocol made generic
> > > > >    * major re-work addressing issues raised for sndif
> > > > > 
> > > > > Signed-off-by: Oleksandr Grytsov <oleksandr_grytsov@xxxxxxxx>
> > > > > Signed-off-by: Oleksandr Andrushchenko 
> > > > > <oleksandr_andrushchenko@xxxxxxxx>
> > > > > ---
> > > > >    xen/include/public/io/displif.h | 778 
> > > > > ++++++++++++++++++++++++++++++++++++++++
> > > > >    1 file changed, 778 insertions(+)
> > > > >    create mode 100644 xen/include/public/io/displif.h
> > > > > 
> > > > > diff --git a/xen/include/public/io/displif.h 
> > > > > b/xen/include/public/io/displif.h
> > > > > new file mode 100644
> > > > > index 000000000000..849f27fe5f1d
> > > > > --- /dev/null
> > > > > +++ b/xen/include/public/io/displif.h
> > > > > @@ -0,0 +1,778 @@
> > > > > +/******************************************************************************
> > > > > + * displif.h
> > > > > + *
> > > > > + * Unified display device I/O interface for Xen guest OSes.
> > > > > + *
> > > > > + * Permission is hereby granted, free of charge, to any person 
> > > > > obtaining a copy
> > > > > + * of this software and associated documentation files (the 
> > > > > "Software"), to
> > > > > + * deal in the Software without restriction, including without 
> > > > > limitation the
> > > > > + * rights to use, copy, modify, merge, publish, distribute, 
> > > > > sublicense, and/or
> > > > > + * sell copies of the Software, and to permit persons to whom the 
> > > > > Software is
> > > > > + * furnished to do so, subject to the following conditions:
> > > > > + *
> > > > > + * The above copyright notice and this permission notice shall be 
> > > > > included in
> > > > > + * all copies or substantial portions of the Software.
> > > > > + *
> > > > > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
> > > > > EXPRESS OR
> > > > > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
> > > > > MERCHANTABILITY,
> > > > > + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT 
> > > > > SHALL THE
> > > > > + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 
> > > > > OTHER
> > > > > + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 
> > > > > ARISING
> > > > > + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 
> > > > > OTHER
> > > > > + * DEALINGS IN THE SOFTWARE.
> > > > > + *
> > > > > + * Copyright (C) 2016-2017 EPAM Systems Inc.
> > > > > + *
> > > > > + * Authors: Oleksandr Andrushchenko 
> > > > > <oleksandr_andrushchenko@xxxxxxxx>
> > > > > + *          Oleksandr Grytsov <oleksandr_grytsov@xxxxxxxx>
> > > > > + */
> > > > > +
> > > > > +#ifndef __XEN_PUBLIC_IO_DISPLIF_H__
> > > > > +#define __XEN_PUBLIC_IO_DISPLIF_H__
> > > > > +
> > > > > +#include "ring.h"
> > > > > +#include "../grant_table.h"
> > > > > +
> > > > > +/*
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *                  Main features provided by the protocol
> > > > > + 
> > > > > ******************************************************************************
> > > > > + * This protocol aims to provide a unified protocol which fits more
> > > > > + * sophisticated use-cases than a framebuffer device can handle. At 
> > > > > the
> > > > > + * moment basic functionality is supported with the intention to be 
> > > > > extended:
> > > > > + *  o multiple dynamically allocated/destroyed framebuffers
> > > > > + *  o buffers of arbitrary sizes
> > > > > + *  o buffer allocation at either back or front end
> > > > > + *  o better configuration options including multiple display support
> > > > > + *
> > > > > + * Note: existing fbif can be used together with displif running at 
> > > > > the
> > > > > + * same time, e.g. on Linux one provides framebuffer and another 
> > > > > DRM/KMS
> > > > > + *
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *                        Direction of improvements
> > > > > + 
> > > > > ******************************************************************************
> > > > > + * Future extensions to the existing protocol may include:
> > > > > + *  o display/connector cloning
> > > > > + *  o allocation of objects other than display buffers
> > > > > + *  o plane/overlay support
> > > > > + *  o scaling support
> > > > > + *  o rotation support
> > > > > + *
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *                  Feature and Parameter Negotiation
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *
> > > > > + * Front->back notifications: when enqueuing a new request, sending a
> > > > > + * notification can be made conditional on xendispl_req (i.e., the 
> > > > > generic
> > > > > + * hold-off mechanism provided by the ring macros). Backends must set
> > > > > + * xendispl_req appropriately (e.g., using 
> > > > > RING_FINAL_CHECK_FOR_REQUESTS()).
> > > > > + *
> > > > > + * Back->front notifications: when enqueuing a new response, sending 
> > > > > a
> > > > > + * notification can be made conditional on xendispl_resp (i.e., the 
> > > > > generic
> > > > > + * hold-off mechanism provided by the ring macros). Frontends must 
> > > > > set
> > > > > + * xendispl_resp appropriately (e.g., using 
> > > > > RING_FINAL_CHECK_FOR_RESPONSES()).
> > > > > + *
> > > > > + * The two halves of a para-virtual display driver utilize nodes 
> > > > > within
> > > > > + * XenStore to communicate capabilities and to negotiate operating 
> > > > > parameters.
> > > > > + * This section enumerates these nodes which reside in the 
> > > > > respective front and
> > > > > + * backend portions of XenStore, following the XenBus convention.
> > > > > + *
> > > > > + * All data in XenStore is stored as strings. Nodes specifying 
> > > > > numeric
> > > > > + * values are encoded in decimal. Integer value ranges listed below 
> > > > > are
> > > > > + * expressed as fixed sized integer types capable of storing the 
> > > > > conversion
> > > > > + * of a properly formated node string, without loss of information.
> > > > > + *
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *                        Example configuration
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *
> > > > > + * Note: depending on the use-case backend can expose more display 
> > > > > connectors
> > > > > + * than the underlying HW physically has by employing SW graphics 
> > > > > compositors
> > > > > + *
> > > > > + * This is an example of backend and frontend configuration:
> > > > > + *
> > > > > + *--------------------------------- Backend 
> > > > > -----------------------------------
> > > > > + *
> > > > > + * /local/domain/0/backend/vdispl/1/0/frontend-id = "1"
> > > > > + * /local/domain/0/backend/vdispl/1/0/frontend = 
> > > > > "/local/domain/1/device/vdispl/0"
> > > > > + * /local/domain/0/backend/vdispl/1/0/state = "4"
> > > > > + * /local/domain/0/backend/vdispl/1/0/versions = "1,2"
> > > > > + * /local/domain/0/backend/vdispl/1/0/features = "be_alloc"
> > > > > + *
> > > > > + *--------------------------------- Frontend 
> > > > > ----------------------------------
> > > > > + *
> > > > > + * /local/domain/1/device/vdispl/0/backend-id = "0"
> > > > > + * /local/domain/1/device/vdispl/0/backend = 
> > > > > "/local/domain/0/backend/vdispl/1/0"
> > > > > + * /local/domain/1/device/vdispl/0/state = "4"
> > > > > + * /local/domain/1/device/vdispl/0/version = "1"
> > > > > + *
> > > > > + *-------------------------- Connector 0 configuration 
> > > > > ------------------------
> > > > > + *
> > > > > + * /local/domain/1/device/vdispl/0/0/resolution = "1920x1080"
> > > > > + * /local/domain/1/device/vdispl/0/0/ctrl-ring-ref = "2832"
> > > > > + * /local/domain/1/device/vdispl/0/0/ctrl-channel = "15"
> > > > > + * /local/domain/1/device/vdispl/0/0/event-ring-ref = "387"
> > > > > + * /local/domain/1/device/vdispl/0/0/event-channel = "16"
> > > > > + *
> > > > > + *-------------------------- Connector 1 configuration 
> > > > > ------------------------
> > > > > + *
> > > > > + * /local/domain/1/device/vdispl/0/1/resolution = "800x600"
> > > > > + * /local/domain/1/device/vdispl/0/1/ctrl-ring-ref = "2833"
> > > > > + * /local/domain/1/device/vdispl/0/1/ctrl-channel = "17"
> > > > > + * /local/domain/1/device/vdispl/0/1/event-ring-ref = "388"
> > > > > + * /local/domain/1/device/vdispl/0/1/event-channel = "18"
> > > > > + *
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *                            Backend XenBus Nodes
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *
> > > > > + *----------------------------- Protocol version 
> > > > > ------------------------------
> > > > > + *
> > > > > + * versions
> > > > > + *      Values:         <string>
> > > > > + *
> > > > > + *      List of XENDISPL_LIST_SEPARATOR separated protocol versions 
> > > > > supported
> > > > > + *      by the backend. For example "1,2,3".
> > > > > + *
> > > > > + * features
> > > > > + *      Values:         <list of strings>
> > > > > + *
> > > > > + *      XENDISPL_LIST_SEPARATOR separated list of features
> > > > > + *      XENDISPL_FEATURE_BE_??? that the backend supports.
> > > > > + *
> > > > > + *      be_alloc
> > > > > + *             Backend can be a buffer provider/allocator during
> > > > > + *             XENDISPL_OP_DBUF_CREATE operation (see below for 
> > > > > negotiation).
> > > > > + *
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *                            Frontend XenBus Nodes
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *
> > > > > + *-------------------------------- Addressing 
> > > > > ---------------------------------
> > > > > + *
> > > > > + * dom-id
> > > > > + *      Values:         <uint16_t>
> > > > > + *
> > > > > + *      Domain identifier.
> > > > > + *
> > > > > + * dev-id
> > > > > + *      Values:         <uint16_t>
> > > > > + *
> > > > > + *      Device identifier.
> > > > > + *
> > > > > + * conn-idx
> > > > > + *      Values:         <uint8_t>
> > > > > + *
> > > > > + *      Zero based contigous index of the connector.
> > > > > + *      /local/domain/<dom-id>/device/vdispl/<dev-id>/<conn-idx>/...
> > > > > + *
> > > > > + *----------------------------- Protocol version 
> > > > > ------------------------------
> > > > > + *
> > > > > + * version
> > > > > + *      Values:         <string>
> > > > > + *
> > > > > + *      Protocol version, chosen among the ones supported by the 
> > > > > backend.
> > > > > + *
> > > > > + *----------------------------- Connector settings 
> > > > > ----------------------------
> > > > > + *
> > > > > + * resolution
> > > > > + *      Values:         <width, uint32_t>x<height, uint32_t>
> > > > > + *
> > > > > + *      Width and height of the connector in pixels separated by
> > > > > + *      XENDISPL_RESOLUTION_SEPARATOR.
> > > > Is there an default depth?
> > > no
> > > >    32?
> > > no defaults
> > Should we have a default?
> > 
> > And perhaps also say that all the operations are bounded by these?
> not sure we need default here: this is *up to backend*
> what to do with *depths* and *resolutions* which are different
> from what HW display supports, e.g. those buffers
> can be just a part of the final composition.
> For example, backend utilizes a SW compositor which
> makes screen compositing with 1920x1080x32 (lets say, for
> example, this is the most suitable one for the GPU used
> and also this is used for a remote desktop - use-cases may
> differ)
> But, the real HW display is only 1200x800x24. So, once the
> composition is done, it will be downscaled/resampled by any
> means to what HW display wants.
> 
> Hope, this better explains why buffers may differ from
> what "resolution" says and depth used: buffer is not
> exactly what you see finally, so it can be bigger, smaller
> or equal - all valid

OK, you may to include this explanation in the document.

> > > >    Or should that also be negotiated?
> > > frontend requests the desired value of it, backend provides it
> > > or rejects the request, so front will try other value.
> > > So, yes, this is kind of negotiation here (EINVAL based :)
> > > I will also put a note that "resolution" only defines visible area,
> > > thus display and frame buffer sizes can be different from this value
> > OK, which I suspect means that it can only be smaller, not larger.
> See above, no influence on buffer size
> > > > > + *
> > > > > + *------------------ Connector Request Transport Parameters 
> > > > > -------------------
> > > > > + *
> > > > > + * ctrl-channel
> > > > Please call it 'ctrl-event-channel'
> > > I will
> > > > > + *      Values:         <uint32_t>
> > > > > + *
> > > > > + *      The identifier of the Xen connector's control event channel
> > > > > + *      used to signal activity in the ring buffer.
> > > > > + *
> > > > > + * ctrl-ring-ref
> > > > > + *      Values:         <uint32_t>
> > > > > + *
> > > > > + *      The Xen grant reference granting permission for the backend 
> > > > > to map
> > > > > + *      a sole page in a single page sized connector's control ring 
> > > > > buffer.
> > > > > + *
> > > > > + * event-channel
> > > > > + *      Values:         <uint32_t>
> > > > > + *
> > > > > + *      The identifier of the Xen connector's event channel
> > > > > + *      used to signal activity in the ring buffer.
> > > > > + *
> > > > > + * event-ring-ref
> > > > > + *      Values:         <uint32_t>
> > > > > + *
> > > > > + *      The Xen grant reference granting permission for the backend 
> > > > > to map
> > > > > + *      a sole page in a single page sized connector's event ring 
> > > > > buffer.
> > > > So you are making two rings and two event channels - and it looks like 
> > > > the
> > > > operations are going via the control ring.. but what goes through the
> > > > the other ring buffer?
> > > Events from backend to frontend, currently only XENDISPL_EVT_PG_FLIP
> > Aaaaah! In that case I would change it from 'ctrl-' to
> > 'req-alloc' to match with.
> well, this is the control/command path, for that reason I
> still see its name as "ctrl/cmd-".
> What is more, I can agree to "req", but why "alloc"?
> This path is not only used for allocations, but configuration as well.
> In the future, I would expect other commands/control be passed
> over it.
> So, there is a command/control path ("ctrl-") and event path ("event-")
> which I believe do reflect their usage.

Isn't this tied to 'XENDISPL_FEATURE_BE_ALLOC' feature? If so I would
call it with that name in mind.

> > > I will define 2 sections:
> > >   *------------------ Connector Request Transport Parameters
> > > -------------------
> > >   *
> > >   * ctrl-event-channel
> > >   * ctrl-ring-ref
> > >   *
> > >   *------------------- Connector Event Transport Parameters
> > > --------------------
> > >   *
> > >   * event-channel
> > >   * event-ring-ref
> > > 
> > > > Or is the other ring buffer the one that is created via 
> > > > 'gref_directory' ?
> > > no
> > > At the bottom:
> > >   * In order to deliver asynchronous events from back to front a shared 
> > > page
> > > is
> > >   * allocated by front and its gref propagated to back via XenStore 
> > > entries
> > >   * (event-XXX).
> > AAnd you may want to say this is guarded by REQ_ALLOC feature right?
> Not sure I understood you. Event path is totally independent
> from any feature, e.g. REQ_ALLOC.
> It just provides means to send async events
> from back to front, "page flip done" in my case.

<scratche his head> Why do you need a seperate ring to send
responses back? Why not use the same ring on which requests
were sent

> > > > If so, wouldn't you need mulitple event channels? And also the size of 
> > > > those
> > > > rings is much much bigger. But it is not really a ring. It looks to hold
> > > > some opaque data?
> > > > 
> > > > -ECONFUSED.
> > > > > + */
> > > > > +
> > > > > +/*
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *                               STATE DIAGRAMS
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *
> > > > > + * Tool stack creates front and back state nodes with initial state
> > > > > + * XenbusStateInitialising.
> > > > > + * Tool stack creates and sets up frontend display configuration
> > > > > + * nodes per domain.
> > > > > + *
> > > > > + *-------------------------------- Normal flow 
> > > > > --------------------------------
> > > > > + *
> > > > > + * Front                                Back
> > > > > + * =================================    
> > > > > =====================================
> > > > > + * XenbusStateInitialising              XenbusStateInitialising
> > > > > + *                                       o Query backend device 
> > > > > identification
> > > > > + *                                         data.
> > > > > + *                                       o Open and validate backend 
> > > > > device.
> > > > > + *                                                |
> > > > > + *                                                |
> > > > > + *                                                V
> > > > > + *                                      XenbusStateInitWait
> > > > > + *
> > > > > + * o Query frontend configuration
> > > > > + * o Allocate and initialize
> > > > > + *   event channels per configured
> > > > > + *   connector.
> > > > > + * o Publish transport parameters
> > > > > + *   that will be in effect during
> > > > > + *   this connection.
> > > > > + *              |
> > > > > + *              |
> > > > > + *              V
> > > > > + * XenbusStateInitialised
> > > > > + *
> > > > > + *                                       o Query frontend transport 
> > > > > parameters.
> > > > > + *                                       o Connect to the event 
> > > > > channels.
> > > > > + *                                                |
> > > > > + *                                                |
> > > > > + *                                                V
> > > > > + *                                      XenbusStateConnected
> > > > > + *
> > > > > + *  o Create and initialize OS
> > > > > + *    virtual display connectors
> > > > > + *    as per configuration.
> > > > > + *              |
> > > > > + *              |
> > > > > + *              V
> > > > > + * XenbusStateConnected
> > > > > + *
> > > > > + *                                      XenbusStateUnknown
> > > > > + *                                      XenbusStateClosed
> > > > > + *                                      XenbusStateClosing
> > > > > + * o Remove virtual display device
> > > > > + * o Remove event channels
> > > > > + *              |
> > > > > + *              |
> > > > > + *              V
> > > > > + * XenbusStateClosed
> > > > > + *
> > > > > + *------------------------------- Recovery flow 
> > > > > -------------------------------
> > > > > + *
> > > > > + * In case of frontend unrecoverable errors backend handles that as
> > > > > + * if frontend goes into the XenbusStateClosed state.
> > > > > + *
> > > > > + * In case of backend unrecoverable errors frontend tries removing
> > > > > + * the emulated device. If this is possible at the moment of error,
> > > > What emulated device?
> > > s/emulated/virtualized/g for all?
> > /me nods.
> done
> > > > > + * then frontend goes into the XenbusStateInitialising state and is 
> > > > > ready for
> > > > > + * new connection with backend. If the emulated device is still in 
> > > > > use and
> > > > emulated device?
> > > > 
> > > > > + * cannot be removed, then frontend goes into the 
> > > > > XenbusStateReconfiguring state
> > > > .. and what is done in XenbusStateReconfiguring state?
> > > > 
> > > > I am assuming 'resolution' is examined?
> > > > 
> > > > > + * until either the emulated device removed or backend initiates a 
> > > > > new
> > > > > + * connection. On the emulated device removal frontend goes into the
> > > > emulated device?
> > > The whole idea here is to let frontend recover from backend failure.
> > > What happens when backend dies: frontend cannot send requests
> > > to the backend and thus cannot emulate (virtualize) display
> > > device anymore. There is no simple solution like disconnecting rings
> > > and waiting for the backend to re-connect, as display device, just like
> > > sound devices, does hold some state: configuration in use, number of 
> > > display
> > > buffers, framebuffers, application state, framework "watchdogs" (like
> > > vertical blank time-outs and recovery at framework level) etc.
> > > So, in most cases, it would require frontend to implement complex recovery
> > > logic. Instead, what I suggest, that we go into some state, which tells 
> > > that
> > > we are not yet ready to go into Initialized state and still need some 
> > > time:
> > > at this time frontend will try to make sure no new clients from user-space
> > > are accepted, it allows the current client to exit gracefully by returning
> > > error codes etc. Once all the clients are gone frontend can reinitialize
> > > the virtualized device, e.g. DRM/KMS driver, and get into Initialized 
> > > state
> > > again.
> > That is fine.
> > > Thus, I was thinking of XenbusStateReconfiguringstate as appropriate in 
> > > this
> > > case
> > Right, but somebody has to move to this state. Who would do it?
> when backend dies its state changes to "closed".
> At this moment front tries to remove virtualized device
> and if it is possible/done, then it goes into "initialized"
> state. If not - "reconfiguring".
> So, you would ask how does the front go from "reconfiguring"
> into "initialized" state? This is OS/front specific, but:
> 1. the underlying framework, e.g. DRM/KMS, ALSA, provide
> a callback(s) to signal that the last client to the
> virtualized device has gone and the driver can be removed
> (equivalent to module's usage counter 0)
> 2. one can schedule a delayed work (timer/tasklet/workqueue)
> to periodically check if this is the right time to re-try
> the removal and remove
> 
> In both cases, after the virtualized device has been removed we move
> into "initialized" state again and are ready for new connections
> with backend (if it arose from the dead :)
> > Would the
> > frontend have some form of timer to make sure that the backend is still
> > alive? And if it had died then move to Reconfiguring?
> There are at least 2 ways to understand if back is dead:
> 1. XenBus state change (back is closed)

.. If the backend does a nice shutdown..

> 2. time-outs on requests from front to back
>
Right. 
> 
> Bottom line on the "recovery flow": what I describe could be put in
> the description as an example to clarify more this.
> > > > > + * XenbusStateInitialising state.
> > > > > + *
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *                             REQUEST CODES
> > > > > + 
> > > > > ******************************************************************************
> > > > > + */
> > > > > +#define XENDISPL_OP_DBUF_CREATE       0
> > > > > +#define XENDISPL_OP_DBUF_DESTROY      1
> > > > > +#define XENDISPL_OP_FB_ATTACH         2
> > > > > +#define XENDISPL_OP_FB_DETACH         3
> > > > > +#define XENDISPL_OP_SET_CONFIG        4
> > > > > +#define XENDISPL_OP_PG_FLIP           5
> > > > > +
> > > > > +/*
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *                                 EVENT CODES
> > > > > + 
> > > > > ******************************************************************************
> > > > > + */
> > > > > +#define XENDISPL_EVT_PG_FLIP          0
> > > > > +
> > > > > +/*
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *               XENSTORE FIELD AND PATH NAME STRINGS, HELPERS
> > > > > + 
> > > > > ******************************************************************************
> > > > > + */
> > > > > +#define XENDISPL_DRIVER_NAME          "vdispl"
> > > > > +
> > > > > +#define XENDISPL_LIST_SEPARATOR       ","
> > > > > +#define XENDISPL_RESOLUTION_SEPARATOR "x"
> > > > > +/* Field names */
> > > > > +#define XENDISPL_FIELD_BE_VERSIONS    "versions"
> > > > > +#define XENDISPL_FIELD_FE_VERSION     "version"
> > > > > +#define XENDISPL_FIELD_FEATURES       "features"
> > > > > +#define XENDISPL_FIELD_CTRL_RING_REF  "ctrl-ring-ref"
> > > > > +#define XENDISPL_FIELD_CTRL_CHANNEL   "ctrl-channel"
> > > > > +#define XENDISPL_FIELD_EVT_RING_REF   "event-ring-ref"
> > > > > +#define XENDISPL_FIELD_EVT_CHANNEL    "event-channel"
> > > > > +#define XENDISPL_FIELD_RESOLUTION     "resolution"
> > > > > +
> > > > > +#define XENDISPL_FEATURE_BE_ALLOC     "be_alloc"
> > > > > +
> > > > > +/*
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *                          STATUS RETURN CODES
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *
> > > > > + * Status return code is zero on success and -XEN_EXX on failure.
> > > > > + *
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *                              Assumptions
> > > > > + 
> > > > > ******************************************************************************
> > > > > + * o usage of grant reference 0 as invalid grant reference:
> > > > > + *   grant reference 0 is valid, but never exposed to a PV driver,
> > > > > + *   because of the fact it is already in use/reserved by the PV 
> > > > > console.
> > > > > + * o all references in this document to page sizes must be treated
> > > > > + *   as pages of size XEN_PAGE_SIZE unless otherwise noted.
> > > > > + *
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *       Description of the protocol between frontend and backend 
> > > > > driver
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *
> > > > > + * The two halves of a Para-virtual display driver communicate with
> > > > > + * each other using shared pages and event channels.
> > > > > + * Shared page contains a ring with request/response packets.
> > > > > + *
> > > > > + * All reserved fields in the structures below must be 0.
> > > > > + * Display buffers's cookie of value 0 treated as invalid.
> > > > > + * Framebuffer's cookie of value 0 treated as invalid.
> > > > > + *
> > > > > + *---------------------------------- Requests 
> > > > > ---------------------------------
> > > > > + *
> > > > > + * All requests/responses, which are not connector specific, must be 
> > > > > sent over
> > > > > + * control ring of the connector with index 0.
> > > > > + *
> > > > > + * For all request/response/event packets that use cookies:
> > > > > + *   dbuf_cookie - uint64_t, unique to guest domain value used by 
> > > > > the backend
> > > > > + *     to map remote display buffer to its local one
> > > > > + *   fb_cookie - uint64_t, unique to guest domain value used by the 
> > > > > backend
> > > > > + *     to map remote framebuffer to its local one
> > > > > + *
> > > > > + * All request packets have the same length (64 octets)
> > > > > + * All request packets have common header:
> > > > > + *         0                1                 2               3      
> > > > >   octet
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |               id                |    operation   |   reserved   
> > > > >   | 4
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + *   id - uint16_t, private guest value, echoed in response
> > > > > + *   operation - uint8_t, operation code, XENDISPL_OP_???
> > > > > + *
> > > > > + * Request dbuf creation - request creation of a display buffer.
> > > > > + *         0                1                 2               3      
> > > > >   octet
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |               id                |_OP_DBUF_CREATE |   reserved   
> > > > >   | 4
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                       dbuf_cookie low 32-bit                    
> > > > >   | 12
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                       dbuf_cookie high 32-bit                   
> > > > >   | 16
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                               width                             
> > > > >   | 20
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                               height                            
> > > > >   | 24
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                                bpp                              
> > > > >   | 28
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             buffer_sz                           
> > > > >   | 32
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                               flags                             
> > > > >   | 36
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                           gref_directory                        
> > > > >   | 40
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 44
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * 
> > > > > |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 64
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + *
> > > > > + * Must be sent over control ring of the connector with index 0.
> > > > > + *
> > > > > + * width - uint32_t, width in pixels
> > > > > + * height - uint32_t, height in pixels
> > > > Why? Isn't that in the 'resolution' XenBus entry?
> > > It can be bigger that the resolution, for example
> > > if scaling will take place.
> > How would you reflect the scaling part of this? Is that something
> > that is assumed if the XenBus resolution value < widthxheight values?
> As in the above example with back utilizing an SW compositor,
> scaling will be done by the backend, front nows nothing
> about the destiny of the buffers it wants to show
> So, no need to worry about widthXheightXdepth of the buffers
> > > > If not, why even have the 'resolution' field?
> > > The confusion comes from the fact that the resolution is visible area:
> > > will state that clearly.
> > > > And also - what if the width or height are bigger than 'resolution'?
> > > > Should -EINVAL be returned?
> > > > 
> > > no problem here: we can have buffers bigger than visible area
> > > > > + * bpp - uint32_t, bits per pixel
> > > > > + * buffer_sz - uint32_t, buffer size to be allocated, octets
> > > > > + * flags - uint32_t, flags of the operation
> > > > > + *   o XENDISPL_DBUF_FLG_REQ_ALLOC - if set, then backend is 
> > > > > requested
> > > > > + *     to allocate the buffer with the parameters provided in this 
> > > > > request.
> > > > > + *     Page directory is handled as follows:
> > > > > + *       Frontend on request:
> > > > > + *         o allocates pages for the directory
> > > > > + *         o grants permissions for the pages of the directory
> > > > > + *         o sets gref_dir_next_page fields
> > > > > + *       Backend on response:
> > > > > + *         o grants permissions for the pages of the buffer allocated
> > > > <scratches his head>
> > > > > + *         o fills in page directory with grant references
> > > > The backend provides the pages instead of the frontend? But you said
> > > > 'allocated pages for the directory' in the frontned part - and since you
> > > > say 'pages' that means more than one? Or did you mean 'the 
> > > > gref_directory'
> > > > page and the 'gref_dir_next_page' pages? You may want to be explicit.
> > > > 
> > > sure, I will state it clearly that only directory pages
> > > are allocated: gref_directory + gref_dir_next_page(s)
> > Thx
> > > > And what if the 'flags' is zero?
> > > it would mean that even that the backend can allocate buffers
> > > for us we don't want it to do so, we will allocate on our own:
> > > flag is not set
> > > > Or 0x314? Perhaps also mention
> > > > the default one (0 I presume) which would make the backend map
> > > > the frontend pages provided in 'gref_directory'?
> > > yes, I'll put a note on defaults
> > Awesome!
> > > > > + * gref_directory - grant_ref_t, a reference to the first shared page
> > > > > + *   describing shared buffer references. At least one page exists. 
> > > > > If shared
> > > > > + *   buffer size  (buffer_sz) exceeds what can be addressed by this 
> > > > > single page,
> > > >                      ^- extra space
> > > done
> > > > > + *   then reference to the next page must be supplied (see 
> > > > > gref_dir_next_page
> > > > > + *   below)
> > > > > + */
> > > > What are some of the return errors ? Would it make sense to mention
> > > > some?
> > > not sure, this way will dictate implementation details,
> > > but we are defining protocol
> > True to an extent.
> And that extent makes me believe we shouldn't dictate
> error codes here. POSIX error codes are (sometimes :)
> more than descriptive )
> > > > What to for example if there are multiple  _OP_DBUF_CREATE
> > > > with the same dbuf_cookie but with different width/height?
> > > it will be an error, I will clearly state this:
> > >   * An attempt to create multiple display buffers with the same 
> > > dbuf_cookie
> > > is
> > >   * an error. dbuf_cookie can be re-used after destroying the 
> > > corresponding
> > >   * display buffer.
> > May also want to say what error value it should be. -EAGAIN? No probably 
> > something
> > different.
> As above, I would prefer to not put anything

OK.
> > > > > +
> > > > > +#define XENDISPL_DBUF_FLG_REQ_ALLOC       0x0001
> > > > > +
> > > > > +struct xendispl_dbuf_create_req {
> > > > > +    uint64_t dbuf_cookie;
> > > > > +    uint32_t width;
> > > > > +    uint32_t height;
> > > > > +    uint32_t bpp;
> > > > > +    uint32_t buffer_sz;
> > > > > +    uint32_t flags;
> > > > > +    grant_ref_t gref_directory;
> > > > > +};
> > > > > +
> > > > > +/*
> > > > > + * Shared page for XENDISPL_OP_DBUF_CREATE buffer descriptor 
> > > > > (gref_directory in
> > > > > + * the request) employs a list of pages, describing all pages of the 
> > > > > shared
> > > > > + * data buffer:
> > > > > + *         0                1                 2               3      
> > > > >   octet
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                        gref_dir_next_page                       
> > > > >   | 4
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                              gref[0]                            
> > > > >   | 8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * 
> > > > > |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                              gref[i]                            
> > > > >   | i*4+8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * 
> > > > > |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             gref[N - 1]                         
> > > > >   | N*4+8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + *
> > > > > + * gref_dir_next_page - grant_ref_t, reference to the next page 
> > > > > describing
> > > > > + *   page directory. Must be 0 if there are no more pages in the 
> > > > > list.
> > > > > + * gref[i] - grant_ref_t, reference to a shared page of the buffer
> > > > > + *   allocated at XENDISPL_OP_DBUF_CREATE
> > > > > + *
> > > > > + * Number of grant_ref_t entries in the whole page directory is not
> > > > > + * passed, but instead can be calculated as:
> > > > > + *   num_grefs_total = (XENDISPL_OP_DBUF_CREATE.buffer_sz + 
> > > > > XEN_PAGE_SIZE - 1) /
> > > > > + *       XEN_PAGE_SIZE
> > > > > + */
> > > > > +
> > > > > +struct xendispl_page_directory {
> > > > > +    grant_ref_t gref_dir_next_page;
> > > > > +    grant_ref_t gref[1]; /* Variable length */
> > > > > +};
> > > > > +
> > > > > +/*
> > > > > + * Request dbuf destruction - destroy a previously allocated display 
> > > > > buffer:
> > > > > + *         0                1                 2               3      
> > > > >   octet
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |               id                |_OP_DBUF_DESTROY|   reserved   
> > > > >   | 4
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                       dbuf_cookie low 32-bit                    
> > > > >   | 12
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                       dbuf_cookie high 32-bit                   
> > > > >   | 16
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 20
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * 
> > > > > |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 64
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + *
> > > > > + * Must be sent over control ring of the connector with index 0.
> > > > > + */
> > > > > +
> > > > > +struct xendispl_dbuf_destroy_req {
> > > > > +    uint64_t dbuf_cookie;
> > > > > +};
> > > > > +
> > > > > +/*
> > > > > + * Request framebuffer attachment - request attachment of a 
> > > > > framebuffer to
> > > > > + * previously created display buffer.
> > > > > + *         0                1                 2               3      
> > > > >   octet
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |               id                | _OP_FB_ATTACH  |   reserved   
> > > > >   | 4
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                       dbuf_cookie low 32-bit                    
> > > > >   | 12
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                       dbuf_cookie high 32-bit                   
> > > > >   | 16
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                        fb_cookie low 32-bit                     
> > > > >   | 20
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                        fb_cookie high 32-bit                    
> > > > >   | 24
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                               width                             
> > > > >   | 28
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                               height                            
> > > > >   | 32
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                            pixel_format                         
> > > > >   | 36
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 40
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * 
> > > > > |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 64
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + *
> > > > > + * Must be sent over control ring of the connector with index 0.
> > > > > + *
> > > > > + * width - uint32_t, width in pixels
> > > > > + * height - uint32_t, height in pixels
> > > > Why? The _OP_DBUF_CREATE already specified the height/width. Why have 
> > > > this?
> > > > 
> > > > Or are you thinking to have an smaller (or bigger?) resolution 
> > > > framebuffer
> > > > than the display? I suppose you can do that which would imply that the 
> > > > display
> > > > would switch modes? Perhaps mention this?
> > > > 
> > > > Also what if these values are bigger (or lesser) than 'resolution' ?
> > > > 
> > > > 
> > > > > + * pixel_format - uint32_t, pixel format of the framebuffer, FOURCC 
> > > > > code
> > > > You did not mention the fb_cookie?
> > > I have a common section:
> > >   * For all request/response/event packets that use cookies:
> > >   *   dbuf_cookie - uint64_t, unique to guest domain value used by the
> > > backend
> > >   *     to map remote display buffer to its local one
> > >   *   fb_cookie - uint64_t, unique to guest domain value used by the 
> > > backend
> > >   *     to map remote framebuffer to its local one
> > > But it is in the "Requests" section - I'll pull it out to be common for 
> > > all
> > Aaaah!
> > > > > + */
> > > > > +
> > > > > +struct xendispl_fb_attach_req {
> > > > > +    uint64_t dbuf_cookie;
> > > > > +    uint64_t fb_cookie;
> > > > > +    uint32_t width;
> > > > > +    uint32_t height;
> > > > > +    uint32_t pixel_format;
> > > > > +};
> > > > > +
> > > > > +/*
> > > > > + * Request framebuffer detach - detach a previously
> > > > > + * attached framebuffer from the display buffer in request:
> > > > > + *         0                1                 2               3      
> > > > >   octet
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |               id                |  _OP_FB_DETACH |   reserved   
> > > > >   | 4
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                        fb_cookie low 32-bit                     
> > > > >   | 12
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                        fb_cookie high 32-bit                    
> > > > >   | 16
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 20
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * 
> > > > > |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 64
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + *
> > > > > + * Must be sent over control ring of the connector with index 0.
> > > > > + */
> > > > > +
> > > > > +struct xendispl_fb_detach_req {
> > > > > +    uint64_t fb_cookie;
> > > > > +};
> > > > > +
> > > > > +/*
> > > > > + * Request configuration set/reset - request to set or reset
> > > > > + * the configuration/mode of the display:
> > > > > + *         0                1                 2               3      
> > > > >   octet
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |               id                | _OP_SET_CONFIG |   reserved   
> > > > >   | 4
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                        fb_cookie low 32-bit                     
> > > > >   | 12
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                        fb_cookie high 32-bit                    
> > > > >   | 16
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                                 x                               
> > > > >   | 20
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                                 y                               
> > > > >   | 24
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                               width                             
> > > > >   | 28
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                               height                            
> > > > >   | 32
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                                bpp                              
> > > > >   | 40
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 44
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * 
> > > > > |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 64
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + *
> > > > > + * Pass all zeros to reset, otherwise command is treated as
> > > > > + * configuration set.
> > > > All zeros? Including fb_cookie?
> > > Yes, fb_cookie is 0 when we disable the display, as at this point there
> > > could be no fb at all (all released by that time)
> > > > > + * If this is a set configuration request then framebuffer's cookie 
> > > > > tells
> > > > Not sure if the first part of the sentence is needed. This is after all
> > > > the section that talks about setting configurations.
> > > ok, will remove it
> > > > > + * the display which framebuffer/dbuf must be displayed while 
> > > > > enabling display
> > > > > + * (applying configuration).
> > > > Can you disable an display without changing this?
> > > You pass ALL zeros, including fb_cookie to disable/reset.
> > > > > + *
> > > > > + * x - uint32_t, starting position in pixels by X axis
> > > > > + * y - uint32_t, starting position in pixels by Y axis
> > > > Which is bound by 'resolution' ? Or by the display command?
> > > these are limited by the "resolution" - will state that:
> > >   * x, y, width and height are bound by the connector resolution and must 
> > > not
> > >   * exceed it.
> > Thanks!
> BTW, this is the only place ATM where we stick to resolution
> from XenStore... And it will clearly be stated

/me nods
> > > > > + * width - uint32_t, width in pixels
> > > > > + * height - uint32_t, height in pixels
> > > > > + * bpp - uint32_t, bits per pixel
> > > > Shouldn't there be an stride as well?
> > > no, stride is kind of implementation detail which shouldn't
> > > be in the protocol
> > > > > + */
> > > > > +
> > > > > +struct xendispl_set_config_req {
> > > > > +    uint64_t fb_cookie;
> > > > > +    uint32_t x;
> > > > > +    uint32_t y;
> > > > > +    uint32_t width;
> > > > > +    uint32_t height;
> > > > > +    uint32_t bpp;
> > > > > +};
> > > > > +
> > > > > +/*
> > > > > + * Request page flip - request to flip a page identified by the 
> > > > > framebuffer
> > > > > + * cookie:
> > > > > + *         0                1                 2               3      
> > > > >   octet
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |               id                | _OP_PG_FLIP    |   reserved   
> > > > >   | 4
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                        fb_cookie low 32-bit                     
> > > > >   | 12
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                        fb_cookie high 32-bit                    
> > > > >   | 16
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 20
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * 
> > > > > |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 64
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + */
> > > > > +
> > > > > +struct xendispl_page_flip_req {
> > > > > +    uint64_t fb_cookie;
> > > > > +};
> > > > > +
> > > > > +/*
> > > > > + *---------------------------------- Responses 
> > > > > --------------------------------
> > > > > + *
> > > > > + * All response packets have the same length (64 octets)
> > > > > + *
> > > > > + * All response packets have common header:
> > > > > + *         0                1                 2               3      
> > > > >   octet
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |               id                |            reserved           
> > > > >   | 4
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                              status                             
> > > > >   | 8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 12
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * 
> > > > > |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 64
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + *
> > > > > + * id - uint16_t, private guest value, echoed from request
> > > > > + * status - int32_t, response status, zero on success and -XEN_EXX 
> > > > > on failure
> > > > > + *
> > > > > + *----------------------------------- Events 
> > > > > ----------------------------------
> > > > > + *
> > > > > + * Events are sent via a shared page allocated by the front and 
> > > > > propagated by
> > > > > + *   event-channel/event-ring-ref XenStore entries
> > > > > + * All event packets have the same length (64 octets)
> > > > > + * All event packets have common header:
> > > > > + *         0                1                 2               3      
> > > > >   octet
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |               id                |      type      |   reserved   
> > > > >   | 4
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + *
> > > > > + * id - uint16_t, event id, may be used by front
> > > > > + * type - uint8_t, type of the event
> > > > > + *
> > > > > + *
> > > > > + * Page flip complete event - event from back to front on page flip 
> > > > > completed:
> > > > > + *         0                1                 2               3      
> > > > >   octet
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |               id                |   _EVT_PG_FLIP |   reserved   
> > > > >   | 4
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 8
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                        fb_cookie low 32-bit                     
> > > > >   | 12
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                        fb_cookie high 32-bit                    
> > > > >   | 16
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 20
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * 
> > > > > |/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/|
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + * |                             reserved                            
> > > > >   | 64
> > > > > + * 
> > > > > +----------------+----------------+----------------+----------------+
> > > > > + */
> > > > > +
> > > > > +struct xendispl_pg_flip_evt {
> > > > > +    uint64_t fb_cookie;
> > > > > +};
> > > > > +
> > > > > +struct xendispl_req {
> > > > > +    uint16_t id;
> > > > > +    uint8_t operation;
> > > > > +    uint8_t reserved[5];
> > > > > +    union {
> > > > > +        struct xendispl_dbuf_create_req dbuf_create;
> > > > > +        struct xendispl_dbuf_destroy_req dbuf_destroy;
> > > > > +        struct xendispl_fb_attach_req fb_attach;
> > > > > +        struct xendispl_fb_detach_req fb_detach;
> > > > > +        struct xendispl_set_config_req set_config;
> > > > > +        struct xendispl_page_flip_req pg_flip;
> > > > > +        uint8_t reserved[56];
> > > > > +    } op;
> > > > > +};
> > > > > +
> > > > > +struct xendispl_resp {
> > > > > +    uint16_t id;
> > > > > +    uint8_t operation;
> > > > > +    uint8_t reserved;
> > > > > +    int32_t status;
> > > > > +    uint8_t reserved1[56];
> > > > > +};
> > > > > +
> > > > > +struct xendispl_evt {
> > > > > +    uint16_t id;
> > > > > +    uint8_t type;
> > > > > +    uint8_t reserved[5];
> > > > > +    union {
> > > > > +        struct xendispl_pg_flip_evt pg_flip;
> > > > > +        uint8_t reserved[56];
> > > > > +    } op;
> > > > > +};
> > > > > +
> > > > > +DEFINE_RING_TYPES(xen_displif, struct xendispl_req, struct 
> > > > > xendispl_resp);
> > > > > +
> > > > > +/*
> > > > > + 
> > > > > ******************************************************************************
> > > > > + *                        Back to front events delivery
> > > > > + 
> > > > > ******************************************************************************
> > > > > + * In order to deliver asynchronous events from back to front a 
> > > > > shared page is
> > > > > + * allocated by front and its grefs propagated to back via XenStore 
> > > > > entries
> > > > > + * (event-XXX).
> > > > ?
> > > > 
> > > > You mean event-channel ? Or control-event-channel?
> > > event-channel which is used for async events from back to front,
> > > control is always used to pass req/resp.
> > > > > + * This page has a common header used by both front and back to 
> > > > > synchronize
> > > > > + * access and control event's ring buffer, while back being a 
> > > > > producer of the
> > > > > + * events and front being a consumer. The rest of the page after the 
> > > > > header
> > > > > + * is used for event packets.
> > > > > + *
> > > > > + * Upon reception of an event(s) front may confirm its reception
> > > > > + * for either each event, group of events or none.
> > > > > + */
> > > > > +
> > > > > +struct xendispl_event_page {
> > > > > +    uint32_t in_cons;
> > > > > +    uint32_t in_prod;
> > > > > +    uint8_t reserved[56];
> > > > > +};
> > > > > +
> > > > > +#define XENDISPL_EVENT_PAGE_SIZE 4096
> > > > > +#define XENDISPL_IN_RING_OFFS (sizeof(struct xendispl_event_page))
> > > > > +#define XENDISPL_IN_RING_SIZE (XENDISPL_EVENT_PAGE_SIZE - 
> > > > > XENDISPL_IN_RING_OFFS)
> > > > > +#define XENDISPL_IN_RING_LEN (XENDISPL_IN_RING_SIZE / sizeof(struct 
> > > > > xendispl_evt))
> > > > > +#define XENDISPL_IN_RING(page) \
> > > > > +     ((struct xendispl_evt *)((char *)(page) + 
> > > > > XENDISPL_IN_RING_OFFS))
> > > > > +#define XENDISPL_IN_RING_REF(page, idx) \
> > > > > +     (XENDISPL_IN_RING((page))[(idx) % XENDISPL_IN_RING_LEN])
> > > > Why not use the ring.h macros?
> > > well, this is the way the same structs are defined for fbif/kbif
> > > and I am not sure what can be re-used here from ring.h as it is
> > > designed to work with req/resp, not events.
> > > > Especially as the top of this talks about 
> > > > "RING_FINAL_CHECK_FOR_REQUESTS"?
> > > I can remove this
> > > > > +
> > > > > +#endif /* __XEN_PUBLIC_IO_DISPLIF_H__ */
> > > > Could we also have this header in:
> > > sure, I will add the same to sndif as well
> > > > /*
> > > >    * Local variables:
> > > >    * mode: C
> > > >    * c-file-style: "BSD"
> > > >    * c-basic-offset: 4
> > > >    * tab-width: 4
> > > >    * indent-tabs-mode: nil
> > > >    * End:
> > > >    */
> > > > 
> > > > please?
> > > > > -- 
> > > > > 2.7.4
> > > > > 
> > > [1] http://marc.info/?l=xen-devel&m=142167153324052&w=4
> > > 
> Thank you,
> Oleksandr

_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
https://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.