[edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out

Zurcher, Christopher J posted 4 patches 6 years, 5 months ago
There is a newer version of this series
[edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out
Posted by Zurcher, Christopher J 6 years, 5 months ago
This patch implements the Security Protocol In and Security Protocol Out
commands in UefiScsiLib to prepare support for the Storage Security
Command Protocol.

Cc: Jiewen Yao <jiewen.yao@intel.com>
Cc: Jian J Wang <jian.j.wang@intel.com>
Cc: Liming Gao <liming.gao@intel.com>
Signed-off-by: Christopher J Zurcher <christopher.j.zurcher@intel.com>
---
 MdePkg/Include/IndustryStandard/Scsi.h   |  48 +++--
 MdePkg/Include/Library/UefiScsiLib.h     | 126 +++++++++++-
 MdePkg/Include/Protocol/ScsiIo.h         |   9 +-
 MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 205 +++++++++++++++++++-
 4 files changed, 366 insertions(+), 22 deletions(-)

diff --git a/MdePkg/Include/IndustryStandard/Scsi.h b/MdePkg/Include/IndustryStandard/Scsi.h
index cbe5709fe5..10d7b49ba7 100644
--- a/MdePkg/Include/IndustryStandard/Scsi.h
+++ b/MdePkg/Include/IndustryStandard/Scsi.h
@@ -1,7 +1,7 @@
 /** @file
   Support for SCSI-2 standard
 
-  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -163,6 +163,12 @@
 #define EFI_SCSI_OP_SEND_MESSAGE10  0x2a
 #define EFI_SCSI_OP_SEND_MESSAGE12  0xaa
 
+//
+// Additional commands for Secure Transactions
+//
+#define EFI_SCSI_OP_SECURITY_PROTOCOL_IN  0xa2
+#define EFI_SCSI_OP_SECURITY_PROTOCOL_OUT 0xb5
+
 //
 // SCSI Data Transfer Direction
 //
@@ -172,22 +178,30 @@
 //
 // Peripheral Device Type Definitions
 //
-#define EFI_SCSI_TYPE_DISK          0x00  ///< Direct-access device (e.g. magnetic disk)
-#define EFI_SCSI_TYPE_TAPE          0x01  ///< Sequential-access device (e.g. magnetic tape)
-#define EFI_SCSI_TYPE_PRINTER       0x02  ///< Printer device
-#define EFI_SCSI_TYPE_PROCESSOR     0x03  ///< Processor device
-#define EFI_SCSI_TYPE_WORM          0x04  ///< Write-once device (e.g. some optical disks)
-#define EFI_SCSI_TYPE_CDROM         0x05  ///< CD-ROM device
-#define EFI_SCSI_TYPE_SCANNER       0x06  ///< Scanner device
-#define EFI_SCSI_TYPE_OPTICAL       0x07  ///< Optical memory device (e.g. some optical disks)
-#define EFI_SCSI_TYPE_MEDIUMCHANGER 0x08  ///< Medium changer device (e.g. jukeboxes)
-#define EFI_SCSI_TYPE_COMMUNICATION 0x09  ///< Communications device
-#define EFI_SCSI_TYPE_ASCIT8_1      0x0A  ///< Defined by ASC IT8 (Graphic arts pre-press devices)
-#define EFI_SCSI_TYPE_ASCIT8_2      0x0B  ///< Defined by ASC IT8 (Graphic arts pre-press devices)
-//
-// 0Ch - 1Eh are reserved
-//
-#define EFI_SCSI_TYPE_UNKNOWN       0x1F  ///< Unknown or no device type
+#define EFI_SCSI_TYPE_DISK            0x00  ///< Direct-access device (e.g. magnetic disk)
+#define EFI_SCSI_TYPE_TAPE            0x01  ///< Sequential-access device (e.g. magnetic tape)
+#define EFI_SCSI_TYPE_PRINTER         0x02  ///< Printer device
+#define EFI_SCSI_TYPE_PROCESSOR       0x03  ///< Processor device
+#define EFI_SCSI_TYPE_WORM            0x04  ///< Write-once device (e.g. some optical disks)
+#define EFI_SCSI_TYPE_CDROM           0x05  ///< CD/DVD device
+#define EFI_SCSI_TYPE_SCANNER         0x06  ///< Scanner device (obsolete)
+#define EFI_SCSI_TYPE_OPTICAL         0x07  ///< Optical memory device (e.g. some optical disks)
+#define EFI_SCSI_TYPE_MEDIUMCHANGER   0x08  ///< Medium changer device (e.g. jukeboxes)
+#define EFI_SCSI_TYPE_COMMUNICATION   0x09  ///< Communications device (obsolete)
+#define EFI_SCSI_TYPE_A               0x0A  ///< Obsolete
+#define EFI_SCSI_TYPE_B               0x0B  ///< Obsolete
+#define EFI_SCSI_TYPE_RAID            0x0C  ///< Storage array controller device (e.g., RAID)
+#define EFI_SCSI_TYPE_SES             0x0D  ///< Enclosure services device
+#define EFI_SCSI_TYPE_RBC             0x0E  ///< Simplified direct-access device (e.g., magnetic disk)
+#define EFI_SCSI_TYPE_OCRW            0x0F  ///< Optical card reader/writer device
+#define EFI_SCSI_TYPE_BRIDGE          0x10  ///< Bridge Controller Commands
+#define EFI_SCSI_TYPE_OSD             0x11  ///< Object-based Storage Device
+#define EFI_SCSI_TYPE_AUTOMATION      0x12  ///< Automation/Drive Interface
+#define EFI_SCSI_TYPE_SECURITYMANAGER 0x13  ///< Security manager device
+#define EFI_SCSI_TYPE_RESERVED_LOW    0x14  ///< Reserved (low)
+#define EFI_SCSI_TYPE_RESERVED_HIGH   0x1D  ///< Reserved (high)
+#define EFI_SCSI_TYPE_WLUN            0x1E  ///< Well known logical unit
+#define EFI_SCSI_TYPE_UNKNOWN         0x1F  ///< Unknown or no device type
 
 //
 // Page Codes for INQUIRY command
diff --git a/MdePkg/Include/Library/UefiScsiLib.h b/MdePkg/Include/Library/UefiScsiLib.h
index 10dd81902b..a0d99e703a 100644
--- a/MdePkg/Include/Library/UefiScsiLib.h
+++ b/MdePkg/Include/Library/UefiScsiLib.h
@@ -5,7 +5,7 @@
   for hard drive, CD and DVD devices that are the most common SCSI boot targets used by UEFI platforms.
   This library class depends on SCSI I/O Protocol defined in UEFI Specification and SCSI-2 industry standard.
 
-Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
 SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -813,6 +813,130 @@ ScsiWrite16Command (
   );
 
 
+/**
+  Execute Security Protocol In SCSI command on a specific SCSI target.
+
+  Executes the SCSI Security Protocol In command on the SCSI target specified by ScsiIo.
+  If Timeout is zero, then this function waits indefinitely for the command to complete.
+  If Timeout is greater than zero, then the command is executed and will timeout after
+  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to construct
+  the CDB for this SCSI command.
+  If ScsiIo is NULL, then ASSERT().
+  If SenseDataLength is NULL, then ASSERT().
+  If HostAdapterStatus is NULL, then ASSERT().
+  If TargetStatus is NULL, then ASSERT().
+  If DataLength is NULL, then ASSERT().
+
+  If SenseDataLength is non-zero and SenseData is not NULL, SenseData must meet buffer
+  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise EFI_INVALID_PARAMETER
+  gets returned.
+
+  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must meet buffer
+  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise EFI_INVALID_PARAMETER
+  gets returned.
+
+  @param[in]      ScsiIo               SCSI IO Protocol to use.
+  @param[in]      Timeout              The length of timeout period.
+  @param[in, out] SenseData            A pointer to output sense data.
+  @param[in, out] SenseDataLength      The length of output sense data.
+  @param[out]     HostAdapterStatus    The status of Host Adapter.
+  @param[out]     TargetStatus         The status of the target.
+  @param[in]      SecurityProtocol     The Security Protocol to use.
+  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
+  @param[in]      TransferLength       The size in bytes of the data allocation.
+  @param[in, out] DataBuffer           A pointer to a data buffer.
+  @param[in, out] DataLength           The length of data buffer.
+
+  @retval  EFI_SUCCESS                 Command is executed successfully.
+  @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 DataLength.
+  @retval  EFI_NOT_READY               The SCSI Request Packet could not be sent because there are too many
+                                       SCSI Command Packets already queued.
+  @retval  EFI_DEVICE_ERROR            A device error occurred while attempting to send SCSI Request Packet.
+  @retval  EFI_UNSUPPORTED             The command described by the SCSI Request Packet is not supported by
+                                       the SCSI initiator(i.e., SCSI  Host Controller)
+  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the SCSI Request Packet to execute.
+  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request Packet are invalid.
+
+**/
+EFI_STATUS
+EFIAPI
+ScsiSecurityProtocolInCommand (
+  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
+  IN     UINT64                Timeout,
+  IN OUT VOID                  *SenseData,   OPTIONAL
+  IN OUT UINT8                 *SenseDataLength,
+     OUT UINT8                 *HostAdapterStatus,
+     OUT UINT8                 *TargetStatus,
+  IN     UINT8                 SecurityProtocol,
+  IN     UINT16                SecurityProtocolSpecific,
+  IN     UINT32                TransferLength,
+  IN OUT VOID                  *DataBuffer,  OPTIONAL
+  IN OUT UINT32                *DataLength
+  );
+
+
+/**
+  Execute Security Protocol Out SCSI command on a specific SCSI target.
+
+  Executes the SCSI Security Protocol Out command on the SCSI target specified by ScsiIo.
+  If Timeout is zero, then this function waits indefinitely for the command to complete.
+  If Timeout is greater than zero, then the command is executed and will timeout after
+  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to construct
+  the CDB for this SCSI command.
+  If ScsiIo is NULL, then ASSERT().
+  If SenseDataLength is NULL, then ASSERT().
+  If HostAdapterStatus is NULL, then ASSERT().
+  If TargetStatus is NULL, then ASSERT().
+  If DataLength is NULL, then ASSERT().
+
+  If SenseDataLength is non-zero and SenseData is not NULL, SenseData must meet buffer
+  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise EFI_INVALID_PARAMETER
+  gets returned.
+
+  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must meet buffer
+  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise EFI_INVALID_PARAMETER
+  gets returned.
+
+  @param[in]      ScsiIo               SCSI IO Protocol to use.
+  @param[in]      Timeout              The length of timeout period.
+  @param[in, out] SenseData            A pointer to output sense data.
+  @param[in, out] SenseDataLength      The length of output sense data.
+  @param[out]     HostAdapterStatus    The status of Host Adapter.
+  @param[out]     TargetStatus         The status of the target.
+  @param[in]      SecurityProtocol     The Security Protocol to use.
+  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
+  @param[in]      TransferLength       The size in bytes of the transfer data.
+  @param[in, out] DataBuffer           A pointer to a data buffer.
+
+  @retval  EFI_SUCCESS                 Command is executed successfully.
+  @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 DataLength.
+  @retval  EFI_NOT_READY               The SCSI Request Packet could not be sent because there are too many
+                                       SCSI Command Packets already queued.
+  @retval  EFI_DEVICE_ERROR            A device error occurred while attempting to send SCSI Request Packet.
+  @retval  EFI_UNSUPPORTED             The command described by the SCSI Request Packet is not supported by
+                                       the SCSI initiator(i.e., SCSI  Host Controller)
+  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the SCSI Request Packet to execute.
+  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request Packet are invalid.
+
+**/
+EFI_STATUS
+EFIAPI
+ScsiSecurityProtocolOutCommand (
+  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
+  IN     UINT64                Timeout,
+  IN OUT VOID                  *SenseData,   OPTIONAL
+  IN OUT UINT8                 *SenseDataLength,
+     OUT UINT8                 *HostAdapterStatus,
+     OUT UINT8                 *TargetStatus,
+  IN     UINT8                 SecurityProtocol,
+  IN     UINT16                SecurityProtocolSpecific,
+  IN     UINT32                TransferLength,
+  IN OUT VOID                  *DataBuffer  OPTIONAL
+  );
+
+
 /**
   Execute blocking/non-blocking Read(10) SCSI command on a specific SCSI
   target.
diff --git a/MdePkg/Include/Protocol/ScsiIo.h b/MdePkg/Include/Protocol/ScsiIo.h
index 05e46bda9c..27c31fe7f9 100644
--- a/MdePkg/Include/Protocol/ScsiIo.h
+++ b/MdePkg/Include/Protocol/ScsiIo.h
@@ -4,7 +4,7 @@
   services environment to access SCSI devices. In particular, functions for
   managing devices on SCSI buses are defined here.
 
-  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -43,8 +43,11 @@ typedef struct _EFI_SCSI_IO_PROTOCOL EFI_SCSI_IO_PROTOCOL;
 #define MFI_SCSI_IO_TYPE_OCRW                                  0x0F    ///< Optical card reader/writer device
 #define MFI_SCSI_IO_TYPE_BRIDGE                                0x10    ///< Bridge Controller Commands
 #define MFI_SCSI_IO_TYPE_OSD                                   0x11    ///< Object-based Storage Device
-#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x12    ///< Reserved (low)
-#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1E    ///< Reserved (high)
+#define MFI_SCSI_IO_TYPE_AUTOMATION                            0x12    ///< Automation/Drive Interface
+#define MFI_SCSI_IO_TYPE_SECURITYMANAGER                       0x13    ///< Security manager device
+#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x14    ///< Reserved (low)
+#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1D    ///< Reserved (high)
+#define EFI_SCSI_IO_TYPE_WLUN                                  0x1E    ///< Well known logical unit
 #define EFI_SCSI_IO_TYPE_UNKNOWN                               0x1F    ///< Unknown no device type
 
 //
diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
index c7491d1436..7584d717ad 100644
--- a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
+++ b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
@@ -1,7 +1,7 @@
 /** @file
   UEFI SCSI Library implementation
 
-  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
+  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
   SPDX-License-Identifier: BSD-2-Clause-Patent
 
 **/
@@ -23,6 +23,7 @@
   //
 #define EFI_SCSI_OP_LENGTH_SIX      0x6
 #define EFI_SCSI_OP_LENGTH_TEN      0xa
+#define EFI_SCSI_OP_LENGTH_TWELVE   0xc
 #define EFI_SCSI_OP_LENGTH_SIXTEEN  0x10
 
 //
@@ -1280,6 +1281,208 @@ ScsiWrite16Command (
 }
 
 
+/**
+  Execute Security Protocol In SCSI command on a specific SCSI target.
+
+  Executes the SCSI Security Protocol In command on the SCSI target specified by ScsiIo.
+  If Timeout is zero, then this function waits indefinitely for the command to complete.
+  If Timeout is greater than zero, then the command is executed and will timeout after
+  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to construct
+  the CDB for this SCSI command.
+  If ScsiIo is NULL, then ASSERT().
+  If SenseDataLength is NULL, then ASSERT().
+  If HostAdapterStatus is NULL, then ASSERT().
+  If TargetStatus is NULL, then ASSERT().
+  If DataLength is NULL, then ASSERT().
+
+  If SenseDataLength is non-zero and SenseData is not NULL, SenseData must meet buffer
+  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise EFI_INVALID_PARAMETER
+  gets returned.
+
+  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must meet buffer
+  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise EFI_INVALID_PARAMETER
+  gets returned.
+
+  @param[in]      ScsiIo               SCSI IO Protocol to use.
+  @param[in]      Timeout              The length of timeout period.
+  @param[in, out] SenseData            A pointer to output sense data.
+  @param[in, out] SenseDataLength      The length of output sense data.
+  @param[out]     HostAdapterStatus    The status of Host Adapter.
+  @param[out]     TargetStatus         The status of the target.
+  @param[in]      SecurityProtocol     The Security Protocol to use.
+  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
+  @param[in]      TransferLength       The size in bytes of the data allocation.
+  @param[in, out] DataBuffer           A pointer to a data buffer.
+  @param[in, out] DataLength           The length of data buffer.
+
+  @retval  EFI_SUCCESS                 Command is executed successfully.
+  @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 DataLength.
+  @retval  EFI_NOT_READY               The SCSI Request Packet could not be sent because there are too many
+                                       SCSI Command Packets already queued.
+  @retval  EFI_DEVICE_ERROR            A device error occurred while attempting to send SCSI Request Packet.
+  @retval  EFI_UNSUPPORTED             The command described by the SCSI Request Packet is not supported by
+                                       the SCSI initiator(i.e., SCSI  Host Controller)
+  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the SCSI Request Packet to execute.
+  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request Packet are invalid.
+
+**/
+EFI_STATUS
+EFIAPI
+ScsiSecurityProtocolInCommand (
+  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
+  IN     UINT64                Timeout,
+  IN OUT VOID                  *SenseData,   OPTIONAL
+  IN OUT UINT8                 *SenseDataLength,
+     OUT UINT8                 *HostAdapterStatus,
+     OUT UINT8                 *TargetStatus,
+  IN     UINT8                 SecurityProtocol,
+  IN     UINT16                SecurityProtocolSpecific,
+  IN     UINT32                TransferLength,
+  IN OUT VOID                  *DataBuffer,  OPTIONAL
+  IN OUT UINT32                *DataLength
+  )
+{
+  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
+  EFI_STATUS                      Status;
+  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
+
+  ASSERT (SenseDataLength != NULL);
+  ASSERT (HostAdapterStatus != NULL);
+  ASSERT (TargetStatus != NULL);
+  ASSERT (DataLength != NULL);
+  ASSERT (ScsiIo != NULL);
+
+  ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
+  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
+
+  CommandPacket.Timeout           = Timeout;
+  CommandPacket.InDataBuffer      = DataBuffer;
+  CommandPacket.SenseData         = SenseData;
+  CommandPacket.InTransferLength  = TransferLength;
+  CommandPacket.Cdb               = Cdb;
+  //
+  // Fill Cdb for Security Protocol In Command
+  //
+  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_IN;
+  Cdb[1]                        = SecurityProtocol;
+  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16 (SecurityProtocolSpecific));
+  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength));
+
+  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
+  CommandPacket.DataDirection   = EFI_SCSI_DATA_IN;
+  CommandPacket.SenseDataLength = *SenseDataLength;
+
+  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo, &CommandPacket, NULL);
+
+  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
+  *TargetStatus                 = CommandPacket.TargetStatus;
+  *SenseDataLength              = CommandPacket.SenseDataLength;
+  *DataLength                   = CommandPacket.InTransferLength;
+
+  return Status;
+}
+
+
+/**
+  Execute Security Protocol Out SCSI command on a specific SCSI target.
+
+  Executes the SCSI Security Protocol Out command on the SCSI target specified by ScsiIo.
+  If Timeout is zero, then this function waits indefinitely for the command to complete.
+  If Timeout is greater than zero, then the command is executed and will timeout after
+  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to construct
+  the CDB for this SCSI command.
+  If ScsiIo is NULL, then ASSERT().
+  If SenseDataLength is NULL, then ASSERT().
+  If HostAdapterStatus is NULL, then ASSERT().
+  If TargetStatus is NULL, then ASSERT().
+  If DataLength is NULL, then ASSERT().
+
+  If SenseDataLength is non-zero and SenseData is not NULL, SenseData must meet buffer
+  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise EFI_INVALID_PARAMETER
+  gets returned.
+
+  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must meet buffer
+  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise EFI_INVALID_PARAMETER
+  gets returned.
+
+  @param[in]      ScsiIo               SCSI IO Protocol to use.
+  @param[in]      Timeout              The length of timeout period.
+  @param[in, out] SenseData            A pointer to output sense data.
+  @param[in, out] SenseDataLength      The length of output sense data.
+  @param[out]     HostAdapterStatus    The status of Host Adapter.
+  @param[out]     TargetStatus         The status of the target.
+  @param[in]      SecurityProtocol     The Security Protocol to use.
+  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
+  @param[in]      TransferLength       The size in bytes of the transfer data.
+  @param[in, out] DataBuffer           A pointer to a data buffer.
+
+  @retval  EFI_SUCCESS                 Command is executed successfully.
+  @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 DataLength.
+  @retval  EFI_NOT_READY               The SCSI Request Packet could not be sent because there are too many
+                                       SCSI Command Packets already queued.
+  @retval  EFI_DEVICE_ERROR            A device error occurred while attempting to send SCSI Request Packet.
+  @retval  EFI_UNSUPPORTED             The command described by the SCSI Request Packet is not supported by
+                                       the SCSI initiator(i.e., SCSI  Host Controller)
+  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the SCSI Request Packet to execute.
+  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request Packet are invalid.
+
+**/
+EFI_STATUS
+EFIAPI
+ScsiSecurityProtocolOutCommand (
+  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
+  IN     UINT64                Timeout,
+  IN OUT VOID                  *SenseData,   OPTIONAL
+  IN OUT UINT8                 *SenseDataLength,
+     OUT UINT8                 *HostAdapterStatus,
+     OUT UINT8                 *TargetStatus,
+  IN     UINT8                 SecurityProtocol,
+  IN     UINT16                SecurityProtocolSpecific,
+  IN     UINT32                TransferLength,
+  IN OUT VOID                  *DataBuffer   OPTIONAL
+  )
+{
+  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
+  EFI_STATUS                      Status;
+  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
+
+  ASSERT (SenseDataLength != NULL);
+  ASSERT (HostAdapterStatus != NULL);
+  ASSERT (TargetStatus != NULL);
+  ASSERT (ScsiIo != NULL);
+
+  ZeroMem (&CommandPacket, sizeof (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
+  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
+
+  CommandPacket.Timeout           = Timeout;
+  CommandPacket.OutDataBuffer     = DataBuffer;
+  CommandPacket.SenseData         = SenseData;
+  CommandPacket.OutTransferLength = TransferLength;
+  CommandPacket.Cdb               = Cdb;
+  //
+  // Fill Cdb for Security Protocol Out Command
+  //
+  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_OUT;
+  Cdb[1]                        = SecurityProtocol;
+  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16 (SecurityProtocolSpecific));
+  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength));
+
+  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
+  CommandPacket.DataDirection   = EFI_SCSI_DATA_OUT;
+  CommandPacket.SenseDataLength = *SenseDataLength;
+
+  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo, &CommandPacket, NULL);
+
+  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
+  *TargetStatus                 = CommandPacket.TargetStatus;
+  *SenseDataLength              = CommandPacket.SenseDataLength;
+
+  return Status;
+}
+
+
 /**
   Internal helper notify function in which update the result of the
   non-blocking SCSI Read/Write commands and signal caller event.
-- 
2.16.2.windows.1


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#46238): https://edk2.groups.io/g/devel/message/46238
Mute This Topic: https://groups.io/mt/32994942/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out
Posted by Wu, Hao A 6 years, 5 months ago
Hello,

Please refer to the below inline comments:


> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> Zurcher, Christopher J
> Sent: Friday, August 23, 2019 6:02 AM
> To: devel@edk2.groups.io
> Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> Subject: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands
> for Security Protocol In/Out
> 
> This patch implements the Security Protocol In and Security Protocol Out
> commands in UefiScsiLib to prepare support for the Storage Security
> Command Protocol.
> 
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: Jian J Wang <jian.j.wang@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Signed-off-by: Christopher J Zurcher <christopher.j.zurcher@intel.com>
> ---
>  MdePkg/Include/IndustryStandard/Scsi.h   |  48 +++--
>  MdePkg/Include/Library/UefiScsiLib.h     | 126 +++++++++++-
>  MdePkg/Include/Protocol/ScsiIo.h         |   9 +-
>  MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 205 +++++++++++++++++++-
>  4 files changed, 366 insertions(+), 22 deletions(-)
> 
> diff --git a/MdePkg/Include/IndustryStandard/Scsi.h
> b/MdePkg/Include/IndustryStandard/Scsi.h
> index cbe5709fe5..10d7b49ba7 100644
> --- a/MdePkg/Include/IndustryStandard/Scsi.h
> +++ b/MdePkg/Include/IndustryStandard/Scsi.h
> @@ -1,7 +1,7 @@
>  /** @file
>    Support for SCSI-2 standard
> 
> -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -163,6 +163,12 @@
>  #define EFI_SCSI_OP_SEND_MESSAGE10  0x2a
>  #define EFI_SCSI_OP_SEND_MESSAGE12  0xaa
> 
> +//
> +// Additional commands for Secure Transactions
> +//
> +#define EFI_SCSI_OP_SECURITY_PROTOCOL_IN  0xa2
> +#define EFI_SCSI_OP_SECURITY_PROTOCOL_OUT 0xb5
> +
>  //
>  // SCSI Data Transfer Direction
>  //
> @@ -172,22 +178,30 @@
>  //
>  // Peripheral Device Type Definitions
>  //
> -#define EFI_SCSI_TYPE_DISK          0x00  ///< Direct-access device (e.g.
> magnetic disk)
> -#define EFI_SCSI_TYPE_TAPE          0x01  ///< Sequential-access device (e.g.
> magnetic tape)
> -#define EFI_SCSI_TYPE_PRINTER       0x02  ///< Printer device
> -#define EFI_SCSI_TYPE_PROCESSOR     0x03  ///< Processor device
> -#define EFI_SCSI_TYPE_WORM          0x04  ///< Write-once device (e.g. some
> optical disks)
> -#define EFI_SCSI_TYPE_CDROM         0x05  ///< CD-ROM device
> -#define EFI_SCSI_TYPE_SCANNER       0x06  ///< Scanner device
> -#define EFI_SCSI_TYPE_OPTICAL       0x07  ///< Optical memory device (e.g.
> some optical disks)
> -#define EFI_SCSI_TYPE_MEDIUMCHANGER 0x08  ///< Medium changer
> device (e.g. jukeboxes)
> -#define EFI_SCSI_TYPE_COMMUNICATION 0x09  ///< Communications
> device
> -#define EFI_SCSI_TYPE_ASCIT8_1      0x0A  ///< Defined by ASC IT8 (Graphic
> arts pre-press devices)
> -#define EFI_SCSI_TYPE_ASCIT8_2      0x0B  ///< Defined by ASC IT8 (Graphic
> arts pre-press devices)


Could you help to address Liming's comment in the V4 series that to preserve
the definition for EFI_SCSI_TYPE_ASCIT8_1 & EFI_SCSI_TYPE_ASCIT8_2 for
compatibility consideration:

https://edk2.groups.io/g/devel/message/42361?p=,,,20,0,0,0::Created,,scsi,20,2,40,32048246


> -//
> -// 0Ch - 1Eh are reserved
> -//
> -#define EFI_SCSI_TYPE_UNKNOWN       0x1F  ///< Unknown or no device
> type
> +#define EFI_SCSI_TYPE_DISK            0x00  ///< Direct-access device (e.g.
> magnetic disk)
> +#define EFI_SCSI_TYPE_TAPE            0x01  ///< Sequential-access device (e.g.
> magnetic tape)
> +#define EFI_SCSI_TYPE_PRINTER         0x02  ///< Printer device
> +#define EFI_SCSI_TYPE_PROCESSOR       0x03  ///< Processor device
> +#define EFI_SCSI_TYPE_WORM            0x04  ///< Write-once device (e.g.
> some optical disks)
> +#define EFI_SCSI_TYPE_CDROM           0x05  ///< CD/DVD device
> +#define EFI_SCSI_TYPE_SCANNER         0x06  ///< Scanner device (obsolete)
> +#define EFI_SCSI_TYPE_OPTICAL         0x07  ///< Optical memory device (e.g.
> some optical disks)
> +#define EFI_SCSI_TYPE_MEDIUMCHANGER   0x08  ///< Medium changer
> device (e.g. jukeboxes)
> +#define EFI_SCSI_TYPE_COMMUNICATION   0x09  ///< Communications
> device (obsolete)
> +#define EFI_SCSI_TYPE_A               0x0A  ///< Obsolete
> +#define EFI_SCSI_TYPE_B               0x0B  ///< Obsolete
> +#define EFI_SCSI_TYPE_RAID            0x0C  ///< Storage array controller
> device (e.g., RAID)
> +#define EFI_SCSI_TYPE_SES             0x0D  ///< Enclosure services device
> +#define EFI_SCSI_TYPE_RBC             0x0E  ///< Simplified direct-access device
> (e.g., magnetic disk)
> +#define EFI_SCSI_TYPE_OCRW            0x0F  ///< Optical card reader/writer
> device
> +#define EFI_SCSI_TYPE_BRIDGE          0x10  ///< Bridge Controller Commands
> +#define EFI_SCSI_TYPE_OSD             0x11  ///< Object-based Storage Device
> +#define EFI_SCSI_TYPE_AUTOMATION      0x12  ///< Automation/Drive
> Interface
> +#define EFI_SCSI_TYPE_SECURITYMANAGER 0x13  ///< Security manager
> device
> +#define EFI_SCSI_TYPE_RESERVED_LOW    0x14  ///< Reserved (low)
> +#define EFI_SCSI_TYPE_RESERVED_HIGH   0x1D  ///< Reserved (high)
> +#define EFI_SCSI_TYPE_WLUN            0x1E  ///< Well known logical unit
> +#define EFI_SCSI_TYPE_UNKNOWN         0x1F  ///< Unknown or no device
> type
> 
>  //
>  // Page Codes for INQUIRY command
> diff --git a/MdePkg/Include/Library/UefiScsiLib.h
> b/MdePkg/Include/Library/UefiScsiLib.h
> index 10dd81902b..a0d99e703a 100644
> --- a/MdePkg/Include/Library/UefiScsiLib.h
> +++ b/MdePkg/Include/Library/UefiScsiLib.h
> @@ -5,7 +5,7 @@
>    for hard drive, CD and DVD devices that are the most common SCSI boot
> targets used by UEFI platforms.
>    This library class depends on SCSI I/O Protocol defined in UEFI Specification
> and SCSI-2 industry standard.
> 
> -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -813,6 +813,130 @@ ScsiWrite16Command (
>    );
> 
> 
> +/**
> +  Execute Security Protocol In SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol In command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to
> construct


As mentioned in V4 series:

There is no 'StartLba' & 'SectorSize' parameters for APIs:

ScsiSecurityProtocolInCommand
ScsiSecurityProtocolOutCommand

Could you help to update the comments to address this?
(Please help to update UefiScsiLib.c as well.)


> +  the CDB for this SCSI command.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If DataLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> +  @param[in]      Timeout              The length of timeout period.
> +  @param[in, out] SenseData            A pointer to output sense data.
> +  @param[in, out] SenseDataLength      The length of output sense data.
> +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> +  @param[out]     TargetStatus         The status of the target.
> +  @param[in]      SecurityProtocol     The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
> +  @param[in]      TransferLength       The size in bytes of the data allocation.
> +  @param[in, out] DataBuffer           A pointer to a data buffer.
> +  @param[in, out] DataLength           The length of data buffer.


As mentioned in V4 series:

Referring to the implementation of the library (changes made in
MdePkg/Library/UefiScsiLib/UefiScsiLib.c):

'TransferLength' (input) specifies the length of content in 'DataBuffer';
'DataLength' (input & output) reflects the actual number of bytes
transferred.

How about swapping their names and changing the description comments to:
(Please help to update UefiScsiLib.c as well.)

  @param[in]      DataLength           The size in bytes of the data buffer.
  ...
  @param[out]     TransferLength       A pointer to a buffer to store the size
                                       in bytes of the data written to the data
                                       buffer.


> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @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 DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolInCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     UINT32                TransferLength,
> +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> +  IN OUT UINT32                *DataLength
> +  );


As mentioned in V4 series, could you help to add a new parameter "Inc512" for
both new APIs:
ScsiSecurityProtocolInCommand
ScsiSecurityProtocolOutCommand

Though UFS spec requires the INC_512 field of a CDB to be set to 0, but
for other devices, setting this field to 1 may be a valid configuration.


Also, I would suggest the below parameter type changes to match with the services
definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL (including the
name swap mentioned above):

IN     UINT32                TransferLength,
to
IN     UINTN                 DataLength,

IN OUT UINT32                *DataLength
to
   OUT UINTN                 *TransferLength


> +
> +
> +/**
> +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol Out command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to
> construct


As mentioned in V4 series:

There is no 'StartLba' & 'SectorSize' parameters for APIs:

ScsiSecurityProtocolInCommand
ScsiSecurityProtocolOutCommand

Could you help to update the comments to address this?
(Please help to update UefiScsiLib.c as well.)


> +  the CDB for this SCSI command.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If DataLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> +  @param[in]      Timeout              The length of timeout period.
> +  @param[in, out] SenseData            A pointer to output sense data.
> +  @param[in, out] SenseDataLength      The length of output sense data.
> +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> +  @param[out]     TargetStatus         The status of the target.
> +  @param[in]      SecurityProtocol     The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
> +  @param[in]      TransferLength       The size in bytes of the transfer data.
> +  @param[in, out] DataBuffer           A pointer to a data buffer.


As mentioned in V4:

Suggest to rename 'TransferLength' to 'DataLength' so that it may be a bit
more clear for users to know 'DataLength' reflects the size of 'DataBuffer'.


> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @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 DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolOutCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     UINT32                TransferLength,
> +  IN OUT VOID                  *DataBuffer  OPTIONAL
> +  );


As mentioned in V4 series:

Suggest the below parameter type changes to match with the services
definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL (including the
name change mentioned above):

IN     UINT32                TransferLength
to
IN     UINTN                 DataLength

Best Regards,
Hao Wu


> +
> +
>  /**
>    Execute blocking/non-blocking Read(10) SCSI command on a specific SCSI
>    target.
> diff --git a/MdePkg/Include/Protocol/ScsiIo.h
> b/MdePkg/Include/Protocol/ScsiIo.h
> index 05e46bda9c..27c31fe7f9 100644
> --- a/MdePkg/Include/Protocol/ScsiIo.h
> +++ b/MdePkg/Include/Protocol/ScsiIo.h
> @@ -4,7 +4,7 @@
>    services environment to access SCSI devices. In particular, functions for
>    managing devices on SCSI buses are defined here.
> 
> -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -43,8 +43,11 @@ typedef struct _EFI_SCSI_IO_PROTOCOL
> EFI_SCSI_IO_PROTOCOL;
>  #define MFI_SCSI_IO_TYPE_OCRW                                  0x0F    ///< Optical card
> reader/writer device
>  #define MFI_SCSI_IO_TYPE_BRIDGE                                0x10    ///< Bridge
> Controller Commands
>  #define MFI_SCSI_IO_TYPE_OSD                                   0x11    ///< Object-based
> Storage Device
> -#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x12    ///<
> Reserved (low)
> -#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1E    ///<
> Reserved (high)
> +#define MFI_SCSI_IO_TYPE_AUTOMATION                            0x12    ///<
> Automation/Drive Interface
> +#define MFI_SCSI_IO_TYPE_SECURITYMANAGER                       0x13    ///<
> Security manager device
> +#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x14    ///<
> Reserved (low)
> +#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1D    ///<
> Reserved (high)
> +#define EFI_SCSI_IO_TYPE_WLUN                                  0x1E    ///< Well known
> logical unit
>  #define EFI_SCSI_IO_TYPE_UNKNOWN                               0x1F    ///< Unknown
> no device type
> 
>  //
> diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> index c7491d1436..7584d717ad 100644
> --- a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> +++ b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> @@ -1,7 +1,7 @@
>  /** @file
>    UEFI SCSI Library implementation
> 
> -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -23,6 +23,7 @@
>    //
>  #define EFI_SCSI_OP_LENGTH_SIX      0x6
>  #define EFI_SCSI_OP_LENGTH_TEN      0xa
> +#define EFI_SCSI_OP_LENGTH_TWELVE   0xc
>  #define EFI_SCSI_OP_LENGTH_SIXTEEN  0x10
> 
>  //
> @@ -1280,6 +1281,208 @@ ScsiWrite16Command (
>  }
> 
> 
> +/**
> +  Execute Security Protocol In SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol In command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to
> construct


As mentioned in V4 series:

There is no 'StartLba' & 'SectorSize' parameters for APIs:

ScsiSecurityProtocolInCommand
ScsiSecurityProtocolOutCommand

Could you help to update the comments to address this?
(Please help to update UefiScsiLib.c as well.)


> +  the CDB for this SCSI command.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If DataLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> +  @param[in]      Timeout              The length of timeout period.
> +  @param[in, out] SenseData            A pointer to output sense data.
> +  @param[in, out] SenseDataLength      The length of output sense data.
> +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> +  @param[out]     TargetStatus         The status of the target.
> +  @param[in]      SecurityProtocol     The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
> +  @param[in]      TransferLength       The size in bytes of the data allocation.
> +  @param[in, out] DataBuffer           A pointer to a data buffer.
> +  @param[in, out] DataLength           The length of data buffer.
> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @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 DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolInCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     UINT32                TransferLength,
> +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> +  IN OUT UINT32                *DataLength
> +  )
> +{
> +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> +  EFI_STATUS                      Status;
> +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> +
> +  ASSERT (SenseDataLength != NULL);
> +  ASSERT (HostAdapterStatus != NULL);
> +  ASSERT (TargetStatus != NULL);
> +  ASSERT (DataLength != NULL);
> +  ASSERT (ScsiIo != NULL);
> +
> +  ZeroMem (&CommandPacket, sizeof
> (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> +
> +  CommandPacket.Timeout           = Timeout;
> +  CommandPacket.InDataBuffer      = DataBuffer;
> +  CommandPacket.SenseData         = SenseData;
> +  CommandPacket.InTransferLength  = TransferLength;
> +  CommandPacket.Cdb               = Cdb;
> +  //
> +  // Fill Cdb for Security Protocol In Command
> +  //
> +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_IN;
> +  Cdb[1]                        = SecurityProtocol;
> +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> (SecurityProtocolSpecific));
> +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength));
> +
> +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> +  CommandPacket.DataDirection   = EFI_SCSI_DATA_IN;
> +  CommandPacket.SenseDataLength = *SenseDataLength;
> +
> +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> &CommandPacket, NULL);
> +
> +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> +  *TargetStatus                 = CommandPacket.TargetStatus;
> +  *SenseDataLength              = CommandPacket.SenseDataLength;
> +  *DataLength                   = CommandPacket.InTransferLength;
> +
> +  return Status;
> +}
> +
> +
> +/**
> +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol Out command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to
> construct
> +  the CDB for this SCSI command.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If DataLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> +  @param[in]      Timeout              The length of timeout period.
> +  @param[in, out] SenseData            A pointer to output sense data.
> +  @param[in, out] SenseDataLength      The length of output sense data.
> +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> +  @param[out]     TargetStatus         The status of the target.
> +  @param[in]      SecurityProtocol     The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
> +  @param[in]      TransferLength       The size in bytes of the transfer data.
> +  @param[in, out] DataBuffer           A pointer to a data buffer.
> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @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 DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolOutCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     UINT32                TransferLength,
> +  IN OUT VOID                  *DataBuffer   OPTIONAL
> +  )
> +{
> +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> +  EFI_STATUS                      Status;
> +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> +
> +  ASSERT (SenseDataLength != NULL);
> +  ASSERT (HostAdapterStatus != NULL);
> +  ASSERT (TargetStatus != NULL);
> +  ASSERT (ScsiIo != NULL);
> +
> +  ZeroMem (&CommandPacket, sizeof
> (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> +
> +  CommandPacket.Timeout           = Timeout;
> +  CommandPacket.OutDataBuffer     = DataBuffer;
> +  CommandPacket.SenseData         = SenseData;
> +  CommandPacket.OutTransferLength = TransferLength;
> +  CommandPacket.Cdb               = Cdb;
> +  //
> +  // Fill Cdb for Security Protocol Out Command
> +  //
> +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_OUT;
> +  Cdb[1]                        = SecurityProtocol;
> +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> (SecurityProtocolSpecific));
> +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength));
> +
> +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> +  CommandPacket.DataDirection   = EFI_SCSI_DATA_OUT;
> +  CommandPacket.SenseDataLength = *SenseDataLength;
> +
> +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> &CommandPacket, NULL);
> +
> +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> +  *TargetStatus                 = CommandPacket.TargetStatus;
> +  *SenseDataLength              = CommandPacket.SenseDataLength;
> +
> +  return Status;
> +}
> +
> +
>  /**
>    Internal helper notify function in which update the result of the
>    non-blocking SCSI Read/Write commands and signal caller event.
> --
> 2.16.2.windows.1
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#46405): https://edk2.groups.io/g/devel/message/46405
Mute This Topic: https://groups.io/mt/32994942/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out
Posted by Zurcher, Christopher J 6 years, 5 months ago
I've implemented all the suggested changes except changing the arguments from UINT32 to UINTN. No other functions in UefiScsiLib take UINTN arguments, and since the library is directly packing the CDB, I think it makes sense to force the caller to provide the correct-size length value. That way there is no ambiguity on what is going to the device.
If you agree I will send the updated patchset.

Thanks,
Christopher Zurcher

-----Original Message-----
From: Wu, Hao A 
Sent: Monday, August 26, 2019 20:03
To: devel@edk2.groups.io; Zurcher, Christopher J <christopher.j.zurcher@intel.com>
Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J <jian.j.wang@intel.com>; Gao, Liming <liming.gao@intel.com>
Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out

Hello,

Please refer to the below inline comments:


> -----Original Message-----
> From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> Zurcher, Christopher J
> Sent: Friday, August 23, 2019 6:02 AM
> To: devel@edk2.groups.io
> Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> Subject: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands
> for Security Protocol In/Out
> 
> This patch implements the Security Protocol In and Security Protocol Out
> commands in UefiScsiLib to prepare support for the Storage Security
> Command Protocol.
> 
> Cc: Jiewen Yao <jiewen.yao@intel.com>
> Cc: Jian J Wang <jian.j.wang@intel.com>
> Cc: Liming Gao <liming.gao@intel.com>
> Signed-off-by: Christopher J Zurcher <christopher.j.zurcher@intel.com>
> ---
>  MdePkg/Include/IndustryStandard/Scsi.h   |  48 +++--
>  MdePkg/Include/Library/UefiScsiLib.h     | 126 +++++++++++-
>  MdePkg/Include/Protocol/ScsiIo.h         |   9 +-
>  MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 205 +++++++++++++++++++-
>  4 files changed, 366 insertions(+), 22 deletions(-)
> 
> diff --git a/MdePkg/Include/IndustryStandard/Scsi.h
> b/MdePkg/Include/IndustryStandard/Scsi.h
> index cbe5709fe5..10d7b49ba7 100644
> --- a/MdePkg/Include/IndustryStandard/Scsi.h
> +++ b/MdePkg/Include/IndustryStandard/Scsi.h
> @@ -1,7 +1,7 @@
>  /** @file
>    Support for SCSI-2 standard
> 
> -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -163,6 +163,12 @@
>  #define EFI_SCSI_OP_SEND_MESSAGE10  0x2a
>  #define EFI_SCSI_OP_SEND_MESSAGE12  0xaa
> 
> +//
> +// Additional commands for Secure Transactions
> +//
> +#define EFI_SCSI_OP_SECURITY_PROTOCOL_IN  0xa2
> +#define EFI_SCSI_OP_SECURITY_PROTOCOL_OUT 0xb5
> +
>  //
>  // SCSI Data Transfer Direction
>  //
> @@ -172,22 +178,30 @@
>  //
>  // Peripheral Device Type Definitions
>  //
> -#define EFI_SCSI_TYPE_DISK          0x00  ///< Direct-access device (e.g.
> magnetic disk)
> -#define EFI_SCSI_TYPE_TAPE          0x01  ///< Sequential-access device (e.g.
> magnetic tape)
> -#define EFI_SCSI_TYPE_PRINTER       0x02  ///< Printer device
> -#define EFI_SCSI_TYPE_PROCESSOR     0x03  ///< Processor device
> -#define EFI_SCSI_TYPE_WORM          0x04  ///< Write-once device (e.g. some
> optical disks)
> -#define EFI_SCSI_TYPE_CDROM         0x05  ///< CD-ROM device
> -#define EFI_SCSI_TYPE_SCANNER       0x06  ///< Scanner device
> -#define EFI_SCSI_TYPE_OPTICAL       0x07  ///< Optical memory device (e.g.
> some optical disks)
> -#define EFI_SCSI_TYPE_MEDIUMCHANGER 0x08  ///< Medium changer
> device (e.g. jukeboxes)
> -#define EFI_SCSI_TYPE_COMMUNICATION 0x09  ///< Communications
> device
> -#define EFI_SCSI_TYPE_ASCIT8_1      0x0A  ///< Defined by ASC IT8 (Graphic
> arts pre-press devices)
> -#define EFI_SCSI_TYPE_ASCIT8_2      0x0B  ///< Defined by ASC IT8 (Graphic
> arts pre-press devices)


Could you help to address Liming's comment in the V4 series that to preserve
the definition for EFI_SCSI_TYPE_ASCIT8_1 & EFI_SCSI_TYPE_ASCIT8_2 for
compatibility consideration:

https://edk2.groups.io/g/devel/message/42361?p=,,,20,0,0,0::Created,,scsi,20,2,40,32048246


> -//
> -// 0Ch - 1Eh are reserved
> -//
> -#define EFI_SCSI_TYPE_UNKNOWN       0x1F  ///< Unknown or no device
> type
> +#define EFI_SCSI_TYPE_DISK            0x00  ///< Direct-access device (e.g.
> magnetic disk)
> +#define EFI_SCSI_TYPE_TAPE            0x01  ///< Sequential-access device (e.g.
> magnetic tape)
> +#define EFI_SCSI_TYPE_PRINTER         0x02  ///< Printer device
> +#define EFI_SCSI_TYPE_PROCESSOR       0x03  ///< Processor device
> +#define EFI_SCSI_TYPE_WORM            0x04  ///< Write-once device (e.g.
> some optical disks)
> +#define EFI_SCSI_TYPE_CDROM           0x05  ///< CD/DVD device
> +#define EFI_SCSI_TYPE_SCANNER         0x06  ///< Scanner device (obsolete)
> +#define EFI_SCSI_TYPE_OPTICAL         0x07  ///< Optical memory device (e.g.
> some optical disks)
> +#define EFI_SCSI_TYPE_MEDIUMCHANGER   0x08  ///< Medium changer
> device (e.g. jukeboxes)
> +#define EFI_SCSI_TYPE_COMMUNICATION   0x09  ///< Communications
> device (obsolete)
> +#define EFI_SCSI_TYPE_A               0x0A  ///< Obsolete
> +#define EFI_SCSI_TYPE_B               0x0B  ///< Obsolete
> +#define EFI_SCSI_TYPE_RAID            0x0C  ///< Storage array controller
> device (e.g., RAID)
> +#define EFI_SCSI_TYPE_SES             0x0D  ///< Enclosure services device
> +#define EFI_SCSI_TYPE_RBC             0x0E  ///< Simplified direct-access device
> (e.g., magnetic disk)
> +#define EFI_SCSI_TYPE_OCRW            0x0F  ///< Optical card reader/writer
> device
> +#define EFI_SCSI_TYPE_BRIDGE          0x10  ///< Bridge Controller Commands
> +#define EFI_SCSI_TYPE_OSD             0x11  ///< Object-based Storage Device
> +#define EFI_SCSI_TYPE_AUTOMATION      0x12  ///< Automation/Drive
> Interface
> +#define EFI_SCSI_TYPE_SECURITYMANAGER 0x13  ///< Security manager
> device
> +#define EFI_SCSI_TYPE_RESERVED_LOW    0x14  ///< Reserved (low)
> +#define EFI_SCSI_TYPE_RESERVED_HIGH   0x1D  ///< Reserved (high)
> +#define EFI_SCSI_TYPE_WLUN            0x1E  ///< Well known logical unit
> +#define EFI_SCSI_TYPE_UNKNOWN         0x1F  ///< Unknown or no device
> type
> 
>  //
>  // Page Codes for INQUIRY command
> diff --git a/MdePkg/Include/Library/UefiScsiLib.h
> b/MdePkg/Include/Library/UefiScsiLib.h
> index 10dd81902b..a0d99e703a 100644
> --- a/MdePkg/Include/Library/UefiScsiLib.h
> +++ b/MdePkg/Include/Library/UefiScsiLib.h
> @@ -5,7 +5,7 @@
>    for hard drive, CD and DVD devices that are the most common SCSI boot
> targets used by UEFI platforms.
>    This library class depends on SCSI I/O Protocol defined in UEFI Specification
> and SCSI-2 industry standard.
> 
> -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>  SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -813,6 +813,130 @@ ScsiWrite16Command (
>    );
> 
> 
> +/**
> +  Execute Security Protocol In SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol In command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to
> construct


As mentioned in V4 series:

There is no 'StartLba' & 'SectorSize' parameters for APIs:

ScsiSecurityProtocolInCommand
ScsiSecurityProtocolOutCommand

Could you help to update the comments to address this?
(Please help to update UefiScsiLib.c as well.)


> +  the CDB for this SCSI command.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If DataLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> +  @param[in]      Timeout              The length of timeout period.
> +  @param[in, out] SenseData            A pointer to output sense data.
> +  @param[in, out] SenseDataLength      The length of output sense data.
> +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> +  @param[out]     TargetStatus         The status of the target.
> +  @param[in]      SecurityProtocol     The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
> +  @param[in]      TransferLength       The size in bytes of the data allocation.
> +  @param[in, out] DataBuffer           A pointer to a data buffer.
> +  @param[in, out] DataLength           The length of data buffer.


As mentioned in V4 series:

Referring to the implementation of the library (changes made in
MdePkg/Library/UefiScsiLib/UefiScsiLib.c):

'TransferLength' (input) specifies the length of content in 'DataBuffer';
'DataLength' (input & output) reflects the actual number of bytes
transferred.

How about swapping their names and changing the description comments to:
(Please help to update UefiScsiLib.c as well.)

  @param[in]      DataLength           The size in bytes of the data buffer.
  ...
  @param[out]     TransferLength       A pointer to a buffer to store the size
                                       in bytes of the data written to the data
                                       buffer.


> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @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 DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolInCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     UINT32                TransferLength,
> +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> +  IN OUT UINT32                *DataLength
> +  );


As mentioned in V4 series, could you help to add a new parameter "Inc512" for
both new APIs:
ScsiSecurityProtocolInCommand
ScsiSecurityProtocolOutCommand

Though UFS spec requires the INC_512 field of a CDB to be set to 0, but
for other devices, setting this field to 1 may be a valid configuration.


Also, I would suggest the below parameter type changes to match with the services
definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL (including the
name swap mentioned above):

IN     UINT32                TransferLength,
to
IN     UINTN                 DataLength,

IN OUT UINT32                *DataLength
to
   OUT UINTN                 *TransferLength


> +
> +
> +/**
> +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol Out command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to
> construct


As mentioned in V4 series:

There is no 'StartLba' & 'SectorSize' parameters for APIs:

ScsiSecurityProtocolInCommand
ScsiSecurityProtocolOutCommand

Could you help to update the comments to address this?
(Please help to update UefiScsiLib.c as well.)


> +  the CDB for this SCSI command.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If DataLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> +  @param[in]      Timeout              The length of timeout period.
> +  @param[in, out] SenseData            A pointer to output sense data.
> +  @param[in, out] SenseDataLength      The length of output sense data.
> +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> +  @param[out]     TargetStatus         The status of the target.
> +  @param[in]      SecurityProtocol     The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
> +  @param[in]      TransferLength       The size in bytes of the transfer data.
> +  @param[in, out] DataBuffer           A pointer to a data buffer.


As mentioned in V4:

Suggest to rename 'TransferLength' to 'DataLength' so that it may be a bit
more clear for users to know 'DataLength' reflects the size of 'DataBuffer'.


> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @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 DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolOutCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     UINT32                TransferLength,
> +  IN OUT VOID                  *DataBuffer  OPTIONAL
> +  );


As mentioned in V4 series:

Suggest the below parameter type changes to match with the services
definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL (including the
name change mentioned above):

IN     UINT32                TransferLength
to
IN     UINTN                 DataLength

Best Regards,
Hao Wu


> +
> +
>  /**
>    Execute blocking/non-blocking Read(10) SCSI command on a specific SCSI
>    target.
> diff --git a/MdePkg/Include/Protocol/ScsiIo.h
> b/MdePkg/Include/Protocol/ScsiIo.h
> index 05e46bda9c..27c31fe7f9 100644
> --- a/MdePkg/Include/Protocol/ScsiIo.h
> +++ b/MdePkg/Include/Protocol/ScsiIo.h
> @@ -4,7 +4,7 @@
>    services environment to access SCSI devices. In particular, functions for
>    managing devices on SCSI buses are defined here.
> 
> -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -43,8 +43,11 @@ typedef struct _EFI_SCSI_IO_PROTOCOL
> EFI_SCSI_IO_PROTOCOL;
>  #define MFI_SCSI_IO_TYPE_OCRW                                  0x0F    ///< Optical card
> reader/writer device
>  #define MFI_SCSI_IO_TYPE_BRIDGE                                0x10    ///< Bridge
> Controller Commands
>  #define MFI_SCSI_IO_TYPE_OSD                                   0x11    ///< Object-based
> Storage Device
> -#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x12    ///<
> Reserved (low)
> -#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1E    ///<
> Reserved (high)
> +#define MFI_SCSI_IO_TYPE_AUTOMATION                            0x12    ///<
> Automation/Drive Interface
> +#define MFI_SCSI_IO_TYPE_SECURITYMANAGER                       0x13    ///<
> Security manager device
> +#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x14    ///<
> Reserved (low)
> +#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1D    ///<
> Reserved (high)
> +#define EFI_SCSI_IO_TYPE_WLUN                                  0x1E    ///< Well known
> logical unit
>  #define EFI_SCSI_IO_TYPE_UNKNOWN                               0x1F    ///< Unknown
> no device type
> 
>  //
> diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> index c7491d1436..7584d717ad 100644
> --- a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> +++ b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> @@ -1,7 +1,7 @@
>  /** @file
>    UEFI SCSI Library implementation
> 
> -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>    SPDX-License-Identifier: BSD-2-Clause-Patent
> 
>  **/
> @@ -23,6 +23,7 @@
>    //
>  #define EFI_SCSI_OP_LENGTH_SIX      0x6
>  #define EFI_SCSI_OP_LENGTH_TEN      0xa
> +#define EFI_SCSI_OP_LENGTH_TWELVE   0xc
>  #define EFI_SCSI_OP_LENGTH_SIXTEEN  0x10
> 
>  //
> @@ -1280,6 +1281,208 @@ ScsiWrite16Command (
>  }
> 
> 
> +/**
> +  Execute Security Protocol In SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol In command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to
> construct


As mentioned in V4 series:

There is no 'StartLba' & 'SectorSize' parameters for APIs:

ScsiSecurityProtocolInCommand
ScsiSecurityProtocolOutCommand

Could you help to update the comments to address this?
(Please help to update UefiScsiLib.c as well.)


> +  the CDB for this SCSI command.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If DataLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> +  @param[in]      Timeout              The length of timeout period.
> +  @param[in, out] SenseData            A pointer to output sense data.
> +  @param[in, out] SenseDataLength      The length of output sense data.
> +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> +  @param[out]     TargetStatus         The status of the target.
> +  @param[in]      SecurityProtocol     The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
> +  @param[in]      TransferLength       The size in bytes of the data allocation.
> +  @param[in, out] DataBuffer           A pointer to a data buffer.
> +  @param[in, out] DataLength           The length of data buffer.
> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @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 DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolInCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     UINT32                TransferLength,
> +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> +  IN OUT UINT32                *DataLength
> +  )
> +{
> +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> +  EFI_STATUS                      Status;
> +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> +
> +  ASSERT (SenseDataLength != NULL);
> +  ASSERT (HostAdapterStatus != NULL);
> +  ASSERT (TargetStatus != NULL);
> +  ASSERT (DataLength != NULL);
> +  ASSERT (ScsiIo != NULL);
> +
> +  ZeroMem (&CommandPacket, sizeof
> (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> +
> +  CommandPacket.Timeout           = Timeout;
> +  CommandPacket.InDataBuffer      = DataBuffer;
> +  CommandPacket.SenseData         = SenseData;
> +  CommandPacket.InTransferLength  = TransferLength;
> +  CommandPacket.Cdb               = Cdb;
> +  //
> +  // Fill Cdb for Security Protocol In Command
> +  //
> +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_IN;
> +  Cdb[1]                        = SecurityProtocol;
> +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> (SecurityProtocolSpecific));
> +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength));
> +
> +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> +  CommandPacket.DataDirection   = EFI_SCSI_DATA_IN;
> +  CommandPacket.SenseDataLength = *SenseDataLength;
> +
> +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> &CommandPacket, NULL);
> +
> +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> +  *TargetStatus                 = CommandPacket.TargetStatus;
> +  *SenseDataLength              = CommandPacket.SenseDataLength;
> +  *DataLength                   = CommandPacket.InTransferLength;
> +
> +  return Status;
> +}
> +
> +
> +/**
> +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> +
> +  Executes the SCSI Security Protocol Out command on the SCSI target
> specified by ScsiIo.
> +  If Timeout is zero, then this function waits indefinitely for the command to
> complete.
> +  If Timeout is greater than zero, then the command is executed and will
> timeout after
> +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used to
> construct
> +  the CDB for this SCSI command.
> +  If ScsiIo is NULL, then ASSERT().
> +  If SenseDataLength is NULL, then ASSERT().
> +  If HostAdapterStatus is NULL, then ASSERT().
> +  If TargetStatus is NULL, then ASSERT().
> +  If DataLength is NULL, then ASSERT().
> +
> +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> must meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> meet buffer
> +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> EFI_INVALID_PARAMETER
> +  gets returned.
> +
> +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> +  @param[in]      Timeout              The length of timeout period.
> +  @param[in, out] SenseData            A pointer to output sense data.
> +  @param[in, out] SenseDataLength      The length of output sense data.
> +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> +  @param[out]     TargetStatus         The status of the target.
> +  @param[in]      SecurityProtocol     The Security Protocol to use.
> +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific data.
> +  @param[in]      TransferLength       The size in bytes of the transfer data.
> +  @param[in, out] DataBuffer           A pointer to a data buffer.
> +
> +  @retval  EFI_SUCCESS                 Command is executed successfully.
> +  @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 DataLength.
> +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> sent because there are too many
> +                                       SCSI Command Packets already queued.
> +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> attempting to send SCSI Request Packet.
> +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> Request Packet is not supported by
> +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> SCSI Request Packet to execute.
> +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> Packet are invalid.
> +
> +**/
> +EFI_STATUS
> +EFIAPI
> +ScsiSecurityProtocolOutCommand (
> +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> +  IN     UINT64                Timeout,
> +  IN OUT VOID                  *SenseData,   OPTIONAL
> +  IN OUT UINT8                 *SenseDataLength,
> +     OUT UINT8                 *HostAdapterStatus,
> +     OUT UINT8                 *TargetStatus,
> +  IN     UINT8                 SecurityProtocol,
> +  IN     UINT16                SecurityProtocolSpecific,
> +  IN     UINT32                TransferLength,
> +  IN OUT VOID                  *DataBuffer   OPTIONAL
> +  )
> +{
> +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> +  EFI_STATUS                      Status;
> +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> +
> +  ASSERT (SenseDataLength != NULL);
> +  ASSERT (HostAdapterStatus != NULL);
> +  ASSERT (TargetStatus != NULL);
> +  ASSERT (ScsiIo != NULL);
> +
> +  ZeroMem (&CommandPacket, sizeof
> (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> +
> +  CommandPacket.Timeout           = Timeout;
> +  CommandPacket.OutDataBuffer     = DataBuffer;
> +  CommandPacket.SenseData         = SenseData;
> +  CommandPacket.OutTransferLength = TransferLength;
> +  CommandPacket.Cdb               = Cdb;
> +  //
> +  // Fill Cdb for Security Protocol Out Command
> +  //
> +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_OUT;
> +  Cdb[1]                        = SecurityProtocol;
> +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> (SecurityProtocolSpecific));
> +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength));
> +
> +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> +  CommandPacket.DataDirection   = EFI_SCSI_DATA_OUT;
> +  CommandPacket.SenseDataLength = *SenseDataLength;
> +
> +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> &CommandPacket, NULL);
> +
> +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> +  *TargetStatus                 = CommandPacket.TargetStatus;
> +  *SenseDataLength              = CommandPacket.SenseDataLength;
> +
> +  return Status;
> +}
> +
> +
>  /**
>    Internal helper notify function in which update the result of the
>    non-blocking SCSI Read/Write commands and signal caller event.
> --
> 2.16.2.windows.1
> 
> 
> 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#46605): https://edk2.groups.io/g/devel/message/46605
Mute This Topic: https://groups.io/mt/32994942/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out
Posted by Wu, Hao A 6 years, 5 months ago
Hello,

Sorry for top-posting.

I was thinking to make the parameters interface match between the UefiScsiLib
API and the EFI Storage Security Command Protocol service, since the
implementation of the SSC protocol will directly call the UefiScsiLib API.

More specifically, for UefiScsiLib API:
EFI_STATUS
EFIAPI
ScsiSecurityProtocolInCommand (
  ...
  IN     UINT32  TransferLength,
  ...
  IN OUT UINT32  *DataLength
  )

to match the SSC protocol service:
typedef
EFI_STATUS
(EFIAPI *EFI_STORAGE_SECURITY_RECEIVE_DATA)(
  ...
  IN UINTN   PayloadBufferSize,
  ...
  OUT UINTN  *PayloadTransferSize
  )

and for UefiScsiLib API:
EFI_STATUS
EFIAPI
ScsiSecurityProtocolOutCommand (
  ...
  IN     UINT32  TransferLength,
  ...
  )

to match the SSC protocol service:
typedef
EFI_STATUS
(EFIAPI *EFI_STORAGE_SECURITY_SEND_DATA) (
  ...
  IN UINTN  PayloadBufferSize,
  ...
  )

I am okay with the cast from UINTN to UINT32, as long as we can ensure
truncation will not happen (which I think should be safe when dealing with
data transfer with actual devices).

But for casting from UINTN* to UINT32*, I am not sure if this is a recommended
coding style. Maybe within the BIOS perspective, little endian is always the
case where such cast should work well.

I will leave this open to MdePkg package maintainers for their inputs.

Best Regards,
Hao Wu


> -----Original Message-----
> From: Zurcher, Christopher J
> Sent: Friday, August 30, 2019 8:35 AM
> To: Wu, Hao A; devel@edk2.groups.io
> Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> commands for Security Protocol In/Out
> 
> I've implemented all the suggested changes except changing the arguments
> from UINT32 to UINTN. No other functions in UefiScsiLib take UINTN
> arguments, and since the library is directly packing the CDB, I think it makes
> sense to force the caller to provide the correct-size length value. That way
> there is no ambiguity on what is going to the device.
> If you agree I will send the updated patchset.
> 
> Thanks,
> Christopher Zurcher
> 
> -----Original Message-----
> From: Wu, Hao A
> Sent: Monday, August 26, 2019 20:03
> To: devel@edk2.groups.io; Zurcher, Christopher J
> <christopher.j.zurcher@intel.com>
> Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J
> <jian.j.wang@intel.com>; Gao, Liming <liming.gao@intel.com>
> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> commands for Security Protocol In/Out
> 
> Hello,
> 
> Please refer to the below inline comments:
> 
> 
> > -----Original Message-----
> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
> > Zurcher, Christopher J
> > Sent: Friday, August 23, 2019 6:02 AM
> > To: devel@edk2.groups.io
> > Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> > Subject: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands
> > for Security Protocol In/Out
> >
> > This patch implements the Security Protocol In and Security Protocol Out
> > commands in UefiScsiLib to prepare support for the Storage Security
> > Command Protocol.
> >
> > Cc: Jiewen Yao <jiewen.yao@intel.com>
> > Cc: Jian J Wang <jian.j.wang@intel.com>
> > Cc: Liming Gao <liming.gao@intel.com>
> > Signed-off-by: Christopher J Zurcher <christopher.j.zurcher@intel.com>
> > ---
> >  MdePkg/Include/IndustryStandard/Scsi.h   |  48 +++--
> >  MdePkg/Include/Library/UefiScsiLib.h     | 126 +++++++++++-
> >  MdePkg/Include/Protocol/ScsiIo.h         |   9 +-
> >  MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 205 +++++++++++++++++++-
> >  4 files changed, 366 insertions(+), 22 deletions(-)
> >
> > diff --git a/MdePkg/Include/IndustryStandard/Scsi.h
> > b/MdePkg/Include/IndustryStandard/Scsi.h
> > index cbe5709fe5..10d7b49ba7 100644
> > --- a/MdePkg/Include/IndustryStandard/Scsi.h
> > +++ b/MdePkg/Include/IndustryStandard/Scsi.h
> > @@ -1,7 +1,7 @@
> >  /** @file
> >    Support for SCSI-2 standard
> >
> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> >    SPDX-License-Identifier: BSD-2-Clause-Patent
> >
> >  **/
> > @@ -163,6 +163,12 @@
> >  #define EFI_SCSI_OP_SEND_MESSAGE10  0x2a
> >  #define EFI_SCSI_OP_SEND_MESSAGE12  0xaa
> >
> > +//
> > +// Additional commands for Secure Transactions
> > +//
> > +#define EFI_SCSI_OP_SECURITY_PROTOCOL_IN  0xa2
> > +#define EFI_SCSI_OP_SECURITY_PROTOCOL_OUT 0xb5
> > +
> >  //
> >  // SCSI Data Transfer Direction
> >  //
> > @@ -172,22 +178,30 @@
> >  //
> >  // Peripheral Device Type Definitions
> >  //
> > -#define EFI_SCSI_TYPE_DISK          0x00  ///< Direct-access device (e.g.
> > magnetic disk)
> > -#define EFI_SCSI_TYPE_TAPE          0x01  ///< Sequential-access device (e.g.
> > magnetic tape)
> > -#define EFI_SCSI_TYPE_PRINTER       0x02  ///< Printer device
> > -#define EFI_SCSI_TYPE_PROCESSOR     0x03  ///< Processor device
> > -#define EFI_SCSI_TYPE_WORM          0x04  ///< Write-once device (e.g.
> some
> > optical disks)
> > -#define EFI_SCSI_TYPE_CDROM         0x05  ///< CD-ROM device
> > -#define EFI_SCSI_TYPE_SCANNER       0x06  ///< Scanner device
> > -#define EFI_SCSI_TYPE_OPTICAL       0x07  ///< Optical memory device (e.g.
> > some optical disks)
> > -#define EFI_SCSI_TYPE_MEDIUMCHANGER 0x08  ///< Medium changer
> > device (e.g. jukeboxes)
> > -#define EFI_SCSI_TYPE_COMMUNICATION 0x09  ///< Communications
> > device
> > -#define EFI_SCSI_TYPE_ASCIT8_1      0x0A  ///< Defined by ASC IT8
> (Graphic
> > arts pre-press devices)
> > -#define EFI_SCSI_TYPE_ASCIT8_2      0x0B  ///< Defined by ASC IT8
> (Graphic
> > arts pre-press devices)
> 
> 
> Could you help to address Liming's comment in the V4 series that to preserve
> the definition for EFI_SCSI_TYPE_ASCIT8_1 & EFI_SCSI_TYPE_ASCIT8_2 for
> compatibility consideration:
> 
> https://edk2.groups.io/g/devel/message/42361?p=,,,20,0,0,0::Created,,scsi,
> 20,2,40,32048246
> 
> 
> > -//
> > -// 0Ch - 1Eh are reserved
> > -//
> > -#define EFI_SCSI_TYPE_UNKNOWN       0x1F  ///< Unknown or no device
> > type
> > +#define EFI_SCSI_TYPE_DISK            0x00  ///< Direct-access device (e.g.
> > magnetic disk)
> > +#define EFI_SCSI_TYPE_TAPE            0x01  ///< Sequential-access device
> (e.g.
> > magnetic tape)
> > +#define EFI_SCSI_TYPE_PRINTER         0x02  ///< Printer device
> > +#define EFI_SCSI_TYPE_PROCESSOR       0x03  ///< Processor device
> > +#define EFI_SCSI_TYPE_WORM            0x04  ///< Write-once device (e.g.
> > some optical disks)
> > +#define EFI_SCSI_TYPE_CDROM           0x05  ///< CD/DVD device
> > +#define EFI_SCSI_TYPE_SCANNER         0x06  ///< Scanner device (obsolete)
> > +#define EFI_SCSI_TYPE_OPTICAL         0x07  ///< Optical memory device
> (e.g.
> > some optical disks)
> > +#define EFI_SCSI_TYPE_MEDIUMCHANGER   0x08  ///< Medium changer
> > device (e.g. jukeboxes)
> > +#define EFI_SCSI_TYPE_COMMUNICATION   0x09  ///< Communications
> > device (obsolete)
> > +#define EFI_SCSI_TYPE_A               0x0A  ///< Obsolete
> > +#define EFI_SCSI_TYPE_B               0x0B  ///< Obsolete
> > +#define EFI_SCSI_TYPE_RAID            0x0C  ///< Storage array controller
> > device (e.g., RAID)
> > +#define EFI_SCSI_TYPE_SES             0x0D  ///< Enclosure services device
> > +#define EFI_SCSI_TYPE_RBC             0x0E  ///< Simplified direct-access
> device
> > (e.g., magnetic disk)
> > +#define EFI_SCSI_TYPE_OCRW            0x0F  ///< Optical card reader/writer
> > device
> > +#define EFI_SCSI_TYPE_BRIDGE          0x10  ///< Bridge Controller
> Commands
> > +#define EFI_SCSI_TYPE_OSD             0x11  ///< Object-based Storage
> Device
> > +#define EFI_SCSI_TYPE_AUTOMATION      0x12  ///< Automation/Drive
> > Interface
> > +#define EFI_SCSI_TYPE_SECURITYMANAGER 0x13  ///< Security manager
> > device
> > +#define EFI_SCSI_TYPE_RESERVED_LOW    0x14  ///< Reserved (low)
> > +#define EFI_SCSI_TYPE_RESERVED_HIGH   0x1D  ///< Reserved (high)
> > +#define EFI_SCSI_TYPE_WLUN            0x1E  ///< Well known logical unit
> > +#define EFI_SCSI_TYPE_UNKNOWN         0x1F  ///< Unknown or no device
> > type
> >
> >  //
> >  // Page Codes for INQUIRY command
> > diff --git a/MdePkg/Include/Library/UefiScsiLib.h
> > b/MdePkg/Include/Library/UefiScsiLib.h
> > index 10dd81902b..a0d99e703a 100644
> > --- a/MdePkg/Include/Library/UefiScsiLib.h
> > +++ b/MdePkg/Include/Library/UefiScsiLib.h
> > @@ -5,7 +5,7 @@
> >    for hard drive, CD and DVD devices that are the most common SCSI boot
> > targets used by UEFI platforms.
> >    This library class depends on SCSI I/O Protocol defined in UEFI
> Specification
> > and SCSI-2 industry standard.
> >
> > -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> > +Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> >  SPDX-License-Identifier: BSD-2-Clause-Patent
> >
> >  **/
> > @@ -813,6 +813,130 @@ ScsiWrite16Command (
> >    );
> >
> >
> > +/**
> > +  Execute Security Protocol In SCSI command on a specific SCSI target.
> > +
> > +  Executes the SCSI Security Protocol In command on the SCSI target
> > specified by ScsiIo.
> > +  If Timeout is zero, then this function waits indefinitely for the command
> to
> > complete.
> > +  If Timeout is greater than zero, then the command is executed and will
> > timeout after
> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used
> to
> > construct
> 
> 
> As mentioned in V4 series:
> 
> There is no 'StartLba' & 'SectorSize' parameters for APIs:
> 
> ScsiSecurityProtocolInCommand
> ScsiSecurityProtocolOutCommand
> 
> Could you help to update the comments to address this?
> (Please help to update UefiScsiLib.c as well.)
> 
> 
> > +  the CDB for this SCSI command.
> > +  If ScsiIo is NULL, then ASSERT().
> > +  If SenseDataLength is NULL, then ASSERT().
> > +  If HostAdapterStatus is NULL, then ASSERT().
> > +  If TargetStatus is NULL, then ASSERT().
> > +  If DataLength is NULL, then ASSERT().
> > +
> > +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> > must meet buffer
> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> > EFI_INVALID_PARAMETER
> > +  gets returned.
> > +
> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> > meet buffer
> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> > EFI_INVALID_PARAMETER
> > +  gets returned.
> > +
> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> > +  @param[in]      Timeout              The length of timeout period.
> > +  @param[in, out] SenseData            A pointer to output sense data.
> > +  @param[in, out] SenseDataLength      The length of output sense data.
> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> > +  @param[out]     TargetStatus         The status of the target.
> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
> data.
> > +  @param[in]      TransferLength       The size in bytes of the data allocation.
> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> > +  @param[in, out] DataLength           The length of data buffer.
> 
> 
> As mentioned in V4 series:
> 
> Referring to the implementation of the library (changes made in
> MdePkg/Library/UefiScsiLib/UefiScsiLib.c):
> 
> 'TransferLength' (input) specifies the length of content in 'DataBuffer';
> 'DataLength' (input & output) reflects the actual number of bytes
> transferred.
> 
> How about swapping their names and changing the description comments to:
> (Please help to update UefiScsiLib.c as well.)
> 
>   @param[in]      DataLength           The size in bytes of the data buffer.
>   ...
>   @param[out]     TransferLength       A pointer to a buffer to store the size
>                                        in bytes of the data written to the data
>                                        buffer.
> 
> 
> > +
> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> > +  @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 DataLength.
> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> > sent because there are too many
> > +                                       SCSI Command Packets already queued.
> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> > attempting to send SCSI Request Packet.
> > +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> > Request Packet is not supported by
> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> > SCSI Request Packet to execute.
> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> > Packet are invalid.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +ScsiSecurityProtocolInCommand (
> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> > +  IN     UINT64                Timeout,
> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> > +  IN OUT UINT8                 *SenseDataLength,
> > +     OUT UINT8                 *HostAdapterStatus,
> > +     OUT UINT8                 *TargetStatus,
> > +  IN     UINT8                 SecurityProtocol,
> > +  IN     UINT16                SecurityProtocolSpecific,
> > +  IN     UINT32                TransferLength,
> > +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> > +  IN OUT UINT32                *DataLength
> > +  );
> 
> 
> As mentioned in V4 series, could you help to add a new parameter "Inc512"
> for
> both new APIs:
> ScsiSecurityProtocolInCommand
> ScsiSecurityProtocolOutCommand
> 
> Though UFS spec requires the INC_512 field of a CDB to be set to 0, but
> for other devices, setting this field to 1 may be a valid configuration.
> 
> 
> Also, I would suggest the below parameter type changes to match with the
> services
> definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL (including
> the
> name swap mentioned above):
> 
> IN     UINT32                TransferLength,
> to
> IN     UINTN                 DataLength,
> 
> IN OUT UINT32                *DataLength
> to
>    OUT UINTN                 *TransferLength
> 
> 
> > +
> > +
> > +/**
> > +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> > +
> > +  Executes the SCSI Security Protocol Out command on the SCSI target
> > specified by ScsiIo.
> > +  If Timeout is zero, then this function waits indefinitely for the command
> to
> > complete.
> > +  If Timeout is greater than zero, then the command is executed and will
> > timeout after
> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used
> to
> > construct
> 
> 
> As mentioned in V4 series:
> 
> There is no 'StartLba' & 'SectorSize' parameters for APIs:
> 
> ScsiSecurityProtocolInCommand
> ScsiSecurityProtocolOutCommand
> 
> Could you help to update the comments to address this?
> (Please help to update UefiScsiLib.c as well.)
> 
> 
> > +  the CDB for this SCSI command.
> > +  If ScsiIo is NULL, then ASSERT().
> > +  If SenseDataLength is NULL, then ASSERT().
> > +  If HostAdapterStatus is NULL, then ASSERT().
> > +  If TargetStatus is NULL, then ASSERT().
> > +  If DataLength is NULL, then ASSERT().
> > +
> > +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> > must meet buffer
> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> > EFI_INVALID_PARAMETER
> > +  gets returned.
> > +
> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> > meet buffer
> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> > EFI_INVALID_PARAMETER
> > +  gets returned.
> > +
> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> > +  @param[in]      Timeout              The length of timeout period.
> > +  @param[in, out] SenseData            A pointer to output sense data.
> > +  @param[in, out] SenseDataLength      The length of output sense data.
> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> > +  @param[out]     TargetStatus         The status of the target.
> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
> data.
> > +  @param[in]      TransferLength       The size in bytes of the transfer data.
> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> 
> 
> As mentioned in V4:
> 
> Suggest to rename 'TransferLength' to 'DataLength' so that it may be a bit
> more clear for users to know 'DataLength' reflects the size of 'DataBuffer'.
> 
> 
> > +
> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> > +  @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 DataLength.
> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> > sent because there are too many
> > +                                       SCSI Command Packets already queued.
> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> > attempting to send SCSI Request Packet.
> > +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> > Request Packet is not supported by
> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> > SCSI Request Packet to execute.
> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> > Packet are invalid.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +ScsiSecurityProtocolOutCommand (
> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> > +  IN     UINT64                Timeout,
> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> > +  IN OUT UINT8                 *SenseDataLength,
> > +     OUT UINT8                 *HostAdapterStatus,
> > +     OUT UINT8                 *TargetStatus,
> > +  IN     UINT8                 SecurityProtocol,
> > +  IN     UINT16                SecurityProtocolSpecific,
> > +  IN     UINT32                TransferLength,
> > +  IN OUT VOID                  *DataBuffer  OPTIONAL
> > +  );
> 
> 
> As mentioned in V4 series:
> 
> Suggest the below parameter type changes to match with the services
> definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL (including
> the
> name change mentioned above):
> 
> IN     UINT32                TransferLength
> to
> IN     UINTN                 DataLength
> 
> Best Regards,
> Hao Wu
> 
> 
> > +
> > +
> >  /**
> >    Execute blocking/non-blocking Read(10) SCSI command on a specific SCSI
> >    target.
> > diff --git a/MdePkg/Include/Protocol/ScsiIo.h
> > b/MdePkg/Include/Protocol/ScsiIo.h
> > index 05e46bda9c..27c31fe7f9 100644
> > --- a/MdePkg/Include/Protocol/ScsiIo.h
> > +++ b/MdePkg/Include/Protocol/ScsiIo.h
> > @@ -4,7 +4,7 @@
> >    services environment to access SCSI devices. In particular, functions for
> >    managing devices on SCSI buses are defined here.
> >
> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> >    SPDX-License-Identifier: BSD-2-Clause-Patent
> >
> >  **/
> > @@ -43,8 +43,11 @@ typedef struct _EFI_SCSI_IO_PROTOCOL
> > EFI_SCSI_IO_PROTOCOL;
> >  #define MFI_SCSI_IO_TYPE_OCRW                                  0x0F    ///< Optical
> card
> > reader/writer device
> >  #define MFI_SCSI_IO_TYPE_BRIDGE                                0x10    ///< Bridge
> > Controller Commands
> >  #define MFI_SCSI_IO_TYPE_OSD                                   0x11    ///< Object-
> based
> > Storage Device
> > -#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x12    ///<
> > Reserved (low)
> > -#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1E    ///<
> > Reserved (high)
> > +#define MFI_SCSI_IO_TYPE_AUTOMATION                            0x12    ///<
> > Automation/Drive Interface
> > +#define MFI_SCSI_IO_TYPE_SECURITYMANAGER                       0x13    ///<
> > Security manager device
> > +#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x14    ///<
> > Reserved (low)
> > +#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1D    ///<
> > Reserved (high)
> > +#define EFI_SCSI_IO_TYPE_WLUN                                  0x1E    ///< Well
> known
> > logical unit
> >  #define EFI_SCSI_IO_TYPE_UNKNOWN                               0x1F    ///<
> Unknown
> > no device type
> >
> >  //
> > diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> > b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> > index c7491d1436..7584d717ad 100644
> > --- a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> > +++ b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> > @@ -1,7 +1,7 @@
> >  /** @file
> >    UEFI SCSI Library implementation
> >
> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> >    SPDX-License-Identifier: BSD-2-Clause-Patent
> >
> >  **/
> > @@ -23,6 +23,7 @@
> >    //
> >  #define EFI_SCSI_OP_LENGTH_SIX      0x6
> >  #define EFI_SCSI_OP_LENGTH_TEN      0xa
> > +#define EFI_SCSI_OP_LENGTH_TWELVE   0xc
> >  #define EFI_SCSI_OP_LENGTH_SIXTEEN  0x10
> >
> >  //
> > @@ -1280,6 +1281,208 @@ ScsiWrite16Command (
> >  }
> >
> >
> > +/**
> > +  Execute Security Protocol In SCSI command on a specific SCSI target.
> > +
> > +  Executes the SCSI Security Protocol In command on the SCSI target
> > specified by ScsiIo.
> > +  If Timeout is zero, then this function waits indefinitely for the command
> to
> > complete.
> > +  If Timeout is greater than zero, then the command is executed and will
> > timeout after
> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used
> to
> > construct
> 
> 
> As mentioned in V4 series:
> 
> There is no 'StartLba' & 'SectorSize' parameters for APIs:
> 
> ScsiSecurityProtocolInCommand
> ScsiSecurityProtocolOutCommand
> 
> Could you help to update the comments to address this?
> (Please help to update UefiScsiLib.c as well.)
> 
> 
> > +  the CDB for this SCSI command.
> > +  If ScsiIo is NULL, then ASSERT().
> > +  If SenseDataLength is NULL, then ASSERT().
> > +  If HostAdapterStatus is NULL, then ASSERT().
> > +  If TargetStatus is NULL, then ASSERT().
> > +  If DataLength is NULL, then ASSERT().
> > +
> > +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> > must meet buffer
> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> > EFI_INVALID_PARAMETER
> > +  gets returned.
> > +
> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> > meet buffer
> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> > EFI_INVALID_PARAMETER
> > +  gets returned.
> > +
> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> > +  @param[in]      Timeout              The length of timeout period.
> > +  @param[in, out] SenseData            A pointer to output sense data.
> > +  @param[in, out] SenseDataLength      The length of output sense data.
> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> > +  @param[out]     TargetStatus         The status of the target.
> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
> data.
> > +  @param[in]      TransferLength       The size in bytes of the data allocation.
> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> > +  @param[in, out] DataLength           The length of data buffer.
> > +
> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> > +  @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 DataLength.
> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> > sent because there are too many
> > +                                       SCSI Command Packets already queued.
> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> > attempting to send SCSI Request Packet.
> > +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> > Request Packet is not supported by
> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> > SCSI Request Packet to execute.
> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> > Packet are invalid.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +ScsiSecurityProtocolInCommand (
> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> > +  IN     UINT64                Timeout,
> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> > +  IN OUT UINT8                 *SenseDataLength,
> > +     OUT UINT8                 *HostAdapterStatus,
> > +     OUT UINT8                 *TargetStatus,
> > +  IN     UINT8                 SecurityProtocol,
> > +  IN     UINT16                SecurityProtocolSpecific,
> > +  IN     UINT32                TransferLength,
> > +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> > +  IN OUT UINT32                *DataLength
> > +  )
> > +{
> > +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> > +  EFI_STATUS                      Status;
> > +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> > +
> > +  ASSERT (SenseDataLength != NULL);
> > +  ASSERT (HostAdapterStatus != NULL);
> > +  ASSERT (TargetStatus != NULL);
> > +  ASSERT (DataLength != NULL);
> > +  ASSERT (ScsiIo != NULL);
> > +
> > +  ZeroMem (&CommandPacket, sizeof
> > (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> > +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> > +
> > +  CommandPacket.Timeout           = Timeout;
> > +  CommandPacket.InDataBuffer      = DataBuffer;
> > +  CommandPacket.SenseData         = SenseData;
> > +  CommandPacket.InTransferLength  = TransferLength;
> > +  CommandPacket.Cdb               = Cdb;
> > +  //
> > +  // Fill Cdb for Security Protocol In Command
> > +  //
> > +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_IN;
> > +  Cdb[1]                        = SecurityProtocol;
> > +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> > (SecurityProtocolSpecific));
> > +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength));
> > +
> > +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> > +  CommandPacket.DataDirection   = EFI_SCSI_DATA_IN;
> > +  CommandPacket.SenseDataLength = *SenseDataLength;
> > +
> > +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> > &CommandPacket, NULL);
> > +
> > +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> > +  *TargetStatus                 = CommandPacket.TargetStatus;
> > +  *SenseDataLength              = CommandPacket.SenseDataLength;
> > +  *DataLength                   = CommandPacket.InTransferLength;
> > +
> > +  return Status;
> > +}
> > +
> > +
> > +/**
> > +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> > +
> > +  Executes the SCSI Security Protocol Out command on the SCSI target
> > specified by ScsiIo.
> > +  If Timeout is zero, then this function waits indefinitely for the command
> to
> > complete.
> > +  If Timeout is greater than zero, then the command is executed and will
> > timeout after
> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used
> to
> > construct
> > +  the CDB for this SCSI command.
> > +  If ScsiIo is NULL, then ASSERT().
> > +  If SenseDataLength is NULL, then ASSERT().
> > +  If HostAdapterStatus is NULL, then ASSERT().
> > +  If TargetStatus is NULL, then ASSERT().
> > +  If DataLength is NULL, then ASSERT().
> > +
> > +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
> > must meet buffer
> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> > EFI_INVALID_PARAMETER
> > +  gets returned.
> > +
> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
> > meet buffer
> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
> > EFI_INVALID_PARAMETER
> > +  gets returned.
> > +
> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> > +  @param[in]      Timeout              The length of timeout period.
> > +  @param[in, out] SenseData            A pointer to output sense data.
> > +  @param[in, out] SenseDataLength      The length of output sense data.
> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> > +  @param[out]     TargetStatus         The status of the target.
> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
> data.
> > +  @param[in]      TransferLength       The size in bytes of the transfer data.
> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> > +
> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> > +  @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 DataLength.
> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
> > sent because there are too many
> > +                                       SCSI Command Packets already queued.
> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> > attempting to send SCSI Request Packet.
> > +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
> > Request Packet is not supported by
> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
> > SCSI Request Packet to execute.
> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
> > Packet are invalid.
> > +
> > +**/
> > +EFI_STATUS
> > +EFIAPI
> > +ScsiSecurityProtocolOutCommand (
> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> > +  IN     UINT64                Timeout,
> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> > +  IN OUT UINT8                 *SenseDataLength,
> > +     OUT UINT8                 *HostAdapterStatus,
> > +     OUT UINT8                 *TargetStatus,
> > +  IN     UINT8                 SecurityProtocol,
> > +  IN     UINT16                SecurityProtocolSpecific,
> > +  IN     UINT32                TransferLength,
> > +  IN OUT VOID                  *DataBuffer   OPTIONAL
> > +  )
> > +{
> > +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> > +  EFI_STATUS                      Status;
> > +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> > +
> > +  ASSERT (SenseDataLength != NULL);
> > +  ASSERT (HostAdapterStatus != NULL);
> > +  ASSERT (TargetStatus != NULL);
> > +  ASSERT (ScsiIo != NULL);
> > +
> > +  ZeroMem (&CommandPacket, sizeof
> > (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> > +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> > +
> > +  CommandPacket.Timeout           = Timeout;
> > +  CommandPacket.OutDataBuffer     = DataBuffer;
> > +  CommandPacket.SenseData         = SenseData;
> > +  CommandPacket.OutTransferLength = TransferLength;
> > +  CommandPacket.Cdb               = Cdb;
> > +  //
> > +  // Fill Cdb for Security Protocol Out Command
> > +  //
> > +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_OUT;
> > +  Cdb[1]                        = SecurityProtocol;
> > +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> > (SecurityProtocolSpecific));
> > +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength));
> > +
> > +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> > +  CommandPacket.DataDirection   = EFI_SCSI_DATA_OUT;
> > +  CommandPacket.SenseDataLength = *SenseDataLength;
> > +
> > +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> > &CommandPacket, NULL);
> > +
> > +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> > +  *TargetStatus                 = CommandPacket.TargetStatus;
> > +  *SenseDataLength              = CommandPacket.SenseDataLength;
> > +
> > +  return Status;
> > +}
> > +
> > +
> >  /**
> >    Internal helper notify function in which update the result of the
> >    non-blocking SCSI Read/Write commands and signal caller event.
> > --
> > 2.16.2.windows.1
> >
> >
> > 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#46610): https://edk2.groups.io/g/devel/message/46610
Mute This Topic: https://groups.io/mt/32994942/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out
Posted by Liming Gao 6 years, 5 months ago
UefiScsiLib is designed for the convenient usage with SCSI commands. They should try to align to UEFI definition. 
If you check current SCSI APIs, their interface matches EFI_SCSI_IO_SCSI_REQUEST_PACKET strut. 
So, new added APIs had better match EFI_STORAGE_SECURITY_COMMAND_PROTOCOL. 

For the change in MdePkg\Include\Protocol\ScsiIo.h, where is new definition EFI_SCSI_IO_TYPE_WLUN from?

Thanks
Liming
>-----Original Message-----
>From: Wu, Hao A
>Sent: Friday, August 30, 2019 1:18 PM
>To: Zurcher, Christopher J <christopher.j.zurcher@intel.com>;
>devel@edk2.groups.io; Gao, Liming <liming.gao@intel.com>; Kinney, Michael
>D <michael.d.kinney@intel.com>
>Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J
><jian.j.wang@intel.com>
>Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands
>for Security Protocol In/Out
>
>Hello,
>
>Sorry for top-posting.
>
>I was thinking to make the parameters interface match between the
>UefiScsiLib
>API and the EFI Storage Security Command Protocol service, since the
>implementation of the SSC protocol will directly call the UefiScsiLib API.
>
>More specifically, for UefiScsiLib API:
>EFI_STATUS
>EFIAPI
>ScsiSecurityProtocolInCommand (
>  ...
>  IN     UINT32  TransferLength,
>  ...
>  IN OUT UINT32  *DataLength
>  )
>
>to match the SSC protocol service:
>typedef
>EFI_STATUS
>(EFIAPI *EFI_STORAGE_SECURITY_RECEIVE_DATA)(
>  ...
>  IN UINTN   PayloadBufferSize,
>  ...
>  OUT UINTN  *PayloadTransferSize
>  )
>
>and for UefiScsiLib API:
>EFI_STATUS
>EFIAPI
>ScsiSecurityProtocolOutCommand (
>  ...
>  IN     UINT32  TransferLength,
>  ...
>  )
>
>to match the SSC protocol service:
>typedef
>EFI_STATUS
>(EFIAPI *EFI_STORAGE_SECURITY_SEND_DATA) (
>  ...
>  IN UINTN  PayloadBufferSize,
>  ...
>  )
>
>I am okay with the cast from UINTN to UINT32, as long as we can ensure
>truncation will not happen (which I think should be safe when dealing with
>data transfer with actual devices).
>
>But for casting from UINTN* to UINT32*, I am not sure if this is a
>recommended
>coding style. Maybe within the BIOS perspective, little endian is always the
>case where such cast should work well.
>
>I will leave this open to MdePkg package maintainers for their inputs.
>
>Best Regards,
>Hao Wu
>
>
>> -----Original Message-----
>> From: Zurcher, Christopher J
>> Sent: Friday, August 30, 2019 8:35 AM
>> To: Wu, Hao A; devel@edk2.groups.io
>> Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
>> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
>> commands for Security Protocol In/Out
>>
>> I've implemented all the suggested changes except changing the arguments
>> from UINT32 to UINTN. No other functions in UefiScsiLib take UINTN
>> arguments, and since the library is directly packing the CDB, I think it makes
>> sense to force the caller to provide the correct-size length value. That way
>> there is no ambiguity on what is going to the device.
>> If you agree I will send the updated patchset.
>>
>> Thanks,
>> Christopher Zurcher
>>
>> -----Original Message-----
>> From: Wu, Hao A
>> Sent: Monday, August 26, 2019 20:03
>> To: devel@edk2.groups.io; Zurcher, Christopher J
>> <christopher.j.zurcher@intel.com>
>> Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J
>> <jian.j.wang@intel.com>; Gao, Liming <liming.gao@intel.com>
>> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
>> commands for Security Protocol In/Out
>>
>> Hello,
>>
>> Please refer to the below inline comments:
>>
>>
>> > -----Original Message-----
>> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf Of
>> > Zurcher, Christopher J
>> > Sent: Friday, August 23, 2019 6:02 AM
>> > To: devel@edk2.groups.io
>> > Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
>> > Subject: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands
>> > for Security Protocol In/Out
>> >
>> > This patch implements the Security Protocol In and Security Protocol Out
>> > commands in UefiScsiLib to prepare support for the Storage Security
>> > Command Protocol.
>> >
>> > Cc: Jiewen Yao <jiewen.yao@intel.com>
>> > Cc: Jian J Wang <jian.j.wang@intel.com>
>> > Cc: Liming Gao <liming.gao@intel.com>
>> > Signed-off-by: Christopher J Zurcher <christopher.j.zurcher@intel.com>
>> > ---
>> >  MdePkg/Include/IndustryStandard/Scsi.h   |  48 +++--
>> >  MdePkg/Include/Library/UefiScsiLib.h     | 126 +++++++++++-
>> >  MdePkg/Include/Protocol/ScsiIo.h         |   9 +-
>> >  MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 205 +++++++++++++++++++-
>> >  4 files changed, 366 insertions(+), 22 deletions(-)
>> >
>> > diff --git a/MdePkg/Include/IndustryStandard/Scsi.h
>> > b/MdePkg/Include/IndustryStandard/Scsi.h
>> > index cbe5709fe5..10d7b49ba7 100644
>> > --- a/MdePkg/Include/IndustryStandard/Scsi.h
>> > +++ b/MdePkg/Include/IndustryStandard/Scsi.h
>> > @@ -1,7 +1,7 @@
>> >  /** @file
>> >    Support for SCSI-2 standard
>> >
>> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
>> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>> >    SPDX-License-Identifier: BSD-2-Clause-Patent
>> >
>> >  **/
>> > @@ -163,6 +163,12 @@
>> >  #define EFI_SCSI_OP_SEND_MESSAGE10  0x2a
>> >  #define EFI_SCSI_OP_SEND_MESSAGE12  0xaa
>> >
>> > +//
>> > +// Additional commands for Secure Transactions
>> > +//
>> > +#define EFI_SCSI_OP_SECURITY_PROTOCOL_IN  0xa2
>> > +#define EFI_SCSI_OP_SECURITY_PROTOCOL_OUT 0xb5
>> > +
>> >  //
>> >  // SCSI Data Transfer Direction
>> >  //
>> > @@ -172,22 +178,30 @@
>> >  //
>> >  // Peripheral Device Type Definitions
>> >  //
>> > -#define EFI_SCSI_TYPE_DISK          0x00  ///< Direct-access device (e.g.
>> > magnetic disk)
>> > -#define EFI_SCSI_TYPE_TAPE          0x01  ///< Sequential-access device
>(e.g.
>> > magnetic tape)
>> > -#define EFI_SCSI_TYPE_PRINTER       0x02  ///< Printer device
>> > -#define EFI_SCSI_TYPE_PROCESSOR     0x03  ///< Processor device
>> > -#define EFI_SCSI_TYPE_WORM          0x04  ///< Write-once device (e.g.
>> some
>> > optical disks)
>> > -#define EFI_SCSI_TYPE_CDROM         0x05  ///< CD-ROM device
>> > -#define EFI_SCSI_TYPE_SCANNER       0x06  ///< Scanner device
>> > -#define EFI_SCSI_TYPE_OPTICAL       0x07  ///< Optical memory device
>(e.g.
>> > some optical disks)
>> > -#define EFI_SCSI_TYPE_MEDIUMCHANGER 0x08  ///< Medium changer
>> > device (e.g. jukeboxes)
>> > -#define EFI_SCSI_TYPE_COMMUNICATION 0x09  ///< Communications
>> > device
>> > -#define EFI_SCSI_TYPE_ASCIT8_1      0x0A  ///< Defined by ASC IT8
>> (Graphic
>> > arts pre-press devices)
>> > -#define EFI_SCSI_TYPE_ASCIT8_2      0x0B  ///< Defined by ASC IT8
>> (Graphic
>> > arts pre-press devices)
>>
>>
>> Could you help to address Liming's comment in the V4 series that to
>preserve
>> the definition for EFI_SCSI_TYPE_ASCIT8_1 & EFI_SCSI_TYPE_ASCIT8_2 for
>> compatibility consideration:
>>
>> https://edk2.groups.io/g/devel/message/42361?p=,,,20,0,0,0::Created,,scsi,
>> 20,2,40,32048246
>>
>>
>> > -//
>> > -// 0Ch - 1Eh are reserved
>> > -//
>> > -#define EFI_SCSI_TYPE_UNKNOWN       0x1F  ///< Unknown or no device
>> > type
>> > +#define EFI_SCSI_TYPE_DISK            0x00  ///< Direct-access device (e.g.
>> > magnetic disk)
>> > +#define EFI_SCSI_TYPE_TAPE            0x01  ///< Sequential-access device
>> (e.g.
>> > magnetic tape)
>> > +#define EFI_SCSI_TYPE_PRINTER         0x02  ///< Printer device
>> > +#define EFI_SCSI_TYPE_PROCESSOR       0x03  ///< Processor device
>> > +#define EFI_SCSI_TYPE_WORM            0x04  ///< Write-once device (e.g.
>> > some optical disks)
>> > +#define EFI_SCSI_TYPE_CDROM           0x05  ///< CD/DVD device
>> > +#define EFI_SCSI_TYPE_SCANNER         0x06  ///< Scanner device
>(obsolete)
>> > +#define EFI_SCSI_TYPE_OPTICAL         0x07  ///< Optical memory device
>> (e.g.
>> > some optical disks)
>> > +#define EFI_SCSI_TYPE_MEDIUMCHANGER   0x08  ///< Medium changer
>> > device (e.g. jukeboxes)
>> > +#define EFI_SCSI_TYPE_COMMUNICATION   0x09  ///< Communications
>> > device (obsolete)
>> > +#define EFI_SCSI_TYPE_A               0x0A  ///< Obsolete
>> > +#define EFI_SCSI_TYPE_B               0x0B  ///< Obsolete
>> > +#define EFI_SCSI_TYPE_RAID            0x0C  ///< Storage array controller
>> > device (e.g., RAID)
>> > +#define EFI_SCSI_TYPE_SES             0x0D  ///< Enclosure services device
>> > +#define EFI_SCSI_TYPE_RBC             0x0E  ///< Simplified direct-access
>> device
>> > (e.g., magnetic disk)
>> > +#define EFI_SCSI_TYPE_OCRW            0x0F  ///< Optical card reader/writer
>> > device
>> > +#define EFI_SCSI_TYPE_BRIDGE          0x10  ///< Bridge Controller
>> Commands
>> > +#define EFI_SCSI_TYPE_OSD             0x11  ///< Object-based Storage
>> Device
>> > +#define EFI_SCSI_TYPE_AUTOMATION      0x12  ///< Automation/Drive
>> > Interface
>> > +#define EFI_SCSI_TYPE_SECURITYMANAGER 0x13  ///< Security manager
>> > device
>> > +#define EFI_SCSI_TYPE_RESERVED_LOW    0x14  ///< Reserved (low)
>> > +#define EFI_SCSI_TYPE_RESERVED_HIGH   0x1D  ///< Reserved (high)
>> > +#define EFI_SCSI_TYPE_WLUN            0x1E  ///< Well known logical unit
>> > +#define EFI_SCSI_TYPE_UNKNOWN         0x1F  ///< Unknown or no
>device
>> > type
>> >
>> >  //
>> >  // Page Codes for INQUIRY command
>> > diff --git a/MdePkg/Include/Library/UefiScsiLib.h
>> > b/MdePkg/Include/Library/UefiScsiLib.h
>> > index 10dd81902b..a0d99e703a 100644
>> > --- a/MdePkg/Include/Library/UefiScsiLib.h
>> > +++ b/MdePkg/Include/Library/UefiScsiLib.h
>> > @@ -5,7 +5,7 @@
>> >    for hard drive, CD and DVD devices that are the most common SCSI boot
>> > targets used by UEFI platforms.
>> >    This library class depends on SCSI I/O Protocol defined in UEFI
>> Specification
>> > and SCSI-2 industry standard.
>> >
>> > -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
>> > +Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>> >  SPDX-License-Identifier: BSD-2-Clause-Patent
>> >
>> >  **/
>> > @@ -813,6 +813,130 @@ ScsiWrite16Command (
>> >    );
>> >
>> >
>> > +/**
>> > +  Execute Security Protocol In SCSI command on a specific SCSI target.
>> > +
>> > +  Executes the SCSI Security Protocol In command on the SCSI target
>> > specified by ScsiIo.
>> > +  If Timeout is zero, then this function waits indefinitely for the command
>> to
>> > complete.
>> > +  If Timeout is greater than zero, then the command is executed and will
>> > timeout after
>> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used
>> to
>> > construct
>>
>>
>> As mentioned in V4 series:
>>
>> There is no 'StartLba' & 'SectorSize' parameters for APIs:
>>
>> ScsiSecurityProtocolInCommand
>> ScsiSecurityProtocolOutCommand
>>
>> Could you help to update the comments to address this?
>> (Please help to update UefiScsiLib.c as well.)
>>
>>
>> > +  the CDB for this SCSI command.
>> > +  If ScsiIo is NULL, then ASSERT().
>> > +  If SenseDataLength is NULL, then ASSERT().
>> > +  If HostAdapterStatus is NULL, then ASSERT().
>> > +  If TargetStatus is NULL, then ASSERT().
>> > +  If DataLength is NULL, then ASSERT().
>> > +
>> > +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
>> > must meet buffer
>> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
>> > EFI_INVALID_PARAMETER
>> > +  gets returned.
>> > +
>> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
>> > meet buffer
>> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
>> > EFI_INVALID_PARAMETER
>> > +  gets returned.
>> > +
>> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
>> > +  @param[in]      Timeout              The length of timeout period.
>> > +  @param[in, out] SenseData            A pointer to output sense data.
>> > +  @param[in, out] SenseDataLength      The length of output sense data.
>> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
>> > +  @param[out]     TargetStatus         The status of the target.
>> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
>> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
>> data.
>> > +  @param[in]      TransferLength       The size in bytes of the data allocation.
>> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
>> > +  @param[in, out] DataLength           The length of data buffer.
>>
>>
>> As mentioned in V4 series:
>>
>> Referring to the implementation of the library (changes made in
>> MdePkg/Library/UefiScsiLib/UefiScsiLib.c):
>>
>> 'TransferLength' (input) specifies the length of content in 'DataBuffer';
>> 'DataLength' (input & output) reflects the actual number of bytes
>> transferred.
>>
>> How about swapping their names and changing the description comments
>to:
>> (Please help to update UefiScsiLib.c as well.)
>>
>>   @param[in]      DataLength           The size in bytes of the data buffer.
>>   ...
>>   @param[out]     TransferLength       A pointer to a buffer to store the size
>>                                        in bytes of the data written to the data
>>                                        buffer.
>>
>>
>> > +
>> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
>> > +  @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 DataLength.
>> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
>> > sent because there are too many
>> > +                                       SCSI Command Packets already queued.
>> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
>> > attempting to send SCSI Request Packet.
>> > +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
>> > Request Packet is not supported by
>> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
>> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
>> > SCSI Request Packet to execute.
>> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
>> > Packet are invalid.
>> > +
>> > +**/
>> > +EFI_STATUS
>> > +EFIAPI
>> > +ScsiSecurityProtocolInCommand (
>> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
>> > +  IN     UINT64                Timeout,
>> > +  IN OUT VOID                  *SenseData,   OPTIONAL
>> > +  IN OUT UINT8                 *SenseDataLength,
>> > +     OUT UINT8                 *HostAdapterStatus,
>> > +     OUT UINT8                 *TargetStatus,
>> > +  IN     UINT8                 SecurityProtocol,
>> > +  IN     UINT16                SecurityProtocolSpecific,
>> > +  IN     UINT32                TransferLength,
>> > +  IN OUT VOID                  *DataBuffer,  OPTIONAL
>> > +  IN OUT UINT32                *DataLength
>> > +  );
>>
>>
>> As mentioned in V4 series, could you help to add a new parameter "Inc512"
>> for
>> both new APIs:
>> ScsiSecurityProtocolInCommand
>> ScsiSecurityProtocolOutCommand
>>
>> Though UFS spec requires the INC_512 field of a CDB to be set to 0, but
>> for other devices, setting this field to 1 may be a valid configuration.
>>
>>
>> Also, I would suggest the below parameter type changes to match with the
>> services
>> definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL
>(including
>> the
>> name swap mentioned above):
>>
>> IN     UINT32                TransferLength,
>> to
>> IN     UINTN                 DataLength,
>>
>> IN OUT UINT32                *DataLength
>> to
>>    OUT UINTN                 *TransferLength
>>
>>
>> > +
>> > +
>> > +/**
>> > +  Execute Security Protocol Out SCSI command on a specific SCSI target.
>> > +
>> > +  Executes the SCSI Security Protocol Out command on the SCSI target
>> > specified by ScsiIo.
>> > +  If Timeout is zero, then this function waits indefinitely for the command
>> to
>> > complete.
>> > +  If Timeout is greater than zero, then the command is executed and will
>> > timeout after
>> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used
>> to
>> > construct
>>
>>
>> As mentioned in V4 series:
>>
>> There is no 'StartLba' & 'SectorSize' parameters for APIs:
>>
>> ScsiSecurityProtocolInCommand
>> ScsiSecurityProtocolOutCommand
>>
>> Could you help to update the comments to address this?
>> (Please help to update UefiScsiLib.c as well.)
>>
>>
>> > +  the CDB for this SCSI command.
>> > +  If ScsiIo is NULL, then ASSERT().
>> > +  If SenseDataLength is NULL, then ASSERT().
>> > +  If HostAdapterStatus is NULL, then ASSERT().
>> > +  If TargetStatus is NULL, then ASSERT().
>> > +  If DataLength is NULL, then ASSERT().
>> > +
>> > +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
>> > must meet buffer
>> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
>> > EFI_INVALID_PARAMETER
>> > +  gets returned.
>> > +
>> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
>> > meet buffer
>> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
>> > EFI_INVALID_PARAMETER
>> > +  gets returned.
>> > +
>> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
>> > +  @param[in]      Timeout              The length of timeout period.
>> > +  @param[in, out] SenseData            A pointer to output sense data.
>> > +  @param[in, out] SenseDataLength      The length of output sense data.
>> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
>> > +  @param[out]     TargetStatus         The status of the target.
>> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
>> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
>> data.
>> > +  @param[in]      TransferLength       The size in bytes of the transfer data.
>> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
>>
>>
>> As mentioned in V4:
>>
>> Suggest to rename 'TransferLength' to 'DataLength' so that it may be a bit
>> more clear for users to know 'DataLength' reflects the size of 'DataBuffer'.
>>
>>
>> > +
>> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
>> > +  @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 DataLength.
>> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
>> > sent because there are too many
>> > +                                       SCSI Command Packets already queued.
>> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
>> > attempting to send SCSI Request Packet.
>> > +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
>> > Request Packet is not supported by
>> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
>> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
>> > SCSI Request Packet to execute.
>> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
>> > Packet are invalid.
>> > +
>> > +**/
>> > +EFI_STATUS
>> > +EFIAPI
>> > +ScsiSecurityProtocolOutCommand (
>> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
>> > +  IN     UINT64                Timeout,
>> > +  IN OUT VOID                  *SenseData,   OPTIONAL
>> > +  IN OUT UINT8                 *SenseDataLength,
>> > +     OUT UINT8                 *HostAdapterStatus,
>> > +     OUT UINT8                 *TargetStatus,
>> > +  IN     UINT8                 SecurityProtocol,
>> > +  IN     UINT16                SecurityProtocolSpecific,
>> > +  IN     UINT32                TransferLength,
>> > +  IN OUT VOID                  *DataBuffer  OPTIONAL
>> > +  );
>>
>>
>> As mentioned in V4 series:
>>
>> Suggest the below parameter type changes to match with the services
>> definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL
>(including
>> the
>> name change mentioned above):
>>
>> IN     UINT32                TransferLength
>> to
>> IN     UINTN                 DataLength
>>
>> Best Regards,
>> Hao Wu
>>
>>
>> > +
>> > +
>> >  /**
>> >    Execute blocking/non-blocking Read(10) SCSI command on a specific SCSI
>> >    target.
>> > diff --git a/MdePkg/Include/Protocol/ScsiIo.h
>> > b/MdePkg/Include/Protocol/ScsiIo.h
>> > index 05e46bda9c..27c31fe7f9 100644
>> > --- a/MdePkg/Include/Protocol/ScsiIo.h
>> > +++ b/MdePkg/Include/Protocol/ScsiIo.h
>> > @@ -4,7 +4,7 @@
>> >    services environment to access SCSI devices. In particular, functions for
>> >    managing devices on SCSI buses are defined here.
>> >
>> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
>> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>> >    SPDX-License-Identifier: BSD-2-Clause-Patent
>> >
>> >  **/
>> > @@ -43,8 +43,11 @@ typedef struct _EFI_SCSI_IO_PROTOCOL
>> > EFI_SCSI_IO_PROTOCOL;
>> >  #define MFI_SCSI_IO_TYPE_OCRW                                  0x0F    ///< Optical
>> card
>> > reader/writer device
>> >  #define MFI_SCSI_IO_TYPE_BRIDGE                                0x10    ///< Bridge
>> > Controller Commands
>> >  #define MFI_SCSI_IO_TYPE_OSD                                   0x11    ///< Object-
>> based
>> > Storage Device
>> > -#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x12    ///<
>> > Reserved (low)
>> > -#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1E    ///<
>> > Reserved (high)
>> > +#define MFI_SCSI_IO_TYPE_AUTOMATION                            0x12    ///<
>> > Automation/Drive Interface
>> > +#define MFI_SCSI_IO_TYPE_SECURITYMANAGER                       0x13    ///<
>> > Security manager device
>> > +#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x14    ///<
>> > Reserved (low)
>> > +#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1D    ///<
>> > Reserved (high)
>> > +#define EFI_SCSI_IO_TYPE_WLUN                                  0x1E    ///< Well
>> known
>> > logical unit
>> >  #define EFI_SCSI_IO_TYPE_UNKNOWN                               0x1F    ///<
>> Unknown
>> > no device type
>> >
>> >  //
>> > diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
>> > b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
>> > index c7491d1436..7584d717ad 100644
>> > --- a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
>> > +++ b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
>> > @@ -1,7 +1,7 @@
>> >  /** @file
>> >    UEFI SCSI Library implementation
>> >
>> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
>> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
>> >    SPDX-License-Identifier: BSD-2-Clause-Patent
>> >
>> >  **/
>> > @@ -23,6 +23,7 @@
>> >    //
>> >  #define EFI_SCSI_OP_LENGTH_SIX      0x6
>> >  #define EFI_SCSI_OP_LENGTH_TEN      0xa
>> > +#define EFI_SCSI_OP_LENGTH_TWELVE   0xc
>> >  #define EFI_SCSI_OP_LENGTH_SIXTEEN  0x10
>> >
>> >  //
>> > @@ -1280,6 +1281,208 @@ ScsiWrite16Command (
>> >  }
>> >
>> >
>> > +/**
>> > +  Execute Security Protocol In SCSI command on a specific SCSI target.
>> > +
>> > +  Executes the SCSI Security Protocol In command on the SCSI target
>> > specified by ScsiIo.
>> > +  If Timeout is zero, then this function waits indefinitely for the command
>> to
>> > complete.
>> > +  If Timeout is greater than zero, then the command is executed and will
>> > timeout after
>> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used
>> to
>> > construct
>>
>>
>> As mentioned in V4 series:
>>
>> There is no 'StartLba' & 'SectorSize' parameters for APIs:
>>
>> ScsiSecurityProtocolInCommand
>> ScsiSecurityProtocolOutCommand
>>
>> Could you help to update the comments to address this?
>> (Please help to update UefiScsiLib.c as well.)
>>
>>
>> > +  the CDB for this SCSI command.
>> > +  If ScsiIo is NULL, then ASSERT().
>> > +  If SenseDataLength is NULL, then ASSERT().
>> > +  If HostAdapterStatus is NULL, then ASSERT().
>> > +  If TargetStatus is NULL, then ASSERT().
>> > +  If DataLength is NULL, then ASSERT().
>> > +
>> > +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
>> > must meet buffer
>> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
>> > EFI_INVALID_PARAMETER
>> > +  gets returned.
>> > +
>> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
>> > meet buffer
>> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
>> > EFI_INVALID_PARAMETER
>> > +  gets returned.
>> > +
>> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
>> > +  @param[in]      Timeout              The length of timeout period.
>> > +  @param[in, out] SenseData            A pointer to output sense data.
>> > +  @param[in, out] SenseDataLength      The length of output sense data.
>> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
>> > +  @param[out]     TargetStatus         The status of the target.
>> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
>> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
>> data.
>> > +  @param[in]      TransferLength       The size in bytes of the data allocation.
>> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
>> > +  @param[in, out] DataLength           The length of data buffer.
>> > +
>> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
>> > +  @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 DataLength.
>> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
>> > sent because there are too many
>> > +                                       SCSI Command Packets already queued.
>> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
>> > attempting to send SCSI Request Packet.
>> > +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
>> > Request Packet is not supported by
>> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
>> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
>> > SCSI Request Packet to execute.
>> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
>> > Packet are invalid.
>> > +
>> > +**/
>> > +EFI_STATUS
>> > +EFIAPI
>> > +ScsiSecurityProtocolInCommand (
>> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
>> > +  IN     UINT64                Timeout,
>> > +  IN OUT VOID                  *SenseData,   OPTIONAL
>> > +  IN OUT UINT8                 *SenseDataLength,
>> > +     OUT UINT8                 *HostAdapterStatus,
>> > +     OUT UINT8                 *TargetStatus,
>> > +  IN     UINT8                 SecurityProtocol,
>> > +  IN     UINT16                SecurityProtocolSpecific,
>> > +  IN     UINT32                TransferLength,
>> > +  IN OUT VOID                  *DataBuffer,  OPTIONAL
>> > +  IN OUT UINT32                *DataLength
>> > +  )
>> > +{
>> > +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
>> > +  EFI_STATUS                      Status;
>> > +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
>> > +
>> > +  ASSERT (SenseDataLength != NULL);
>> > +  ASSERT (HostAdapterStatus != NULL);
>> > +  ASSERT (TargetStatus != NULL);
>> > +  ASSERT (DataLength != NULL);
>> > +  ASSERT (ScsiIo != NULL);
>> > +
>> > +  ZeroMem (&CommandPacket, sizeof
>> > (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
>> > +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
>> > +
>> > +  CommandPacket.Timeout           = Timeout;
>> > +  CommandPacket.InDataBuffer      = DataBuffer;
>> > +  CommandPacket.SenseData         = SenseData;
>> > +  CommandPacket.InTransferLength  = TransferLength;
>> > +  CommandPacket.Cdb               = Cdb;
>> > +  //
>> > +  // Fill Cdb for Security Protocol In Command
>> > +  //
>> > +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_IN;
>> > +  Cdb[1]                        = SecurityProtocol;
>> > +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
>> > (SecurityProtocolSpecific));
>> > +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength));
>> > +
>> > +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
>> > +  CommandPacket.DataDirection   = EFI_SCSI_DATA_IN;
>> > +  CommandPacket.SenseDataLength = *SenseDataLength;
>> > +
>> > +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
>> > &CommandPacket, NULL);
>> > +
>> > +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
>> > +  *TargetStatus                 = CommandPacket.TargetStatus;
>> > +  *SenseDataLength              = CommandPacket.SenseDataLength;
>> > +  *DataLength                   = CommandPacket.InTransferLength;
>> > +
>> > +  return Status;
>> > +}
>> > +
>> > +
>> > +/**
>> > +  Execute Security Protocol Out SCSI command on a specific SCSI target.
>> > +
>> > +  Executes the SCSI Security Protocol Out command on the SCSI target
>> > specified by ScsiIo.
>> > +  If Timeout is zero, then this function waits indefinitely for the command
>> to
>> > complete.
>> > +  If Timeout is greater than zero, then the command is executed and will
>> > timeout after
>> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are used
>> to
>> > construct
>> > +  the CDB for this SCSI command.
>> > +  If ScsiIo is NULL, then ASSERT().
>> > +  If SenseDataLength is NULL, then ASSERT().
>> > +  If HostAdapterStatus is NULL, then ASSERT().
>> > +  If TargetStatus is NULL, then ASSERT().
>> > +  If DataLength is NULL, then ASSERT().
>> > +
>> > +  If SenseDataLength is non-zero and SenseData is not NULL, SenseData
>> > must meet buffer
>> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
>> > EFI_INVALID_PARAMETER
>> > +  gets returned.
>> > +
>> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer must
>> > meet buffer
>> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL. Otherwise
>> > EFI_INVALID_PARAMETER
>> > +  gets returned.
>> > +
>> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
>> > +  @param[in]      Timeout              The length of timeout period.
>> > +  @param[in, out] SenseData            A pointer to output sense data.
>> > +  @param[in, out] SenseDataLength      The length of output sense data.
>> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
>> > +  @param[out]     TargetStatus         The status of the target.
>> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
>> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
>> data.
>> > +  @param[in]      TransferLength       The size in bytes of the transfer data.
>> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
>> > +
>> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
>> > +  @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 DataLength.
>> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not be
>> > sent because there are too many
>> > +                                       SCSI Command Packets already queued.
>> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
>> > attempting to send SCSI Request Packet.
>> > +  @retval  EFI_UNSUPPORTED             The command described by the SCSI
>> > Request Packet is not supported by
>> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
>> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for the
>> > SCSI Request Packet to execute.
>> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI Request
>> > Packet are invalid.
>> > +
>> > +**/
>> > +EFI_STATUS
>> > +EFIAPI
>> > +ScsiSecurityProtocolOutCommand (
>> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
>> > +  IN     UINT64                Timeout,
>> > +  IN OUT VOID                  *SenseData,   OPTIONAL
>> > +  IN OUT UINT8                 *SenseDataLength,
>> > +     OUT UINT8                 *HostAdapterStatus,
>> > +     OUT UINT8                 *TargetStatus,
>> > +  IN     UINT8                 SecurityProtocol,
>> > +  IN     UINT16                SecurityProtocolSpecific,
>> > +  IN     UINT32                TransferLength,
>> > +  IN OUT VOID                  *DataBuffer   OPTIONAL
>> > +  )
>> > +{
>> > +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
>> > +  EFI_STATUS                      Status;
>> > +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
>> > +
>> > +  ASSERT (SenseDataLength != NULL);
>> > +  ASSERT (HostAdapterStatus != NULL);
>> > +  ASSERT (TargetStatus != NULL);
>> > +  ASSERT (ScsiIo != NULL);
>> > +
>> > +  ZeroMem (&CommandPacket, sizeof
>> > (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
>> > +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
>> > +
>> > +  CommandPacket.Timeout           = Timeout;
>> > +  CommandPacket.OutDataBuffer     = DataBuffer;
>> > +  CommandPacket.SenseData         = SenseData;
>> > +  CommandPacket.OutTransferLength = TransferLength;
>> > +  CommandPacket.Cdb               = Cdb;
>> > +  //
>> > +  // Fill Cdb for Security Protocol Out Command
>> > +  //
>> > +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_OUT;
>> > +  Cdb[1]                        = SecurityProtocol;
>> > +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
>> > (SecurityProtocolSpecific));
>> > +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32 (TransferLength));
>> > +
>> > +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
>> > +  CommandPacket.DataDirection   = EFI_SCSI_DATA_OUT;
>> > +  CommandPacket.SenseDataLength = *SenseDataLength;
>> > +
>> > +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
>> > &CommandPacket, NULL);
>> > +
>> > +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
>> > +  *TargetStatus                 = CommandPacket.TargetStatus;
>> > +  *SenseDataLength              = CommandPacket.SenseDataLength;
>> > +
>> > +  return Status;
>> > +}
>> > +
>> > +
>> >  /**
>> >    Internal helper notify function in which update the result of the
>> >    non-blocking SCSI Read/Write commands and signal caller event.
>> > --
>> > 2.16.2.windows.1
>> >
>> >
>> > 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#46614): https://edk2.groups.io/g/devel/message/46614
Mute This Topic: https://groups.io/mt/32994942/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out
Posted by Wu, Hao A 6 years, 5 months ago
> -----Original Message-----
> From: Gao, Liming
> Sent: Friday, August 30, 2019 5:15 PM
> To: Wu, Hao A; Zurcher, Christopher J; devel@edk2.groups.io; Kinney,
> Michael D
> Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> commands for Security Protocol In/Out
> 
> UefiScsiLib is designed for the convenient usage with SCSI commands. They
> should try to align to UEFI definition.
> If you check current SCSI APIs, their interface matches
> EFI_SCSI_IO_SCSI_REQUEST_PACKET strut.
> So, new added APIs had better match
> EFI_STORAGE_SECURITY_COMMAND_PROTOCOL.
> 
> For the change in MdePkg\Include\Protocol\ScsiIo.h, where is new definition
> EFI_SCSI_IO_TYPE_WLUN from?


Hello Liming,

The macro "EFI_SCSI_IO_TYPE_WLUN" comes from the SCSI Primary Commands standard
(SPC), just like other existing definitions listed together in the header file.

Best Regards,
Hao Wu


> 
> Thanks
> Liming
> >-----Original Message-----
> >From: Wu, Hao A
> >Sent: Friday, August 30, 2019 1:18 PM
> >To: Zurcher, Christopher J <christopher.j.zurcher@intel.com>;
> >devel@edk2.groups.io; Gao, Liming <liming.gao@intel.com>; Kinney,
> Michael
> >D <michael.d.kinney@intel.com>
> >Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J
> ><jian.j.wang@intel.com>
> >Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> commands
> >for Security Protocol In/Out
> >
> >Hello,
> >
> >Sorry for top-posting.
> >
> >I was thinking to make the parameters interface match between the
> >UefiScsiLib
> >API and the EFI Storage Security Command Protocol service, since the
> >implementation of the SSC protocol will directly call the UefiScsiLib API.
> >
> >More specifically, for UefiScsiLib API:
> >EFI_STATUS
> >EFIAPI
> >ScsiSecurityProtocolInCommand (
> >  ...
> >  IN     UINT32  TransferLength,
> >  ...
> >  IN OUT UINT32  *DataLength
> >  )
> >
> >to match the SSC protocol service:
> >typedef
> >EFI_STATUS
> >(EFIAPI *EFI_STORAGE_SECURITY_RECEIVE_DATA)(
> >  ...
> >  IN UINTN   PayloadBufferSize,
> >  ...
> >  OUT UINTN  *PayloadTransferSize
> >  )
> >
> >and for UefiScsiLib API:
> >EFI_STATUS
> >EFIAPI
> >ScsiSecurityProtocolOutCommand (
> >  ...
> >  IN     UINT32  TransferLength,
> >  ...
> >  )
> >
> >to match the SSC protocol service:
> >typedef
> >EFI_STATUS
> >(EFIAPI *EFI_STORAGE_SECURITY_SEND_DATA) (
> >  ...
> >  IN UINTN  PayloadBufferSize,
> >  ...
> >  )
> >
> >I am okay with the cast from UINTN to UINT32, as long as we can ensure
> >truncation will not happen (which I think should be safe when dealing with
> >data transfer with actual devices).
> >
> >But for casting from UINTN* to UINT32*, I am not sure if this is a
> >recommended
> >coding style. Maybe within the BIOS perspective, little endian is always the
> >case where such cast should work well.
> >
> >I will leave this open to MdePkg package maintainers for their inputs.
> >
> >Best Regards,
> >Hao Wu
> >
> >
> >> -----Original Message-----
> >> From: Zurcher, Christopher J
> >> Sent: Friday, August 30, 2019 8:35 AM
> >> To: Wu, Hao A; devel@edk2.groups.io
> >> Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> >> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> >> commands for Security Protocol In/Out
> >>
> >> I've implemented all the suggested changes except changing the
> arguments
> >> from UINT32 to UINTN. No other functions in UefiScsiLib take UINTN
> >> arguments, and since the library is directly packing the CDB, I think it
> makes
> >> sense to force the caller to provide the correct-size length value. That way
> >> there is no ambiguity on what is going to the device.
> >> If you agree I will send the updated patchset.
> >>
> >> Thanks,
> >> Christopher Zurcher
> >>
> >> -----Original Message-----
> >> From: Wu, Hao A
> >> Sent: Monday, August 26, 2019 20:03
> >> To: devel@edk2.groups.io; Zurcher, Christopher J
> >> <christopher.j.zurcher@intel.com>
> >> Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J
> >> <jian.j.wang@intel.com>; Gao, Liming <liming.gao@intel.com>
> >> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> >> commands for Security Protocol In/Out
> >>
> >> Hello,
> >>
> >> Please refer to the below inline comments:
> >>
> >>
> >> > -----Original Message-----
> >> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf
> Of
> >> > Zurcher, Christopher J
> >> > Sent: Friday, August 23, 2019 6:02 AM
> >> > To: devel@edk2.groups.io
> >> > Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> >> > Subject: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> commands
> >> > for Security Protocol In/Out
> >> >
> >> > This patch implements the Security Protocol In and Security Protocol Out
> >> > commands in UefiScsiLib to prepare support for the Storage Security
> >> > Command Protocol.
> >> >
> >> > Cc: Jiewen Yao <jiewen.yao@intel.com>
> >> > Cc: Jian J Wang <jian.j.wang@intel.com>
> >> > Cc: Liming Gao <liming.gao@intel.com>
> >> > Signed-off-by: Christopher J Zurcher <christopher.j.zurcher@intel.com>
> >> > ---
> >> >  MdePkg/Include/IndustryStandard/Scsi.h   |  48 +++--
> >> >  MdePkg/Include/Library/UefiScsiLib.h     | 126 +++++++++++-
> >> >  MdePkg/Include/Protocol/ScsiIo.h         |   9 +-
> >> >  MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 205
> +++++++++++++++++++-
> >> >  4 files changed, 366 insertions(+), 22 deletions(-)
> >> >
> >> > diff --git a/MdePkg/Include/IndustryStandard/Scsi.h
> >> > b/MdePkg/Include/IndustryStandard/Scsi.h
> >> > index cbe5709fe5..10d7b49ba7 100644
> >> > --- a/MdePkg/Include/IndustryStandard/Scsi.h
> >> > +++ b/MdePkg/Include/IndustryStandard/Scsi.h
> >> > @@ -1,7 +1,7 @@
> >> >  /** @file
> >> >    Support for SCSI-2 standard
> >> >
> >> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> >> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> >> >    SPDX-License-Identifier: BSD-2-Clause-Patent
> >> >
> >> >  **/
> >> > @@ -163,6 +163,12 @@
> >> >  #define EFI_SCSI_OP_SEND_MESSAGE10  0x2a
> >> >  #define EFI_SCSI_OP_SEND_MESSAGE12  0xaa
> >> >
> >> > +//
> >> > +// Additional commands for Secure Transactions
> >> > +//
> >> > +#define EFI_SCSI_OP_SECURITY_PROTOCOL_IN  0xa2
> >> > +#define EFI_SCSI_OP_SECURITY_PROTOCOL_OUT 0xb5
> >> > +
> >> >  //
> >> >  // SCSI Data Transfer Direction
> >> >  //
> >> > @@ -172,22 +178,30 @@
> >> >  //
> >> >  // Peripheral Device Type Definitions
> >> >  //
> >> > -#define EFI_SCSI_TYPE_DISK          0x00  ///< Direct-access device (e.g.
> >> > magnetic disk)
> >> > -#define EFI_SCSI_TYPE_TAPE          0x01  ///< Sequential-access device
> >(e.g.
> >> > magnetic tape)
> >> > -#define EFI_SCSI_TYPE_PRINTER       0x02  ///< Printer device
> >> > -#define EFI_SCSI_TYPE_PROCESSOR     0x03  ///< Processor device
> >> > -#define EFI_SCSI_TYPE_WORM          0x04  ///< Write-once device (e.g.
> >> some
> >> > optical disks)
> >> > -#define EFI_SCSI_TYPE_CDROM         0x05  ///< CD-ROM device
> >> > -#define EFI_SCSI_TYPE_SCANNER       0x06  ///< Scanner device
> >> > -#define EFI_SCSI_TYPE_OPTICAL       0x07  ///< Optical memory device
> >(e.g.
> >> > some optical disks)
> >> > -#define EFI_SCSI_TYPE_MEDIUMCHANGER 0x08  ///< Medium changer
> >> > device (e.g. jukeboxes)
> >> > -#define EFI_SCSI_TYPE_COMMUNICATION 0x09  ///< Communications
> >> > device
> >> > -#define EFI_SCSI_TYPE_ASCIT8_1      0x0A  ///< Defined by ASC IT8
> >> (Graphic
> >> > arts pre-press devices)
> >> > -#define EFI_SCSI_TYPE_ASCIT8_2      0x0B  ///< Defined by ASC IT8
> >> (Graphic
> >> > arts pre-press devices)
> >>
> >>
> >> Could you help to address Liming's comment in the V4 series that to
> >preserve
> >> the definition for EFI_SCSI_TYPE_ASCIT8_1 & EFI_SCSI_TYPE_ASCIT8_2
> for
> >> compatibility consideration:
> >>
> >>
> https://edk2.groups.io/g/devel/message/42361?p=,,,20,0,0,0::Created,,scsi,
> >> 20,2,40,32048246
> >>
> >>
> >> > -//
> >> > -// 0Ch - 1Eh are reserved
> >> > -//
> >> > -#define EFI_SCSI_TYPE_UNKNOWN       0x1F  ///< Unknown or no
> device
> >> > type
> >> > +#define EFI_SCSI_TYPE_DISK            0x00  ///< Direct-access device (e.g.
> >> > magnetic disk)
> >> > +#define EFI_SCSI_TYPE_TAPE            0x01  ///< Sequential-access device
> >> (e.g.
> >> > magnetic tape)
> >> > +#define EFI_SCSI_TYPE_PRINTER         0x02  ///< Printer device
> >> > +#define EFI_SCSI_TYPE_PROCESSOR       0x03  ///< Processor device
> >> > +#define EFI_SCSI_TYPE_WORM            0x04  ///< Write-once device (e.g.
> >> > some optical disks)
> >> > +#define EFI_SCSI_TYPE_CDROM           0x05  ///< CD/DVD device
> >> > +#define EFI_SCSI_TYPE_SCANNER         0x06  ///< Scanner device
> >(obsolete)
> >> > +#define EFI_SCSI_TYPE_OPTICAL         0x07  ///< Optical memory device
> >> (e.g.
> >> > some optical disks)
> >> > +#define EFI_SCSI_TYPE_MEDIUMCHANGER   0x08  ///< Medium
> changer
> >> > device (e.g. jukeboxes)
> >> > +#define EFI_SCSI_TYPE_COMMUNICATION   0x09  ///<
> Communications
> >> > device (obsolete)
> >> > +#define EFI_SCSI_TYPE_A               0x0A  ///< Obsolete
> >> > +#define EFI_SCSI_TYPE_B               0x0B  ///< Obsolete
> >> > +#define EFI_SCSI_TYPE_RAID            0x0C  ///< Storage array controller
> >> > device (e.g., RAID)
> >> > +#define EFI_SCSI_TYPE_SES             0x0D  ///< Enclosure services device
> >> > +#define EFI_SCSI_TYPE_RBC             0x0E  ///< Simplified direct-access
> >> device
> >> > (e.g., magnetic disk)
> >> > +#define EFI_SCSI_TYPE_OCRW            0x0F  ///< Optical card
> reader/writer
> >> > device
> >> > +#define EFI_SCSI_TYPE_BRIDGE          0x10  ///< Bridge Controller
> >> Commands
> >> > +#define EFI_SCSI_TYPE_OSD             0x11  ///< Object-based Storage
> >> Device
> >> > +#define EFI_SCSI_TYPE_AUTOMATION      0x12  ///< Automation/Drive
> >> > Interface
> >> > +#define EFI_SCSI_TYPE_SECURITYMANAGER 0x13  ///< Security
> manager
> >> > device
> >> > +#define EFI_SCSI_TYPE_RESERVED_LOW    0x14  ///< Reserved (low)
> >> > +#define EFI_SCSI_TYPE_RESERVED_HIGH   0x1D  ///< Reserved (high)
> >> > +#define EFI_SCSI_TYPE_WLUN            0x1E  ///< Well known logical unit
> >> > +#define EFI_SCSI_TYPE_UNKNOWN         0x1F  ///< Unknown or no
> >device
> >> > type
> >> >
> >> >  //
> >> >  // Page Codes for INQUIRY command
> >> > diff --git a/MdePkg/Include/Library/UefiScsiLib.h
> >> > b/MdePkg/Include/Library/UefiScsiLib.h
> >> > index 10dd81902b..a0d99e703a 100644
> >> > --- a/MdePkg/Include/Library/UefiScsiLib.h
> >> > +++ b/MdePkg/Include/Library/UefiScsiLib.h
> >> > @@ -5,7 +5,7 @@
> >> >    for hard drive, CD and DVD devices that are the most common SCSI
> boot
> >> > targets used by UEFI platforms.
> >> >    This library class depends on SCSI I/O Protocol defined in UEFI
> >> Specification
> >> > and SCSI-2 industry standard.
> >> >
> >> > -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> >> > +Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> >> >  SPDX-License-Identifier: BSD-2-Clause-Patent
> >> >
> >> >  **/
> >> > @@ -813,6 +813,130 @@ ScsiWrite16Command (
> >> >    );
> >> >
> >> >
> >> > +/**
> >> > +  Execute Security Protocol In SCSI command on a specific SCSI target.
> >> > +
> >> > +  Executes the SCSI Security Protocol In command on the SCSI target
> >> > specified by ScsiIo.
> >> > +  If Timeout is zero, then this function waits indefinitely for the
> command
> >> to
> >> > complete.
> >> > +  If Timeout is greater than zero, then the command is executed and
> will
> >> > timeout after
> >> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are
> used
> >> to
> >> > construct
> >>
> >>
> >> As mentioned in V4 series:
> >>
> >> There is no 'StartLba' & 'SectorSize' parameters for APIs:
> >>
> >> ScsiSecurityProtocolInCommand
> >> ScsiSecurityProtocolOutCommand
> >>
> >> Could you help to update the comments to address this?
> >> (Please help to update UefiScsiLib.c as well.)
> >>
> >>
> >> > +  the CDB for this SCSI command.
> >> > +  If ScsiIo is NULL, then ASSERT().
> >> > +  If SenseDataLength is NULL, then ASSERT().
> >> > +  If HostAdapterStatus is NULL, then ASSERT().
> >> > +  If TargetStatus is NULL, then ASSERT().
> >> > +  If DataLength is NULL, then ASSERT().
> >> > +
> >> > +  If SenseDataLength is non-zero and SenseData is not NULL,
> SenseData
> >> > must meet buffer
> >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> Otherwise
> >> > EFI_INVALID_PARAMETER
> >> > +  gets returned.
> >> > +
> >> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer
> must
> >> > meet buffer
> >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> Otherwise
> >> > EFI_INVALID_PARAMETER
> >> > +  gets returned.
> >> > +
> >> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> >> > +  @param[in]      Timeout              The length of timeout period.
> >> > +  @param[in, out] SenseData            A pointer to output sense data.
> >> > +  @param[in, out] SenseDataLength      The length of output sense data.
> >> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> >> > +  @param[out]     TargetStatus         The status of the target.
> >> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> >> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
> >> data.
> >> > +  @param[in]      TransferLength       The size in bytes of the data
> allocation.
> >> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> >> > +  @param[in, out] DataLength           The length of data buffer.
> >>
> >>
> >> As mentioned in V4 series:
> >>
> >> Referring to the implementation of the library (changes made in
> >> MdePkg/Library/UefiScsiLib/UefiScsiLib.c):
> >>
> >> 'TransferLength' (input) specifies the length of content in 'DataBuffer';
> >> 'DataLength' (input & output) reflects the actual number of bytes
> >> transferred.
> >>
> >> How about swapping their names and changing the description comments
> >to:
> >> (Please help to update UefiScsiLib.c as well.)
> >>
> >>   @param[in]      DataLength           The size in bytes of the data buffer.
> >>   ...
> >>   @param[out]     TransferLength       A pointer to a buffer to store the size
> >>                                        in bytes of the data written to the data
> >>                                        buffer.
> >>
> >>
> >> > +
> >> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> >> > +  @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 DataLength.
> >> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not
> be
> >> > sent because there are too many
> >> > +                                       SCSI Command Packets already queued.
> >> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> >> > attempting to send SCSI Request Packet.
> >> > +  @retval  EFI_UNSUPPORTED             The command described by the
> SCSI
> >> > Request Packet is not supported by
> >> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> >> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for
> the
> >> > SCSI Request Packet to execute.
> >> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI
> Request
> >> > Packet are invalid.
> >> > +
> >> > +**/
> >> > +EFI_STATUS
> >> > +EFIAPI
> >> > +ScsiSecurityProtocolInCommand (
> >> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> >> > +  IN     UINT64                Timeout,
> >> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> >> > +  IN OUT UINT8                 *SenseDataLength,
> >> > +     OUT UINT8                 *HostAdapterStatus,
> >> > +     OUT UINT8                 *TargetStatus,
> >> > +  IN     UINT8                 SecurityProtocol,
> >> > +  IN     UINT16                SecurityProtocolSpecific,
> >> > +  IN     UINT32                TransferLength,
> >> > +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> >> > +  IN OUT UINT32                *DataLength
> >> > +  );
> >>
> >>
> >> As mentioned in V4 series, could you help to add a new parameter
> "Inc512"
> >> for
> >> both new APIs:
> >> ScsiSecurityProtocolInCommand
> >> ScsiSecurityProtocolOutCommand
> >>
> >> Though UFS spec requires the INC_512 field of a CDB to be set to 0, but
> >> for other devices, setting this field to 1 may be a valid configuration.
> >>
> >>
> >> Also, I would suggest the below parameter type changes to match with
> the
> >> services
> >> definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL
> >(including
> >> the
> >> name swap mentioned above):
> >>
> >> IN     UINT32                TransferLength,
> >> to
> >> IN     UINTN                 DataLength,
> >>
> >> IN OUT UINT32                *DataLength
> >> to
> >>    OUT UINTN                 *TransferLength
> >>
> >>
> >> > +
> >> > +
> >> > +/**
> >> > +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> >> > +
> >> > +  Executes the SCSI Security Protocol Out command on the SCSI target
> >> > specified by ScsiIo.
> >> > +  If Timeout is zero, then this function waits indefinitely for the
> command
> >> to
> >> > complete.
> >> > +  If Timeout is greater than zero, then the command is executed and
> will
> >> > timeout after
> >> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are
> used
> >> to
> >> > construct
> >>
> >>
> >> As mentioned in V4 series:
> >>
> >> There is no 'StartLba' & 'SectorSize' parameters for APIs:
> >>
> >> ScsiSecurityProtocolInCommand
> >> ScsiSecurityProtocolOutCommand
> >>
> >> Could you help to update the comments to address this?
> >> (Please help to update UefiScsiLib.c as well.)
> >>
> >>
> >> > +  the CDB for this SCSI command.
> >> > +  If ScsiIo is NULL, then ASSERT().
> >> > +  If SenseDataLength is NULL, then ASSERT().
> >> > +  If HostAdapterStatus is NULL, then ASSERT().
> >> > +  If TargetStatus is NULL, then ASSERT().
> >> > +  If DataLength is NULL, then ASSERT().
> >> > +
> >> > +  If SenseDataLength is non-zero and SenseData is not NULL,
> SenseData
> >> > must meet buffer
> >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> Otherwise
> >> > EFI_INVALID_PARAMETER
> >> > +  gets returned.
> >> > +
> >> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer
> must
> >> > meet buffer
> >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> Otherwise
> >> > EFI_INVALID_PARAMETER
> >> > +  gets returned.
> >> > +
> >> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> >> > +  @param[in]      Timeout              The length of timeout period.
> >> > +  @param[in, out] SenseData            A pointer to output sense data.
> >> > +  @param[in, out] SenseDataLength      The length of output sense data.
> >> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> >> > +  @param[out]     TargetStatus         The status of the target.
> >> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> >> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
> >> data.
> >> > +  @param[in]      TransferLength       The size in bytes of the transfer
> data.
> >> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> >>
> >>
> >> As mentioned in V4:
> >>
> >> Suggest to rename 'TransferLength' to 'DataLength' so that it may be a bit
> >> more clear for users to know 'DataLength' reflects the size of 'DataBuffer'.
> >>
> >>
> >> > +
> >> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> >> > +  @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 DataLength.
> >> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not
> be
> >> > sent because there are too many
> >> > +                                       SCSI Command Packets already queued.
> >> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> >> > attempting to send SCSI Request Packet.
> >> > +  @retval  EFI_UNSUPPORTED             The command described by the
> SCSI
> >> > Request Packet is not supported by
> >> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> >> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for
> the
> >> > SCSI Request Packet to execute.
> >> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI
> Request
> >> > Packet are invalid.
> >> > +
> >> > +**/
> >> > +EFI_STATUS
> >> > +EFIAPI
> >> > +ScsiSecurityProtocolOutCommand (
> >> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> >> > +  IN     UINT64                Timeout,
> >> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> >> > +  IN OUT UINT8                 *SenseDataLength,
> >> > +     OUT UINT8                 *HostAdapterStatus,
> >> > +     OUT UINT8                 *TargetStatus,
> >> > +  IN     UINT8                 SecurityProtocol,
> >> > +  IN     UINT16                SecurityProtocolSpecific,
> >> > +  IN     UINT32                TransferLength,
> >> > +  IN OUT VOID                  *DataBuffer  OPTIONAL
> >> > +  );
> >>
> >>
> >> As mentioned in V4 series:
> >>
> >> Suggest the below parameter type changes to match with the services
> >> definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL
> >(including
> >> the
> >> name change mentioned above):
> >>
> >> IN     UINT32                TransferLength
> >> to
> >> IN     UINTN                 DataLength
> >>
> >> Best Regards,
> >> Hao Wu
> >>
> >>
> >> > +
> >> > +
> >> >  /**
> >> >    Execute blocking/non-blocking Read(10) SCSI command on a specific
> SCSI
> >> >    target.
> >> > diff --git a/MdePkg/Include/Protocol/ScsiIo.h
> >> > b/MdePkg/Include/Protocol/ScsiIo.h
> >> > index 05e46bda9c..27c31fe7f9 100644
> >> > --- a/MdePkg/Include/Protocol/ScsiIo.h
> >> > +++ b/MdePkg/Include/Protocol/ScsiIo.h
> >> > @@ -4,7 +4,7 @@
> >> >    services environment to access SCSI devices. In particular, functions
> for
> >> >    managing devices on SCSI buses are defined here.
> >> >
> >> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> >> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> >> >    SPDX-License-Identifier: BSD-2-Clause-Patent
> >> >
> >> >  **/
> >> > @@ -43,8 +43,11 @@ typedef struct _EFI_SCSI_IO_PROTOCOL
> >> > EFI_SCSI_IO_PROTOCOL;
> >> >  #define MFI_SCSI_IO_TYPE_OCRW                                  0x0F    ///< Optical
> >> card
> >> > reader/writer device
> >> >  #define MFI_SCSI_IO_TYPE_BRIDGE                                0x10    ///< Bridge
> >> > Controller Commands
> >> >  #define MFI_SCSI_IO_TYPE_OSD                                   0x11    ///< Object-
> >> based
> >> > Storage Device
> >> > -#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x12    ///<
> >> > Reserved (low)
> >> > -#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1E    ///<
> >> > Reserved (high)
> >> > +#define MFI_SCSI_IO_TYPE_AUTOMATION                            0x12    ///<
> >> > Automation/Drive Interface
> >> > +#define MFI_SCSI_IO_TYPE_SECURITYMANAGER                       0x13
> ///<
> >> > Security manager device
> >> > +#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x14    ///<
> >> > Reserved (low)
> >> > +#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1D    ///<
> >> > Reserved (high)
> >> > +#define EFI_SCSI_IO_TYPE_WLUN                                  0x1E    ///< Well
> >> known
> >> > logical unit
> >> >  #define EFI_SCSI_IO_TYPE_UNKNOWN                               0x1F    ///<
> >> Unknown
> >> > no device type
> >> >
> >> >  //
> >> > diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> >> > b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> >> > index c7491d1436..7584d717ad 100644
> >> > --- a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> >> > +++ b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> >> > @@ -1,7 +1,7 @@
> >> >  /** @file
> >> >    UEFI SCSI Library implementation
> >> >
> >> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> >> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> >> >    SPDX-License-Identifier: BSD-2-Clause-Patent
> >> >
> >> >  **/
> >> > @@ -23,6 +23,7 @@
> >> >    //
> >> >  #define EFI_SCSI_OP_LENGTH_SIX      0x6
> >> >  #define EFI_SCSI_OP_LENGTH_TEN      0xa
> >> > +#define EFI_SCSI_OP_LENGTH_TWELVE   0xc
> >> >  #define EFI_SCSI_OP_LENGTH_SIXTEEN  0x10
> >> >
> >> >  //
> >> > @@ -1280,6 +1281,208 @@ ScsiWrite16Command (
> >> >  }
> >> >
> >> >
> >> > +/**
> >> > +  Execute Security Protocol In SCSI command on a specific SCSI target.
> >> > +
> >> > +  Executes the SCSI Security Protocol In command on the SCSI target
> >> > specified by ScsiIo.
> >> > +  If Timeout is zero, then this function waits indefinitely for the
> command
> >> to
> >> > complete.
> >> > +  If Timeout is greater than zero, then the command is executed and
> will
> >> > timeout after
> >> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are
> used
> >> to
> >> > construct
> >>
> >>
> >> As mentioned in V4 series:
> >>
> >> There is no 'StartLba' & 'SectorSize' parameters for APIs:
> >>
> >> ScsiSecurityProtocolInCommand
> >> ScsiSecurityProtocolOutCommand
> >>
> >> Could you help to update the comments to address this?
> >> (Please help to update UefiScsiLib.c as well.)
> >>
> >>
> >> > +  the CDB for this SCSI command.
> >> > +  If ScsiIo is NULL, then ASSERT().
> >> > +  If SenseDataLength is NULL, then ASSERT().
> >> > +  If HostAdapterStatus is NULL, then ASSERT().
> >> > +  If TargetStatus is NULL, then ASSERT().
> >> > +  If DataLength is NULL, then ASSERT().
> >> > +
> >> > +  If SenseDataLength is non-zero and SenseData is not NULL,
> SenseData
> >> > must meet buffer
> >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> Otherwise
> >> > EFI_INVALID_PARAMETER
> >> > +  gets returned.
> >> > +
> >> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer
> must
> >> > meet buffer
> >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> Otherwise
> >> > EFI_INVALID_PARAMETER
> >> > +  gets returned.
> >> > +
> >> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> >> > +  @param[in]      Timeout              The length of timeout period.
> >> > +  @param[in, out] SenseData            A pointer to output sense data.
> >> > +  @param[in, out] SenseDataLength      The length of output sense data.
> >> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> >> > +  @param[out]     TargetStatus         The status of the target.
> >> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> >> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
> >> data.
> >> > +  @param[in]      TransferLength       The size in bytes of the data
> allocation.
> >> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> >> > +  @param[in, out] DataLength           The length of data buffer.
> >> > +
> >> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> >> > +  @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 DataLength.
> >> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not
> be
> >> > sent because there are too many
> >> > +                                       SCSI Command Packets already queued.
> >> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> >> > attempting to send SCSI Request Packet.
> >> > +  @retval  EFI_UNSUPPORTED             The command described by the
> SCSI
> >> > Request Packet is not supported by
> >> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> >> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for
> the
> >> > SCSI Request Packet to execute.
> >> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI
> Request
> >> > Packet are invalid.
> >> > +
> >> > +**/
> >> > +EFI_STATUS
> >> > +EFIAPI
> >> > +ScsiSecurityProtocolInCommand (
> >> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> >> > +  IN     UINT64                Timeout,
> >> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> >> > +  IN OUT UINT8                 *SenseDataLength,
> >> > +     OUT UINT8                 *HostAdapterStatus,
> >> > +     OUT UINT8                 *TargetStatus,
> >> > +  IN     UINT8                 SecurityProtocol,
> >> > +  IN     UINT16                SecurityProtocolSpecific,
> >> > +  IN     UINT32                TransferLength,
> >> > +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> >> > +  IN OUT UINT32                *DataLength
> >> > +  )
> >> > +{
> >> > +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> >> > +  EFI_STATUS                      Status;
> >> > +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> >> > +
> >> > +  ASSERT (SenseDataLength != NULL);
> >> > +  ASSERT (HostAdapterStatus != NULL);
> >> > +  ASSERT (TargetStatus != NULL);
> >> > +  ASSERT (DataLength != NULL);
> >> > +  ASSERT (ScsiIo != NULL);
> >> > +
> >> > +  ZeroMem (&CommandPacket, sizeof
> >> > (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> >> > +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> >> > +
> >> > +  CommandPacket.Timeout           = Timeout;
> >> > +  CommandPacket.InDataBuffer      = DataBuffer;
> >> > +  CommandPacket.SenseData         = SenseData;
> >> > +  CommandPacket.InTransferLength  = TransferLength;
> >> > +  CommandPacket.Cdb               = Cdb;
> >> > +  //
> >> > +  // Fill Cdb for Security Protocol In Command
> >> > +  //
> >> > +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_IN;
> >> > +  Cdb[1]                        = SecurityProtocol;
> >> > +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> >> > (SecurityProtocolSpecific));
> >> > +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32
> (TransferLength));
> >> > +
> >> > +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> >> > +  CommandPacket.DataDirection   = EFI_SCSI_DATA_IN;
> >> > +  CommandPacket.SenseDataLength = *SenseDataLength;
> >> > +
> >> > +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> >> > &CommandPacket, NULL);
> >> > +
> >> > +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> >> > +  *TargetStatus                 = CommandPacket.TargetStatus;
> >> > +  *SenseDataLength              = CommandPacket.SenseDataLength;
> >> > +  *DataLength                   = CommandPacket.InTransferLength;
> >> > +
> >> > +  return Status;
> >> > +}
> >> > +
> >> > +
> >> > +/**
> >> > +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> >> > +
> >> > +  Executes the SCSI Security Protocol Out command on the SCSI target
> >> > specified by ScsiIo.
> >> > +  If Timeout is zero, then this function waits indefinitely for the
> command
> >> to
> >> > complete.
> >> > +  If Timeout is greater than zero, then the command is executed and
> will
> >> > timeout after
> >> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are
> used
> >> to
> >> > construct
> >> > +  the CDB for this SCSI command.
> >> > +  If ScsiIo is NULL, then ASSERT().
> >> > +  If SenseDataLength is NULL, then ASSERT().
> >> > +  If HostAdapterStatus is NULL, then ASSERT().
> >> > +  If TargetStatus is NULL, then ASSERT().
> >> > +  If DataLength is NULL, then ASSERT().
> >> > +
> >> > +  If SenseDataLength is non-zero and SenseData is not NULL,
> SenseData
> >> > must meet buffer
> >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> Otherwise
> >> > EFI_INVALID_PARAMETER
> >> > +  gets returned.
> >> > +
> >> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer
> must
> >> > meet buffer
> >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> Otherwise
> >> > EFI_INVALID_PARAMETER
> >> > +  gets returned.
> >> > +
> >> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> >> > +  @param[in]      Timeout              The length of timeout period.
> >> > +  @param[in, out] SenseData            A pointer to output sense data.
> >> > +  @param[in, out] SenseDataLength      The length of output sense data.
> >> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> >> > +  @param[out]     TargetStatus         The status of the target.
> >> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> >> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
> >> data.
> >> > +  @param[in]      TransferLength       The size in bytes of the transfer
> data.
> >> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> >> > +
> >> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> >> > +  @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 DataLength.
> >> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not
> be
> >> > sent because there are too many
> >> > +                                       SCSI Command Packets already queued.
> >> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> >> > attempting to send SCSI Request Packet.
> >> > +  @retval  EFI_UNSUPPORTED             The command described by the
> SCSI
> >> > Request Packet is not supported by
> >> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> >> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for
> the
> >> > SCSI Request Packet to execute.
> >> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI
> Request
> >> > Packet are invalid.
> >> > +
> >> > +**/
> >> > +EFI_STATUS
> >> > +EFIAPI
> >> > +ScsiSecurityProtocolOutCommand (
> >> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> >> > +  IN     UINT64                Timeout,
> >> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> >> > +  IN OUT UINT8                 *SenseDataLength,
> >> > +     OUT UINT8                 *HostAdapterStatus,
> >> > +     OUT UINT8                 *TargetStatus,
> >> > +  IN     UINT8                 SecurityProtocol,
> >> > +  IN     UINT16                SecurityProtocolSpecific,
> >> > +  IN     UINT32                TransferLength,
> >> > +  IN OUT VOID                  *DataBuffer   OPTIONAL
> >> > +  )
> >> > +{
> >> > +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> >> > +  EFI_STATUS                      Status;
> >> > +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> >> > +
> >> > +  ASSERT (SenseDataLength != NULL);
> >> > +  ASSERT (HostAdapterStatus != NULL);
> >> > +  ASSERT (TargetStatus != NULL);
> >> > +  ASSERT (ScsiIo != NULL);
> >> > +
> >> > +  ZeroMem (&CommandPacket, sizeof
> >> > (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> >> > +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> >> > +
> >> > +  CommandPacket.Timeout           = Timeout;
> >> > +  CommandPacket.OutDataBuffer     = DataBuffer;
> >> > +  CommandPacket.SenseData         = SenseData;
> >> > +  CommandPacket.OutTransferLength = TransferLength;
> >> > +  CommandPacket.Cdb               = Cdb;
> >> > +  //
> >> > +  // Fill Cdb for Security Protocol Out Command
> >> > +  //
> >> > +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_OUT;
> >> > +  Cdb[1]                        = SecurityProtocol;
> >> > +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> >> > (SecurityProtocolSpecific));
> >> > +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32
> (TransferLength));
> >> > +
> >> > +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> >> > +  CommandPacket.DataDirection   = EFI_SCSI_DATA_OUT;
> >> > +  CommandPacket.SenseDataLength = *SenseDataLength;
> >> > +
> >> > +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> >> > &CommandPacket, NULL);
> >> > +
> >> > +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> >> > +  *TargetStatus                 = CommandPacket.TargetStatus;
> >> > +  *SenseDataLength              = CommandPacket.SenseDataLength;
> >> > +
> >> > +  return Status;
> >> > +}
> >> > +
> >> > +
> >> >  /**
> >> >    Internal helper notify function in which update the result of the
> >> >    non-blocking SCSI Read/Write commands and signal caller event.
> >> > --
> >> > 2.16.2.windows.1
> >> >
> >> >
> >> > 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#46650): https://edk2.groups.io/g/devel/message/46650
Mute This Topic: https://groups.io/mt/32994942/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out
Posted by Liming Gao 6 years, 5 months ago
Hao:
  I add my comments. 

Thanks
Liming
> -----Original Message-----
> From: Wu, Hao A
> Sent: Monday, September 2, 2019 9:11 AM
> To: Gao, Liming <liming.gao@intel.com>; Zurcher, Christopher J <christopher.j.zurcher@intel.com>; devel@edk2.groups.io; Kinney,
> Michael D <michael.d.kinney@intel.com>
> Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J <jian.j.wang@intel.com>
> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out
> 
> > -----Original Message-----
> > From: Gao, Liming
> > Sent: Friday, August 30, 2019 5:15 PM
> > To: Wu, Hao A; Zurcher, Christopher J; devel@edk2.groups.io; Kinney,
> > Michael D
> > Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> > Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> > commands for Security Protocol In/Out
> >
> > UefiScsiLib is designed for the convenient usage with SCSI commands. They
> > should try to align to UEFI definition.
> > If you check current SCSI APIs, their interface matches
> > EFI_SCSI_IO_SCSI_REQUEST_PACKET strut.
> > So, new added APIs had better match
> > EFI_STORAGE_SECURITY_COMMAND_PROTOCOL.
> >
> > For the change in MdePkg\Include\Protocol\ScsiIo.h, where is new definition
> > EFI_SCSI_IO_TYPE_WLUN from?
> 
> 
> Hello Liming,
> 
> The macro "EFI_SCSI_IO_TYPE_WLUN" comes from the SCSI Primary Commands standard
> (SPC), just like other existing definitions listed together in the header file.
I check UEFI spec. Other existing definitions are defined in UEFI spec. 
So, I think new added one should be proposed to UEFI spec for ScsiIo.h. 
I am OK to the change in IndustryStandard/Scsi.h. Can the consumer code get 
new definition from IndustryStandard/Scsi.h instead of Protocol/ScsiIo.h?
If so, this patch doesn't need to update Protocol/ScsiIo.h.

Thanks
Liming
> 
> Best Regards,
> Hao Wu
> 
> 
> >
> > Thanks
> > Liming
> > >-----Original Message-----
> > >From: Wu, Hao A
> > >Sent: Friday, August 30, 2019 1:18 PM
> > >To: Zurcher, Christopher J <christopher.j.zurcher@intel.com>;
> > >devel@edk2.groups.io; Gao, Liming <liming.gao@intel.com>; Kinney,
> > Michael
> > >D <michael.d.kinney@intel.com>
> > >Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J
> > ><jian.j.wang@intel.com>
> > >Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> > commands
> > >for Security Protocol In/Out
> > >
> > >Hello,
> > >
> > >Sorry for top-posting.
> > >
> > >I was thinking to make the parameters interface match between the
> > >UefiScsiLib
> > >API and the EFI Storage Security Command Protocol service, since the
> > >implementation of the SSC protocol will directly call the UefiScsiLib API.
> > >
> > >More specifically, for UefiScsiLib API:
> > >EFI_STATUS
> > >EFIAPI
> > >ScsiSecurityProtocolInCommand (
> > >  ...
> > >  IN     UINT32  TransferLength,
> > >  ...
> > >  IN OUT UINT32  *DataLength
> > >  )
> > >
> > >to match the SSC protocol service:
> > >typedef
> > >EFI_STATUS
> > >(EFIAPI *EFI_STORAGE_SECURITY_RECEIVE_DATA)(
> > >  ...
> > >  IN UINTN   PayloadBufferSize,
> > >  ...
> > >  OUT UINTN  *PayloadTransferSize
> > >  )
> > >
> > >and for UefiScsiLib API:
> > >EFI_STATUS
> > >EFIAPI
> > >ScsiSecurityProtocolOutCommand (
> > >  ...
> > >  IN     UINT32  TransferLength,
> > >  ...
> > >  )
> > >
> > >to match the SSC protocol service:
> > >typedef
> > >EFI_STATUS
> > >(EFIAPI *EFI_STORAGE_SECURITY_SEND_DATA) (
> > >  ...
> > >  IN UINTN  PayloadBufferSize,
> > >  ...
> > >  )
> > >
> > >I am okay with the cast from UINTN to UINT32, as long as we can ensure
> > >truncation will not happen (which I think should be safe when dealing with
> > >data transfer with actual devices).
> > >
> > >But for casting from UINTN* to UINT32*, I am not sure if this is a
> > >recommended
> > >coding style. Maybe within the BIOS perspective, little endian is always the
> > >case where such cast should work well.
> > >
> > >I will leave this open to MdePkg package maintainers for their inputs.
> > >
> > >Best Regards,
> > >Hao Wu
> > >
> > >
> > >> -----Original Message-----
> > >> From: Zurcher, Christopher J
> > >> Sent: Friday, August 30, 2019 8:35 AM
> > >> To: Wu, Hao A; devel@edk2.groups.io
> > >> Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> > >> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> > >> commands for Security Protocol In/Out
> > >>
> > >> I've implemented all the suggested changes except changing the
> > arguments
> > >> from UINT32 to UINTN. No other functions in UefiScsiLib take UINTN
> > >> arguments, and since the library is directly packing the CDB, I think it
> > makes
> > >> sense to force the caller to provide the correct-size length value. That way
> > >> there is no ambiguity on what is going to the device.
> > >> If you agree I will send the updated patchset.
> > >>
> > >> Thanks,
> > >> Christopher Zurcher
> > >>
> > >> -----Original Message-----
> > >> From: Wu, Hao A
> > >> Sent: Monday, August 26, 2019 20:03
> > >> To: devel@edk2.groups.io; Zurcher, Christopher J
> > >> <christopher.j.zurcher@intel.com>
> > >> Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J
> > >> <jian.j.wang@intel.com>; Gao, Liming <liming.gao@intel.com>
> > >> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> > >> commands for Security Protocol In/Out
> > >>
> > >> Hello,
> > >>
> > >> Please refer to the below inline comments:
> > >>
> > >>
> > >> > -----Original Message-----
> > >> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On Behalf
> > Of
> > >> > Zurcher, Christopher J
> > >> > Sent: Friday, August 23, 2019 6:02 AM
> > >> > To: devel@edk2.groups.io
> > >> > Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> > >> > Subject: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> > commands
> > >> > for Security Protocol In/Out
> > >> >
> > >> > This patch implements the Security Protocol In and Security Protocol Out
> > >> > commands in UefiScsiLib to prepare support for the Storage Security
> > >> > Command Protocol.
> > >> >
> > >> > Cc: Jiewen Yao <jiewen.yao@intel.com>
> > >> > Cc: Jian J Wang <jian.j.wang@intel.com>
> > >> > Cc: Liming Gao <liming.gao@intel.com>
> > >> > Signed-off-by: Christopher J Zurcher <christopher.j.zurcher@intel.com>
> > >> > ---
> > >> >  MdePkg/Include/IndustryStandard/Scsi.h   |  48 +++--
> > >> >  MdePkg/Include/Library/UefiScsiLib.h     | 126 +++++++++++-
> > >> >  MdePkg/Include/Protocol/ScsiIo.h         |   9 +-
> > >> >  MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 205
> > +++++++++++++++++++-
> > >> >  4 files changed, 366 insertions(+), 22 deletions(-)
> > >> >
> > >> > diff --git a/MdePkg/Include/IndustryStandard/Scsi.h
> > >> > b/MdePkg/Include/IndustryStandard/Scsi.h
> > >> > index cbe5709fe5..10d7b49ba7 100644
> > >> > --- a/MdePkg/Include/IndustryStandard/Scsi.h
> > >> > +++ b/MdePkg/Include/IndustryStandard/Scsi.h
> > >> > @@ -1,7 +1,7 @@
> > >> >  /** @file
> > >> >    Support for SCSI-2 standard
> > >> >
> > >> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> > >> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> > >> >    SPDX-License-Identifier: BSD-2-Clause-Patent
> > >> >
> > >> >  **/
> > >> > @@ -163,6 +163,12 @@
> > >> >  #define EFI_SCSI_OP_SEND_MESSAGE10  0x2a
> > >> >  #define EFI_SCSI_OP_SEND_MESSAGE12  0xaa
> > >> >
> > >> > +//
> > >> > +// Additional commands for Secure Transactions
> > >> > +//
> > >> > +#define EFI_SCSI_OP_SECURITY_PROTOCOL_IN  0xa2
> > >> > +#define EFI_SCSI_OP_SECURITY_PROTOCOL_OUT 0xb5
> > >> > +
> > >> >  //
> > >> >  // SCSI Data Transfer Direction
> > >> >  //
> > >> > @@ -172,22 +178,30 @@
> > >> >  //
> > >> >  // Peripheral Device Type Definitions
> > >> >  //
> > >> > -#define EFI_SCSI_TYPE_DISK          0x00  ///< Direct-access device (e.g.
> > >> > magnetic disk)
> > >> > -#define EFI_SCSI_TYPE_TAPE          0x01  ///< Sequential-access device
> > >(e.g.
> > >> > magnetic tape)
> > >> > -#define EFI_SCSI_TYPE_PRINTER       0x02  ///< Printer device
> > >> > -#define EFI_SCSI_TYPE_PROCESSOR     0x03  ///< Processor device
> > >> > -#define EFI_SCSI_TYPE_WORM          0x04  ///< Write-once device (e.g.
> > >> some
> > >> > optical disks)
> > >> > -#define EFI_SCSI_TYPE_CDROM         0x05  ///< CD-ROM device
> > >> > -#define EFI_SCSI_TYPE_SCANNER       0x06  ///< Scanner device
> > >> > -#define EFI_SCSI_TYPE_OPTICAL       0x07  ///< Optical memory device
> > >(e.g.
> > >> > some optical disks)
> > >> > -#define EFI_SCSI_TYPE_MEDIUMCHANGER 0x08  ///< Medium changer
> > >> > device (e.g. jukeboxes)
> > >> > -#define EFI_SCSI_TYPE_COMMUNICATION 0x09  ///< Communications
> > >> > device
> > >> > -#define EFI_SCSI_TYPE_ASCIT8_1      0x0A  ///< Defined by ASC IT8
> > >> (Graphic
> > >> > arts pre-press devices)
> > >> > -#define EFI_SCSI_TYPE_ASCIT8_2      0x0B  ///< Defined by ASC IT8
> > >> (Graphic
> > >> > arts pre-press devices)
> > >>
> > >>
> > >> Could you help to address Liming's comment in the V4 series that to
> > >preserve
> > >> the definition for EFI_SCSI_TYPE_ASCIT8_1 & EFI_SCSI_TYPE_ASCIT8_2
> > for
> > >> compatibility consideration:
> > >>
> > >>
> > https://edk2.groups.io/g/devel/message/42361?p=,,,20,0,0,0::Created,,scsi,
> > >> 20,2,40,32048246
> > >>
> > >>
> > >> > -//
> > >> > -// 0Ch - 1Eh are reserved
> > >> > -//
> > >> > -#define EFI_SCSI_TYPE_UNKNOWN       0x1F  ///< Unknown or no
> > device
> > >> > type
> > >> > +#define EFI_SCSI_TYPE_DISK            0x00  ///< Direct-access device (e.g.
> > >> > magnetic disk)
> > >> > +#define EFI_SCSI_TYPE_TAPE            0x01  ///< Sequential-access device
> > >> (e.g.
> > >> > magnetic tape)
> > >> > +#define EFI_SCSI_TYPE_PRINTER         0x02  ///< Printer device
> > >> > +#define EFI_SCSI_TYPE_PROCESSOR       0x03  ///< Processor device
> > >> > +#define EFI_SCSI_TYPE_WORM            0x04  ///< Write-once device (e.g.
> > >> > some optical disks)
> > >> > +#define EFI_SCSI_TYPE_CDROM           0x05  ///< CD/DVD device
> > >> > +#define EFI_SCSI_TYPE_SCANNER         0x06  ///< Scanner device
> > >(obsolete)
> > >> > +#define EFI_SCSI_TYPE_OPTICAL         0x07  ///< Optical memory device
> > >> (e.g.
> > >> > some optical disks)
> > >> > +#define EFI_SCSI_TYPE_MEDIUMCHANGER   0x08  ///< Medium
> > changer
> > >> > device (e.g. jukeboxes)
> > >> > +#define EFI_SCSI_TYPE_COMMUNICATION   0x09  ///<
> > Communications
> > >> > device (obsolete)
> > >> > +#define EFI_SCSI_TYPE_A               0x0A  ///< Obsolete
> > >> > +#define EFI_SCSI_TYPE_B               0x0B  ///< Obsolete
> > >> > +#define EFI_SCSI_TYPE_RAID            0x0C  ///< Storage array controller
> > >> > device (e.g., RAID)
> > >> > +#define EFI_SCSI_TYPE_SES             0x0D  ///< Enclosure services device
> > >> > +#define EFI_SCSI_TYPE_RBC             0x0E  ///< Simplified direct-access
> > >> device
> > >> > (e.g., magnetic disk)
> > >> > +#define EFI_SCSI_TYPE_OCRW            0x0F  ///< Optical card
> > reader/writer
> > >> > device
> > >> > +#define EFI_SCSI_TYPE_BRIDGE          0x10  ///< Bridge Controller
> > >> Commands
> > >> > +#define EFI_SCSI_TYPE_OSD             0x11  ///< Object-based Storage
> > >> Device
> > >> > +#define EFI_SCSI_TYPE_AUTOMATION      0x12  ///< Automation/Drive
> > >> > Interface
> > >> > +#define EFI_SCSI_TYPE_SECURITYMANAGER 0x13  ///< Security
> > manager
> > >> > device
> > >> > +#define EFI_SCSI_TYPE_RESERVED_LOW    0x14  ///< Reserved (low)
> > >> > +#define EFI_SCSI_TYPE_RESERVED_HIGH   0x1D  ///< Reserved (high)
> > >> > +#define EFI_SCSI_TYPE_WLUN            0x1E  ///< Well known logical unit
> > >> > +#define EFI_SCSI_TYPE_UNKNOWN         0x1F  ///< Unknown or no
> > >device
> > >> > type
> > >> >
> > >> >  //
> > >> >  // Page Codes for INQUIRY command
> > >> > diff --git a/MdePkg/Include/Library/UefiScsiLib.h
> > >> > b/MdePkg/Include/Library/UefiScsiLib.h
> > >> > index 10dd81902b..a0d99e703a 100644
> > >> > --- a/MdePkg/Include/Library/UefiScsiLib.h
> > >> > +++ b/MdePkg/Include/Library/UefiScsiLib.h
> > >> > @@ -5,7 +5,7 @@
> > >> >    for hard drive, CD and DVD devices that are the most common SCSI
> > boot
> > >> > targets used by UEFI platforms.
> > >> >    This library class depends on SCSI I/O Protocol defined in UEFI
> > >> Specification
> > >> > and SCSI-2 industry standard.
> > >> >
> > >> > -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> > >> > +Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> > >> >  SPDX-License-Identifier: BSD-2-Clause-Patent
> > >> >
> > >> >  **/
> > >> > @@ -813,6 +813,130 @@ ScsiWrite16Command (
> > >> >    );
> > >> >
> > >> >
> > >> > +/**
> > >> > +  Execute Security Protocol In SCSI command on a specific SCSI target.
> > >> > +
> > >> > +  Executes the SCSI Security Protocol In command on the SCSI target
> > >> > specified by ScsiIo.
> > >> > +  If Timeout is zero, then this function waits indefinitely for the
> > command
> > >> to
> > >> > complete.
> > >> > +  If Timeout is greater than zero, then the command is executed and
> > will
> > >> > timeout after
> > >> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are
> > used
> > >> to
> > >> > construct
> > >>
> > >>
> > >> As mentioned in V4 series:
> > >>
> > >> There is no 'StartLba' & 'SectorSize' parameters for APIs:
> > >>
> > >> ScsiSecurityProtocolInCommand
> > >> ScsiSecurityProtocolOutCommand
> > >>
> > >> Could you help to update the comments to address this?
> > >> (Please help to update UefiScsiLib.c as well.)
> > >>
> > >>
> > >> > +  the CDB for this SCSI command.
> > >> > +  If ScsiIo is NULL, then ASSERT().
> > >> > +  If SenseDataLength is NULL, then ASSERT().
> > >> > +  If HostAdapterStatus is NULL, then ASSERT().
> > >> > +  If TargetStatus is NULL, then ASSERT().
> > >> > +  If DataLength is NULL, then ASSERT().
> > >> > +
> > >> > +  If SenseDataLength is non-zero and SenseData is not NULL,
> > SenseData
> > >> > must meet buffer
> > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > Otherwise
> > >> > EFI_INVALID_PARAMETER
> > >> > +  gets returned.
> > >> > +
> > >> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer
> > must
> > >> > meet buffer
> > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > Otherwise
> > >> > EFI_INVALID_PARAMETER
> > >> > +  gets returned.
> > >> > +
> > >> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> > >> > +  @param[in]      Timeout              The length of timeout period.
> > >> > +  @param[in, out] SenseData            A pointer to output sense data.
> > >> > +  @param[in, out] SenseDataLength      The length of output sense data.
> > >> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> > >> > +  @param[out]     TargetStatus         The status of the target.
> > >> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> > >> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
> > >> data.
> > >> > +  @param[in]      TransferLength       The size in bytes of the data
> > allocation.
> > >> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> > >> > +  @param[in, out] DataLength           The length of data buffer.
> > >>
> > >>
> > >> As mentioned in V4 series:
> > >>
> > >> Referring to the implementation of the library (changes made in
> > >> MdePkg/Library/UefiScsiLib/UefiScsiLib.c):
> > >>
> > >> 'TransferLength' (input) specifies the length of content in 'DataBuffer';
> > >> 'DataLength' (input & output) reflects the actual number of bytes
> > >> transferred.
> > >>
> > >> How about swapping their names and changing the description comments
> > >to:
> > >> (Please help to update UefiScsiLib.c as well.)
> > >>
> > >>   @param[in]      DataLength           The size in bytes of the data buffer.
> > >>   ...
> > >>   @param[out]     TransferLength       A pointer to a buffer to store the size
> > >>                                        in bytes of the data written to the data
> > >>                                        buffer.
> > >>
> > >>
> > >> > +
> > >> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> > >> > +  @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 DataLength.
> > >> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not
> > be
> > >> > sent because there are too many
> > >> > +                                       SCSI Command Packets already queued.
> > >> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> > >> > attempting to send SCSI Request Packet.
> > >> > +  @retval  EFI_UNSUPPORTED             The command described by the
> > SCSI
> > >> > Request Packet is not supported by
> > >> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> > >> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for
> > the
> > >> > SCSI Request Packet to execute.
> > >> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI
> > Request
> > >> > Packet are invalid.
> > >> > +
> > >> > +**/
> > >> > +EFI_STATUS
> > >> > +EFIAPI
> > >> > +ScsiSecurityProtocolInCommand (
> > >> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> > >> > +  IN     UINT64                Timeout,
> > >> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> > >> > +  IN OUT UINT8                 *SenseDataLength,
> > >> > +     OUT UINT8                 *HostAdapterStatus,
> > >> > +     OUT UINT8                 *TargetStatus,
> > >> > +  IN     UINT8                 SecurityProtocol,
> > >> > +  IN     UINT16                SecurityProtocolSpecific,
> > >> > +  IN     UINT32                TransferLength,
> > >> > +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> > >> > +  IN OUT UINT32                *DataLength
> > >> > +  );
> > >>
> > >>
> > >> As mentioned in V4 series, could you help to add a new parameter
> > "Inc512"
> > >> for
> > >> both new APIs:
> > >> ScsiSecurityProtocolInCommand
> > >> ScsiSecurityProtocolOutCommand
> > >>
> > >> Though UFS spec requires the INC_512 field of a CDB to be set to 0, but
> > >> for other devices, setting this field to 1 may be a valid configuration.
> > >>
> > >>
> > >> Also, I would suggest the below parameter type changes to match with
> > the
> > >> services
> > >> definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL
> > >(including
> > >> the
> > >> name swap mentioned above):
> > >>
> > >> IN     UINT32                TransferLength,
> > >> to
> > >> IN     UINTN                 DataLength,
> > >>
> > >> IN OUT UINT32                *DataLength
> > >> to
> > >>    OUT UINTN                 *TransferLength
> > >>
> > >>
> > >> > +
> > >> > +
> > >> > +/**
> > >> > +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> > >> > +
> > >> > +  Executes the SCSI Security Protocol Out command on the SCSI target
> > >> > specified by ScsiIo.
> > >> > +  If Timeout is zero, then this function waits indefinitely for the
> > command
> > >> to
> > >> > complete.
> > >> > +  If Timeout is greater than zero, then the command is executed and
> > will
> > >> > timeout after
> > >> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are
> > used
> > >> to
> > >> > construct
> > >>
> > >>
> > >> As mentioned in V4 series:
> > >>
> > >> There is no 'StartLba' & 'SectorSize' parameters for APIs:
> > >>
> > >> ScsiSecurityProtocolInCommand
> > >> ScsiSecurityProtocolOutCommand
> > >>
> > >> Could you help to update the comments to address this?
> > >> (Please help to update UefiScsiLib.c as well.)
> > >>
> > >>
> > >> > +  the CDB for this SCSI command.
> > >> > +  If ScsiIo is NULL, then ASSERT().
> > >> > +  If SenseDataLength is NULL, then ASSERT().
> > >> > +  If HostAdapterStatus is NULL, then ASSERT().
> > >> > +  If TargetStatus is NULL, then ASSERT().
> > >> > +  If DataLength is NULL, then ASSERT().
> > >> > +
> > >> > +  If SenseDataLength is non-zero and SenseData is not NULL,
> > SenseData
> > >> > must meet buffer
> > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > Otherwise
> > >> > EFI_INVALID_PARAMETER
> > >> > +  gets returned.
> > >> > +
> > >> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer
> > must
> > >> > meet buffer
> > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > Otherwise
> > >> > EFI_INVALID_PARAMETER
> > >> > +  gets returned.
> > >> > +
> > >> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> > >> > +  @param[in]      Timeout              The length of timeout period.
> > >> > +  @param[in, out] SenseData            A pointer to output sense data.
> > >> > +  @param[in, out] SenseDataLength      The length of output sense data.
> > >> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> > >> > +  @param[out]     TargetStatus         The status of the target.
> > >> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> > >> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
> > >> data.
> > >> > +  @param[in]      TransferLength       The size in bytes of the transfer
> > data.
> > >> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> > >>
> > >>
> > >> As mentioned in V4:
> > >>
> > >> Suggest to rename 'TransferLength' to 'DataLength' so that it may be a bit
> > >> more clear for users to know 'DataLength' reflects the size of 'DataBuffer'.
> > >>
> > >>
> > >> > +
> > >> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> > >> > +  @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 DataLength.
> > >> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not
> > be
> > >> > sent because there are too many
> > >> > +                                       SCSI Command Packets already queued.
> > >> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> > >> > attempting to send SCSI Request Packet.
> > >> > +  @retval  EFI_UNSUPPORTED             The command described by the
> > SCSI
> > >> > Request Packet is not supported by
> > >> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> > >> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for
> > the
> > >> > SCSI Request Packet to execute.
> > >> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI
> > Request
> > >> > Packet are invalid.
> > >> > +
> > >> > +**/
> > >> > +EFI_STATUS
> > >> > +EFIAPI
> > >> > +ScsiSecurityProtocolOutCommand (
> > >> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> > >> > +  IN     UINT64                Timeout,
> > >> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> > >> > +  IN OUT UINT8                 *SenseDataLength,
> > >> > +     OUT UINT8                 *HostAdapterStatus,
> > >> > +     OUT UINT8                 *TargetStatus,
> > >> > +  IN     UINT8                 SecurityProtocol,
> > >> > +  IN     UINT16                SecurityProtocolSpecific,
> > >> > +  IN     UINT32                TransferLength,
> > >> > +  IN OUT VOID                  *DataBuffer  OPTIONAL
> > >> > +  );
> > >>
> > >>
> > >> As mentioned in V4 series:
> > >>
> > >> Suggest the below parameter type changes to match with the services
> > >> definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL
> > >(including
> > >> the
> > >> name change mentioned above):
> > >>
> > >> IN     UINT32                TransferLength
> > >> to
> > >> IN     UINTN                 DataLength
> > >>
> > >> Best Regards,
> > >> Hao Wu
> > >>
> > >>
> > >> > +
> > >> > +
> > >> >  /**
> > >> >    Execute blocking/non-blocking Read(10) SCSI command on a specific
> > SCSI
> > >> >    target.
> > >> > diff --git a/MdePkg/Include/Protocol/ScsiIo.h
> > >> > b/MdePkg/Include/Protocol/ScsiIo.h
> > >> > index 05e46bda9c..27c31fe7f9 100644
> > >> > --- a/MdePkg/Include/Protocol/ScsiIo.h
> > >> > +++ b/MdePkg/Include/Protocol/ScsiIo.h
> > >> > @@ -4,7 +4,7 @@
> > >> >    services environment to access SCSI devices. In particular, functions
> > for
> > >> >    managing devices on SCSI buses are defined here.
> > >> >
> > >> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> > >> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> > >> >    SPDX-License-Identifier: BSD-2-Clause-Patent
> > >> >
> > >> >  **/
> > >> > @@ -43,8 +43,11 @@ typedef struct _EFI_SCSI_IO_PROTOCOL
> > >> > EFI_SCSI_IO_PROTOCOL;
> > >> >  #define MFI_SCSI_IO_TYPE_OCRW                                  0x0F    ///< Optical
> > >> card
> > >> > reader/writer device
> > >> >  #define MFI_SCSI_IO_TYPE_BRIDGE                                0x10    ///< Bridge
> > >> > Controller Commands
> > >> >  #define MFI_SCSI_IO_TYPE_OSD                                   0x11    ///< Object-
> > >> based
> > >> > Storage Device
> > >> > -#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x12    ///<
> > >> > Reserved (low)
> > >> > -#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1E    ///<
> > >> > Reserved (high)
> > >> > +#define MFI_SCSI_IO_TYPE_AUTOMATION                            0x12    ///<
> > >> > Automation/Drive Interface
> > >> > +#define MFI_SCSI_IO_TYPE_SECURITYMANAGER                       0x13
> > ///<
> > >> > Security manager device
> > >> > +#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x14    ///<
> > >> > Reserved (low)
> > >> > +#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1D    ///<
> > >> > Reserved (high)
> > >> > +#define EFI_SCSI_IO_TYPE_WLUN                                  0x1E    ///< Well
> > >> known
> > >> > logical unit
> > >> >  #define EFI_SCSI_IO_TYPE_UNKNOWN                               0x1F    ///<
> > >> Unknown
> > >> > no device type
> > >> >
> > >> >  //
> > >> > diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> > >> > b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> > >> > index c7491d1436..7584d717ad 100644
> > >> > --- a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> > >> > +++ b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> > >> > @@ -1,7 +1,7 @@
> > >> >  /** @file
> > >> >    UEFI SCSI Library implementation
> > >> >
> > >> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> > >> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> > >> >    SPDX-License-Identifier: BSD-2-Clause-Patent
> > >> >
> > >> >  **/
> > >> > @@ -23,6 +23,7 @@
> > >> >    //
> > >> >  #define EFI_SCSI_OP_LENGTH_SIX      0x6
> > >> >  #define EFI_SCSI_OP_LENGTH_TEN      0xa
> > >> > +#define EFI_SCSI_OP_LENGTH_TWELVE   0xc
> > >> >  #define EFI_SCSI_OP_LENGTH_SIXTEEN  0x10
> > >> >
> > >> >  //
> > >> > @@ -1280,6 +1281,208 @@ ScsiWrite16Command (
> > >> >  }
> > >> >
> > >> >
> > >> > +/**
> > >> > +  Execute Security Protocol In SCSI command on a specific SCSI target.
> > >> > +
> > >> > +  Executes the SCSI Security Protocol In command on the SCSI target
> > >> > specified by ScsiIo.
> > >> > +  If Timeout is zero, then this function waits indefinitely for the
> > command
> > >> to
> > >> > complete.
> > >> > +  If Timeout is greater than zero, then the command is executed and
> > will
> > >> > timeout after
> > >> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are
> > used
> > >> to
> > >> > construct
> > >>
> > >>
> > >> As mentioned in V4 series:
> > >>
> > >> There is no 'StartLba' & 'SectorSize' parameters for APIs:
> > >>
> > >> ScsiSecurityProtocolInCommand
> > >> ScsiSecurityProtocolOutCommand
> > >>
> > >> Could you help to update the comments to address this?
> > >> (Please help to update UefiScsiLib.c as well.)
> > >>
> > >>
> > >> > +  the CDB for this SCSI command.
> > >> > +  If ScsiIo is NULL, then ASSERT().
> > >> > +  If SenseDataLength is NULL, then ASSERT().
> > >> > +  If HostAdapterStatus is NULL, then ASSERT().
> > >> > +  If TargetStatus is NULL, then ASSERT().
> > >> > +  If DataLength is NULL, then ASSERT().
> > >> > +
> > >> > +  If SenseDataLength is non-zero and SenseData is not NULL,
> > SenseData
> > >> > must meet buffer
> > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > Otherwise
> > >> > EFI_INVALID_PARAMETER
> > >> > +  gets returned.
> > >> > +
> > >> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer
> > must
> > >> > meet buffer
> > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > Otherwise
> > >> > EFI_INVALID_PARAMETER
> > >> > +  gets returned.
> > >> > +
> > >> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> > >> > +  @param[in]      Timeout              The length of timeout period.
> > >> > +  @param[in, out] SenseData            A pointer to output sense data.
> > >> > +  @param[in, out] SenseDataLength      The length of output sense data.
> > >> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> > >> > +  @param[out]     TargetStatus         The status of the target.
> > >> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> > >> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
> > >> data.
> > >> > +  @param[in]      TransferLength       The size in bytes of the data
> > allocation.
> > >> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> > >> > +  @param[in, out] DataLength           The length of data buffer.
> > >> > +
> > >> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> > >> > +  @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 DataLength.
> > >> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not
> > be
> > >> > sent because there are too many
> > >> > +                                       SCSI Command Packets already queued.
> > >> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> > >> > attempting to send SCSI Request Packet.
> > >> > +  @retval  EFI_UNSUPPORTED             The command described by the
> > SCSI
> > >> > Request Packet is not supported by
> > >> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> > >> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for
> > the
> > >> > SCSI Request Packet to execute.
> > >> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI
> > Request
> > >> > Packet are invalid.
> > >> > +
> > >> > +**/
> > >> > +EFI_STATUS
> > >> > +EFIAPI
> > >> > +ScsiSecurityProtocolInCommand (
> > >> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> > >> > +  IN     UINT64                Timeout,
> > >> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> > >> > +  IN OUT UINT8                 *SenseDataLength,
> > >> > +     OUT UINT8                 *HostAdapterStatus,
> > >> > +     OUT UINT8                 *TargetStatus,
> > >> > +  IN     UINT8                 SecurityProtocol,
> > >> > +  IN     UINT16                SecurityProtocolSpecific,
> > >> > +  IN     UINT32                TransferLength,
> > >> > +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> > >> > +  IN OUT UINT32                *DataLength
> > >> > +  )
> > >> > +{
> > >> > +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> > >> > +  EFI_STATUS                      Status;
> > >> > +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> > >> > +
> > >> > +  ASSERT (SenseDataLength != NULL);
> > >> > +  ASSERT (HostAdapterStatus != NULL);
> > >> > +  ASSERT (TargetStatus != NULL);
> > >> > +  ASSERT (DataLength != NULL);
> > >> > +  ASSERT (ScsiIo != NULL);
> > >> > +
> > >> > +  ZeroMem (&CommandPacket, sizeof
> > >> > (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> > >> > +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> > >> > +
> > >> > +  CommandPacket.Timeout           = Timeout;
> > >> > +  CommandPacket.InDataBuffer      = DataBuffer;
> > >> > +  CommandPacket.SenseData         = SenseData;
> > >> > +  CommandPacket.InTransferLength  = TransferLength;
> > >> > +  CommandPacket.Cdb               = Cdb;
> > >> > +  //
> > >> > +  // Fill Cdb for Security Protocol In Command
> > >> > +  //
> > >> > +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_IN;
> > >> > +  Cdb[1]                        = SecurityProtocol;
> > >> > +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> > >> > (SecurityProtocolSpecific));
> > >> > +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32
> > (TransferLength));
> > >> > +
> > >> > +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> > >> > +  CommandPacket.DataDirection   = EFI_SCSI_DATA_IN;
> > >> > +  CommandPacket.SenseDataLength = *SenseDataLength;
> > >> > +
> > >> > +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> > >> > &CommandPacket, NULL);
> > >> > +
> > >> > +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> > >> > +  *TargetStatus                 = CommandPacket.TargetStatus;
> > >> > +  *SenseDataLength              = CommandPacket.SenseDataLength;
> > >> > +  *DataLength                   = CommandPacket.InTransferLength;
> > >> > +
> > >> > +  return Status;
> > >> > +}
> > >> > +
> > >> > +
> > >> > +/**
> > >> > +  Execute Security Protocol Out SCSI command on a specific SCSI target.
> > >> > +
> > >> > +  Executes the SCSI Security Protocol Out command on the SCSI target
> > >> > specified by ScsiIo.
> > >> > +  If Timeout is zero, then this function waits indefinitely for the
> > command
> > >> to
> > >> > complete.
> > >> > +  If Timeout is greater than zero, then the command is executed and
> > will
> > >> > timeout after
> > >> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are
> > used
> > >> to
> > >> > construct
> > >> > +  the CDB for this SCSI command.
> > >> > +  If ScsiIo is NULL, then ASSERT().
> > >> > +  If SenseDataLength is NULL, then ASSERT().
> > >> > +  If HostAdapterStatus is NULL, then ASSERT().
> > >> > +  If TargetStatus is NULL, then ASSERT().
> > >> > +  If DataLength is NULL, then ASSERT().
> > >> > +
> > >> > +  If SenseDataLength is non-zero and SenseData is not NULL,
> > SenseData
> > >> > must meet buffer
> > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > Otherwise
> > >> > EFI_INVALID_PARAMETER
> > >> > +  gets returned.
> > >> > +
> > >> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer
> > must
> > >> > meet buffer
> > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > Otherwise
> > >> > EFI_INVALID_PARAMETER
> > >> > +  gets returned.
> > >> > +
> > >> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> > >> > +  @param[in]      Timeout              The length of timeout period.
> > >> > +  @param[in, out] SenseData            A pointer to output sense data.
> > >> > +  @param[in, out] SenseDataLength      The length of output sense data.
> > >> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> > >> > +  @param[out]     TargetStatus         The status of the target.
> > >> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> > >> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol Specific
> > >> data.
> > >> > +  @param[in]      TransferLength       The size in bytes of the transfer
> > data.
> > >> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> > >> > +
> > >> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> > >> > +  @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 DataLength.
> > >> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could not
> > be
> > >> > sent because there are too many
> > >> > +                                       SCSI Command Packets already queued.
> > >> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> > >> > attempting to send SCSI Request Packet.
> > >> > +  @retval  EFI_UNSUPPORTED             The command described by the
> > SCSI
> > >> > Request Packet is not supported by
> > >> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> > >> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting for
> > the
> > >> > SCSI Request Packet to execute.
> > >> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI
> > Request
> > >> > Packet are invalid.
> > >> > +
> > >> > +**/
> > >> > +EFI_STATUS
> > >> > +EFIAPI
> > >> > +ScsiSecurityProtocolOutCommand (
> > >> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> > >> > +  IN     UINT64                Timeout,
> > >> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> > >> > +  IN OUT UINT8                 *SenseDataLength,
> > >> > +     OUT UINT8                 *HostAdapterStatus,
> > >> > +     OUT UINT8                 *TargetStatus,
> > >> > +  IN     UINT8                 SecurityProtocol,
> > >> > +  IN     UINT16                SecurityProtocolSpecific,
> > >> > +  IN     UINT32                TransferLength,
> > >> > +  IN OUT VOID                  *DataBuffer   OPTIONAL
> > >> > +  )
> > >> > +{
> > >> > +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> > >> > +  EFI_STATUS                      Status;
> > >> > +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> > >> > +
> > >> > +  ASSERT (SenseDataLength != NULL);
> > >> > +  ASSERT (HostAdapterStatus != NULL);
> > >> > +  ASSERT (TargetStatus != NULL);
> > >> > +  ASSERT (ScsiIo != NULL);
> > >> > +
> > >> > +  ZeroMem (&CommandPacket, sizeof
> > >> > (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> > >> > +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> > >> > +
> > >> > +  CommandPacket.Timeout           = Timeout;
> > >> > +  CommandPacket.OutDataBuffer     = DataBuffer;
> > >> > +  CommandPacket.SenseData         = SenseData;
> > >> > +  CommandPacket.OutTransferLength = TransferLength;
> > >> > +  CommandPacket.Cdb               = Cdb;
> > >> > +  //
> > >> > +  // Fill Cdb for Security Protocol Out Command
> > >> > +  //
> > >> > +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_OUT;
> > >> > +  Cdb[1]                        = SecurityProtocol;
> > >> > +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> > >> > (SecurityProtocolSpecific));
> > >> > +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32
> > (TransferLength));
> > >> > +
> > >> > +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> > >> > +  CommandPacket.DataDirection   = EFI_SCSI_DATA_OUT;
> > >> > +  CommandPacket.SenseDataLength = *SenseDataLength;
> > >> > +
> > >> > +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> > >> > &CommandPacket, NULL);
> > >> > +
> > >> > +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> > >> > +  *TargetStatus                 = CommandPacket.TargetStatus;
> > >> > +  *SenseDataLength              = CommandPacket.SenseDataLength;
> > >> > +
> > >> > +  return Status;
> > >> > +}
> > >> > +
> > >> > +
> > >> >  /**
> > >> >    Internal helper notify function in which update the result of the
> > >> >    non-blocking SCSI Read/Write commands and signal caller event.
> > >> > --
> > >> > 2.16.2.windows.1
> > >> >
> > >> >
> > >> > 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#46652): https://edk2.groups.io/g/devel/message/46652
Mute This Topic: https://groups.io/mt/32994942/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-

Re: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI commands for Security Protocol In/Out
Posted by Wu, Hao A 6 years, 5 months ago
> -----Original Message-----
> From: Gao, Liming
> Sent: Monday, September 02, 2019 9:47 AM
> To: Wu, Hao A; Zurcher, Christopher J; devel@edk2.groups.io; Kinney,
> Michael D
> Cc: Yao, Jiewen; Wang, Jian J
> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> commands for Security Protocol In/Out
> 
> Hao:
>   I add my comments.
> 
> Thanks
> Liming
> > -----Original Message-----
> > From: Wu, Hao A
> > Sent: Monday, September 2, 2019 9:11 AM
> > To: Gao, Liming <liming.gao@intel.com>; Zurcher, Christopher J
> <christopher.j.zurcher@intel.com>; devel@edk2.groups.io; Kinney,
> > Michael D <michael.d.kinney@intel.com>
> > Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J
> <jian.j.wang@intel.com>
> > Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> commands for Security Protocol In/Out
> >
> > > -----Original Message-----
> > > From: Gao, Liming
> > > Sent: Friday, August 30, 2019 5:15 PM
> > > To: Wu, Hao A; Zurcher, Christopher J; devel@edk2.groups.io; Kinney,
> > > Michael D
> > > Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> > > Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> > > commands for Security Protocol In/Out
> > >
> > > UefiScsiLib is designed for the convenient usage with SCSI commands.
> They
> > > should try to align to UEFI definition.
> > > If you check current SCSI APIs, their interface matches
> > > EFI_SCSI_IO_SCSI_REQUEST_PACKET strut.
> > > So, new added APIs had better match
> > > EFI_STORAGE_SECURITY_COMMAND_PROTOCOL.
> > >
> > > For the change in MdePkg\Include\Protocol\ScsiIo.h, where is new
> definition
> > > EFI_SCSI_IO_TYPE_WLUN from?
> >
> >
> > Hello Liming,
> >
> > The macro "EFI_SCSI_IO_TYPE_WLUN" comes from the SCSI Primary
> Commands standard
> > (SPC), just like other existing definitions listed together in the header file.
> I check UEFI spec. Other existing definitions are defined in UEFI spec.
> So, I think new added one should be proposed to UEFI spec for ScsiIo.h.
> I am OK to the change in IndustryStandard/Scsi.h. Can the consumer code
> get
> new definition from IndustryStandard/Scsi.h instead of Protocol/ScsiIo.h?
> If so, this patch doesn't need to update Protocol/ScsiIo.h.


Yes. I think the one "EFI_SCSI_IO_TYPE_WLUN" added in ScsiIo.h is not consumed
by the proposed patch. So I think removing it should not impact the
functionality.

(Actually, all the "EFI_SCSI_IO_TYPE_XXX" macros seem not being used within
edk2/edk2-platforms repositories at this moment.)


Hello Christopher Zurcher,

Could you help to double confirm? If "EFI_SCSI_IO_TYPE_WLUN" is not used, could
you help to remove all the changes made to file ScsiIo.h from the proposed
patch? I think we can update it later when the UEFI spec got updated.

Best Regards,
Hao Wu


> 
> Thanks
> Liming
> >
> > Best Regards,
> > Hao Wu
> >
> >
> > >
> > > Thanks
> > > Liming
> > > >-----Original Message-----
> > > >From: Wu, Hao A
> > > >Sent: Friday, August 30, 2019 1:18 PM
> > > >To: Zurcher, Christopher J <christopher.j.zurcher@intel.com>;
> > > >devel@edk2.groups.io; Gao, Liming <liming.gao@intel.com>; Kinney,
> > > Michael
> > > >D <michael.d.kinney@intel.com>
> > > >Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J
> > > ><jian.j.wang@intel.com>
> > > >Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> > > commands
> > > >for Security Protocol In/Out
> > > >
> > > >Hello,
> > > >
> > > >Sorry for top-posting.
> > > >
> > > >I was thinking to make the parameters interface match between the
> > > >UefiScsiLib
> > > >API and the EFI Storage Security Command Protocol service, since the
> > > >implementation of the SSC protocol will directly call the UefiScsiLib API.
> > > >
> > > >More specifically, for UefiScsiLib API:
> > > >EFI_STATUS
> > > >EFIAPI
> > > >ScsiSecurityProtocolInCommand (
> > > >  ...
> > > >  IN     UINT32  TransferLength,
> > > >  ...
> > > >  IN OUT UINT32  *DataLength
> > > >  )
> > > >
> > > >to match the SSC protocol service:
> > > >typedef
> > > >EFI_STATUS
> > > >(EFIAPI *EFI_STORAGE_SECURITY_RECEIVE_DATA)(
> > > >  ...
> > > >  IN UINTN   PayloadBufferSize,
> > > >  ...
> > > >  OUT UINTN  *PayloadTransferSize
> > > >  )
> > > >
> > > >and for UefiScsiLib API:
> > > >EFI_STATUS
> > > >EFIAPI
> > > >ScsiSecurityProtocolOutCommand (
> > > >  ...
> > > >  IN     UINT32  TransferLength,
> > > >  ...
> > > >  )
> > > >
> > > >to match the SSC protocol service:
> > > >typedef
> > > >EFI_STATUS
> > > >(EFIAPI *EFI_STORAGE_SECURITY_SEND_DATA) (
> > > >  ...
> > > >  IN UINTN  PayloadBufferSize,
> > > >  ...
> > > >  )
> > > >
> > > >I am okay with the cast from UINTN to UINT32, as long as we can ensure
> > > >truncation will not happen (which I think should be safe when dealing
> with
> > > >data transfer with actual devices).
> > > >
> > > >But for casting from UINTN* to UINT32*, I am not sure if this is a
> > > >recommended
> > > >coding style. Maybe within the BIOS perspective, little endian is always
> the
> > > >case where such cast should work well.
> > > >
> > > >I will leave this open to MdePkg package maintainers for their inputs.
> > > >
> > > >Best Regards,
> > > >Hao Wu
> > > >
> > > >
> > > >> -----Original Message-----
> > > >> From: Zurcher, Christopher J
> > > >> Sent: Friday, August 30, 2019 8:35 AM
> > > >> To: Wu, Hao A; devel@edk2.groups.io
> > > >> Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> > > >> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> > > >> commands for Security Protocol In/Out
> > > >>
> > > >> I've implemented all the suggested changes except changing the
> > > arguments
> > > >> from UINT32 to UINTN. No other functions in UefiScsiLib take UINTN
> > > >> arguments, and since the library is directly packing the CDB, I think it
> > > makes
> > > >> sense to force the caller to provide the correct-size length value. That
> way
> > > >> there is no ambiguity on what is going to the device.
> > > >> If you agree I will send the updated patchset.
> > > >>
> > > >> Thanks,
> > > >> Christopher Zurcher
> > > >>
> > > >> -----Original Message-----
> > > >> From: Wu, Hao A
> > > >> Sent: Monday, August 26, 2019 20:03
> > > >> To: devel@edk2.groups.io; Zurcher, Christopher J
> > > >> <christopher.j.zurcher@intel.com>
> > > >> Cc: Yao, Jiewen <jiewen.yao@intel.com>; Wang, Jian J
> > > >> <jian.j.wang@intel.com>; Gao, Liming <liming.gao@intel.com>
> > > >> Subject: RE: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> > > >> commands for Security Protocol In/Out
> > > >>
> > > >> Hello,
> > > >>
> > > >> Please refer to the below inline comments:
> > > >>
> > > >>
> > > >> > -----Original Message-----
> > > >> > From: devel@edk2.groups.io [mailto:devel@edk2.groups.io] On
> Behalf
> > > Of
> > > >> > Zurcher, Christopher J
> > > >> > Sent: Friday, August 23, 2019 6:02 AM
> > > >> > To: devel@edk2.groups.io
> > > >> > Cc: Yao, Jiewen; Wang, Jian J; Gao, Liming
> > > >> > Subject: [edk2-devel] [PATCH v5 1/4] MdePkg: Implement SCSI
> > > commands
> > > >> > for Security Protocol In/Out
> > > >> >
> > > >> > This patch implements the Security Protocol In and Security Protocol
> Out
> > > >> > commands in UefiScsiLib to prepare support for the Storage Security
> > > >> > Command Protocol.
> > > >> >
> > > >> > Cc: Jiewen Yao <jiewen.yao@intel.com>
> > > >> > Cc: Jian J Wang <jian.j.wang@intel.com>
> > > >> > Cc: Liming Gao <liming.gao@intel.com>
> > > >> > Signed-off-by: Christopher J Zurcher
> <christopher.j.zurcher@intel.com>
> > > >> > ---
> > > >> >  MdePkg/Include/IndustryStandard/Scsi.h   |  48 +++--
> > > >> >  MdePkg/Include/Library/UefiScsiLib.h     | 126 +++++++++++-
> > > >> >  MdePkg/Include/Protocol/ScsiIo.h         |   9 +-
> > > >> >  MdePkg/Library/UefiScsiLib/UefiScsiLib.c | 205
> > > +++++++++++++++++++-
> > > >> >  4 files changed, 366 insertions(+), 22 deletions(-)
> > > >> >
> > > >> > diff --git a/MdePkg/Include/IndustryStandard/Scsi.h
> > > >> > b/MdePkg/Include/IndustryStandard/Scsi.h
> > > >> > index cbe5709fe5..10d7b49ba7 100644
> > > >> > --- a/MdePkg/Include/IndustryStandard/Scsi.h
> > > >> > +++ b/MdePkg/Include/IndustryStandard/Scsi.h
> > > >> > @@ -1,7 +1,7 @@
> > > >> >  /** @file
> > > >> >    Support for SCSI-2 standard
> > > >> >
> > > >> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> > > >> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> > > >> >    SPDX-License-Identifier: BSD-2-Clause-Patent
> > > >> >
> > > >> >  **/
> > > >> > @@ -163,6 +163,12 @@
> > > >> >  #define EFI_SCSI_OP_SEND_MESSAGE10  0x2a
> > > >> >  #define EFI_SCSI_OP_SEND_MESSAGE12  0xaa
> > > >> >
> > > >> > +//
> > > >> > +// Additional commands for Secure Transactions
> > > >> > +//
> > > >> > +#define EFI_SCSI_OP_SECURITY_PROTOCOL_IN  0xa2
> > > >> > +#define EFI_SCSI_OP_SECURITY_PROTOCOL_OUT 0xb5
> > > >> > +
> > > >> >  //
> > > >> >  // SCSI Data Transfer Direction
> > > >> >  //
> > > >> > @@ -172,22 +178,30 @@
> > > >> >  //
> > > >> >  // Peripheral Device Type Definitions
> > > >> >  //
> > > >> > -#define EFI_SCSI_TYPE_DISK          0x00  ///< Direct-access device
> (e.g.
> > > >> > magnetic disk)
> > > >> > -#define EFI_SCSI_TYPE_TAPE          0x01  ///< Sequential-access
> device
> > > >(e.g.
> > > >> > magnetic tape)
> > > >> > -#define EFI_SCSI_TYPE_PRINTER       0x02  ///< Printer device
> > > >> > -#define EFI_SCSI_TYPE_PROCESSOR     0x03  ///< Processor device
> > > >> > -#define EFI_SCSI_TYPE_WORM          0x04  ///< Write-once device
> (e.g.
> > > >> some
> > > >> > optical disks)
> > > >> > -#define EFI_SCSI_TYPE_CDROM         0x05  ///< CD-ROM device
> > > >> > -#define EFI_SCSI_TYPE_SCANNER       0x06  ///< Scanner device
> > > >> > -#define EFI_SCSI_TYPE_OPTICAL       0x07  ///< Optical memory
> device
> > > >(e.g.
> > > >> > some optical disks)
> > > >> > -#define EFI_SCSI_TYPE_MEDIUMCHANGER 0x08  ///< Medium
> changer
> > > >> > device (e.g. jukeboxes)
> > > >> > -#define EFI_SCSI_TYPE_COMMUNICATION 0x09  ///<
> Communications
> > > >> > device
> > > >> > -#define EFI_SCSI_TYPE_ASCIT8_1      0x0A  ///< Defined by ASC IT8
> > > >> (Graphic
> > > >> > arts pre-press devices)
> > > >> > -#define EFI_SCSI_TYPE_ASCIT8_2      0x0B  ///< Defined by ASC IT8
> > > >> (Graphic
> > > >> > arts pre-press devices)
> > > >>
> > > >>
> > > >> Could you help to address Liming's comment in the V4 series that to
> > > >preserve
> > > >> the definition for EFI_SCSI_TYPE_ASCIT8_1 &
> EFI_SCSI_TYPE_ASCIT8_2
> > > for
> > > >> compatibility consideration:
> > > >>
> > > >>
> > >
> https://edk2.groups.io/g/devel/message/42361?p=,,,20,0,0,0::Created,,scsi,
> > > >> 20,2,40,32048246
> > > >>
> > > >>
> > > >> > -//
> > > >> > -// 0Ch - 1Eh are reserved
> > > >> > -//
> > > >> > -#define EFI_SCSI_TYPE_UNKNOWN       0x1F  ///< Unknown or no
> > > device
> > > >> > type
> > > >> > +#define EFI_SCSI_TYPE_DISK            0x00  ///< Direct-access device
> (e.g.
> > > >> > magnetic disk)
> > > >> > +#define EFI_SCSI_TYPE_TAPE            0x01  ///< Sequential-access
> device
> > > >> (e.g.
> > > >> > magnetic tape)
> > > >> > +#define EFI_SCSI_TYPE_PRINTER         0x02  ///< Printer device
> > > >> > +#define EFI_SCSI_TYPE_PROCESSOR       0x03  ///< Processor device
> > > >> > +#define EFI_SCSI_TYPE_WORM            0x04  ///< Write-once device
> (e.g.
> > > >> > some optical disks)
> > > >> > +#define EFI_SCSI_TYPE_CDROM           0x05  ///< CD/DVD device
> > > >> > +#define EFI_SCSI_TYPE_SCANNER         0x06  ///< Scanner device
> > > >(obsolete)
> > > >> > +#define EFI_SCSI_TYPE_OPTICAL         0x07  ///< Optical memory
> device
> > > >> (e.g.
> > > >> > some optical disks)
> > > >> > +#define EFI_SCSI_TYPE_MEDIUMCHANGER   0x08  ///< Medium
> > > changer
> > > >> > device (e.g. jukeboxes)
> > > >> > +#define EFI_SCSI_TYPE_COMMUNICATION   0x09  ///<
> > > Communications
> > > >> > device (obsolete)
> > > >> > +#define EFI_SCSI_TYPE_A               0x0A  ///< Obsolete
> > > >> > +#define EFI_SCSI_TYPE_B               0x0B  ///< Obsolete
> > > >> > +#define EFI_SCSI_TYPE_RAID            0x0C  ///< Storage array
> controller
> > > >> > device (e.g., RAID)
> > > >> > +#define EFI_SCSI_TYPE_SES             0x0D  ///< Enclosure services
> device
> > > >> > +#define EFI_SCSI_TYPE_RBC             0x0E  ///< Simplified direct-
> access
> > > >> device
> > > >> > (e.g., magnetic disk)
> > > >> > +#define EFI_SCSI_TYPE_OCRW            0x0F  ///< Optical card
> > > reader/writer
> > > >> > device
> > > >> > +#define EFI_SCSI_TYPE_BRIDGE          0x10  ///< Bridge Controller
> > > >> Commands
> > > >> > +#define EFI_SCSI_TYPE_OSD             0x11  ///< Object-based Storage
> > > >> Device
> > > >> > +#define EFI_SCSI_TYPE_AUTOMATION      0x12  ///<
> Automation/Drive
> > > >> > Interface
> > > >> > +#define EFI_SCSI_TYPE_SECURITYMANAGER 0x13  ///< Security
> > > manager
> > > >> > device
> > > >> > +#define EFI_SCSI_TYPE_RESERVED_LOW    0x14  ///< Reserved (low)
> > > >> > +#define EFI_SCSI_TYPE_RESERVED_HIGH   0x1D  ///< Reserved
> (high)
> > > >> > +#define EFI_SCSI_TYPE_WLUN            0x1E  ///< Well known logical
> unit
> > > >> > +#define EFI_SCSI_TYPE_UNKNOWN         0x1F  ///< Unknown or no
> > > >device
> > > >> > type
> > > >> >
> > > >> >  //
> > > >> >  // Page Codes for INQUIRY command
> > > >> > diff --git a/MdePkg/Include/Library/UefiScsiLib.h
> > > >> > b/MdePkg/Include/Library/UefiScsiLib.h
> > > >> > index 10dd81902b..a0d99e703a 100644
> > > >> > --- a/MdePkg/Include/Library/UefiScsiLib.h
> > > >> > +++ b/MdePkg/Include/Library/UefiScsiLib.h
> > > >> > @@ -5,7 +5,7 @@
> > > >> >    for hard drive, CD and DVD devices that are the most common SCSI
> > > boot
> > > >> > targets used by UEFI platforms.
> > > >> >    This library class depends on SCSI I/O Protocol defined in UEFI
> > > >> Specification
> > > >> > and SCSI-2 industry standard.
> > > >> >
> > > >> > -Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> > > >> > +Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> > > >> >  SPDX-License-Identifier: BSD-2-Clause-Patent
> > > >> >
> > > >> >  **/
> > > >> > @@ -813,6 +813,130 @@ ScsiWrite16Command (
> > > >> >    );
> > > >> >
> > > >> >
> > > >> > +/**
> > > >> > +  Execute Security Protocol In SCSI command on a specific SCSI
> target.
> > > >> > +
> > > >> > +  Executes the SCSI Security Protocol In command on the SCSI
> target
> > > >> > specified by ScsiIo.
> > > >> > +  If Timeout is zero, then this function waits indefinitely for the
> > > command
> > > >> to
> > > >> > complete.
> > > >> > +  If Timeout is greater than zero, then the command is executed
> and
> > > will
> > > >> > timeout after
> > > >> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are
> > > used
> > > >> to
> > > >> > construct
> > > >>
> > > >>
> > > >> As mentioned in V4 series:
> > > >>
> > > >> There is no 'StartLba' & 'SectorSize' parameters for APIs:
> > > >>
> > > >> ScsiSecurityProtocolInCommand
> > > >> ScsiSecurityProtocolOutCommand
> > > >>
> > > >> Could you help to update the comments to address this?
> > > >> (Please help to update UefiScsiLib.c as well.)
> > > >>
> > > >>
> > > >> > +  the CDB for this SCSI command.
> > > >> > +  If ScsiIo is NULL, then ASSERT().
> > > >> > +  If SenseDataLength is NULL, then ASSERT().
> > > >> > +  If HostAdapterStatus is NULL, then ASSERT().
> > > >> > +  If TargetStatus is NULL, then ASSERT().
> > > >> > +  If DataLength is NULL, then ASSERT().
> > > >> > +
> > > >> > +  If SenseDataLength is non-zero and SenseData is not NULL,
> > > SenseData
> > > >> > must meet buffer
> > > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > > Otherwise
> > > >> > EFI_INVALID_PARAMETER
> > > >> > +  gets returned.
> > > >> > +
> > > >> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer
> > > must
> > > >> > meet buffer
> > > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > > Otherwise
> > > >> > EFI_INVALID_PARAMETER
> > > >> > +  gets returned.
> > > >> > +
> > > >> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> > > >> > +  @param[in]      Timeout              The length of timeout period.
> > > >> > +  @param[in, out] SenseData            A pointer to output sense data.
> > > >> > +  @param[in, out] SenseDataLength      The length of output sense
> data.
> > > >> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> > > >> > +  @param[out]     TargetStatus         The status of the target.
> > > >> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> > > >> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol
> Specific
> > > >> data.
> > > >> > +  @param[in]      TransferLength       The size in bytes of the data
> > > allocation.
> > > >> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> > > >> > +  @param[in, out] DataLength           The length of data buffer.
> > > >>
> > > >>
> > > >> As mentioned in V4 series:
> > > >>
> > > >> Referring to the implementation of the library (changes made in
> > > >> MdePkg/Library/UefiScsiLib/UefiScsiLib.c):
> > > >>
> > > >> 'TransferLength' (input) specifies the length of content in 'DataBuffer';
> > > >> 'DataLength' (input & output) reflects the actual number of bytes
> > > >> transferred.
> > > >>
> > > >> How about swapping their names and changing the description
> comments
> > > >to:
> > > >> (Please help to update UefiScsiLib.c as well.)
> > > >>
> > > >>   @param[in]      DataLength           The size in bytes of the data buffer.
> > > >>   ...
> > > >>   @param[out]     TransferLength       A pointer to a buffer to store the
> size
> > > >>                                        in bytes of the data written to the data
> > > >>                                        buffer.
> > > >>
> > > >>
> > > >> > +
> > > >> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> > > >> > +  @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 DataLength.
> > > >> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could
> not
> > > be
> > > >> > sent because there are too many
> > > >> > +                                       SCSI Command Packets already queued.
> > > >> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> > > >> > attempting to send SCSI Request Packet.
> > > >> > +  @retval  EFI_UNSUPPORTED             The command described by
> the
> > > SCSI
> > > >> > Request Packet is not supported by
> > > >> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> > > >> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting
> for
> > > the
> > > >> > SCSI Request Packet to execute.
> > > >> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI
> > > Request
> > > >> > Packet are invalid.
> > > >> > +
> > > >> > +**/
> > > >> > +EFI_STATUS
> > > >> > +EFIAPI
> > > >> > +ScsiSecurityProtocolInCommand (
> > > >> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> > > >> > +  IN     UINT64                Timeout,
> > > >> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> > > >> > +  IN OUT UINT8                 *SenseDataLength,
> > > >> > +     OUT UINT8                 *HostAdapterStatus,
> > > >> > +     OUT UINT8                 *TargetStatus,
> > > >> > +  IN     UINT8                 SecurityProtocol,
> > > >> > +  IN     UINT16                SecurityProtocolSpecific,
> > > >> > +  IN     UINT32                TransferLength,
> > > >> > +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> > > >> > +  IN OUT UINT32                *DataLength
> > > >> > +  );
> > > >>
> > > >>
> > > >> As mentioned in V4 series, could you help to add a new parameter
> > > "Inc512"
> > > >> for
> > > >> both new APIs:
> > > >> ScsiSecurityProtocolInCommand
> > > >> ScsiSecurityProtocolOutCommand
> > > >>
> > > >> Though UFS spec requires the INC_512 field of a CDB to be set to 0,
> but
> > > >> for other devices, setting this field to 1 may be a valid configuration.
> > > >>
> > > >>
> > > >> Also, I would suggest the below parameter type changes to match
> with
> > > the
> > > >> services
> > > >> definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL
> > > >(including
> > > >> the
> > > >> name swap mentioned above):
> > > >>
> > > >> IN     UINT32                TransferLength,
> > > >> to
> > > >> IN     UINTN                 DataLength,
> > > >>
> > > >> IN OUT UINT32                *DataLength
> > > >> to
> > > >>    OUT UINTN                 *TransferLength
> > > >>
> > > >>
> > > >> > +
> > > >> > +
> > > >> > +/**
> > > >> > +  Execute Security Protocol Out SCSI command on a specific SCSI
> target.
> > > >> > +
> > > >> > +  Executes the SCSI Security Protocol Out command on the SCSI
> target
> > > >> > specified by ScsiIo.
> > > >> > +  If Timeout is zero, then this function waits indefinitely for the
> > > command
> > > >> to
> > > >> > complete.
> > > >> > +  If Timeout is greater than zero, then the command is executed
> and
> > > will
> > > >> > timeout after
> > > >> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are
> > > used
> > > >> to
> > > >> > construct
> > > >>
> > > >>
> > > >> As mentioned in V4 series:
> > > >>
> > > >> There is no 'StartLba' & 'SectorSize' parameters for APIs:
> > > >>
> > > >> ScsiSecurityProtocolInCommand
> > > >> ScsiSecurityProtocolOutCommand
> > > >>
> > > >> Could you help to update the comments to address this?
> > > >> (Please help to update UefiScsiLib.c as well.)
> > > >>
> > > >>
> > > >> > +  the CDB for this SCSI command.
> > > >> > +  If ScsiIo is NULL, then ASSERT().
> > > >> > +  If SenseDataLength is NULL, then ASSERT().
> > > >> > +  If HostAdapterStatus is NULL, then ASSERT().
> > > >> > +  If TargetStatus is NULL, then ASSERT().
> > > >> > +  If DataLength is NULL, then ASSERT().
> > > >> > +
> > > >> > +  If SenseDataLength is non-zero and SenseData is not NULL,
> > > SenseData
> > > >> > must meet buffer
> > > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > > Otherwise
> > > >> > EFI_INVALID_PARAMETER
> > > >> > +  gets returned.
> > > >> > +
> > > >> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer
> > > must
> > > >> > meet buffer
> > > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > > Otherwise
> > > >> > EFI_INVALID_PARAMETER
> > > >> > +  gets returned.
> > > >> > +
> > > >> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> > > >> > +  @param[in]      Timeout              The length of timeout period.
> > > >> > +  @param[in, out] SenseData            A pointer to output sense data.
> > > >> > +  @param[in, out] SenseDataLength      The length of output sense
> data.
> > > >> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> > > >> > +  @param[out]     TargetStatus         The status of the target.
> > > >> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> > > >> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol
> Specific
> > > >> data.
> > > >> > +  @param[in]      TransferLength       The size in bytes of the transfer
> > > data.
> > > >> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> > > >>
> > > >>
> > > >> As mentioned in V4:
> > > >>
> > > >> Suggest to rename 'TransferLength' to 'DataLength' so that it may be a
> bit
> > > >> more clear for users to know 'DataLength' reflects the size of
> 'DataBuffer'.
> > > >>
> > > >>
> > > >> > +
> > > >> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> > > >> > +  @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 DataLength.
> > > >> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could
> not
> > > be
> > > >> > sent because there are too many
> > > >> > +                                       SCSI Command Packets already queued.
> > > >> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> > > >> > attempting to send SCSI Request Packet.
> > > >> > +  @retval  EFI_UNSUPPORTED             The command described by
> the
> > > SCSI
> > > >> > Request Packet is not supported by
> > > >> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> > > >> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting
> for
> > > the
> > > >> > SCSI Request Packet to execute.
> > > >> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI
> > > Request
> > > >> > Packet are invalid.
> > > >> > +
> > > >> > +**/
> > > >> > +EFI_STATUS
> > > >> > +EFIAPI
> > > >> > +ScsiSecurityProtocolOutCommand (
> > > >> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> > > >> > +  IN     UINT64                Timeout,
> > > >> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> > > >> > +  IN OUT UINT8                 *SenseDataLength,
> > > >> > +     OUT UINT8                 *HostAdapterStatus,
> > > >> > +     OUT UINT8                 *TargetStatus,
> > > >> > +  IN     UINT8                 SecurityProtocol,
> > > >> > +  IN     UINT16                SecurityProtocolSpecific,
> > > >> > +  IN     UINT32                TransferLength,
> > > >> > +  IN OUT VOID                  *DataBuffer  OPTIONAL
> > > >> > +  );
> > > >>
> > > >>
> > > >> As mentioned in V4 series:
> > > >>
> > > >> Suggest the below parameter type changes to match with the services
> > > >> definition of the EFI_STORAGE_SECURITY_COMMAND_PROTOCOL
> > > >(including
> > > >> the
> > > >> name change mentioned above):
> > > >>
> > > >> IN     UINT32                TransferLength
> > > >> to
> > > >> IN     UINTN                 DataLength
> > > >>
> > > >> Best Regards,
> > > >> Hao Wu
> > > >>
> > > >>
> > > >> > +
> > > >> > +
> > > >> >  /**
> > > >> >    Execute blocking/non-blocking Read(10) SCSI command on a
> specific
> > > SCSI
> > > >> >    target.
> > > >> > diff --git a/MdePkg/Include/Protocol/ScsiIo.h
> > > >> > b/MdePkg/Include/Protocol/ScsiIo.h
> > > >> > index 05e46bda9c..27c31fe7f9 100644
> > > >> > --- a/MdePkg/Include/Protocol/ScsiIo.h
> > > >> > +++ b/MdePkg/Include/Protocol/ScsiIo.h
> > > >> > @@ -4,7 +4,7 @@
> > > >> >    services environment to access SCSI devices. In particular,
> functions
> > > for
> > > >> >    managing devices on SCSI buses are defined here.
> > > >> >
> > > >> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> > > >> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> > > >> >    SPDX-License-Identifier: BSD-2-Clause-Patent
> > > >> >
> > > >> >  **/
> > > >> > @@ -43,8 +43,11 @@ typedef struct _EFI_SCSI_IO_PROTOCOL
> > > >> > EFI_SCSI_IO_PROTOCOL;
> > > >> >  #define MFI_SCSI_IO_TYPE_OCRW                                  0x0F    ///<
> Optical
> > > >> card
> > > >> > reader/writer device
> > > >> >  #define MFI_SCSI_IO_TYPE_BRIDGE                                0x10    ///<
> Bridge
> > > >> > Controller Commands
> > > >> >  #define MFI_SCSI_IO_TYPE_OSD                                   0x11    ///<
> Object-
> > > >> based
> > > >> > Storage Device
> > > >> > -#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x12    ///<
> > > >> > Reserved (low)
> > > >> > -#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1E    ///<
> > > >> > Reserved (high)
> > > >> > +#define MFI_SCSI_IO_TYPE_AUTOMATION                            0x12
> ///<
> > > >> > Automation/Drive Interface
> > > >> > +#define MFI_SCSI_IO_TYPE_SECURITYMANAGER                       0x13
> > > ///<
> > > >> > Security manager device
> > > >> > +#define EFI_SCSI_IO_TYPE_RESERVED_LOW                          0x14
> ///<
> > > >> > Reserved (low)
> > > >> > +#define EFI_SCSI_IO_TYPE_RESERVED_HIGH                         0x1D
> ///<
> > > >> > Reserved (high)
> > > >> > +#define EFI_SCSI_IO_TYPE_WLUN                                  0x1E    ///< Well
> > > >> known
> > > >> > logical unit
> > > >> >  #define EFI_SCSI_IO_TYPE_UNKNOWN                               0x1F    ///<
> > > >> Unknown
> > > >> > no device type
> > > >> >
> > > >> >  //
> > > >> > diff --git a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> > > >> > b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> > > >> > index c7491d1436..7584d717ad 100644
> > > >> > --- a/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> > > >> > +++ b/MdePkg/Library/UefiScsiLib/UefiScsiLib.c
> > > >> > @@ -1,7 +1,7 @@
> > > >> >  /** @file
> > > >> >    UEFI SCSI Library implementation
> > > >> >
> > > >> > -  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
> > > >> > +  Copyright (c) 2006 - 2019, Intel Corporation. All rights reserved.<BR>
> > > >> >    SPDX-License-Identifier: BSD-2-Clause-Patent
> > > >> >
> > > >> >  **/
> > > >> > @@ -23,6 +23,7 @@
> > > >> >    //
> > > >> >  #define EFI_SCSI_OP_LENGTH_SIX      0x6
> > > >> >  #define EFI_SCSI_OP_LENGTH_TEN      0xa
> > > >> > +#define EFI_SCSI_OP_LENGTH_TWELVE   0xc
> > > >> >  #define EFI_SCSI_OP_LENGTH_SIXTEEN  0x10
> > > >> >
> > > >> >  //
> > > >> > @@ -1280,6 +1281,208 @@ ScsiWrite16Command (
> > > >> >  }
> > > >> >
> > > >> >
> > > >> > +/**
> > > >> > +  Execute Security Protocol In SCSI command on a specific SCSI
> target.
> > > >> > +
> > > >> > +  Executes the SCSI Security Protocol In command on the SCSI
> target
> > > >> > specified by ScsiIo.
> > > >> > +  If Timeout is zero, then this function waits indefinitely for the
> > > command
> > > >> to
> > > >> > complete.
> > > >> > +  If Timeout is greater than zero, then the command is executed
> and
> > > will
> > > >> > timeout after
> > > >> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are
> > > used
> > > >> to
> > > >> > construct
> > > >>
> > > >>
> > > >> As mentioned in V4 series:
> > > >>
> > > >> There is no 'StartLba' & 'SectorSize' parameters for APIs:
> > > >>
> > > >> ScsiSecurityProtocolInCommand
> > > >> ScsiSecurityProtocolOutCommand
> > > >>
> > > >> Could you help to update the comments to address this?
> > > >> (Please help to update UefiScsiLib.c as well.)
> > > >>
> > > >>
> > > >> > +  the CDB for this SCSI command.
> > > >> > +  If ScsiIo is NULL, then ASSERT().
> > > >> > +  If SenseDataLength is NULL, then ASSERT().
> > > >> > +  If HostAdapterStatus is NULL, then ASSERT().
> > > >> > +  If TargetStatus is NULL, then ASSERT().
> > > >> > +  If DataLength is NULL, then ASSERT().
> > > >> > +
> > > >> > +  If SenseDataLength is non-zero and SenseData is not NULL,
> > > SenseData
> > > >> > must meet buffer
> > > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > > Otherwise
> > > >> > EFI_INVALID_PARAMETER
> > > >> > +  gets returned.
> > > >> > +
> > > >> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer
> > > must
> > > >> > meet buffer
> > > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > > Otherwise
> > > >> > EFI_INVALID_PARAMETER
> > > >> > +  gets returned.
> > > >> > +
> > > >> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> > > >> > +  @param[in]      Timeout              The length of timeout period.
> > > >> > +  @param[in, out] SenseData            A pointer to output sense data.
> > > >> > +  @param[in, out] SenseDataLength      The length of output sense
> data.
> > > >> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> > > >> > +  @param[out]     TargetStatus         The status of the target.
> > > >> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> > > >> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol
> Specific
> > > >> data.
> > > >> > +  @param[in]      TransferLength       The size in bytes of the data
> > > allocation.
> > > >> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> > > >> > +  @param[in, out] DataLength           The length of data buffer.
> > > >> > +
> > > >> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> > > >> > +  @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 DataLength.
> > > >> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could
> not
> > > be
> > > >> > sent because there are too many
> > > >> > +                                       SCSI Command Packets already queued.
> > > >> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> > > >> > attempting to send SCSI Request Packet.
> > > >> > +  @retval  EFI_UNSUPPORTED             The command described by
> the
> > > SCSI
> > > >> > Request Packet is not supported by
> > > >> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> > > >> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting
> for
> > > the
> > > >> > SCSI Request Packet to execute.
> > > >> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI
> > > Request
> > > >> > Packet are invalid.
> > > >> > +
> > > >> > +**/
> > > >> > +EFI_STATUS
> > > >> > +EFIAPI
> > > >> > +ScsiSecurityProtocolInCommand (
> > > >> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> > > >> > +  IN     UINT64                Timeout,
> > > >> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> > > >> > +  IN OUT UINT8                 *SenseDataLength,
> > > >> > +     OUT UINT8                 *HostAdapterStatus,
> > > >> > +     OUT UINT8                 *TargetStatus,
> > > >> > +  IN     UINT8                 SecurityProtocol,
> > > >> > +  IN     UINT16                SecurityProtocolSpecific,
> > > >> > +  IN     UINT32                TransferLength,
> > > >> > +  IN OUT VOID                  *DataBuffer,  OPTIONAL
> > > >> > +  IN OUT UINT32                *DataLength
> > > >> > +  )
> > > >> > +{
> > > >> > +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> > > >> > +  EFI_STATUS                      Status;
> > > >> > +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> > > >> > +
> > > >> > +  ASSERT (SenseDataLength != NULL);
> > > >> > +  ASSERT (HostAdapterStatus != NULL);
> > > >> > +  ASSERT (TargetStatus != NULL);
> > > >> > +  ASSERT (DataLength != NULL);
> > > >> > +  ASSERT (ScsiIo != NULL);
> > > >> > +
> > > >> > +  ZeroMem (&CommandPacket, sizeof
> > > >> > (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> > > >> > +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> > > >> > +
> > > >> > +  CommandPacket.Timeout           = Timeout;
> > > >> > +  CommandPacket.InDataBuffer      = DataBuffer;
> > > >> > +  CommandPacket.SenseData         = SenseData;
> > > >> > +  CommandPacket.InTransferLength  = TransferLength;
> > > >> > +  CommandPacket.Cdb               = Cdb;
> > > >> > +  //
> > > >> > +  // Fill Cdb for Security Protocol In Command
> > > >> > +  //
> > > >> > +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_IN;
> > > >> > +  Cdb[1]                        = SecurityProtocol;
> > > >> > +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> > > >> > (SecurityProtocolSpecific));
> > > >> > +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32
> > > (TransferLength));
> > > >> > +
> > > >> > +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> > > >> > +  CommandPacket.DataDirection   = EFI_SCSI_DATA_IN;
> > > >> > +  CommandPacket.SenseDataLength = *SenseDataLength;
> > > >> > +
> > > >> > +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> > > >> > &CommandPacket, NULL);
> > > >> > +
> > > >> > +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> > > >> > +  *TargetStatus                 = CommandPacket.TargetStatus;
> > > >> > +  *SenseDataLength              = CommandPacket.SenseDataLength;
> > > >> > +  *DataLength                   = CommandPacket.InTransferLength;
> > > >> > +
> > > >> > +  return Status;
> > > >> > +}
> > > >> > +
> > > >> > +
> > > >> > +/**
> > > >> > +  Execute Security Protocol Out SCSI command on a specific SCSI
> target.
> > > >> > +
> > > >> > +  Executes the SCSI Security Protocol Out command on the SCSI
> target
> > > >> > specified by ScsiIo.
> > > >> > +  If Timeout is zero, then this function waits indefinitely for the
> > > command
> > > >> to
> > > >> > complete.
> > > >> > +  If Timeout is greater than zero, then the command is executed
> and
> > > will
> > > >> > timeout after
> > > >> > +  Timeout 100 ns units.  The StartLba and SectorSize parameters are
> > > used
> > > >> to
> > > >> > construct
> > > >> > +  the CDB for this SCSI command.
> > > >> > +  If ScsiIo is NULL, then ASSERT().
> > > >> > +  If SenseDataLength is NULL, then ASSERT().
> > > >> > +  If HostAdapterStatus is NULL, then ASSERT().
> > > >> > +  If TargetStatus is NULL, then ASSERT().
> > > >> > +  If DataLength is NULL, then ASSERT().
> > > >> > +
> > > >> > +  If SenseDataLength is non-zero and SenseData is not NULL,
> > > SenseData
> > > >> > must meet buffer
> > > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > > Otherwise
> > > >> > EFI_INVALID_PARAMETER
> > > >> > +  gets returned.
> > > >> > +
> > > >> > +  If DataLength is non-zero and DataBuffer is not NULL, DataBuffer
> > > must
> > > >> > meet buffer
> > > >> > +  alignment requirement defined in EFI_SCSI_IO_PROTOCOL.
> > > Otherwise
> > > >> > EFI_INVALID_PARAMETER
> > > >> > +  gets returned.
> > > >> > +
> > > >> > +  @param[in]      ScsiIo               SCSI IO Protocol to use.
> > > >> > +  @param[in]      Timeout              The length of timeout period.
> > > >> > +  @param[in, out] SenseData            A pointer to output sense data.
> > > >> > +  @param[in, out] SenseDataLength      The length of output sense
> data.
> > > >> > +  @param[out]     HostAdapterStatus    The status of Host Adapter.
> > > >> > +  @param[out]     TargetStatus         The status of the target.
> > > >> > +  @param[in]      SecurityProtocol     The Security Protocol to use.
> > > >> > +  @param[in]      SecurityProtocolSpecific  The Security Protocol
> Specific
> > > >> data.
> > > >> > +  @param[in]      TransferLength       The size in bytes of the transfer
> > > data.
> > > >> > +  @param[in, out] DataBuffer           A pointer to a data buffer.
> > > >> > +
> > > >> > +  @retval  EFI_SUCCESS                 Command is executed successfully.
> > > >> > +  @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 DataLength.
> > > >> > +  @retval  EFI_NOT_READY               The SCSI Request Packet could
> not
> > > be
> > > >> > sent because there are too many
> > > >> > +                                       SCSI Command Packets already queued.
> > > >> > +  @retval  EFI_DEVICE_ERROR            A device error occurred while
> > > >> > attempting to send SCSI Request Packet.
> > > >> > +  @retval  EFI_UNSUPPORTED             The command described by
> the
> > > SCSI
> > > >> > Request Packet is not supported by
> > > >> > +                                       the SCSI initiator(i.e., SCSI  Host Controller)
> > > >> > +  @retval  EFI_TIMEOUT                 A timeout occurred while waiting
> for
> > > the
> > > >> > SCSI Request Packet to execute.
> > > >> > +  @retval  EFI_INVALID_PARAMETER       The contents of the SCSI
> > > Request
> > > >> > Packet are invalid.
> > > >> > +
> > > >> > +**/
> > > >> > +EFI_STATUS
> > > >> > +EFIAPI
> > > >> > +ScsiSecurityProtocolOutCommand (
> > > >> > +  IN     EFI_SCSI_IO_PROTOCOL  *ScsiIo,
> > > >> > +  IN     UINT64                Timeout,
> > > >> > +  IN OUT VOID                  *SenseData,   OPTIONAL
> > > >> > +  IN OUT UINT8                 *SenseDataLength,
> > > >> > +     OUT UINT8                 *HostAdapterStatus,
> > > >> > +     OUT UINT8                 *TargetStatus,
> > > >> > +  IN     UINT8                 SecurityProtocol,
> > > >> > +  IN     UINT16                SecurityProtocolSpecific,
> > > >> > +  IN     UINT32                TransferLength,
> > > >> > +  IN OUT VOID                  *DataBuffer   OPTIONAL
> > > >> > +  )
> > > >> > +{
> > > >> > +  EFI_SCSI_IO_SCSI_REQUEST_PACKET CommandPacket;
> > > >> > +  EFI_STATUS                      Status;
> > > >> > +  UINT8                           Cdb[EFI_SCSI_OP_LENGTH_TWELVE];
> > > >> > +
> > > >> > +  ASSERT (SenseDataLength != NULL);
> > > >> > +  ASSERT (HostAdapterStatus != NULL);
> > > >> > +  ASSERT (TargetStatus != NULL);
> > > >> > +  ASSERT (ScsiIo != NULL);
> > > >> > +
> > > >> > +  ZeroMem (&CommandPacket, sizeof
> > > >> > (EFI_SCSI_IO_SCSI_REQUEST_PACKET));
> > > >> > +  ZeroMem (Cdb, EFI_SCSI_OP_LENGTH_TWELVE);
> > > >> > +
> > > >> > +  CommandPacket.Timeout           = Timeout;
> > > >> > +  CommandPacket.OutDataBuffer     = DataBuffer;
> > > >> > +  CommandPacket.SenseData         = SenseData;
> > > >> > +  CommandPacket.OutTransferLength = TransferLength;
> > > >> > +  CommandPacket.Cdb               = Cdb;
> > > >> > +  //
> > > >> > +  // Fill Cdb for Security Protocol Out Command
> > > >> > +  //
> > > >> > +  Cdb[0]                        = EFI_SCSI_OP_SECURITY_PROTOCOL_OUT;
> > > >> > +  Cdb[1]                        = SecurityProtocol;
> > > >> > +  WriteUnaligned16 ((UINT16 *)&Cdb[2], SwapBytes16
> > > >> > (SecurityProtocolSpecific));
> > > >> > +  WriteUnaligned32 ((UINT32 *)&Cdb[6], SwapBytes32
> > > (TransferLength));
> > > >> > +
> > > >> > +  CommandPacket.CdbLength       = EFI_SCSI_OP_LENGTH_TWELVE;
> > > >> > +  CommandPacket.DataDirection   = EFI_SCSI_DATA_OUT;
> > > >> > +  CommandPacket.SenseDataLength = *SenseDataLength;
> > > >> > +
> > > >> > +  Status                        = ScsiIo->ExecuteScsiCommand (ScsiIo,
> > > >> > &CommandPacket, NULL);
> > > >> > +
> > > >> > +  *HostAdapterStatus            = CommandPacket.HostAdapterStatus;
> > > >> > +  *TargetStatus                 = CommandPacket.TargetStatus;
> > > >> > +  *SenseDataLength              = CommandPacket.SenseDataLength;
> > > >> > +
> > > >> > +  return Status;
> > > >> > +}
> > > >> > +
> > > >> > +
> > > >> >  /**
> > > >> >    Internal helper notify function in which update the result of the
> > > >> >    non-blocking SCSI Read/Write commands and signal caller event.
> > > >> > --
> > > >> > 2.16.2.windows.1
> > > >> >
> > > >> >
> > > >> > 


-=-=-=-=-=-=-=-=-=-=-=-
Groups.io Links: You receive all messages sent to this group.

View/Reply Online (#46654): https://edk2.groups.io/g/devel/message/46654
Mute This Topic: https://groups.io/mt/32994942/1787277
Group Owner: devel+owner@edk2.groups.io
Unsubscribe: https://edk2.groups.io/g/devel/unsub  [importer@patchew.org]
-=-=-=-=-=-=-=-=-=-=-=-