/** @file
  EFI_TAPE_IO_PROTOCOL as defined in the UEFI 2.0.
  Provide services to control and access a tape device.

Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __EFI_TAPE_IO_PROTOCOL_H__
#define __EFI_TAPE_IO_PROTOCOL_H__

#define EFI_TAPE_IO_PROTOCOL_GUID \
  { \
    0x1e93e633, 0xd65a, 0x459e, {0xab, 0x84, 0x93, 0xd9, 0xec, 0x26, 0x6d, 0x18 } \
  }

typedef struct _EFI_TAPE_IO_PROTOCOL EFI_TAPE_IO_PROTOCOL;

typedef struct _EFI_TAPE_HEADER {
  UINT64      Signature;
  UINT32      Revision;
  UINT32      BootDescSize;
  UINT32      BootDescCRC;
  EFI_GUID    TapeGUID;
  EFI_GUID    TapeType;
  EFI_GUID    TapeUnique;
  UINT32      BLLocation;
  UINT32      BLBlocksize;
  UINT32      BLFilesize;
  CHAR8       OSVersion[40];
  CHAR8       AppVersion[40];
  CHAR8       CreationDate[10];
  CHAR8       CreationTime[10];
  CHAR8       SystemName[256]; // UTF-8
  CHAR8       TapeTitle[120];  // UTF-8
  CHAR8       pad[468];        // pad to 1024
} EFI_TAPE_HEADER;

/**
  Reads from the tape.

  @param  This       A pointer to the EFI_TAPE_IO_PROTOCOL instance.
  @param  BufferSize The size of the buffer in bytes pointed to by Buffer.
  @param  Buffer     The pointer to the buffer for data to be read into.

  @retval EFI_SUCCESS           Data was successfully transferred from the media.
  @retval EFI_END_OF_FILE       A filemark was encountered which limited the data
                                transferred by the read operation or the head is positioned
                                just after a filemark.
  @retval EFI_NO_MEDIA          No media is loaded in the device.
  @retval EFI_NOT_READY         The transfer failed since the device was not ready (e.g. not
                                online). The transfer may be retried at a later time.
  @retval EFI_UNSUPPORTED       The device does not support this type of transfer.
  @retval EFI_TIMEOUT           The transfer failed to complete within the timeout specified.
  @retval EFI_MEDIA_CHANGED     The media in the device was changed since the last access.
                                The transfer was aborted since the current position of the
                                media may be incorrect.
  @retval EFI_INVALID_PARAMETER A NULL Buffer was specified with a non-zero
                                BufferSize, or the device is operating in fixed block
                                size mode and the BufferSize was not a multiple of
                                device's fixed block size
  @retval EFI_DEVICE_ERROR      A device error occurred while attempting to transfer data
                                from the media.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TAPE_READ)(
  IN EFI_TAPE_IO_PROTOCOL *This,
  IN OUT UINTN            *BufferSize,
  OUT VOID                *Buffer
  );

/**
  Writes to the tape.

  @param  This       A pointer to the EFI_TAPE_IO_PROTOCOL instance.
  @param  BufferSize Size of the buffer in bytes pointed to by Buffer.
  @param  Buffer     The pointer to the buffer for data to be written from.

  @retval EFI_SUCCESS           Data was successfully transferred to the media.
  @retval EFI_END_OF_MEDIA      The logical end of media has been reached. Data may have
                                been successfully transferred to the media.
  @retval EFI_NO_MEDIA          No media is loaded in the device.
  @retval EFI_NOT_READY         The transfer failed since the device was not ready (e.g. not
                                online). The transfer may be retried at a later time.
  @retval EFI_UNSUPPORTED       The device does not support this type of transfer.
  @retval EFI_TIMEOUT           The transfer failed to complete within the timeout specified.
  @retval EFI_MEDIA_CHANGED     The media in the device was changed since the last access.
                                The transfer was aborted since the current position of the
                                media may be incorrect.
  @retval EFI_WRITE_PROTECTED   The media in the device is write-protected. The transfer
                                was aborted since a write cannot be completed.
  @retval EFI_INVALID_PARAMETER A NULL Buffer was specified with a non-zero
                                BufferSize, or the device is operating in fixed block
                                size mode and the BufferSize was not a multiple of
                                device's fixed block size
  @retval EFI_DEVICE_ERROR      A device error occurred while attempting to transfer data
                                from the media.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TAPE_WRITE)(
  IN EFI_TAPE_IO_PROTOCOL *This,
  IN UINTN                *BufferSize,
  IN VOID                 *Buffer
  );

/**
  Rewinds the tape.

  @param  This A pointer to the EFI_TAPE_IO_PROTOCOL instance.

  @retval EFI_SUCCESS      The media was successfully repositioned.
  @retval EFI_NO_MEDIA     No media is loaded in the device.
  @retval EFI_NOT_READY    Repositioning the media failed since the device was not
                           ready (e.g. not online). The transfer may be retried at a later time.
  @retval EFI_UNSUPPORTED  The device does not support this type of media repositioning.
  @retval EFI_TIMEOUT      Repositioning of the media did not complete within the timeout specified.
  @retval EFI_DEVICE_ERROR A device error occurred while attempting to reposition the media.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TAPE_REWIND)(
  IN EFI_TAPE_IO_PROTOCOL *This
  );

/**
  Positions the tape.

  @param  This      A pointer to the EFI_TAPE_IO_PROTOCOL instance.
  @param  Direction Direction and number of data blocks or filemarks to space over on media.
  @param  Type      Type of mark to space over on media.
                    The following Type marks are mandatory:
                    BLOCK type    : 0
                    FILEMARK type : 1

  @retval EFI_SUCCESS       The media was successfully repositioned.
  @retval EFI_END_OF_MEDIA  Beginning or end of media was reached before the
                            indicated number of data blocks or filemarks were found.
  @retval EFI_NO_MEDIA      No media is loaded in the device.
  @retval EFI_NOT_READY     The reposition failed since the device was not ready (e.g. not
                            online). The reposition may be retried at a later time.
  @retval EFI_UNSUPPORTED   The device does not support this type of repositioning.
  @retval EFI_TIMEOUT       The repositioning failed to complete within the timeout specified.
  @retval EFI_MEDIA_CHANGED The media in the device was changed since the last access.
                            Repositioning the media was aborted since the current
                            position of the media may be incorrect.
  @retval EFI_DEVICE_ERROR  A device error occurred while attempting to reposition the media.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TAPE_SPACE)(
  IN EFI_TAPE_IO_PROTOCOL *This,
  IN INTN                 Direction,
  IN UINTN                Type
  );

/**
  Writes filemarks to the media.

  @param  This  A pointer to the EFI_TAPE_IO_PROTOCOL instance.
  @param  Count Number of filemarks to write to the media.

  @retval EFI_SUCCESS       Data was successfully transferred from the media.
  @retval EFI_NO_MEDIA      No media is loaded in the device.
  @retval EFI_NOT_READY     The transfer failed since the device was not ready (e.g. not
                            online). The transfer may be retried at a later time.
  @retval EFI_UNSUPPORTED   The device does not support this type of repositioning.
  @retval EFI_TIMEOUT       The transfer failed to complete within the timeout specified.
  @retval EFI_MEDIA_CHANGED The media in the device was changed since the last access.
                            The transfer was aborted since the current position of the
                            media may be incorrect.
  @retval EFI_DEVICE_ERROR  A device error occurred while attempting to transfer data from the media.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TAPE_WRITEFM)(
  IN EFI_TAPE_IO_PROTOCOL *This,
  IN UINTN                Count
  );

/**
  Resets the tape device.

  @param  This                 A pointer to the EFI_TAPE_IO_PROTOCOL instance.
  @param  ExtendedVerification Indicates whether the parent bus should also be reset.

  @retval  EFI_SUCCESS      The bus and/or device were successfully reset.
  @retval  EFI_NO_MEDIA     No media is loaded in the device.
  @retval  EFI_NOT_READY    The reset failed since the device and/or bus was not ready.
                            The reset may be retried at a later time.
  @retval  EFI_UNSUPPORTED  The device does not support this type of reset.
  @retval  EFI_TIMEOUT      The reset did not complete within the timeout allowed.
  @retval  EFI_DEVICE_ERROR A device error occurred while attempting to reset the bus and/or device.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_TAPE_RESET)(
  IN EFI_TAPE_IO_PROTOCOL *This,
  IN BOOLEAN              ExtendedVerification
  );

///
/// The EFI_TAPE_IO_PROTOCOL provides basic sequential operations for tape devices.
/// These include read, write, rewind, space, write filemarks and reset functions.
/// Per this specification, a boot application uses the services of this protocol
/// to load the bootloader image from tape.
///
struct _EFI_TAPE_IO_PROTOCOL {
  EFI_TAPE_READ       TapeRead;
  EFI_TAPE_WRITE      TapeWrite;
  EFI_TAPE_REWIND     TapeRewind;
  EFI_TAPE_SPACE      TapeSpace;
  EFI_TAPE_WRITEFM    TapeWriteFM;
  EFI_TAPE_RESET      TapeReset;
};

extern EFI_GUID  gEfiTapeIoProtocolGuid;

#endif
