/** @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
  );