/** @file
  BlockFront functions and types declarations.

  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.

**/
#include "XenPvBlkDxe.h"

#include <IndustryStandard/Xen/event_channel.h>
#include <IndustryStandard/Xen/io/blkif.h>

typedef struct _XEN_BLOCK_FRONT_DEVICE XEN_BLOCK_FRONT_DEVICE;
typedef struct _XEN_BLOCK_FRONT_IO XEN_BLOCK_FRONT_IO;

struct _XEN_BLOCK_FRONT_IO
{
  XEN_BLOCK_FRONT_DEVICE  *Dev;
  UINT8                   *Buffer;
  UINTN                   Size;
  UINTN                   Sector; ///< 512 bytes sector.

  grant_ref_t             GrantRef[BLKIF_MAX_SEGMENTS_PER_REQUEST];
  INT32                   NumRef;

  EFI_STATUS              Status;
};

typedef struct
{
  UINT64    Sectors;
  UINT32    SectorSize;
  UINT32    VDiskInfo;
  BOOLEAN   ReadWrite;
  BOOLEAN   CdRom;
  BOOLEAN   FeatureBarrier;
  BOOLEAN   FeatureFlushCache;
} XEN_BLOCK_FRONT_MEDIA_INFO;

#define XEN_BLOCK_FRONT_SIGNATURE SIGNATURE_32 ('X', 'p', 'v', 'B')
struct _XEN_BLOCK_FRONT_DEVICE {
  UINT32                      Signature;
  EFI_BLOCK_IO_PROTOCOL       BlockIo;
  domid_t                     DomainId;

  blkif_front_ring_t          Ring;
  grant_ref_t                 RingRef;
  evtchn_port_t               EventChannel;
  blkif_vdev_t                DeviceId;

  CONST CHAR8                 *NodeName;
  XEN_BLOCK_FRONT_MEDIA_INFO  MediaInfo;

  VOID                        *StateWatchToken;

  XENBUS_PROTOCOL             *XenBusIo;
};

#define XEN_BLOCK_FRONT_FROM_BLOCK_IO(b) \
  CR (b, XEN_BLOCK_FRONT_DEVICE, BlockIo, XEN_BLOCK_FRONT_SIGNATURE)

EFI_STATUS
XenPvBlockFrontInitialization (
  IN  XENBUS_PROTOCOL  *XenBusIo,
  IN  CONST CHAR8      *NodeName,
  OUT XEN_BLOCK_FRONT_DEVICE **DevPtr
  );

VOID
XenPvBlockFrontShutdown (
  IN XEN_BLOCK_FRONT_DEVICE *Dev
  );

VOID
XenPvBlockAsyncIo (
  IN OUT XEN_BLOCK_FRONT_IO *IoData,
  IN     BOOLEAN            IsWrite
  );

EFI_STATUS
XenPvBlockIo (
  IN OUT XEN_BLOCK_FRONT_IO *IoData,
  IN     BOOLEAN            IsWrite
  );

VOID
XenPvBlockAsyncIoPoll (
  IN XEN_BLOCK_FRONT_DEVICE *Dev
  );

VOID
XenPvBlockSync (
  IN XEN_BLOCK_FRONT_DEVICE *Dev
  );
