
/** @file
  XenBus protocol to be used between the XenBus bus driver and Xen PV devices.

  DISCLAIMER: the XENBUS_PROTOCOL introduced here is a work in progress, and
  should not be used outside of the EDK II tree.

  This protocol provide the necessary for a Xen PV driver frontend to
  communicate with the bus driver, and perform several task to
  initialize/shutdown a PV device and perform IO with a PV backend.

  Copyright (C) 2014, Citrix Ltd.

  This program and the accompanying materials
  are licensed and made available under the terms and conditions of the BSD License
  which accompanies this distribution.  The full text of the license may be found at
  http://opensource.org/licenses/bsd-license.php

  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.

**/

#ifndef __PROTOCOL_XENBUS_H__
#define __PROTOCOL_XENBUS_H__

#define XENBUS_PROTOCOL_GUID \
  {0x3d3ca290, 0xb9a5, 0x11e3, {0xb7, 0x5d, 0xb8, 0xac, 0x6f, 0x7d, 0x65, 0xe6}}

///
/// Forward declaration
///
typedef struct _XENBUS_PROTOCOL XENBUS_PROTOCOL;

typedef enum xenbus_state XenBusState;

typedef struct
{
  UINT32 Id;
} XENSTORE_TRANSACTION;

#define XST_NIL ((XENSTORE_TRANSACTION *) NULL)

typedef enum {
  XENSTORE_STATUS_SUCCESS = 0,
  XENSTORE_STATUS_FAIL,
  XENSTORE_STATUS_EINVAL,
  XENSTORE_STATUS_EACCES,
  XENSTORE_STATUS_EEXIST,
  XENSTORE_STATUS_EISDIR,
  XENSTORE_STATUS_ENOENT,
  XENSTORE_STATUS_ENOMEM,
  XENSTORE_STATUS_ENOSPC,
  XENSTORE_STATUS_EIO,
  XENSTORE_STATUS_ENOTEMPTY,
  XENSTORE_STATUS_ENOSYS,
  XENSTORE_STATUS_EROFS,
  XENSTORE_STATUS_EBUSY,
  XENSTORE_STATUS_EAGAIN,
  XENSTORE_STATUS_EISCONN,
  XENSTORE_STATUS_E2BIG
} XENSTORE_STATUS;


#include <IndustryStandard/Xen/grant_table.h>
#include <IndustryStandard/Xen/event_channel.h>

///
/// Function prototypes
///

/**
  Get the contents of the node Node of the PV device. Returns the contents in
  *Result which should be freed after use.

  @param This           A pointer to XENBUS_PROTOCOL instance.
  @param Transaction    The XenStore transaction covering this request.
  @param Node           The basename of the file to read.
  @param Result         The returned contents from this file.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.

  @note The results buffer is malloced and should be free'd by the
        caller.
**/
typedef
XENSTORE_STATUS
(EFIAPI *XENBUS_XS_READ)(
  IN  XENBUS_PROTOCOL       *This,
  IN  CONST XENSTORE_TRANSACTION *Transaction,
  IN  CONST CHAR8           *Node,
  OUT VOID                  **Result
  );

/**
  Get the contents of the node Node of the PV device's backend. Returns the
  contents in *Result which should be freed after use.

  @param This           A pointer to XENBUS_PROTOCOL instance.
  @param Transaction    The XenStore transaction covering this request.
  @param Node           The basename of the file to read.
  @param Result         The returned contents from this file.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.

  @note The results buffer is malloced and should be free'd by the
        caller.
**/
typedef
XENSTORE_STATUS
(EFIAPI *XENBUS_XS_BACKEND_READ)(
  IN  XENBUS_PROTOCOL       *This,
  IN  CONST XENSTORE_TRANSACTION *Transaction,
  IN  CONST CHAR8           *Node,
  OUT VOID                  **Result
  );

/**
  Print formatted write to a XenStore node.

  @param This             A pointer to XENBUS_PROTOCOL instance.
  @param Transaction      The XenStore transaction covering this request.
  @param Directory        The dirname of the path to read.
  @param Node             The basename of the path to read.
  @param Format           AsciiSPrint format string followed by a variable number
                          of arguments.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of write failure.
**/
typedef
XENSTORE_STATUS
(EFIAPI *XENBUS_XS_PRINTF) (
  IN XENBUS_PROTOCOL        *This,
  IN CONST XENSTORE_TRANSACTION *Transaction,
  IN CONST CHAR8            *Directory,
  IN CONST CHAR8            *Node,
  IN CONST CHAR8            *Format,
  ...
  );

/**
  Remove a node or directory (directories must be empty) of the PV driver's
  subdirectory.

  @param This           A pointer to XENBUS_PROTOCOL instance.
  @param Transaction    The XenStore transaction covering this request.
  @param Node           The basename of the node to remove.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.
**/
typedef
XENSTORE_STATUS
(EFIAPI *XENBUS_XS_REMOVE) (
  IN XENBUS_PROTOCOL        *This,
  IN CONST XENSTORE_TRANSACTION *Transaction,
  IN CONST CHAR8            *Node
  );

/**
  Start a transaction.

  Changes by others will not be seen during the lifetime of this
  transaction, and changes will not be visible to others until it
  is committed (XsTransactionEnd).

  @param This         A pointer to XENBUS_PROTOCOL instance.
  @param Transaction  The returned transaction.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.
**/
typedef
XENSTORE_STATUS
(EFIAPI *XENBUS_XS_TRANSACTION_START)(
  IN  XENBUS_PROTOCOL       *This,
  OUT XENSTORE_TRANSACTION  *Transaction
  );

/**
  End a transaction.

  @param This         A pointer to XENBUS_PROTOCOL instance.
  @param Transaction  The transaction to end/commit.
  @param Abort        If TRUE, the transaction is discarded
                      instead of committed.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.
**/
typedef
XENSTORE_STATUS
(EFIAPI *XENBUS_XS_TRANSACTION_END) (
  IN XENBUS_PROTOCOL        *This,
  IN CONST XENSTORE_TRANSACTION *Transaction,
  IN BOOLEAN                Abort
  );

/**
  Set a new state for the frontend of the PV driver.

  @param This         A pointer to XENBUS_PROTOCOL instance.
  @param Transaction  The transaction to end/commit.
  @param State        The new state to apply.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.
**/
typedef
XENSTORE_STATUS
(EFIAPI *XENBUS_SET_STATE)(
  IN XENBUS_PROTOCOL        *This,
  IN CONST XENSTORE_TRANSACTION *Transaction,
  IN XenBusState            State
  );

/**
  Grant access to the page Frame to the domain DomainId.

  @param This       A pointer to XENBUS_PROTOCOL instance.
  @param DomainId   ID of the domain to grant acces to.
  @param Frame      Frame Number of the page to grant access to.
  @param ReadOnly   Provide read-only or read-write access.
  @param RefPtr     Reference number of the grant will be written to this pointer.
**/
typedef
EFI_STATUS
(EFIAPI *XENBUS_GRANT_ACCESS)(
  IN  XENBUS_PROTOCOL *This,
  IN  domid_t         DomainId,
  IN  UINTN           Frame,
  IN  BOOLEAN         ReadOnly,
  OUT grant_ref_t     *refp
  );

/**
  End access to grant Ref, previously return by XenBusGrantAccess.

  @param This       A pointer to XENBUS_PROTOCOL instance.
  @param Ref        Reference numeber of a grant previously returned by
                    XenBusGrantAccess.
**/
typedef
EFI_STATUS
(EFIAPI *XENBUS_GRANT_END_ACCESS)(
  IN XENBUS_PROTOCOL  *This,
  IN grant_ref_t      Ref
  );

/**
  Allocate a port that can be bind from domain DomainId.

  @param This       A pointer to the XENBUS_PROTOCOL.
  @param DomainId   The domain ID that can bind the newly allocated port.
  @param Port       A pointer to a evtchn_port_t that will contain the newly
                    allocated port.

  @retval UINT32    The return value from the hypercall, 0 if success.
**/
typedef
UINT32
(EFIAPI *XENBUS_EVENT_CHANNEL_ALLOCATE) (
  IN  XENBUS_PROTOCOL *This,
  IN  domid_t         DomainId,
  OUT evtchn_port_t   *Port
  );

/**
  Send an event to the remote end of the channel whose local endpoint is Port.

  @param This       A pointer to the XENBUS_PROTOCOL.
  @param Port       Local port to the the event from.

  @retval UINT32    The return value from the hypercall, 0 if success.
**/
typedef
UINT32
(EFIAPI *XENBUS_EVENT_CHANNEL_NOTIFY) (
  IN XENBUS_PROTOCOL  *This,
  IN evtchn_port_t    Port
  );

/**
  Close a local event channel Port.

  @param This       A pointer to the XENBUS_PROTOCOL.
  @param Port       The event channel to close.

  @retval UINT32    The return value from the hypercall, 0 if success.
**/
typedef
UINT32
(EFIAPI *XENBUS_EVENT_CHANNEL_CLOSE) (
  IN XENBUS_PROTOCOL  *This,
  IN evtchn_port_t    Port
  );

/**
  Register a XenStore watch.

  XenStore watches allow a client to wait for changes to an object in the
  XenStore.

  @param This       A pointer to the XENBUS_PROTOCOL.
  @param Node       The basename of the path to watch.
  @param Token      A token.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of write failure.  EEXIST errors from the
           XenStore are suppressed, allowing multiple, physically different,
           xenbus_watch objects, to watch the same path in the XenStore.
**/
typedef
XENSTORE_STATUS
(EFIAPI *XENBUS_REGISTER_WATCH) (
  IN  XENBUS_PROTOCOL *This,
  IN  CONST CHAR8     *Node,
  OUT VOID            **Token
  );

/**
  Register a XenStore watch on a backend's node.

  XenStore watches allow a client to wait for changes to an object in the
  XenStore.

  @param This       A pointer to the XENBUS_PROTOCOL.
  @param Node       The basename of the path to watch.
  @param Token      A token.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of write failure.  EEXIST errors from the
           XenStore are suppressed, allowing multiple, physically different,
           xenbus_watch objects, to watch the same path in the XenStore.
**/
typedef
XENSTORE_STATUS
(EFIAPI *XENBUS_REGISTER_WATCH_BACKEND) (
  IN  XENBUS_PROTOCOL *This,
  IN  CONST CHAR8     *Node,
  OUT VOID            **Token
  );

/**
  Unregister a XenStore watch.

  @param This   A pointer to the XENBUS_PROTOCOL.
  @param Token  An token previously returned by a successful
                call to RegisterWatch ().
**/
typedef
VOID
(EFIAPI *XENBUS_UNREGISTER_WATCH) (
  IN XENBUS_PROTOCOL  *This,
  IN VOID             *Token
  );

/**
  Block until the node watch by Token change.

  @param This   A pointer to the XENBUS_PROTOCOL.
  @param Token  An token previously returned by a successful
                call to RegisterWatch or RegisterWatchBackend.

  @return  On success, XENSTORE_STATUS_SUCCESS. Otherwise an errno value
           indicating the type of failure.
**/
typedef
XENSTORE_STATUS
(EFIAPI *XENBUS_WAIT_FOR_WATCH) (
  IN XENBUS_PROTOCOL  *This,
  IN VOID             *Token
  );


///
/// Protocol structure
///
/// DISCLAIMER: the XENBUS_PROTOCOL introduced here is a work in progress, and
/// should not be used outside of the EDK II tree.
///
struct _XENBUS_PROTOCOL {
  XENBUS_XS_READ                XsRead;
  XENBUS_XS_BACKEND_READ        XsBackendRead;
  XENBUS_XS_PRINTF              XsPrintf;
  XENBUS_XS_REMOVE              XsRemove;
  XENBUS_XS_TRANSACTION_START   XsTransactionStart;
  XENBUS_XS_TRANSACTION_END     XsTransactionEnd;
  XENBUS_SET_STATE              SetState;

  XENBUS_GRANT_ACCESS           GrantAccess;
  XENBUS_GRANT_END_ACCESS       GrantEndAccess;

  XENBUS_EVENT_CHANNEL_ALLOCATE EventChannelAllocate;
  XENBUS_EVENT_CHANNEL_NOTIFY   EventChannelNotify;
  XENBUS_EVENT_CHANNEL_CLOSE    EventChannelClose;

  XENBUS_REGISTER_WATCH         RegisterWatch;
  XENBUS_REGISTER_WATCH_BACKEND RegisterWatchBackend;
  XENBUS_UNREGISTER_WATCH       UnregisterWatch;
  XENBUS_WAIT_FOR_WATCH         WaitForWatch;
  //
  // Protocol data fields
  //
  CONST CHAR8                   *Type;
  UINT16                        DeviceId;
  CONST CHAR8                   *Node;
  CONST CHAR8                   *Backend;
};

extern EFI_GUID gXenBusProtocolGuid;

#endif
