/** @file
  SCSI Pass Through protocol as defined in EFI 1.1.
  This protocol allows information about a SCSI channel to be collected,
  and allows SCSI Request Packets to be sent to any SCSI devices on a SCSI
  channel even if those devices are not boot devices. This protocol is attached
  to the device handle of each SCSI channel in a system that the protocol
  supports, and can be used for diagnostics. It may also be used to build
  a Block I/O driver for SCSI hard drives and SCSI CD-ROM or DVD drives to
  allow those devices to become boot devices.

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef __SCSI_PASS_THROUGH_H__
#define __SCSI_PASS_THROUGH_H__

#define EFI_SCSI_PASS_THRU_PROTOCOL_GUID \
  { \
    0xa59e8fcf, 0xbda0, 0x43bb, {0x90, 0xb1, 0xd3, 0x73, 0x2e, 0xca, 0xa8, 0x77 } \
  }

///
/// Forward reference for pure ANSI compatability
///
typedef struct _EFI_SCSI_PASS_THRU_PROTOCOL EFI_SCSI_PASS_THRU_PROTOCOL;

#define EFI_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL    0x0001
#define EFI_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL     0x0002
#define EFI_SCSI_PASS_THRU_ATTRIBUTES_NONBLOCKIO  0x0004

//
// SCSI Host Adapter Status definition
//
#define EFI_SCSI_STATUS_HOST_ADAPTER_OK                     0x00
#define EFI_SCSI_STATUS_HOST_ADAPTER_TIMEOUT_COMMAND        0x09  // timeout when processing the command
#define EFI_SCSI_STATUS_HOST_ADAPTER_TIMEOUT                0x0b  // timeout when waiting for the command processing
#define EFI_SCSI_STATUS_HOST_ADAPTER_MESSAGE_REJECT         0x0d  // a message reject was received when processing command
#define EFI_SCSI_STATUS_HOST_ADAPTER_BUS_RESET              0x0e  // a bus reset was detected
#define EFI_SCSI_STATUS_HOST_ADAPTER_PARITY_ERROR           0x0f
#define EFI_SCSI_STATUS_HOST_ADAPTER_REQUEST_SENSE_FAILED   0x10  // the adapter failed in issuing request sense command
#define EFI_SCSI_STATUS_HOST_ADAPTER_SELECTION_TIMEOUT      0x11  // selection timeout
#define EFI_SCSI_STATUS_HOST_ADAPTER_DATA_OVERRUN_UNDERRUN  0x12  // data overrun or data underrun
#define EFI_SCSI_STATUS_HOST_ADAPTER_BUS_FREE               0x13  // Unexepected bus free
#define EFI_SCSI_STATUS_HOST_ADAPTER_PHASE_ERROR            0x14  // Target bus phase sequence failure
#define EFI_SCSI_STATUS_HOST_ADAPTER_OTHER                  0x7f

//
// SCSI Target Status definition
//
#define EFI_SCSI_STATUS_TARGET_GOOD                        0x00
#define EFI_SCSI_STATUS_TARGET_CHECK_CONDITION             0x02 // check condition
#define EFI_SCSI_STATUS_TARGET_CONDITION_MET               0x04 // condition met
#define EFI_SCSI_STATUS_TARGET_BUSY                        0x08 // busy
#define EFI_SCSI_STATUS_TARGET_INTERMEDIATE                0x10 // intermediate
#define EFI_SCSI_STATUS_TARGET_INTERMEDIATE_CONDITION_MET  0x14 // intermediate-condition met
#define EFI_SCSI_STATUS_TARGET_RESERVATION_CONFLICT        0x18 // reservation conflict
#define EFI_SCSI_STATUS_TARGET_COMMOND_TERMINATED          0x22 // command terminated
#define EFI_SCSI_STATUS_TARGET_QUEUE_FULL                  0x28 // queue full

typedef struct {
  ///
  /// The timeout, in 100 ns units, to use for the execution of this SCSI
  /// Request Packet. A Timeout value of 0 means that this function
  /// will wait indefinitely for the SCSI Request Packet to execute. If
  /// Timeout is greater than zero, then this function will return
  /// EFI_TIMEOUT if the time required to execute the SCSI Request
  /// Packet is greater than Timeout.
  ///
  UINT64    Timeout;
  ///
  /// A pointer to the data buffer to transfer between the SCSI
  /// controller and the SCSI device. Must be aligned to the boundary
  /// specified in the IoAlign field of the
  /// EFI_SCSI_PASS_THRU_MODE structure.
  ///
  VOID      *DataBuffer;
  ///
  /// A pointer to the sense data that was generated by the execution of
  /// the SCSI Request Packet.
  ///
  VOID      *SenseData;
  ///
  /// A pointer to buffer that contains the Command Data Block to
  /// send to the SCSI device.
  ///
  VOID      *Cdb;
  ///
  /// On Input, the size, in bytes, of InDataBuffer. On output, the
  /// number of bytes transferred between the SCSI controller and the SCSI device.
  ///
  UINT32    TransferLength;
  ///
  /// The length, in bytes, of the buffer Cdb. The standard values are
  /// 6, 10, 12, and 16, but other values are possible if a variable length CDB is used.
  ///
  UINT8     CdbLength;
  ///
  /// The direction of the data transfer. 0 for reads, 1 for writes. A
  /// value of 2 is Reserved for Bi-Directional SCSI commands.
  ///
  UINT8     DataDirection;
  ///
  /// The status of the SCSI Host Controller that produces the SCSI
  /// bus where the SCSI device attached when the SCSI Request
  /// Packet was executed on the SCSI Controller.
  ///
  UINT8     HostAdapterStatus;
  ///
  /// The status returned by the SCSI device when the SCSI Request
  /// Packet was executed.
  ///
  UINT8     TargetStatus;
  ///
  /// On input, the length in bytes of the SenseData buffer. On
  /// output, the number of bytes written to the SenseData buffer.
  ///
  UINT8     SenseDataLength;
} EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET;

typedef struct {
  ///
  /// A Null-terminated Unicode string that represents the printable name of the SCSI controller.
  ///
  CHAR16    *ControllerName;
  ///
  /// A Null-terminated Unicode string that represents the printable name of the SCSI channel.
  ///
  CHAR16    *ChannelName;
  ///
  /// The Target ID of the host adapter on the SCSI channel.
  ///
  UINT32    AdapterId;
  ///
  /// Additional information on the attributes of the SCSI channel.
  ///
  UINT32    Attributes;
  ///
  /// Supplies the alignment requirement for any buffer used in a data transfer.
  ///
  UINT32    IoAlign;
} EFI_SCSI_PASS_THRU_MODE;

/**
  Sends a SCSI Request Packet to a SCSI device that is attached to
  the SCSI channel. This function supports both blocking I/O and
  non-blocking I/O.  The blocking I/O functionality is required,
  and the non-blocking I/O functionality is optional.

  @param  This   Protocol instance pointer.
  @param  Target The Target ID of the SCSI device to
                 send the SCSI Request Packet.
  @param  Lun    The LUN of the SCSI device to send the
                 SCSI Request Packet.
  @param  Packet A pointer to the SCSI Request Packet to send
                 to the SCSI device specified by Target and Lun.
  @param  Event  If non-blocking I/O is not supported then Event
                 is ignored, and blocking I/O is performed.
                 If Event is NULL, then blocking I/O is performed.
                 If Event is not NULL and non blocking I/O is
                 supported, then non-blocking I/O is performed,
                 and Event will be signaled when the SCSI Request
                 Packet completes

  @retval EFI_SUCCESS               The SCSI Request Packet was sent by the host, and
                                    TransferLength bytes were transferred to/from
                                    DataBuffer. See HostAdapterStatus, TargetStatus,
                                    SenseDataLength, and SenseData in that order
                                    for additional status information.
  @retval EFI_BAD_BUFFER_SIZE       The SCSI Request Packet was executed, but the
                                    entire DataBuffer could not be transferred.
                                    The actual number of bytes transferred is returned
                                    in TransferLength. See HostAdapterStatus,
                                    TargetStatus, SenseDataLength, and SenseData in
                                    that order for additional status information.
  @retval EFI_NOT_READY             The SCSI Request Packet could not be sent because
                                    there are too many SCSI Request Packets already
                                    queued.  The caller may retry again later.
  @retval EFI_DEVICE_ERROR          A device error occurred while attempting to send
                                    the SCSI Request Packet. See HostAdapterStatus,
                                    TargetStatus, SenseDataLength, and SenseData in
                                    that order for additional status information.
  @retval EFI_INVALID_PARAMETER     Target, Lun, or the contents of ScsiRequestPacket
                                    are invalid. The SCSI Request Packet was not sent,
                                    so no additional status information is available.
  @retval EFI_UNSUPPORTED           The command described by the SCSI Request Packet
                                    is not supported by the host adapter. The SCSI
                                    Request Packet was not sent, so no additional
                                    status information is available.
  @retval EFI_TIMEOUT               A timeout occurred while waiting for the SCSI
                                    Request Packet to execute. See HostAdapterStatus,
                                    TargetStatus, SenseDataLength, and SenseData in
                                    that order for additional status information.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SCSI_PASS_THRU_PASSTHRU)(
  IN EFI_SCSI_PASS_THRU_PROTOCOL                          *This,
  IN UINT32                                               Target,
  IN UINT64                                               Lun,
  IN OUT EFI_SCSI_PASS_THRU_SCSI_REQUEST_PACKET           *Packet,
  IN EFI_EVENT                                            Event   OPTIONAL
  );

/**
  Used to retrieve the list of legal Target IDs for SCSI devices
  on a SCSI channel.

  @param  This   Protocol instance pointer.
  @param  Target On input, a pointer to the Target ID of a
                 SCSI device present on the SCSI channel.
                 On output, a pointer to the Target ID of
                 the next SCSI device present on a SCSI channel.
                 An input value of 0xFFFFFFFF retrieves the
                 Target ID of the first SCSI device present on
                 a SCSI channel.
  @param  Lun    On input, a pointer to the LUN of a SCSI device
                 present on the SCSI channel. On output, a pointer
                 to the LUN of the next SCSI device present on a
                 SCSI channel.

  @retval EFI_SUCCESS           The Target ID of the next SCSI device on the SCSI
                                channel was returned in Target and Lun.
  @retval EFI_NOT_FOUND         There are no more SCSI devices on this SCSI channel.
  @retval EFI_INVALID_PARAMETER Target is not 0xFFFFFFFF, and Target and Lun were
                                 not returned on a previous call to GetNextDevice().

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SCSI_PASS_THRU_GET_NEXT_DEVICE)(
  IN EFI_SCSI_PASS_THRU_PROTOCOL            *This,
  IN OUT UINT32                             *Target,
  IN OUT UINT64                             *Lun
  );

/**
  Used to allocate and build a device path node for a SCSI device
  on a SCSI channel.

  @param  This       Protocol instance pointer.
  @param  Target     The Target ID of the SCSI device for which
                     a device path node is to be allocated and built.
  @param  Lun        The LUN of the SCSI device for which a device
                     path node is to be allocated and built.
  @param  DevicePath A pointer to a single device path node that
                     describes the SCSI device specified by
                     Target and Lun. This function is responsible
                     for allocating the buffer DevicePath with the boot
                     service AllocatePool().  It is the caller's
                     responsibility to free DevicePath when the caller
                     is finished with DevicePath.

  @retval EFI_SUCCESS           The device path node that describes the SCSI device
                                specified by Target and Lun was allocated and
                                returned in DevicePath.
  @retval EFI_NOT_FOUND         The SCSI devices specified by Target and Lun does
                                not exist on the SCSI channel.
  @retval EFI_INVALID_PARAMETER DevicePath is NULL.
  @retval EFI_OUT_OF_RESOURCES  There are not enough resources to allocate
                                DevicePath.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SCSI_PASS_THRU_BUILD_DEVICE_PATH)(
  IN EFI_SCSI_PASS_THRU_PROTOCOL            *This,
  IN     UINT32                             Target,
  IN     UINT64                             Lun,
  IN OUT EFI_DEVICE_PATH_PROTOCOL           **DevicePath
  );

/**
  Used to translate a device path node to a Target ID and LUN.

  @param  This       Protocol instance pointer.
  @param  DevicePath A pointer to the device path node that
                     describes a SCSI device on the SCSI channel.
  @param  Target     A pointer to the Target ID of a SCSI device
                     on the SCSI channel.
  @param  Lun        A pointer to the LUN of a SCSI device on
                     the SCSI channel.

  @retval EFI_SUCCESS           DevicePath was successfully translated to a
                                Target ID and LUN, and they were returned
                                in Target and Lun.
  @retval EFI_INVALID_PARAMETER DevicePath is NULL.
  @retval EFI_INVALID_PARAMETER Target is NULL.
  @retval EFI_INVALID_PARAMETER Lun is NULL.
  @retval EFI_UNSUPPORTED       This driver does not support the device path
                                node type in DevicePath.
  @retval EFI_NOT_FOUND         A valid translation from DevicePath to a
                                Target ID and LUN does not exist.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SCSI_PASS_THRU_GET_TARGET_LUN)(
  IN EFI_SCSI_PASS_THRU_PROTOCOL            *This,
  IN  EFI_DEVICE_PATH_PROTOCOL              *DevicePath,
  OUT UINT32                                *Target,
  OUT UINT64                                *Lun
  );

/**
  Resets a SCSI channel.This operation resets all the
  SCSI devices connected to the SCSI channel.

  @param  This Protocol instance pointer.

  @retval EFI_SUCCESS      The SCSI channel was reset.
  @retval EFI_UNSUPPORTED  The SCSI channel does not support
                           a channel reset operation.
  @retval EFI_DEVICE_ERROR A device error occurred while
                           attempting to reset the SCSI channel.
  @retval EFI_TIMEOUT      A timeout occurred while attempting
                           to reset the SCSI channel.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SCSI_PASS_THRU_RESET_CHANNEL)(
  IN EFI_SCSI_PASS_THRU_PROTOCOL             *This
  );

/**
  Resets a SCSI device that is connected to a SCSI channel.

  @param  This   Protocol instance pointer.
  @param  Target The Target ID of the SCSI device to reset.
  @param  Lun    The LUN of the SCSI device to reset.

  @retval EFI_SUCCESS           The SCSI device specified by Target and
                                Lun was reset.
  @retval EFI_UNSUPPORTED       The SCSI channel does not support a target
                                reset operation.
  @retval EFI_INVALID_PARAMETER Target or Lun are invalid.
  @retval EFI_DEVICE_ERROR      A device error occurred while attempting
                                to reset the SCSI device specified by Target
                                and Lun.
  @retval EFI_TIMEOUT           A timeout occurred while attempting to reset
                                the SCSI device specified by Target and Lun.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_SCSI_PASS_THRU_RESET_TARGET)(
  IN EFI_SCSI_PASS_THRU_PROTOCOL             *This,
  IN UINT32                                  Target,
  IN UINT64                                  Lun
  );

///
/// The EFI_SCSI_PASS_THRU_PROTOCOL provides information about a SCSI channel and
/// the ability to send SCSI Request Packets to any SCSI device attached to that SCSI channel. The
/// information includes the Target ID of the host controller on the SCSI channel, the attributes of
/// the SCSI channel, the printable name for the SCSI controller, and the printable name of the
/// SCSI channel.
///
struct _EFI_SCSI_PASS_THRU_PROTOCOL {
  ///
  /// A pointer to the EFI_SCSI_PASS_THRU_MODE data for this SCSI channel.
  ///
  EFI_SCSI_PASS_THRU_MODE                 *Mode;
  EFI_SCSI_PASS_THRU_PASSTHRU             PassThru;
  EFI_SCSI_PASS_THRU_GET_NEXT_DEVICE      GetNextDevice;
  EFI_SCSI_PASS_THRU_BUILD_DEVICE_PATH    BuildDevicePath;
  EFI_SCSI_PASS_THRU_GET_TARGET_LUN       GetTargetLun;
  EFI_SCSI_PASS_THRU_RESET_CHANNEL        ResetChannel;
  EFI_SCSI_PASS_THRU_RESET_TARGET         ResetTarget;
};

extern EFI_GUID  gEfiScsiPassThruProtocolGuid;

#endif
