|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |