/** @file
  BlockFront functions and types declarations.

  Copyright (C) 2014, Citrix Ltd.

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/
#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
  );
